1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120 |
- /*
- * Copyright (C) 2007, 2008, 2009, 2012 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #import "config.h"
- #import "DumpRenderTree.h"
- #import "TestRunner.h"
- #import "DefaultPolicyDelegate.h"
- #import "EditingDelegate.h"
- #import "MockGeolocationProvider.h"
- #import "MockWebNotificationProvider.h"
- #import "PolicyDelegate.h"
- #import "StorageTrackerDelegate.h"
- #import "UIDelegate.h"
- #import "WorkQueue.h"
- #import "WorkQueueItem.h"
- #import <Foundation/Foundation.h>
- #import <JavaScriptCore/JSRetainPtr.h>
- #import <JavaScriptCore/JSStringRef.h>
- #import <JavaScriptCore/JSStringRefCF.h>
- #import <WebCore/GeolocationPosition.h>
- #import <WebKit/DOMDocument.h>
- #import <WebKit/DOMElement.h>
- #import <WebKit/DOMHTMLInputElementPrivate.h>
- #import <WebKit/WebApplicationCache.h>
- #import <WebKit/WebBackForwardList.h>
- #import <WebKit/WebCoreStatistics.h>
- #import <WebKit/WebDOMOperationsPrivate.h>
- #import <WebKit/WebDataSource.h>
- #import <WebKit/WebDatabaseManagerPrivate.h>
- #import <WebKit/WebDeviceOrientation.h>
- #import <WebKit/WebDeviceOrientationProviderMock.h>
- #import <WebKit/WebFrame.h>
- #import <WebKit/WebFrameViewPrivate.h>
- #import <WebKit/WebGeolocationPosition.h>
- #import <WebKit/WebHTMLRepresentation.h>
- #import <WebKit/WebHTMLViewPrivate.h>
- #import <WebKit/WebHistory.h>
- #import <WebKit/WebHistoryPrivate.h>
- #import <WebKit/WebIconDatabasePrivate.h>
- #import <WebKit/WebInspectorPrivate.h>
- #import <WebKit/WebNSURLExtras.h>
- #import <WebKit/WebKitErrors.h>
- #import <WebKit/WebPreferences.h>
- #import <WebKit/WebPreferencesPrivate.h>
- #import <WebKit/WebQuotaManager.h>
- #import <WebKit/WebScriptWorld.h>
- #import <WebKit/WebSecurityOriginPrivate.h>
- #import <WebKit/WebStorageManagerPrivate.h>
- #import <WebKit/WebTypesInternal.h>
- #import <WebKit/WebView.h>
- #import <WebKit/WebViewPrivate.h>
- #import <wtf/CurrentTime.h>
- #import <wtf/HashMap.h>
- #import <wtf/RetainPtr.h>
- @interface CommandValidationTarget : NSObject <NSValidatedUserInterfaceItem>
- {
- SEL _action;
- }
- - (id)initWithAction:(SEL)action;
- @end
- @implementation CommandValidationTarget
- - (id)initWithAction:(SEL)action
- {
- self = [super init];
- if (!self)
- return nil;
- _action = action;
- return self;
- }
- - (SEL)action
- {
- return _action;
- }
- - (NSInteger)tag
- {
- return 0;
- }
- @end
- @interface WebGeolocationPosition (Internal)
- - (id)initWithGeolocationPosition:(PassRefPtr<WebCore::GeolocationPosition>)coreGeolocationPosition;
- @end
- TestRunner::~TestRunner()
- {
- }
- void TestRunner::addDisallowedURL(JSStringRef url)
- {
- RetainPtr<CFStringRef> urlCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, url));
- if (!disallowedURLs)
- disallowedURLs = CFSetCreateMutable(kCFAllocatorDefault, 0, NULL);
- // Canonicalize the URL
- NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:(NSString *)urlCF.get()]];
- request = [NSURLProtocol canonicalRequestForRequest:request];
- CFSetAddValue(disallowedURLs, [request URL]);
- }
- bool TestRunner::callShouldCloseOnWebView()
- {
- return [[mainFrame webView] shouldClose];
- }
- void TestRunner::clearAllApplicationCaches()
- {
- [WebApplicationCache deleteAllApplicationCaches];
- }
- long long TestRunner::applicationCacheDiskUsageForOrigin(JSStringRef url)
- {
- RetainPtr<CFStringRef> urlCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, url));
- WebSecurityOrigin *origin = [[WebSecurityOrigin alloc] initWithURL:[NSURL URLWithString:(NSString *)urlCF.get()]];
- long long usage = [WebApplicationCache diskUsageForOrigin:origin];
- [origin release];
- return usage;
- }
- void TestRunner::syncLocalStorage()
- {
- [[WebStorageManager sharedWebStorageManager] syncLocalStorage];
- }
- long long TestRunner::localStorageDiskUsageForOrigin(JSStringRef url)
- {
- RetainPtr<CFStringRef> urlCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, url));
- WebSecurityOrigin *origin = [[WebSecurityOrigin alloc] initWithURL:[NSURL URLWithString:(NSString *)urlCF.get()]];
- long long usage = [[WebStorageManager sharedWebStorageManager] diskUsageForOrigin:origin];
- [origin release];
- return usage;
- }
- void TestRunner::observeStorageTrackerNotifications(unsigned number)
- {
- [storageDelegate logNotifications:number controller:this];
- }
- void TestRunner::clearApplicationCacheForOrigin(JSStringRef url)
- {
- RetainPtr<CFStringRef> urlCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, url));
- WebSecurityOrigin *origin = [[WebSecurityOrigin alloc] initWithURL:[NSURL URLWithString:(NSString *)urlCF.get()]];
- [WebApplicationCache deleteCacheForOrigin:origin];
- [origin release];
- }
- JSValueRef originsArrayToJS(JSContextRef context, NSArray *origins)
- {
- NSUInteger count = [origins count];
- JSValueRef jsOriginsArray[count];
- for (NSUInteger i = 0; i < count; i++) {
- NSString *origin = [[origins objectAtIndex:i] databaseIdentifier];
- JSRetainPtr<JSStringRef> originJS(Adopt, JSStringCreateWithCFString((CFStringRef)origin));
- jsOriginsArray[i] = JSValueMakeString(context, originJS.get());
- }
- return JSObjectMakeArray(context, count, jsOriginsArray, NULL);
- }
- JSValueRef TestRunner::originsWithApplicationCache(JSContextRef context)
- {
- return originsArrayToJS(context, [WebApplicationCache originsWithCache]);
- }
- void TestRunner::clearAllDatabases()
- {
- [[WebDatabaseManager sharedWebDatabaseManager] deleteAllDatabases];
- }
- void TestRunner::deleteAllLocalStorage()
- {
- [[WebStorageManager sharedWebStorageManager] deleteAllOrigins];
- }
- void TestRunner::setStorageDatabaseIdleInterval(double interval)
- {
- [WebStorageManager setStorageDatabaseIdleInterval:interval];
- }
- void TestRunner::closeIdleLocalStorageDatabases()
- {
- [WebStorageManager closeIdleLocalStorageDatabases];
- }
- JSValueRef TestRunner::originsWithLocalStorage(JSContextRef context)
- {
- return originsArrayToJS(context, [[WebStorageManager sharedWebStorageManager] origins]);
- }
- void TestRunner::deleteLocalStorageForOrigin(JSStringRef URL)
- {
- RetainPtr<CFStringRef> urlCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, URL));
-
- WebSecurityOrigin *origin = [[WebSecurityOrigin alloc] initWithURL:[NSURL URLWithString:(NSString *)urlCF.get()]];
- [[WebStorageManager sharedWebStorageManager] deleteOrigin:origin];
- [origin release];
- }
- void TestRunner::clearBackForwardList()
- {
- WebBackForwardList *backForwardList = [[mainFrame webView] backForwardList];
- WebHistoryItem *item = [[backForwardList currentItem] retain];
- // We clear the history by setting the back/forward list's capacity to 0
- // then restoring it back and adding back the current item.
- int capacity = [backForwardList capacity];
- [backForwardList setCapacity:0];
- [backForwardList setCapacity:capacity];
- [backForwardList addItem:item];
- [backForwardList goToItem:item];
- [item release];
- }
- JSStringRef TestRunner::copyDecodedHostName(JSStringRef name)
- {
- RetainPtr<CFStringRef> nameCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, name));
- NSString *nameNS = (NSString *)nameCF.get();
- return JSStringCreateWithCFString((CFStringRef)[nameNS _web_decodeHostName]);
- }
- JSStringRef TestRunner::copyEncodedHostName(JSStringRef name)
- {
- RetainPtr<CFStringRef> nameCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, name));
- NSString *nameNS = (NSString *)nameCF.get();
- return JSStringCreateWithCFString((CFStringRef)[nameNS _web_encodeHostName]);
- }
- void TestRunner::display()
- {
- displayWebView();
- }
- void TestRunner::keepWebHistory()
- {
- if (![WebHistory optionalSharedHistory]) {
- WebHistory *history = [[WebHistory alloc] init];
- [WebHistory setOptionalSharedHistory:history];
- [history release];
- }
- }
- int TestRunner::numberOfPendingGeolocationPermissionRequests()
- {
- return [[[mainFrame webView] UIDelegate] numberOfPendingGeolocationPermissionRequests];
- }
- size_t TestRunner::webHistoryItemCount()
- {
- return [[[WebHistory optionalSharedHistory] allItems] count];
- }
- JSRetainPtr<JSStringRef> TestRunner::platformName() const
- {
- JSRetainPtr<JSStringRef> platformName(Adopt, JSStringCreateWithUTF8CString("mac"));
- return platformName;
- }
- void TestRunner::notifyDone()
- {
- if (m_waitToDump && !topLoadingFrame && !WorkQueue::shared()->count())
- dump();
- m_waitToDump = false;
- }
- static inline std::string stringFromJSString(JSStringRef jsString)
- {
- size_t maxBufferSize = JSStringGetMaximumUTF8CStringSize(jsString);
- char* utf8Buffer = new char[maxBufferSize];
- size_t bytesWrittenToUTF8Buffer = JSStringGetUTF8CString(jsString, utf8Buffer, maxBufferSize);
- std::string stdString(utf8Buffer, bytesWrittenToUTF8Buffer - 1); // bytesWrittenToUTF8Buffer includes a trailing \0 which std::string doesn't need.
- delete[] utf8Buffer;
- return stdString;
- }
- static inline size_t indexOfSeparatorAfterDirectoryName(const std::string& directoryName, const std::string& fullPath)
- {
- std::string searchKey = "/" + directoryName + "/";
- size_t indexOfSearchKeyStart = fullPath.rfind(searchKey);
- if (indexOfSearchKeyStart == std::string::npos) {
- ASSERT_NOT_REACHED();
- return 0;
- }
- // Callers expect the return value not to end in "/", so searchKey.length() - 1.
- return indexOfSearchKeyStart + searchKey.length() - 1;
- }
- static inline std::string resourceRootAbsolutePath(const std::string& testPathOrURL, const std::string& expectedRootName)
- {
- char* localResourceRootEnv = getenv("LOCAL_RESOURCE_ROOT");
- if (localResourceRootEnv)
- return std::string(localResourceRootEnv);
- // This fallback approach works for non-http tests and is useful
- // in the case when we're running DRT directly from the command line.
- return testPathOrURL.substr(0, indexOfSeparatorAfterDirectoryName(expectedRootName, testPathOrURL));
- }
- JSStringRef TestRunner::pathToLocalResource(JSContextRef context, JSStringRef localResourceJSString)
- {
- // The passed in path will be an absolute path to the resource starting
- // with "/tmp" or "/tmp/LayoutTests", optionally starting with the explicit file:// protocol.
- // /tmp maps to DUMPRENDERTREE_TEMP, and /tmp/LayoutTests maps to LOCAL_RESOURCE_ROOT.
- // FIXME: This code should work on all *nix platforms and can be moved into TestRunner.cpp.
- std::string expectedRootName;
- std::string absolutePathToResourceRoot;
- std::string localResourceString = stringFromJSString(localResourceJSString);
- if (localResourceString.find("LayoutTests") != std::string::npos) {
- expectedRootName = "LayoutTests";
- absolutePathToResourceRoot = resourceRootAbsolutePath(m_testPathOrURL, expectedRootName);
- } else if (localResourceString.find("tmp") != std::string::npos) {
- expectedRootName = "tmp";
- absolutePathToResourceRoot = getenv("DUMPRENDERTREE_TEMP");
- } else {
- ASSERT_NOT_REACHED(); // pathToLocalResource was passed a path it doesn't know how to map.
- }
- ASSERT(!absolutePathToResourceRoot.empty());
- size_t indexOfSeparatorAfterRootName = indexOfSeparatorAfterDirectoryName(expectedRootName, localResourceString);
- std::string absolutePathToLocalResource = absolutePathToResourceRoot + localResourceString.substr(indexOfSeparatorAfterRootName);
- // Note: It's important that we keep the file:// or http tests will get confused.
- if (localResourceString.find("file://") != std::string::npos) {
- ASSERT(absolutePathToLocalResource[0] == '/');
- absolutePathToLocalResource = std::string("file://") + absolutePathToLocalResource;
- }
- return JSStringCreateWithUTF8CString(absolutePathToLocalResource.c_str());
- }
- void TestRunner::queueLoad(JSStringRef url, JSStringRef target)
- {
- RetainPtr<CFStringRef> urlCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, url));
- NSString *urlNS = (NSString *)urlCF.get();
- NSURL *nsurl = [NSURL URLWithString:urlNS relativeToURL:[[[mainFrame dataSource] response] URL]];
- NSString *nsurlString = [nsurl absoluteString];
- JSRetainPtr<JSStringRef> absoluteURL(Adopt, JSStringCreateWithUTF8CString([nsurlString UTF8String]));
- WorkQueue::shared()->queue(new LoadItem(absoluteURL.get(), target));
- }
- void TestRunner::setAcceptsEditing(bool newAcceptsEditing)
- {
- [(EditingDelegate *)[[mainFrame webView] editingDelegate] setAcceptsEditing:newAcceptsEditing];
- }
- void TestRunner::setAlwaysAcceptCookies(bool alwaysAcceptCookies)
- {
- if (alwaysAcceptCookies == m_alwaysAcceptCookies)
- return;
- m_alwaysAcceptCookies = alwaysAcceptCookies;
- NSHTTPCookieAcceptPolicy cookieAcceptPolicy = alwaysAcceptCookies ? NSHTTPCookieAcceptPolicyAlways : NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain;
- [WebPreferences _setCurrentNetworkLoaderSessionCookieAcceptPolicy:cookieAcceptPolicy];
- }
- void TestRunner::setAppCacheMaximumSize(unsigned long long size)
- {
- [WebApplicationCache setMaximumSize:size];
- }
- void TestRunner::setApplicationCacheOriginQuota(unsigned long long quota)
- {
- WebSecurityOrigin *origin = [[WebSecurityOrigin alloc] initWithURL:[NSURL URLWithString:@"http://127.0.0.1:8000"]];
- [[origin applicationCacheQuotaManager] setQuota:quota];
- [origin release];
- }
- void TestRunner::setAuthorAndUserStylesEnabled(bool flag)
- {
- [[[mainFrame webView] preferences] setAuthorAndUserStylesEnabled:flag];
- }
- void TestRunner::setCustomPolicyDelegate(bool setDelegate, bool permissive)
- {
- if (!setDelegate) {
- [[mainFrame webView] setPolicyDelegate:defaultPolicyDelegate];
- return;
- }
- [policyDelegate setPermissive:permissive];
- [[mainFrame webView] setPolicyDelegate:policyDelegate];
- }
- void TestRunner::setDatabaseQuota(unsigned long long quota)
- {
- WebSecurityOrigin *origin = [[WebSecurityOrigin alloc] initWithURL:[NSURL URLWithString:@"file:///"]];
- [[origin databaseQuotaManager] setQuota:quota];
- [origin release];
- }
- void TestRunner::goBack()
- {
- [[mainFrame webView] goBack];
- }
- void TestRunner::setDefersLoading(bool defers)
- {
- [[mainFrame webView] setDefersCallbacks:defers];
- }
- void TestRunner::setDomainRelaxationForbiddenForURLScheme(bool forbidden, JSStringRef scheme)
- {
- RetainPtr<CFStringRef> schemeCFString = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, scheme));
- [WebView _setDomainRelaxationForbidden:forbidden forURLScheme:(NSString *)schemeCFString.get()];
- }
- void TestRunner::setMockDeviceOrientation(bool canProvideAlpha, double alpha, bool canProvideBeta, double beta, bool canProvideGamma, double gamma)
- {
- // DumpRenderTree configured the WebView to use WebDeviceOrientationProviderMock.
- id<WebDeviceOrientationProvider> provider = [[mainFrame webView] _deviceOrientationProvider];
- WebDeviceOrientationProviderMock *mockProvider = static_cast<WebDeviceOrientationProviderMock*>(provider);
- WebDeviceOrientation *orientation = [[WebDeviceOrientation alloc] initWithCanProvideAlpha:canProvideAlpha alpha:alpha canProvideBeta:canProvideBeta beta:beta canProvideGamma:canProvideGamma gamma:gamma];
- [mockProvider setOrientation:orientation];
- [orientation release];
- }
- void TestRunner::setMockGeolocationPosition(double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed)
- {
- WebGeolocationPosition *position = nil;
- if (!providesAltitude && !providesAltitudeAccuracy && !providesHeading && !providesSpeed) {
- // Test the exposed API.
- position = [[WebGeolocationPosition alloc] initWithTimestamp:currentTime() latitude:latitude longitude:longitude accuracy:accuracy];
- } else {
- RefPtr<WebCore::GeolocationPosition> coreGeolocationPosition = WebCore::GeolocationPosition::create(currentTime(), latitude, longitude, accuracy, providesAltitude, altitude, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed);
- position = [[WebGeolocationPosition alloc] initWithGeolocationPosition:(coreGeolocationPosition.release())];
- }
- [[MockGeolocationProvider shared] setPosition:position];
- [position release];
- }
- void TestRunner::setMockGeolocationPositionUnavailableError(JSStringRef message)
- {
- RetainPtr<CFStringRef> messageCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, message));
- NSString *messageNS = (NSString *)messageCF.get();
- [[MockGeolocationProvider shared] setPositionUnavailableErrorWithMessage:messageNS];
- }
- void TestRunner::setGeolocationPermission(bool allow)
- {
- setGeolocationPermissionCommon(allow);
- [[[mainFrame webView] UIDelegate] didSetMockGeolocationPermission];
- }
- void TestRunner::addMockSpeechInputResult(JSStringRef result, double confidence, JSStringRef language)
- {
- // FIXME: Implement for speech input layout tests.
- // See https://bugs.webkit.org/show_bug.cgi?id=39485.
- }
- void TestRunner::setMockSpeechInputDumpRect(bool flag)
- {
- // FIXME: Implement for speech input layout tests.
- // See https://bugs.webkit.org/show_bug.cgi?id=39485.
- }
- void TestRunner::startSpeechInput(JSContextRef inputElement)
- {
- // FIXME: Implement for speech input layout tests.
- // See https://bugs.webkit.org/show_bug.cgi?id=39485.
- }
- void TestRunner::setIconDatabaseEnabled(bool iconDatabaseEnabled)
- {
- // FIXME: Workaround <rdar://problem/6480108>
- static WebIconDatabase *sharedWebIconDatabase = NULL;
- if (!sharedWebIconDatabase) {
- if (!iconDatabaseEnabled)
- return;
- sharedWebIconDatabase = [WebIconDatabase sharedIconDatabase];
- if ([sharedWebIconDatabase isEnabled] == iconDatabaseEnabled)
- return;
- }
- [sharedWebIconDatabase setEnabled:iconDatabaseEnabled];
- }
- void TestRunner::setMainFrameIsFirstResponder(bool flag)
- {
- NSView *documentView = [[mainFrame frameView] documentView];
-
- NSResponder *firstResponder = flag ? documentView : nil;
- [[[mainFrame webView] window] makeFirstResponder:firstResponder];
- }
- void TestRunner::setPrivateBrowsingEnabled(bool privateBrowsingEnabled)
- {
- [[[mainFrame webView] preferences] setPrivateBrowsingEnabled:privateBrowsingEnabled];
- }
- void TestRunner::setXSSAuditorEnabled(bool enabled)
- {
- [[[mainFrame webView] preferences] setXSSAuditorEnabled:enabled];
- }
- void TestRunner::setSpatialNavigationEnabled(bool enabled)
- {
- [[[mainFrame webView] preferences] setSpatialNavigationEnabled:enabled];
- }
- void TestRunner::setAllowUniversalAccessFromFileURLs(bool enabled)
- {
- [[[mainFrame webView] preferences] setAllowUniversalAccessFromFileURLs:enabled];
- }
- void TestRunner::setAllowFileAccessFromFileURLs(bool enabled)
- {
- [[[mainFrame webView] preferences] setAllowFileAccessFromFileURLs:enabled];
- }
- void TestRunner::setPopupBlockingEnabled(bool popupBlockingEnabled)
- {
- [[[mainFrame webView] preferences] setJavaScriptCanOpenWindowsAutomatically:!popupBlockingEnabled];
- }
- void TestRunner::setPluginsEnabled(bool pluginsEnabled)
- {
- [[[mainFrame webView] preferences] setPlugInsEnabled:pluginsEnabled];
- }
- void TestRunner::setJavaScriptCanAccessClipboard(bool enabled)
- {
- [[[mainFrame webView] preferences] setJavaScriptCanAccessClipboard:enabled];
- }
- void TestRunner::setAutomaticLinkDetectionEnabled(bool enabled)
- {
- [[mainFrame webView] setAutomaticLinkDetectionEnabled:enabled];
- }
- void TestRunner::setTabKeyCyclesThroughElements(bool cycles)
- {
- [[mainFrame webView] setTabKeyCyclesThroughElements:cycles];
- }
- void TestRunner::setUseDashboardCompatibilityMode(bool flag)
- {
- [[mainFrame webView] _setDashboardBehavior:WebDashboardBehaviorUseBackwardCompatibilityMode to:flag];
- }
- void TestRunner::setUserStyleSheetEnabled(bool flag)
- {
- [[WebPreferences standardPreferences] setUserStyleSheetEnabled:flag];
- }
- void TestRunner::setUserStyleSheetLocation(JSStringRef path)
- {
- RetainPtr<CFStringRef> pathCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, path));
- NSURL *url = [NSURL URLWithString:(NSString *)pathCF.get()];
- [[WebPreferences standardPreferences] setUserStyleSheetLocation:url];
- }
- void TestRunner::setValueForUser(JSContextRef context, JSValueRef nodeObject, JSStringRef value)
- {
- DOMElement *element = [DOMElement _DOMElementFromJSContext:context value:nodeObject];
- if (!element || ![element isKindOfClass:[DOMHTMLInputElement class]])
- return;
- RetainPtr<CFStringRef> valueCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, value));
- [(DOMHTMLInputElement *)element setValueForUser:(NSString *)valueCF.get()];
- }
- void TestRunner::setViewModeMediaFeature(JSStringRef mode)
- {
- // FIXME: implement
- }
- void TestRunner::dispatchPendingLoadRequests()
- {
- [[mainFrame webView] _dispatchPendingLoadRequests];
- }
- void TestRunner::overridePreference(JSStringRef key, JSStringRef value)
- {
- RetainPtr<CFStringRef> keyCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, key));
- NSString *keyNS = (NSString *)keyCF.get();
- RetainPtr<CFStringRef> valueCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, value));
- NSString *valueNS = (NSString *)valueCF.get();
- [[WebPreferences standardPreferences] _setPreferenceForTestWithValue:valueNS forKey:keyNS];
- }
- void TestRunner::removeAllVisitedLinks()
- {
- [WebHistory _removeAllVisitedLinks];
- }
- void TestRunner::setPersistentUserStyleSheetLocation(JSStringRef jsURL)
- {
- RetainPtr<CFStringRef> urlString = adoptCF(JSStringCopyCFString(0, jsURL));
- ::setPersistentUserStyleSheetLocation(urlString.get());
- }
- void TestRunner::clearPersistentUserStyleSheet()
- {
- ::setPersistentUserStyleSheetLocation(0);
- }
- void TestRunner::setWindowIsKey(bool windowIsKey)
- {
- m_windowIsKey = windowIsKey;
- [[mainFrame webView] _updateActiveState];
- }
- static const CFTimeInterval waitToDumpWatchdogInterval = 30.0;
- static void waitUntilDoneWatchdogFired(CFRunLoopTimerRef timer, void* info)
- {
- gTestRunner->waitToDumpWatchdogTimerFired();
- }
- void TestRunner::setWaitToDump(bool waitUntilDone)
- {
- m_waitToDump = waitUntilDone;
- if (m_waitToDump && shouldSetWaitToDumpWatchdog())
- setWaitToDumpWatchdog(CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + waitToDumpWatchdogInterval, 0, 0, 0, waitUntilDoneWatchdogFired, NULL));
- }
- int TestRunner::windowCount()
- {
- return CFArrayGetCount(openWindowsRef);
- }
- void TestRunner::execCommand(JSStringRef name, JSStringRef value)
- {
- RetainPtr<CFStringRef> nameCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, name));
- NSString *nameNS = (NSString *)nameCF.get();
- RetainPtr<CFStringRef> valueCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, value));
- NSString *valueNS = (NSString *)valueCF.get();
- [[mainFrame webView] _executeCoreCommandByName:nameNS value:valueNS];
- }
- bool TestRunner::findString(JSContextRef context, JSStringRef target, JSObjectRef optionsArray)
- {
- WebFindOptions options = 0;
- JSRetainPtr<JSStringRef> lengthPropertyName(Adopt, JSStringCreateWithUTF8CString("length"));
- JSValueRef lengthValue = JSObjectGetProperty(context, optionsArray, lengthPropertyName.get(), 0);
- if (!JSValueIsNumber(context, lengthValue))
- return false;
- RetainPtr<CFStringRef> targetCFString = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, target));
- size_t length = static_cast<size_t>(JSValueToNumber(context, lengthValue, 0));
- for (size_t i = 0; i < length; ++i) {
- JSValueRef value = JSObjectGetPropertyAtIndex(context, optionsArray, i, 0);
- if (!JSValueIsString(context, value))
- continue;
- JSRetainPtr<JSStringRef> optionName(Adopt, JSValueToStringCopy(context, value, 0));
- if (JSStringIsEqualToUTF8CString(optionName.get(), "CaseInsensitive"))
- options |= WebFindOptionsCaseInsensitive;
- else if (JSStringIsEqualToUTF8CString(optionName.get(), "AtWordStarts"))
- options |= WebFindOptionsAtWordStarts;
- else if (JSStringIsEqualToUTF8CString(optionName.get(), "TreatMedialCapitalAsWordStart"))
- options |= WebFindOptionsTreatMedialCapitalAsWordStart;
- else if (JSStringIsEqualToUTF8CString(optionName.get(), "Backwards"))
- options |= WebFindOptionsBackwards;
- else if (JSStringIsEqualToUTF8CString(optionName.get(), "WrapAround"))
- options |= WebFindOptionsWrapAround;
- else if (JSStringIsEqualToUTF8CString(optionName.get(), "StartInSelection"))
- options |= WebFindOptionsStartInSelection;
- }
- return [[mainFrame webView] findString:(NSString *)targetCFString.get() options:options];
- }
- void TestRunner::setCacheModel(int cacheModel)
- {
- [[WebPreferences standardPreferences] setCacheModel:cacheModel];
- }
- bool TestRunner::isCommandEnabled(JSStringRef name)
- {
- RetainPtr<CFStringRef> nameCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, name));
- NSString *nameNS = (NSString *)nameCF.get();
- // Accept command strings with capital letters for first letter without trailing colon.
- if (![nameNS hasSuffix:@":"] && [nameNS length]) {
- nameNS = [[[[nameNS substringToIndex:1] lowercaseString]
- stringByAppendingString:[nameNS substringFromIndex:1]]
- stringByAppendingString:@":"];
- }
- SEL selector = NSSelectorFromString(nameNS);
- RetainPtr<CommandValidationTarget> target = adoptNS([[CommandValidationTarget alloc] initWithAction:selector]);
- id validator = [NSApp targetForAction:selector to:[mainFrame webView] from:target.get()];
- if (!validator)
- return false;
- if (![validator respondsToSelector:selector])
- return false;
- if (![validator respondsToSelector:@selector(validateUserInterfaceItem:)])
- return true;
- return [validator validateUserInterfaceItem:target.get()];
- }
- void TestRunner::waitForPolicyDelegate()
- {
- setWaitToDump(true);
- [policyDelegate setControllerToNotifyDone:this];
- [[mainFrame webView] setPolicyDelegate:policyDelegate];
- }
- void TestRunner::addOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains)
- {
- RetainPtr<CFStringRef> sourceOriginCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, sourceOrigin));
- NSString *sourceOriginNS = (NSString *)sourceOriginCF.get();
- RetainPtr<CFStringRef> protocolCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, destinationProtocol));
- NSString *destinationProtocolNS = (NSString *)protocolCF.get();
- RetainPtr<CFStringRef> hostCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, destinationHost));
- NSString *destinationHostNS = (NSString *)hostCF.get();
- [WebView _addOriginAccessWhitelistEntryWithSourceOrigin:sourceOriginNS destinationProtocol:destinationProtocolNS destinationHost:destinationHostNS allowDestinationSubdomains:allowDestinationSubdomains];
- }
- void TestRunner::removeOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains)
- {
- RetainPtr<CFStringRef> sourceOriginCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, sourceOrigin));
- NSString *sourceOriginNS = (NSString *)sourceOriginCF.get();
- RetainPtr<CFStringRef> protocolCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, destinationProtocol));
- NSString *destinationProtocolNS = (NSString *)protocolCF.get();
- RetainPtr<CFStringRef> hostCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, destinationHost));
- NSString *destinationHostNS = (NSString *)hostCF.get();
- [WebView _removeOriginAccessWhitelistEntryWithSourceOrigin:sourceOriginNS destinationProtocol:destinationProtocolNS destinationHost:destinationHostNS allowDestinationSubdomains:allowDestinationSubdomains];
- }
- void TestRunner::setScrollbarPolicy(JSStringRef orientation, JSStringRef policy)
- {
- // FIXME: implement
- }
- void TestRunner::addUserScript(JSStringRef source, bool runAtStart, bool allFrames)
- {
- RetainPtr<CFStringRef> sourceCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, source));
- NSString *sourceNS = (NSString *)sourceCF.get();
- [WebView _addUserScriptToGroup:@"org.webkit.DumpRenderTree" world:[WebScriptWorld world] source:sourceNS url:nil whitelist:nil blacklist:nil injectionTime:(runAtStart ? WebInjectAtDocumentStart : WebInjectAtDocumentEnd) injectedFrames:(allFrames ? WebInjectInAllFrames : WebInjectInTopFrameOnly)];
- }
- void TestRunner::addUserStyleSheet(JSStringRef source, bool allFrames)
- {
- RetainPtr<CFStringRef> sourceCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, source));
- NSString *sourceNS = (NSString *)sourceCF.get();
- [WebView _addUserStyleSheetToGroup:@"org.webkit.DumpRenderTree" world:[WebScriptWorld world] source:sourceNS url:nil whitelist:nil blacklist:nil injectedFrames:(allFrames ? WebInjectInAllFrames : WebInjectInTopFrameOnly)];
- }
- void TestRunner::setDeveloperExtrasEnabled(bool enabled)
- {
- [[[mainFrame webView] preferences] setDeveloperExtrasEnabled:enabled];
- }
- void TestRunner::showWebInspector()
- {
- [[[mainFrame webView] inspector] show:nil];
- }
- void TestRunner::closeWebInspector()
- {
- [[[mainFrame webView] inspector] close:nil];
- }
- void TestRunner::evaluateInWebInspector(long callId, JSStringRef script)
- {
- RetainPtr<CFStringRef> scriptCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, script));
- NSString *scriptNS = (NSString *)scriptCF.get();
- [[[mainFrame webView] inspector] evaluateInFrontend:nil callId:callId script:scriptNS];
- }
- typedef HashMap<unsigned, RetainPtr<WebScriptWorld> > WorldMap;
- static WorldMap& worldMap()
- {
- static WorldMap& map = *new WorldMap;
- return map;
- }
- unsigned worldIDForWorld(WebScriptWorld *world)
- {
- WorldMap::const_iterator end = worldMap().end();
- for (WorldMap::const_iterator it = worldMap().begin(); it != end; ++it) {
- if (it->value == world)
- return it->key;
- }
- return 0;
- }
- void TestRunner::evaluateScriptInIsolatedWorldAndReturnValue(unsigned worldID, JSObjectRef globalObject, JSStringRef script)
- {
- // FIXME: Implement this.
- }
- void TestRunner::evaluateScriptInIsolatedWorld(unsigned worldID, JSObjectRef globalObject, JSStringRef script)
- {
- RetainPtr<CFStringRef> scriptCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, script));
- NSString *scriptNS = (NSString *)scriptCF.get();
- // A worldID of 0 always corresponds to a new world. Any other worldID corresponds to a world
- // that is created once and cached forever.
- WebScriptWorld *world;
- if (!worldID)
- world = [WebScriptWorld world];
- else {
- RetainPtr<WebScriptWorld>& worldSlot = worldMap().add(worldID, 0).iterator->value;
- if (!worldSlot)
- worldSlot = adoptNS([[WebScriptWorld alloc] init]);
- world = worldSlot.get();
- }
- [mainFrame _stringByEvaluatingJavaScriptFromString:scriptNS withGlobalObject:globalObject inScriptWorld:world];
- }
- @interface APITestDelegate : NSObject
- {
- bool* m_condition;
- }
- @end
- @implementation APITestDelegate
- - (id)initWithCompletionCondition:(bool*)condition
- {
- [super init];
- ASSERT(condition);
- m_condition = condition;
- *m_condition = false;
- return self;
- }
- - (void)webView:(WebView *)sender didFailLoadWithError:(NSError *)error forFrame:(WebFrame *)frame
- {
- printf("API Test load failed\n");
- *m_condition = true;
- }
- - (void)webView:(WebView *)sender didFailProvisionalLoadWithError:(NSError *)error forFrame:(WebFrame *)frame
- {
- printf("API Test load failed provisional\n");
- *m_condition = true;
- }
- - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
- {
- printf("API Test load succeeded\n");
- *m_condition = true;
- }
- @end
- void TestRunner::apiTestNewWindowDataLoadBaseURL(JSStringRef utf8Data, JSStringRef baseURL)
- {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- RetainPtr<CFStringRef> utf8DataCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, utf8Data));
- RetainPtr<CFStringRef> baseURLCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, baseURL));
-
- WebView *webView = [[WebView alloc] initWithFrame:NSZeroRect frameName:@"" groupName:@""];
- bool done = false;
- APITestDelegate *delegate = [[APITestDelegate alloc] initWithCompletionCondition:&done];
- [webView setFrameLoadDelegate:delegate];
- [[webView mainFrame] loadData:[(NSString *)utf8DataCF.get() dataUsingEncoding:NSUTF8StringEncoding] MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:[NSURL URLWithString:(NSString *)baseURLCF.get()]];
-
- while (!done) {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]];
- [pool release];
- }
-
- [webView close];
- [webView release];
- [delegate release];
- [pool release];
- }
- void TestRunner::apiTestGoToCurrentBackForwardItem()
- {
- WebView *view = [mainFrame webView];
- [view goToBackForwardItem:[[view backForwardList] currentItem]];
- }
- void TestRunner::setWebViewEditable(bool editable)
- {
- WebView *view = [mainFrame webView];
- [view setEditable:editable];
- }
- static NSString *SynchronousLoaderRunLoopMode = @"DumpRenderTreeSynchronousLoaderRunLoopMode";
- #if __MAC_OS_X_VERSION_MIN_REQUIRED == 1060
- @protocol NSURLConnectionDelegate <NSObject>
- @end
- #endif
- @interface SynchronousLoader : NSObject <NSURLConnectionDelegate>
- {
- NSString *m_username;
- NSString *m_password;
- BOOL m_isDone;
- }
- + (void)makeRequest:(NSURLRequest *)request withUsername:(NSString *)username password:(NSString *)password;
- @end
- @implementation SynchronousLoader : NSObject
- - (void)dealloc
- {
- [m_username release];
- [m_password release];
- [super dealloc];
- }
- - (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection
- {
- return YES;
- }
- - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
- {
- if ([challenge previousFailureCount] == 0) {
- RetainPtr<NSURLCredential> credential = adoptNS([[NSURLCredential alloc] initWithUser:m_username password:m_password persistence:NSURLCredentialPersistenceForSession]);
- [[challenge sender] useCredential:credential.get() forAuthenticationChallenge:challenge];
- return;
- }
- [[challenge sender] cancelAuthenticationChallenge:challenge];
- }
- - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
- {
- printf("SynchronousLoader failed: %s\n", [[error description] UTF8String]);
- m_isDone = YES;
- }
- - (void)connectionDidFinishLoading:(NSURLConnection *)connection
- {
- m_isDone = YES;
- }
- + (void)makeRequest:(NSURLRequest *)request withUsername:(NSString *)username password:(NSString *)password
- {
- ASSERT(![[request URL] user]);
- ASSERT(![[request URL] password]);
- SynchronousLoader *delegate = [[SynchronousLoader alloc] init];
- delegate->m_username = [username copy];
- delegate->m_password = [password copy];
- NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:delegate startImmediately:NO];
- [connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:SynchronousLoaderRunLoopMode];
- [connection start];
-
- while (!delegate->m_isDone)
- [[NSRunLoop currentRunLoop] runMode:SynchronousLoaderRunLoopMode beforeDate:[NSDate distantFuture]];
- [connection cancel];
-
- [connection release];
- [delegate release];
- }
- @end
- void TestRunner::authenticateSession(JSStringRef url, JSStringRef username, JSStringRef password)
- {
- // See <rdar://problem/7880699>.
- RetainPtr<CFStringRef> urlStringCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, url));
- RetainPtr<CFStringRef> usernameCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, username));
- RetainPtr<CFStringRef> passwordCF = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, password));
- RetainPtr<NSURLRequest> request = adoptNS([[NSURLRequest alloc] initWithURL:[NSURL URLWithString:(NSString *)urlStringCF.get()]]);
- [SynchronousLoader makeRequest:request.get() withUsername:(NSString *)usernameCF.get() password:(NSString *)passwordCF.get()];
- }
- void TestRunner::abortModal()
- {
- [NSApp abortModal];
- }
- void TestRunner::setSerializeHTTPLoads(bool serialize)
- {
- [WebView _setLoadResourcesSerially:serialize];
- }
- void TestRunner::setTextDirection(JSStringRef directionName)
- {
- if (JSStringIsEqualToUTF8CString(directionName, "ltr"))
- [[mainFrame webView] makeBaseWritingDirectionLeftToRight:0];
- else if (JSStringIsEqualToUTF8CString(directionName, "rtl"))
- [[mainFrame webView] makeBaseWritingDirectionRightToLeft:0];
- else
- ASSERT_NOT_REACHED();
- }
- void TestRunner::addChromeInputField()
- {
- NSTextField *textField = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 100, 20)];
- textField.tag = 1;
- [[[[mainFrame webView] window] contentView] addSubview:textField];
- [textField release];
-
- [textField setNextKeyView:[mainFrame webView]];
- [[mainFrame webView] setNextKeyView:textField];
- }
- void TestRunner::removeChromeInputField()
- {
- NSView* textField = [[[[mainFrame webView] window] contentView] viewWithTag:1];
- if (textField) {
- [textField removeFromSuperview];
- focusWebView();
- }
- }
- void TestRunner::focusWebView()
- {
- [[[mainFrame webView] window] makeFirstResponder:[mainFrame webView]];
- }
- void TestRunner::setBackingScaleFactor(double backingScaleFactor)
- {
- [[mainFrame webView] _setCustomBackingScaleFactor:backingScaleFactor];
- }
- void TestRunner::resetPageVisibility()
- {
- WebView *webView = [mainFrame webView];
- if ([webView respondsToSelector:@selector(_setVisibilityState:isInitialState:)])
- [webView _setVisibilityState:WebPageVisibilityStateVisible isInitialState:YES];
- }
- void TestRunner::setPageVisibility(const char* newVisibility)
- {
- if (!newVisibility)
- return;
- WebView *webView = [mainFrame webView];
- if (!strcmp(newVisibility, "visible"))
- [webView _setVisibilityState:WebPageVisibilityStateVisible isInitialState:NO];
- else if (!strcmp(newVisibility, "hidden"))
- [webView _setVisibilityState:WebPageVisibilityStateHidden isInitialState:NO];
- else if (!strcmp(newVisibility, "prerender"))
- [webView _setVisibilityState:WebPageVisibilityStatePrerender isInitialState:NO];
- else if (!strcmp(newVisibility, "unloaded"))
- [webView _setVisibilityState:WebPageVisibilityStateUnloaded isInitialState:NO];
- }
- void TestRunner::grantWebNotificationPermission(JSStringRef jsOrigin)
- {
- RetainPtr<CFStringRef> cfOrigin = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, jsOrigin));
- ASSERT([[mainFrame webView] _notificationProvider] == [MockWebNotificationProvider shared]);
- [[MockWebNotificationProvider shared] setWebNotificationOrigin:(NSString *)cfOrigin.get() permission:TRUE];
- }
- void TestRunner::denyWebNotificationPermission(JSStringRef jsOrigin)
- {
- RetainPtr<CFStringRef> cfOrigin = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, jsOrigin));
- ASSERT([[mainFrame webView] _notificationProvider] == [MockWebNotificationProvider shared]);
- [[MockWebNotificationProvider shared] setWebNotificationOrigin:(NSString *)cfOrigin.get() permission:FALSE];
- }
- void TestRunner::removeAllWebNotificationPermissions()
- {
- [[MockWebNotificationProvider shared] removeAllWebNotificationPermissions];
- }
- void TestRunner::simulateWebNotificationClick(JSValueRef jsNotification)
- {
- uint64_t notificationID = [[mainFrame webView] _notificationIDForTesting:jsNotification];
- m_hasPendingWebNotificationClick = true;
- dispatch_async(dispatch_get_main_queue(), ^{
- if (!m_hasPendingWebNotificationClick)
- return;
- [[MockWebNotificationProvider shared] simulateWebNotificationClick:notificationID];
- m_hasPendingWebNotificationClick = false;
- });
- }
- void TestRunner::simulateLegacyWebNotificationClick(JSStringRef jsTitle)
- {
- }
|