summaryrefslogtreecommitdiff
path: root/Tools/WebKitTestRunner/TestController.h
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/WebKitTestRunner/TestController.h')
-rw-r--r--Tools/WebKitTestRunner/TestController.h264
1 files changed, 204 insertions, 60 deletions
diff --git a/Tools/WebKitTestRunner/TestController.h b/Tools/WebKitTestRunner/TestController.h
index 10031a176..cc753c297 100644
--- a/Tools/WebKitTestRunner/TestController.h
+++ b/Tools/WebKitTestRunner/TestController.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010, 2015-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -29,22 +29,28 @@
#include "GeolocationProviderMock.h"
#include "WebNotificationProvider.h"
#include "WorkQueueManager.h"
-#include <WebKit2/WKRetainPtr.h>
+#include <WebKit/WKRetainPtr.h>
#include <string>
#include <vector>
-#include <wtf/OwnPtr.h>
+#include <wtf/HashMap.h>
#include <wtf/Vector.h>
+#include <wtf/text/StringHash.h>
+
+OBJC_CLASS WKWebViewConfiguration;
namespace WTR {
class TestInvocation;
+class OriginSettings;
class PlatformWebView;
class EventSenderProxy;
+struct TestCommand;
+struct TestOptions;
// FIXME: Rename this TestRunner?
class TestController {
public:
- static TestController& shared();
+ static TestController& singleton();
static const unsigned viewWidth;
static const unsigned viewHeight;
@@ -52,29 +58,32 @@ public:
static const unsigned w3cSVGViewWidth;
static const unsigned w3cSVGViewHeight;
+ static const double defaultShortTimeout;
+ static const double noTimeout;
+
TestController(int argc, const char* argv[]);
~TestController();
bool verbose() const { return m_verbose; }
- WKStringRef injectedBundlePath() { return m_injectedBundlePath.get(); }
- WKStringRef testPluginDirectory() { return m_testPluginDirectory.get(); }
+ WKStringRef injectedBundlePath() const { return m_injectedBundlePath.get(); }
+ WKStringRef testPluginDirectory() const { return m_testPluginDirectory.get(); }
PlatformWebView* mainWebView() { return m_mainWebView.get(); }
WKContextRef context() { return m_context.get(); }
EventSenderProxy* eventSenderProxy() { return m_eventSenderProxy.get(); }
- void ensureViewSupportsOptions(WKDictionaryRef options);
bool shouldUseRemoteLayerTree() const { return m_shouldUseRemoteLayerTree; }
// Runs the run loop until `done` is true or the timeout elapses.
- enum TimeoutDuration { ShortTimeout, LongTimeout, NoTimeout, CustomTimeout };
bool useWaitToDumpWatchdogTimer() { return m_useWaitToDumpWatchdogTimer; }
- void runUntil(bool& done, TimeoutDuration);
+ void runUntil(bool& done, double timeoutSeconds);
void notifyDone();
- int getCustomTimeout();
+ bool shouldShowWebView() const { return m_shouldShowWebView; }
+ bool usingServerMode() const { return m_usingServerMode; }
+ void configureViewForTest(const TestInvocation&);
bool beforeUnloadReturnValue() const { return m_beforeUnloadReturnValue; }
void setBeforeUnloadReturnValue(bool value) { m_beforeUnloadReturnValue = value; }
@@ -86,27 +95,75 @@ public:
void setMockGeolocationPosition(double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed);
void setMockGeolocationPositionUnavailableError(WKStringRef errorMessage);
void handleGeolocationPermissionRequest(WKGeolocationPermissionRequestRef);
+ bool isGeolocationProviderActive() const;
+
+ // MediaStream.
+ String saltForOrigin(WKFrameRef, String);
+ void getUserMediaInfoForOrigin(WKFrameRef, WKStringRef originKey, bool&, WKRetainPtr<WKStringRef>&);
+ WKStringRef getUserMediaSaltForOrigin(WKFrameRef, WKStringRef originKey);
+ void setUserMediaPermission(bool);
+ void setUserMediaPersistentPermissionForOrigin(bool, WKStringRef userMediaDocumentOriginString, WKStringRef topLevelDocumentOriginString);
+ void handleUserMediaPermissionRequest(WKFrameRef, WKSecurityOriginRef, WKSecurityOriginRef, WKUserMediaPermissionRequestRef);
+ void handleCheckOfUserMediaPermissionForOrigin(WKFrameRef, WKSecurityOriginRef, WKSecurityOriginRef, const WKUserMediaPermissionCheckRef&);
+ OriginSettings& settingsForOrigin(const String&);
+ unsigned userMediaPermissionRequestCountForOrigin(WKStringRef userMediaDocumentOriginString, WKStringRef topLevelDocumentOriginString);
+ void resetUserMediaPermissionRequestCountForOrigin(WKStringRef userMediaDocumentOriginString, WKStringRef topLevelDocumentOriginString);
// Policy delegate.
void setCustomPolicyDelegate(bool enabled, bool permissive);
// Page Visibility.
- void setVisibilityState(WKPageVisibilityState, bool isInitialState);
+ void setHidden(bool);
+
+ unsigned imageCountInGeneralPasteboard() const;
+
+ bool resetStateToConsistentValues(const TestOptions&);
+ void resetPreferencesToConsistentValues(const TestOptions&);
- bool resetStateToConsistentValues();
- void resetPreferencesToConsistentValues();
+ void terminateWebContentProcess();
+ void reattachPageToWebProcess();
+
+ static const char* webProcessName();
+ static const char* networkProcessName();
+ static const char* databaseProcessName();
WorkQueueManager& workQueueManager() { return m_workQueueManager; }
+ void setRejectsProtectionSpaceAndContinueForAuthenticationChallenges(bool value) { m_rejectsProtectionSpaceAndContinueForAuthenticationChallenges = value; }
void setHandlesAuthenticationChallenges(bool value) { m_handlesAuthenticationChallenges = value; }
void setAuthenticationUsername(String username) { m_authenticationUsername = username; }
void setAuthenticationPassword(String password) { m_authenticationPassword = password; }
void setBlockAllPlugins(bool shouldBlock) { m_shouldBlockAllPlugins = shouldBlock; }
+ void setShouldLogHistoryClientCallbacks(bool shouldLog) { m_shouldLogHistoryClientCallbacks = shouldLog; }
+ void setShouldLogCanAuthenticateAgainstProtectionSpace(bool shouldLog) { m_shouldLogCanAuthenticateAgainstProtectionSpace = shouldLog; }
+
+ bool isCurrentInvocation(TestInvocation* invocation) const { return invocation == m_currentInvocation.get(); }
+
+ void setShouldDecideNavigationPolicyAfterDelay(bool value) { m_shouldDecideNavigationPolicyAfterDelay = value; }
+
+ void setNavigationGesturesEnabled(bool value);
+ void setIgnoresViewportScaleLimits(bool);
+
+ void setShouldDownloadUndisplayableMIMETypes(bool value) { m_shouldDownloadUndisplayableMIMETypes = value; }
+
+ void setStatisticsPrevalentResource(WKStringRef hostName, bool value);
+ bool isStatisticsPrevalentResource(WKStringRef hostName);
+ void setStatisticsHasHadUserInteraction(WKStringRef hostName, bool value);
+ bool isStatisticsHasHadUserInteraction(WKStringRef hostName);
+ void setStatisticsTimeToLiveUserInteraction(double seconds);
+ void statisticsFireDataModificationHandler();
+ void setStatisticsNotifyPagesWhenDataRecordsWereScanned(bool);
+ void setStatisticsShouldClassifyResourcesBeforeDataRecordsRemoval(bool);
+ void setStatisticsMinimumTimeBetweeenDataRecordsRemoval(double);
+ void statisticsResetToConsistentState();
+
private:
+ WKRetainPtr<WKPageConfigurationRef> generatePageConfiguration(WKContextConfigurationRef);
+ WKRetainPtr<WKContextConfigurationRef> generateContextConfiguration() const;
void initialize(int argc, const char* argv[]);
- void createWebViewWithOptions(WKDictionaryRef);
+ void createWebViewWithOptions(const TestOptions&);
void run();
void runTestingServerLoop();
@@ -114,34 +171,87 @@ private:
void platformInitialize();
void platformDestroy();
+ WKContextRef platformAdjustContext(WKContextRef, WKContextConfigurationRef);
void platformInitializeContext();
+ void platformCreateWebView(WKPageConfigurationRef, const TestOptions&);
+ static PlatformWebView* platformCreateOtherPage(PlatformWebView* parentView, WKPageConfigurationRef, const TestOptions&);
+ void platformResetPreferencesToConsistentValues();
+ void platformResetStateToConsistentValues();
+#if PLATFORM(COCOA)
+ void cocoaResetStateToConsistentValues();
+#endif
+ void platformConfigureViewForTest(const TestInvocation&);
+ void platformWillRunTest(const TestInvocation&);
void platformRunUntil(bool& done, double timeout);
void platformDidCommitLoadForFrame(WKPageRef, WKFrameRef);
+ WKPreferencesRef platformPreferences();
void initializeInjectedBundlePath();
void initializeTestPluginDirectory();
+ void ensureViewSupportsOptionsForTest(const TestInvocation&);
+ TestOptions testOptionsForTest(const TestCommand&) const;
+ void updatePlatformSpecificTestOptionsForTest(TestOptions&, const std::string& pathOrURL) const;
+
+ void updateWebViewSizeForTest(const TestInvocation&);
+ void updateWindowScaleForTest(PlatformWebView*, const TestInvocation&);
+
void decidePolicyForGeolocationPermissionRequestIfPossible();
+ void decidePolicyForUserMediaPermissionRequestIfPossible();
// WKContextInjectedBundleClient
static void didReceiveMessageFromInjectedBundle(WKContextRef, WKStringRef messageName, WKTypeRef messageBody, const void*);
static void didReceiveSynchronousMessageFromInjectedBundle(WKContextRef, WKStringRef messageName, WKTypeRef messageBody, WKTypeRef* returnData, const void*);
+ static WKTypeRef getInjectedBundleInitializationUserData(WKContextRef, const void *clientInfo);
+
+ // WKPageInjectedBundleClient
+ static void didReceivePageMessageFromInjectedBundle(WKPageRef, WKStringRef messageName, WKTypeRef messageBody, const void*);
+ static void didReceiveSynchronousPageMessageFromInjectedBundle(WKPageRef, WKStringRef messageName, WKTypeRef messageBody, WKTypeRef* returnData, const void*);
void didReceiveMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody);
WKRetainPtr<WKTypeRef> didReceiveSynchronousMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody);
+ WKRetainPtr<WKTypeRef> getInjectedBundleInitializationUserData();
void didReceiveKeyDownMessageFromInjectedBundle(WKDictionaryRef messageBodyDictionary, bool synchronous);
- // WKPageLoaderClient
- static void didCommitLoadForFrame(WKPageRef, WKFrameRef, WKTypeRef userData, const void*);
- void didCommitLoadForFrame(WKPageRef, WKFrameRef);
+ // WKContextClient
+ static void networkProcessDidCrash(WKContextRef, const void*);
+ void networkProcessDidCrash();
+ static void databaseProcessDidCrash(WKContextRef, const void*);
+ void databaseProcessDidCrash();
- static void didFinishLoadForFrame(WKPageRef, WKFrameRef, WKTypeRef userData, const void*);
- void didFinishLoadForFrame(WKPageRef, WKFrameRef);
+ // WKPageNavigationClient
+ static void didCommitNavigation(WKPageRef, WKNavigationRef, WKTypeRef userData, const void*);
+ void didCommitNavigation(WKPageRef, WKNavigationRef);
+ static void didFinishNavigation(WKPageRef, WKNavigationRef, WKTypeRef userData, const void*);
+ void didFinishNavigation(WKPageRef, WKNavigationRef);
+
+
+ // WKContextDownloadClient
+ static void downloadDidStart(WKContextRef, WKDownloadRef, const void*);
+ void downloadDidStart(WKContextRef, WKDownloadRef);
+ static WKStringRef decideDestinationWithSuggestedFilename(WKContextRef, WKDownloadRef, WKStringRef filename, bool* allowOverwrite, const void *clientInfo);
+ WKStringRef decideDestinationWithSuggestedFilename(WKContextRef, WKDownloadRef, WKStringRef filename, bool*& allowOverwrite);
+ static void downloadDidFinish(WKContextRef, WKDownloadRef, const void*);
+ void downloadDidFinish(WKContextRef, WKDownloadRef);
+ static void downloadDidFail(WKContextRef, WKDownloadRef, WKErrorRef, const void*);
+ void downloadDidFail(WKContextRef, WKDownloadRef, WKErrorRef);
+ static void downloadDidCancel(WKContextRef, WKDownloadRef, const void*);
+ void downloadDidCancel(WKContextRef, WKDownloadRef);
+
static void processDidCrash(WKPageRef, const void* clientInfo);
void processDidCrash();
- static WKPluginLoadPolicy pluginLoadPolicy(WKPageRef, WKPluginLoadPolicy currentPluginLoadPolicy, WKDictionaryRef pluginInformation, WKStringRef* unavailabilityDescription, const void* clientInfo);
- WKPluginLoadPolicy pluginLoadPolicy(WKPageRef, WKPluginLoadPolicy currentPluginLoadPolicy, WKDictionaryRef pluginInformation, WKStringRef* unavailabilityDescription);
+ static void didBeginNavigationGesture(WKPageRef, const void*);
+ static void willEndNavigationGesture(WKPageRef, WKBackForwardListItemRef, const void*);
+ static void didEndNavigationGesture(WKPageRef, WKBackForwardListItemRef, const void*);
+ static void didRemoveNavigationGestureSnapshot(WKPageRef, const void*);
+ void didBeginNavigationGesture(WKPageRef);
+ void willEndNavigationGesture(WKPageRef, WKBackForwardListItemRef);
+ void didEndNavigationGesture(WKPageRef, WKBackForwardListItemRef);
+ void didRemoveNavigationGestureSnapshot(WKPageRef);
+
+ static WKPluginLoadPolicy decidePolicyForPluginLoad(WKPageRef, WKPluginLoadPolicy currentPluginLoadPolicy, WKDictionaryRef pluginInformation, WKStringRef* unavailabilityDescription, const void* clientInfo);
+ WKPluginLoadPolicy decidePolicyForPluginLoad(WKPageRef, WKPluginLoadPolicy currentPluginLoadPolicy, WKDictionaryRef pluginInformation, WKStringRef* unavailabilityDescription);
static void decidePolicyForNotificationPermissionRequest(WKPageRef, WKSecurityOriginRef, WKNotificationPermissionRequestRef, const void*);
@@ -149,40 +259,54 @@ private:
static void unavailablePluginButtonClicked(WKPageRef, WKPluginUnavailabilityReason, WKDictionaryRef, const void*);
- static void didReceiveAuthenticationChallengeInFrame(WKPageRef, WKFrameRef, WKAuthenticationChallengeRef, const void *clientInfo);
- void didReceiveAuthenticationChallengeInFrame(WKPageRef, WKFrameRef, WKAuthenticationChallengeRef);
+ static bool canAuthenticateAgainstProtectionSpace(WKPageRef, WKProtectionSpaceRef, const void*);
+ bool canAuthenticateAgainstProtectionSpace(WKPageRef, WKProtectionSpaceRef);
+
+ static void didReceiveAuthenticationChallenge(WKPageRef, WKAuthenticationChallengeRef, const void*);
+ void didReceiveAuthenticationChallenge(WKPageRef, WKAuthenticationChallengeRef);
- // WKPagePolicyClient
- static void decidePolicyForNavigationAction(WKPageRef, WKFrameRef, WKFrameNavigationType, WKEventModifiers, WKEventMouseButton, WKFrameRef, WKURLRequestRef, WKFramePolicyListenerRef, WKTypeRef, const void*);
+ static void decidePolicyForNavigationAction(WKPageRef, WKNavigationActionRef, WKFramePolicyListenerRef, WKTypeRef, const void*);
void decidePolicyForNavigationAction(WKFramePolicyListenerRef);
- static void decidePolicyForResponse(WKPageRef, WKFrameRef, WKURLResponseRef, WKURLRequestRef, bool canShowMIMEType, WKFramePolicyListenerRef, WKTypeRef, const void*);
- void decidePolicyForResponse(WKFrameRef, WKURLResponseRef, WKFramePolicyListenerRef);
+ static void decidePolicyForNavigationResponse(WKPageRef, WKNavigationResponseRef, WKFramePolicyListenerRef, WKTypeRef, const void*);
+ void decidePolicyForNavigationResponse(WKNavigationResponseRef, WKFramePolicyListenerRef);
+
+ // WKContextHistoryClient
+ static void didNavigateWithNavigationData(WKContextRef, WKPageRef, WKNavigationDataRef, WKFrameRef, const void*);
+ void didNavigateWithNavigationData(WKNavigationDataRef, WKFrameRef);
+
+ static void didPerformClientRedirect(WKContextRef, WKPageRef, WKURLRef sourceURL, WKURLRef destinationURL, WKFrameRef, const void*);
+ void didPerformClientRedirect(WKURLRef sourceURL, WKURLRef destinationURL, WKFrameRef);
- static WKPageRef createOtherPage(WKPageRef oldPage, WKURLRequestRef, WKDictionaryRef, WKEventModifiers, WKEventMouseButton, const void*);
+ static void didPerformServerRedirect(WKContextRef, WKPageRef, WKURLRef sourceURL, WKURLRef destinationURL, WKFrameRef, const void*);
+ void didPerformServerRedirect(WKURLRef sourceURL, WKURLRef destinationURL, WKFrameRef);
+
+ static void didUpdateHistoryTitle(WKContextRef, WKPageRef, WKStringRef title, WKURLRef, WKFrameRef, const void*);
+ void didUpdateHistoryTitle(WKStringRef title, WKURLRef, WKFrameRef);
+
+ static WKPageRef createOtherPage(WKPageRef, WKPageConfigurationRef, WKNavigationActionRef, WKWindowFeaturesRef, const void*);
static void runModal(WKPageRef, const void* clientInfo);
static void runModal(PlatformWebView*);
- void setHidden(bool);
-
static const char* libraryPathForTesting();
static const char* platformLibraryPathForTesting();
- OwnPtr<TestInvocation> m_currentInvocation;
+ std::unique_ptr<TestInvocation> m_currentInvocation;
- bool m_verbose;
- bool m_printSeparators;
- bool m_usingServerMode;
- bool m_gcBetweenTests;
- bool m_shouldDumpPixelsForAllTests;
+ bool m_verbose { false };
+ bool m_printSeparators { false };
+ bool m_usingServerMode { false };
+ bool m_gcBetweenTests { false };
+ bool m_shouldDumpPixelsForAllTests { false };
std::vector<std::string> m_paths;
+ std::vector<std::string> m_allowedHosts;
WKRetainPtr<WKStringRef> m_injectedBundlePath;
WKRetainPtr<WKStringRef> m_testPluginDirectory;
WebNotificationProvider m_webNotificationProvider;
- OwnPtr<PlatformWebView> m_mainWebView;
+ std::unique_ptr<PlatformWebView> m_mainWebView;
WKRetainPtr<WKContextRef> m_context;
WKRetainPtr<WKPageGroupRef> m_pageGroup;
@@ -191,45 +315,65 @@ private:
Resetting,
RunningTest
};
- State m_state;
- bool m_doneResetting;
+ State m_state { Initial };
+ bool m_doneResetting { false };
- double m_longTimeout;
- double m_shortTimeout;
- double m_noTimeout;
- bool m_useWaitToDumpWatchdogTimer;
- bool m_forceNoTimeout;
+ bool m_useWaitToDumpWatchdogTimer { true };
+ bool m_forceNoTimeout { false };
- int m_timeout;
-
- bool m_didPrintWebProcessCrashedMessage;
- bool m_shouldExitWhenWebProcessCrashes;
+ bool m_didPrintWebProcessCrashedMessage { false };
+ bool m_shouldExitWhenWebProcessCrashes { true };
- bool m_beforeUnloadReturnValue;
+ bool m_beforeUnloadReturnValue { true };
- OwnPtr<GeolocationProviderMock> m_geolocationProvider;
+ std::unique_ptr<GeolocationProviderMock> m_geolocationProvider;
Vector<WKRetainPtr<WKGeolocationPermissionRequestRef> > m_geolocationPermissionRequests;
- bool m_isGeolocationPermissionSet;
- bool m_isGeolocationPermissionAllowed;
+ bool m_isGeolocationPermissionSet { false };
+ bool m_isGeolocationPermissionAllowed { false };
+
+ HashMap<String, RefPtr<OriginSettings>> m_cachedUserMediaPermissions;
+
+ typedef Vector<std::pair<String, WKRetainPtr<WKUserMediaPermissionRequestRef>>> PermissionRequestList;
+ PermissionRequestList m_userMediaPermissionRequests;
+
+ bool m_isUserMediaPermissionSet { false };
+ bool m_isUserMediaPermissionAllowed { false };
- bool m_policyDelegateEnabled;
- bool m_policyDelegatePermissive;
+ bool m_policyDelegateEnabled { false };
+ bool m_policyDelegatePermissive { false };
+ bool m_shouldDownloadUndisplayableMIMETypes { false };
- bool m_handlesAuthenticationChallenges;
+ bool m_rejectsProtectionSpaceAndContinueForAuthenticationChallenges { false };
+ bool m_handlesAuthenticationChallenges { false };
String m_authenticationUsername;
String m_authenticationPassword;
- bool m_shouldBlockAllPlugins;
+ bool m_shouldBlockAllPlugins { false };
- bool m_forceComplexText;
- bool m_shouldUseAcceleratedDrawing;
- bool m_shouldUseRemoteLayerTree;
+ bool m_forceComplexText { false };
+ bool m_shouldUseAcceleratedDrawing { false };
+ bool m_shouldUseRemoteLayerTree { false };
- OwnPtr<EventSenderProxy> m_eventSenderProxy;
+ bool m_shouldLogCanAuthenticateAgainstProtectionSpace { false };
+ bool m_shouldLogHistoryClientCallbacks { false };
+ bool m_shouldShowWebView { false };
+
+ bool m_shouldDecideNavigationPolicyAfterDelay { false };
+
+ std::unique_ptr<EventSenderProxy> m_eventSenderProxy;
WorkQueueManager m_workQueueManager;
};
+struct TestCommand {
+ std::string pathOrURL;
+ std::string absolutePath;
+ bool shouldDumpPixels { false };
+ std::string expectedPixelHash;
+ int timeout { 0 };
+ bool dumpJSConsoleLogInStdErr { false };
+};
+
} // namespace WTR
#endif // TestController_h