diff options
Diffstat (limited to 'Tools/DumpRenderTree/mac/TestRunnerMac.mm')
-rw-r--r-- | Tools/DumpRenderTree/mac/TestRunnerMac.mm | 1119 |
1 files changed, 0 insertions, 1119 deletions
diff --git a/Tools/DumpRenderTree/mac/TestRunnerMac.mm b/Tools/DumpRenderTree/mac/TestRunnerMac.mm deleted file mode 100644 index a7d07de46..000000000 --- a/Tools/DumpRenderTree/mac/TestRunnerMac.mm +++ /dev/null @@ -1,1119 +0,0 @@ -/* - * 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) -{ -} - |