/* * Copyright (C) 2010-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 * 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. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. */ #pragma once #include "JSWrappable.h" #include "StringFunctions.h" #include "WhatToDump.h" #include #include #include #include #include #include #include namespace WTR { class TestRunner : public JSWrappable { public: static Ref create(); virtual ~TestRunner(); // JSWrappable virtual JSClassRef wrapperClass(); void makeWindowObject(JSContextRef); bool isIOSFamily() const { #if PLATFORM(IOS_FAMILY) return true; #else return false; #endif } bool isWebKit2() const { return true; } // The basics. WKURLRef testURL() const { return m_testURL.get(); } void setTestURL(WKURLRef url) { m_testURL = url; } void dumpAsText(bool dumpPixels); void waitForPolicyDelegate(); void dumpChildFramesAsText() { setWhatToDump(WhatToDump::AllFramesText); } void waitUntilDownloadFinished(); void waitUntilDone(); void notifyDone(); double preciseTime(); double timeout() { return m_timeout.milliseconds(); } void setRenderTreeDumpOptions(unsigned short); unsigned renderTreeDumpOptions() const { return m_renderTreeDumpOptions; } // Other dumping. void dumpBackForwardList() { m_shouldDumpBackForwardListsForAllWindows = true; } void dumpChildFrameScrollPositions() { m_shouldDumpAllFrameScrollPositions = true; } void dumpEditingCallbacks() { m_dumpEditingCallbacks = true; } void dumpSelectionRect() { m_dumpSelectionRect = true; } void dumpStatusCallbacks() { m_dumpStatusCallbacks = true; } void dumpTitleChanges() { m_dumpTitleChanges = true; } void dumpFullScreenCallbacks() { m_dumpFullScreenCallbacks = true; } void dumpFrameLoadCallbacks() { setShouldDumpFrameLoadCallbacks(true); } void dumpProgressFinishedCallback() { setShouldDumpProgressFinishedCallback(true); } void dumpResourceLoadCallbacks() { m_dumpResourceLoadCallbacks = true; } void dumpResourceResponseMIMETypes() { m_dumpResourceResponseMIMETypes = true; } void dumpWillCacheResponse() { m_dumpWillCacheResponse = true; } void dumpApplicationCacheDelegateCallbacks() { m_dumpApplicationCacheDelegateCallbacks = true; } void dumpDatabaseCallbacks() { m_dumpDatabaseCallbacks = true; } void dumpDOMAsWebArchive() { setWhatToDump(WhatToDump::DOMAsWebArchive); } void dumpPolicyDelegateCallbacks() { m_dumpPolicyCallbacks = true; } void dumpResourceLoadStatistics(); void setShouldDumpFrameLoadCallbacks(bool value); void setShouldDumpProgressFinishedCallback(bool value) { m_dumpProgressFinishedCallback = value; } // Special options. void keepWebHistory(); void setAcceptsEditing(bool value) { m_shouldAllowEditing = value; } void setCanOpenWindows(); void setCloseRemainingWindowsWhenComplete(bool value) { m_shouldCloseExtraWindows = value; } void setCustomPolicyDelegate(bool enabled, bool permissive = false); void addOriginAccessAllowListEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains); void removeOriginAccessAllowListEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains); void setUserStyleSheetEnabled(bool); void setUserStyleSheetLocation(JSStringRef); void setTabKeyCyclesThroughElements(bool); void setSerializeHTTPLoads(); void dispatchPendingLoadRequests(); void setCacheModel(int); void setAsynchronousSpellCheckingEnabled(bool); void setAllowsAnySSLCertificate(bool); void setShouldSwapToEphemeralSessionOnNextNavigation(bool); void setShouldSwapToDefaultSessionOnNextNavigation(bool); void setCustomUserAgent(JSStringRef); // Special DOM functions. void clearBackForwardList(); void execCommand(JSStringRef name, JSStringRef showUI, JSStringRef value); bool isCommandEnabled(JSStringRef name); unsigned windowCount(); // Repaint testing. void testRepaint() { m_testRepaint = true; } void repaintSweepHorizontally() { m_testRepaintSweepHorizontally = true; } void display(); void displayAndTrackRepaints(); void displayOnLoadFinish() { m_displayOnLoadFinish = true; } bool shouldDisplayOnLoadFinish() { return m_displayOnLoadFinish; } // UserContent testing. void addUserScript(JSStringRef source, bool runAtStart, bool allFrames); void addUserStyleSheet(JSStringRef source, bool allFrames); // Text search testing. bool findString(JSStringRef, JSValueRef optionsArray); void findStringMatchesInPage(JSStringRef, JSValueRef optionsArray); void replaceFindMatchesAtIndices(JSValueRef matchIndices, JSStringRef replacementText, bool selectionOnly); // Local storage void clearAllDatabases(); void setDatabaseQuota(uint64_t); JSRetainPtr pathToLocalResource(JSStringRef); void syncLocalStorage(); // Application Cache void clearAllApplicationCaches(); void clearApplicationCacheForOrigin(JSStringRef origin); void setAppCacheMaximumSize(uint64_t); long long applicationCacheDiskUsageForOrigin(JSStringRef origin); void disallowIncreaseForApplicationCacheQuota(); bool shouldDisallowIncreaseForApplicationCacheQuota() { return m_disallowIncreaseForApplicationCacheQuota; } JSValueRef originsWithApplicationCache(); void clearDOMCache(JSStringRef origin); void clearDOMCaches(); bool hasDOMCache(JSStringRef origin); uint64_t domCacheSize(JSStringRef origin); void setAllowStorageQuotaIncrease(bool); // Failed load condition testing void forceImmediateCompletion(); // Printing bool isPageBoxVisible(int pageIndex); bool isPrinting() { return m_isPrinting; } void setPrinting() { m_isPrinting = true; } // Authentication void setRejectsProtectionSpaceAndContinueForAuthenticationChallenges(bool); void setHandlesAuthenticationChallenges(bool); void setShouldLogCanAuthenticateAgainstProtectionSpace(bool); void setAuthenticationUsername(JSStringRef); void setAuthenticationPassword(JSStringRef); void setValueForUser(JSContextRef, JSValueRef element, JSStringRef value); // Audio testing. void setAudioResult(JSContextRef, JSValueRef data); void setBlockAllPlugins(bool); void setPluginSupportedMode(JSStringRef); WhatToDump whatToDump() const; void setWhatToDump(WhatToDump); bool shouldDumpAllFrameScrollPositions() const { return m_shouldDumpAllFrameScrollPositions; } bool shouldDumpBackForwardListsForAllWindows() const { return m_shouldDumpBackForwardListsForAllWindows; } bool shouldDumpEditingCallbacks() const { return m_dumpEditingCallbacks; } bool shouldDumpMainFrameScrollPosition() const { return whatToDump() == WhatToDump::RenderTree; } bool shouldDumpStatusCallbacks() const { return m_dumpStatusCallbacks; } bool shouldDumpTitleChanges() const { return m_dumpTitleChanges; } bool shouldDumpPixels() const; bool shouldDumpFullScreenCallbacks() const { return m_dumpFullScreenCallbacks; } bool shouldDumpFrameLoadCallbacks(); bool shouldDumpProgressFinishedCallback() const { return m_dumpProgressFinishedCallback; } bool shouldDumpResourceLoadCallbacks() const { return m_dumpResourceLoadCallbacks; } bool shouldDumpResourceResponseMIMETypes() const { return m_dumpResourceResponseMIMETypes; } bool shouldDumpWillCacheResponse() const { return m_dumpWillCacheResponse; } bool shouldDumpApplicationCacheDelegateCallbacks() const { return m_dumpApplicationCacheDelegateCallbacks; } bool shouldDumpDatabaseCallbacks() const { return m_dumpDatabaseCallbacks; } bool shouldDumpSelectionRect() const { return m_dumpSelectionRect; } bool shouldDumpPolicyCallbacks() const { return m_dumpPolicyCallbacks; } bool isPolicyDelegateEnabled() const { return m_policyDelegateEnabled; } bool isPolicyDelegatePermissive() const { return m_policyDelegatePermissive; } bool didReceiveServerRedirectForProvisionalNavigation() const; void clearDidReceiveServerRedirectForProvisionalNavigation(); bool shouldWaitUntilDone() const; // Downloads bool shouldFinishAfterDownload() const { return m_shouldFinishAfterDownload; } void setShouldLogDownloadCallbacks(bool); bool shouldAllowEditing() const { return m_shouldAllowEditing; } bool shouldCloseExtraWindowsAfterRunningTest() const { return m_shouldCloseExtraWindows; } void evaluateScriptInIsolatedWorld(JSContextRef, unsigned worldID, JSStringRef script); static unsigned worldIDForWorld(WKBundleScriptWorldRef); void showWebInspector(); void closeWebInspector(); void evaluateInWebInspector(JSStringRef script); JSRetainPtr inspectorTestStubURL(); void setPOSIXLocale(JSStringRef); bool willSendRequestReturnsNull() const { return m_willSendRequestReturnsNull; } void setWillSendRequestReturnsNull(bool f) { m_willSendRequestReturnsNull = f; } bool willSendRequestReturnsNullOnRedirect() const { return m_willSendRequestReturnsNullOnRedirect; } void setWillSendRequestReturnsNullOnRedirect(bool f) { m_willSendRequestReturnsNullOnRedirect = f; } void setWillSendRequestAddsHTTPBody(JSStringRef body) { m_willSendRequestHTTPBody = toWTFString(body); } String willSendRequestHTTPBody() const { return m_willSendRequestHTTPBody; } void setTextDirection(JSStringRef); void setShouldStayOnPageAfterHandlingBeforeUnload(bool); void setStopProvisionalFrameLoads() { m_shouldStopProvisionalFrameLoads = true; } bool shouldStopProvisionalFrameLoads() const { return m_shouldStopProvisionalFrameLoads; } bool globalFlag() const { return m_globalFlag; } void setGlobalFlag(bool value) { m_globalFlag = value; } double databaseDefaultQuota() const { return m_databaseDefaultQuota; } void setDatabaseDefaultQuota(double quota) { m_databaseDefaultQuota = quota; } double databaseMaxQuota() const { return m_databaseMaxQuota; } void setDatabaseMaxQuota(double quota) { m_databaseMaxQuota = quota; } void addChromeInputField(JSValueRef); void removeChromeInputField(JSValueRef); void focusWebView(JSValueRef); void setTextInChromeInputField(JSStringRef text, JSValueRef callback); void selectChromeInputField(JSValueRef callback); void getSelectedTextInChromeInputField(JSValueRef callback); void setBackingScaleFactor(double, JSValueRef); void setWindowIsKey(bool); void setViewSize(double width, double height); void callAddChromeInputFieldCallback(); void callRemoveChromeInputFieldCallback(); void callFocusWebViewCallback(); void callSetBackingScaleFactorCallback(); void callSetTextInChromeInputFieldCallback(); void callSelectChromeInputFieldCallback(); void callGetSelectedTextInChromeInputFieldCallback(JSStringRef); static void overridePreference(JSStringRef preference, JSStringRef value); // Cookies testing void setAlwaysAcceptCookies(bool); void setOnlyAcceptFirstPartyCookies(bool); // Custom full screen behavior. void setHasCustomFullScreenBehavior(bool value) { m_customFullScreenBehavior = value; } bool hasCustomFullScreenBehavior() const { return m_customFullScreenBehavior; } void setEnterFullscreenForElementCallback(JSValueRef); void callEnterFullscreenForElementCallback(); void setExitFullscreenForElementCallback(JSValueRef); void callExitFullscreenForElementCallback(); // Web notifications. static void grantWebNotificationPermission(JSStringRef origin); static void denyWebNotificationPermission(JSStringRef origin); static void removeAllWebNotificationPermissions(); static void simulateWebNotificationClick(JSValueRef notification); // Geolocation. void setGeolocationPermission(bool); void setMockGeolocationPosition(double latitude, double longitude, double accuracy, std::optional altitude, std::optional altitudeAccuracy, std::optional heading, std::optional speed, std::optional floorLevel); void setMockGeolocationPositionUnavailableError(JSStringRef message); bool isGeolocationProviderActive(); // MediaStream void setUserMediaPermission(bool); void resetUserMediaPermission(); void setUserMediaPersistentPermissionForOrigin(bool permission, JSStringRef origin, JSStringRef parentOrigin); unsigned userMediaPermissionRequestCountForOrigin(JSStringRef origin, JSStringRef parentOrigin) const; void resetUserMediaPermissionRequestCountForOrigin(JSStringRef origin, JSStringRef parentOrigin); bool isDoingMediaCapture() const; void setPageVisibility(JSStringRef state); void resetPageVisibility(); bool callShouldCloseOnWebView(); void setCustomTimeout(WTF::Seconds duration) { m_timeout = duration; } // Work queue. void queueBackNavigation(unsigned howFarBackward); void queueForwardNavigation(unsigned howFarForward); void queueLoad(JSStringRef url, JSStringRef target, bool shouldOpenExternalURLs); void queueLoadHTMLString(JSStringRef content, JSStringRef baseURL, JSStringRef unreachableURL); void queueReload(); void queueLoadingScript(JSStringRef script); void queueNonLoadingScript(JSStringRef script); bool secureEventInputIsEnabled() const; JSValueRef failNextNewCodeBlock(); JSValueRef numberOfDFGCompiles(JSValueRef function); JSValueRef neverInlineFunction(JSValueRef function); bool shouldDecideNavigationPolicyAfterDelay() const { return m_shouldDecideNavigationPolicyAfterDelay; } void setShouldDecideNavigationPolicyAfterDelay(bool); bool shouldDecideResponsePolicyAfterDelay() const { return m_shouldDecideResponsePolicyAfterDelay; } void setShouldDecideResponsePolicyAfterDelay(bool); void setNavigationGesturesEnabled(bool); void setIgnoresViewportScaleLimits(bool); void setShouldDownloadUndisplayableMIMETypes(bool); void setShouldAllowDeviceOrientationAndMotionAccess(bool); bool didCancelClientRedirect() const { return m_didCancelClientRedirect; } void setDidCancelClientRedirect(bool value) { m_didCancelClientRedirect = value; } void runUIScript(JSStringRef script, JSValueRef callback); void runUIScriptImmediately(JSStringRef script, JSValueRef callback); void runUIScriptCallback(unsigned callbackID, JSStringRef result); // Contextual menu actions void setAllowedMenuActions(JSValueRef); void installCustomMenuAction(JSStringRef name, bool dismissesAutomatically, JSValueRef callback); void performCustomMenuAction(); void installDidBeginSwipeCallback(JSValueRef); void installWillEndSwipeCallback(JSValueRef); void installDidEndSwipeCallback(JSValueRef); void installDidRemoveSwipeSnapshotCallback(JSValueRef); void callDidBeginSwipeCallback(); void callWillEndSwipeCallback(); void callDidEndSwipeCallback(); void callDidRemoveSwipeSnapshotCallback(); void clearTestRunnerCallbacks(); void accummulateLogsForChannel(JSStringRef channel); unsigned imageCountInGeneralPasteboard() const; // Gamepads void connectMockGamepad(unsigned index); void disconnectMockGamepad(unsigned index); void setMockGamepadDetails(unsigned index, JSStringRef gamepadID, JSStringRef mapping, unsigned axisCount, unsigned buttonCount); void setMockGamepadAxisValue(unsigned index, unsigned axisIndex, double value); void setMockGamepadButtonValue(unsigned index, unsigned buttonIndex, double value); // Resource Load Statistics void clearStatisticsDataForDomain(JSStringRef domain); bool doesStatisticsDomainIDExistInDatabase(unsigned domainID); void setStatisticsEnabled(bool value); bool isStatisticsEphemeral(); void installStatisticsDidModifyDataRecordsCallback(JSValueRef callback); void installStatisticsDidScanDataRecordsCallback(JSValueRef callback); void statisticsDidModifyDataRecordsCallback(); void statisticsDidScanDataRecordsCallback(); bool statisticsNotifyObserver(); void statisticsProcessStatisticsAndDataRecords(); void statisticsUpdateCookieBlocking(JSValueRef completionHandler); void statisticsCallDidSetBlockCookiesForHostCallback(); void setStatisticsDebugMode(bool value, JSValueRef completionHandler); void statisticsCallDidSetDebugModeCallback(); void setStatisticsPrevalentResourceForDebugMode(JSStringRef hostName, JSValueRef completionHandler); void statisticsCallDidSetPrevalentResourceForDebugModeCallback(); void setStatisticsLastSeen(JSStringRef hostName, double seconds, JSValueRef completionHandler); void statisticsCallDidSetLastSeenCallback(); void setStatisticsMergeStatistic(JSStringRef hostName, JSStringRef topFrameDomain1, JSStringRef topFrameDomain2, double lastSeen, bool hadUserInteraction, double mostRecentUserInteraction, bool isGrandfathered, bool isPrevalent, bool isVeryPrevalent, unsigned dataRecordsRemoved, JSValueRef completionHandler); void statisticsCallDidSetMergeStatisticCallback(); void setStatisticsExpiredStatistic(JSStringRef hostName, unsigned numberOfOperatingDaysPassed, bool hadUserInteraction, bool isScheduledForAllButCookieDataRemoval, bool isPrevalent, JSValueRef completionHandler); void statisticsCallDidSetExpiredStatisticCallback(); void setStatisticsPrevalentResource(JSStringRef hostName, bool value, JSValueRef completionHandler); void statisticsCallDidSetPrevalentResourceCallback(); void setStatisticsVeryPrevalentResource(JSStringRef hostName, bool value, JSValueRef completionHandler); void statisticsCallDidSetVeryPrevalentResourceCallback(); bool isStatisticsPrevalentResource(JSStringRef hostName); bool isStatisticsVeryPrevalentResource(JSStringRef hostName); bool isStatisticsRegisteredAsSubresourceUnder(JSStringRef subresourceHost, JSStringRef topFrameHost); bool isStatisticsRegisteredAsSubFrameUnder(JSStringRef subFrameHost, JSStringRef topFrameHost); bool isStatisticsRegisteredAsRedirectingTo(JSStringRef hostRedirectedFrom, JSStringRef hostRedirectedTo); void setStatisticsHasHadUserInteraction(JSStringRef hostName, bool value, JSValueRef completionHandler); void statisticsCallDidSetHasHadUserInteractionCallback(); bool isStatisticsHasHadUserInteraction(JSStringRef hostName); bool isStatisticsOnlyInDatabaseOnce(JSStringRef subHost, JSStringRef topHost); void setStatisticsGrandfathered(JSStringRef hostName, bool value); bool isStatisticsGrandfathered(JSStringRef hostName); void setStatisticsSubframeUnderTopFrameOrigin(JSStringRef hostName, JSStringRef topFrameHostName); void setStatisticsSubresourceUnderTopFrameOrigin(JSStringRef hostName, JSStringRef topFrameHostName); void setStatisticsSubresourceUniqueRedirectTo(JSStringRef hostName, JSStringRef hostNameRedirectedTo); void setStatisticsSubresourceUniqueRedirectFrom(JSStringRef hostName, JSStringRef hostNameRedirectedFrom); void setStatisticsTopFrameUniqueRedirectTo(JSStringRef hostName, JSStringRef hostNameRedirectedTo); void setStatisticsTopFrameUniqueRedirectFrom(JSStringRef hostName, JSStringRef hostNameRedirectedFrom); void setStatisticsCrossSiteLoadWithLinkDecoration(JSStringRef fromHost, JSStringRef toHost); void setStatisticsTimeToLiveUserInteraction(double seconds); void setStatisticsNotifyPagesWhenDataRecordsWereScanned(bool); void setStatisticsIsRunningTest(bool); void setStatisticsShouldClassifyResourcesBeforeDataRecordsRemoval(bool); void setStatisticsMinimumTimeBetweenDataRecordsRemoval(double); void setStatisticsGrandfatheringTime(double seconds); void setStatisticsMaxStatisticsEntries(unsigned); void setStatisticsPruneEntriesDownTo(unsigned); void statisticsClearInMemoryAndPersistentStore(JSValueRef callback); void statisticsClearInMemoryAndPersistentStoreModifiedSinceHours(unsigned hours, JSValueRef callback); void statisticsClearThroughWebsiteDataRemoval(JSValueRef callback); void statisticsDeleteCookiesForHost(JSStringRef hostName, bool includeHttpOnlyCookies); void statisticsCallClearInMemoryAndPersistentStoreCallback(); void statisticsCallClearThroughWebsiteDataRemovalCallback(); bool isStatisticsHasLocalStorage(JSStringRef hostName); void setStatisticsCacheMaxAgeCap(double seconds); bool hasStatisticsIsolatedSession(JSStringRef hostName); void setStatisticsShouldDowngradeReferrer(bool, JSValueRef callback); void statisticsCallDidSetShouldDowngradeReferrerCallback(); void setStatisticsShouldBlockThirdPartyCookies(bool value, JSValueRef callback, bool onlyOnSitesWithoutUserInteraction); void statisticsCallDidSetShouldBlockThirdPartyCookiesCallback(); void setStatisticsFirstPartyWebsiteDataRemovalMode(bool value, JSValueRef callback); void statisticsCallDidSetFirstPartyWebsiteDataRemovalModeCallback(); void statisticsSetToSameSiteStrictCookies(JSStringRef hostName, JSValueRef callback); void statisticsCallDidSetToSameSiteStrictCookiesCallback(); void statisticsSetFirstPartyHostCNAMEDomain(JSStringRef firstPartyURLString, JSStringRef cnameURLString, JSValueRef completionHandler); void statisticsCallDidSetFirstPartyHostCNAMEDomainCallback(); void statisticsSetThirdPartyCNAMEDomain(JSStringRef cnameURLString, JSValueRef completionHandler); void statisticsCallDidSetThirdPartyCNAMEDomainCallback(); void statisticsResetToConsistentState(JSValueRef completionHandler); void statisticsCallDidResetToConsistentStateCallback(); void loadedSubresourceDomains(JSValueRef callback); void callDidReceiveLoadedSubresourceDomainsCallback(Vector&& domains); // Injected bundle form client. void installTextDidChangeInTextFieldCallback(JSValueRef callback); void textDidChangeInTextFieldCallback(); void installTextFieldDidBeginEditingCallback(JSValueRef callback); void textFieldDidBeginEditingCallback(); void installTextFieldDidEndEditingCallback(JSValueRef callback); void textFieldDidEndEditingCallback(); // Storage Access API void getAllStorageAccessEntries(JSValueRef callback); void callDidReceiveAllStorageAccessEntriesCallback(Vector& domains); // Open panel void setOpenPanelFiles(JSValueRef); void setOpenPanelFilesMediaIcon(JSValueRef); // Modal alerts void setShouldDismissJavaScriptAlertsAsynchronously(bool); void abortModal(); void terminateNetworkProcess(); void terminateServiceWorkers(); void setUseSeparateServiceWorkerProcess(bool); void removeAllSessionCredentials(JSValueRef); void callDidRemoveAllSessionCredentialsCallback(); void getApplicationManifestThen(JSValueRef); void didGetApplicationManifest(); void installFakeHelvetica(JSStringRef configuration); void dumpAllHTTPRedirectedResponseHeaders() { m_dumpAllHTTPRedirectedResponseHeaders = true; } bool shouldDumpAllHTTPRedirectedResponseHeaders() const { return m_dumpAllHTTPRedirectedResponseHeaders; } void addMockCameraDevice(JSStringRef persistentId, JSStringRef label); void addMockMicrophoneDevice(JSStringRef persistentId, JSStringRef label); void addMockScreenDevice(JSStringRef persistentId, JSStringRef label); void clearMockMediaDevices(); void removeMockMediaDevice(JSStringRef persistentId); void resetMockMediaDevices(); void setMockCameraOrientation(unsigned); bool isMockRealtimeMediaSourceCenterEnabled(); bool hasAppBoundSession(); void clearAppBoundSession(); void setAppBoundDomains(JSValueRef originArray, JSValueRef callback); void didSetAppBoundDomainsCallback(); bool didLoadAppInitiatedRequest(); bool didLoadNonAppInitiatedRequest(); size_t userScriptInjectedCount() const; void injectUserScript(JSStringRef); void sendDisplayConfigurationChangedMessageForTesting(); void setServiceWorkerFetchTimeout(double seconds); // FIXME(189876) void addTestKeyToKeychain(JSStringRef privateKeyBase64, JSStringRef attrLabel, JSStringRef applicationTagBase64); void cleanUpKeychain(JSStringRef attrLabel, JSStringRef applicationLabelBase64); bool keyExistsInKeychain(JSStringRef attrLabel, JSStringRef applicationLabelBase64); unsigned long serverTrustEvaluationCallbackCallsCount(); // Private Click Measurement. void dumpPrivateClickMeasurement(); void clearPrivateClickMeasurement(); void clearPrivateClickMeasurementsThroughWebsiteDataRemoval(); void setPrivateClickMeasurementOverrideTimerForTesting(bool value); void setPrivateClickMeasurementTokenPublicKeyURLForTesting(JSStringRef); void setPrivateClickMeasurementTokenSignatureURLForTesting(JSStringRef); void setPrivateClickMeasurementAttributionReportURLsForTesting(JSStringRef sourceURL, JSStringRef destinationURL); void markPrivateClickMeasurementsAsExpiredForTesting(); void markAttributedPrivateClickMeasurementsAsExpiredForTesting(); void setPrivateClickMeasurementFraudPreventionValuesForTesting(JSStringRef unlinkableToken, JSStringRef secretToken, JSStringRef signature, JSStringRef keyID); void simulateResourceLoadStatisticsSessionRestart(); void setIsSpeechRecognitionPermissionGranted(bool); void setIsMediaKeySystemPermissionGranted(bool); private: TestRunner(); void platformInitialize(); void setDumpPixels(bool); void setWaitUntilDone(bool); void addMockMediaDevice(JSStringRef persistentId, JSStringRef label, const char* type); WKRetainPtr m_testURL; // Set by InjectedBundlePage once provisional load starts. String m_willSendRequestHTTPBody; WTF::Seconds m_timeout { 30_s }; WKRetainPtr m_userStyleSheetLocation; WKRetainPtr m_allowedHosts; double m_databaseDefaultQuota { -1 }; double m_databaseMaxQuota { -1 }; size_t m_userMediaPermissionRequestCount { 0 }; unsigned m_renderTreeDumpOptions { 0 }; bool m_shouldDumpAllFrameScrollPositions { false }; bool m_shouldDumpBackForwardListsForAllWindows { false }; bool m_shouldAllowEditing { true }; bool m_shouldCloseExtraWindows { false }; bool m_dumpEditingCallbacks { false }; bool m_dumpStatusCallbacks { false }; bool m_dumpTitleChanges { false }; bool m_dumpPixels { false }; bool m_dumpSelectionRect { false }; bool m_dumpFullScreenCallbacks { false }; bool m_dumpProgressFinishedCallback { false }; bool m_dumpResourceLoadCallbacks { false }; bool m_dumpResourceResponseMIMETypes { false }; bool m_dumpWillCacheResponse { false }; bool m_dumpApplicationCacheDelegateCallbacks { false }; bool m_dumpDatabaseCallbacks { false }; bool m_dumpPolicyCallbacks { false }; bool m_disallowIncreaseForApplicationCacheQuota { false }; bool m_testRepaint { false }; bool m_testRepaintSweepHorizontally { false }; bool m_displayOnLoadFinish { false }; bool m_isPrinting { false }; bool m_willSendRequestReturnsNull { false }; bool m_willSendRequestReturnsNullOnRedirect { false }; bool m_shouldStopProvisionalFrameLoads { false }; bool m_policyDelegateEnabled { false }; bool m_policyDelegatePermissive { false }; bool m_globalFlag { false }; bool m_customFullScreenBehavior { false }; bool m_shouldDecideNavigationPolicyAfterDelay { false }; bool m_shouldDecideResponsePolicyAfterDelay { false }; bool m_shouldFinishAfterDownload { false }; bool m_didCancelClientRedirect { false }; bool m_userStyleSheetEnabled { false }; bool m_dumpAllHTTPRedirectedResponseHeaders { false }; bool m_hasSetDowngradeReferrerCallback { false }; bool m_hasSetBlockThirdPartyCookiesCallback { false }; bool m_hasSetFirstPartyWebsiteDataRemovalModeCallback { false }; }; } // namespace WTR