/*
 * 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.
 */

interface TestRunner {
    readonly attribute boolean isWebKit2;
    readonly attribute boolean isIOSFamily;

    // The basics.
    void dumpAsText(boolean dumpPixels);
    void dumpChildFramesAsText();
    void waitForPolicyDelegate();
    void waitUntilDone();
    void notifyDone();
    double preciseTime(); // seconds since the epoch
    readonly attribute double timeout; // milliseconds

    // Downloads.
    void waitUntilDownloadFinished();
    void setShouldLogDownloadCallbacks(boolean value);

    const unsigned short RENDER_TREE_SHOW_ALL_LAYERS            = 1;
    const unsigned short RENDER_TREE_SHOW_LAYER_NESTING         = 2;
    const unsigned short RENDER_TREE_SHOW_COMPOSITED_LAYERS     = 4;
    const unsigned short RENDER_TREE_SHOW_OVERFLOW              = 8;
    const unsigned short RENDER_TREE_SHOW_SVG_GEOMETRY          = 16;
    const unsigned short RENDER_TREE_SHOW_LAYER_FRAGMENTS       = 32;
    void setRenderTreeDumpOptions(unsigned short options);

    // Other dumping.
    void dumpBackForwardList();
    void dumpChildFrameScrollPositions();
    void dumpEditingCallbacks();
    void dumpSelectionRect();
    void dumpStatusCallbacks();
    void dumpTitleChanges();
    void dumpFullScreenCallbacks();
    void dumpFrameLoadCallbacks();
    void dumpProgressFinishedCallback();
    void dumpResourceLoadCallbacks();
    void dumpResourceResponseMIMETypes();
    void dumpWillCacheResponse();
    void dumpApplicationCacheDelegateCallbacks();
    void dumpDatabaseCallbacks();
    void dumpDOMAsWebArchive();
    void dumpPolicyDelegateCallbacks();
    void dumpResourceLoadStatistics();
    void dumpAdClickAttribution();

    void clearDOMCaches();
    void clearDOMCache(DOMString origin);
    boolean hasDOMCache(DOMString origin);
    unsigned long domCacheSize(DOMString origin);
    void setAllowStorageQuotaIncrease(boolean value);

    // Special options.
    void keepWebHistory();
    void setAcceptsEditing(boolean value);
    void setCanOpenWindows();
    void setCloseRemainingWindowsWhenComplete(boolean value);
    void setXSSAuditorEnabled(boolean value);
    void setAllowUniversalAccessFromFileURLs(boolean value);
    void setAllowFileAccessFromFileURLs(boolean value);
    void setNeedsStorageAccessFromFileURLsQuirk(boolean value);
    void setPluginsEnabled(boolean value);
    void setJavaScriptCanAccessClipboard(boolean value);
    void setPopupBlockingEnabled(boolean value);
    void setAuthorAndUserStylesEnabled(boolean value);
    void setCustomPolicyDelegate(boolean enabled, boolean permissive);
    void addOriginAccessWhitelistEntry(DOMString sourceOrigin, DOMString destinationProtocol, DOMString destinationHost, boolean allowDestinationSubdomains);
    void removeOriginAccessWhitelistEntry(DOMString sourceOrigin, DOMString destinationProtocol, DOMString destinationHost, boolean allowDestinationSubdomains);
    void setUserStyleSheetEnabled(boolean value);
    void setUserStyleSheetLocation(DOMString location);
    void setSpatialNavigationEnabled(boolean value);
    void setTabKeyCyclesThroughElements(boolean enabled);
    void setSerializeHTTPLoads();
    void dispatchPendingLoadRequests();
    void setCacheModel(long model);
    void setAsynchronousSpellCheckingEnabled(boolean value);
    void setPrinting();
    void setShouldDecideNavigationPolicyAfterDelay(boolean value);
    void setShouldDecideResponsePolicyAfterDelay(boolean value);
    void setNavigationGesturesEnabled(boolean value);
    void setIgnoresViewportScaleLimits(boolean value);
    void setShouldDownloadUndisplayableMIMETypes(boolean value);

    // Special DOM functions.
    void clearBackForwardList();
    void execCommand(DOMString name, DOMString showUI, DOMString value);
    boolean isCommandEnabled(DOMString name);
    unsigned long windowCount();

    // Device Orientation Motion.
    void setShouldAllowDeviceOrientationAndMotionAccess(boolean value);

    // Special DOM variables.
    attribute boolean globalFlag;

    // Repaint testing.
    void testRepaint();
    void repaintSweepHorizontally();
    void display();
    void displayAndTrackRepaints();

    // Failed load condition testing
    void forceImmediateCompletion();

    // Printing
    boolean isPageBoxVisible(long pageIndex);

    void dumpAllHTTPRedirectedResponseHeaders();

    [PassContext] void setValueForUser(object element, DOMString value);

    // UserContent testing.
    void addUserScript(DOMString source, boolean runAtStart, boolean allFrames);
    void addUserStyleSheet(DOMString source, boolean allFrames);

    // Local storage API
    void clearAllDatabases();
    void setDatabaseQuota(unsigned long long quota);
    DOMString pathToLocalResource(DOMString url);
    void syncLocalStorage();

    attribute double databaseDefaultQuota;
    attribute double databaseMaxQuota;

    // Application Cache API
    void clearAllApplicationCaches();
    void setAppCacheMaximumSize(unsigned long long size);
    long long applicationCacheDiskUsageForOrigin(DOMString origin);
    void clearApplicationCacheForOrigin(DOMString name);
    void disallowIncreaseForApplicationCacheQuota();
    object originsWithApplicationCache();

    // Text search testing.
    boolean findString(DOMString target, object optionsArray);
    void findStringMatchesInPage(DOMString target, object optionsArray);
    void replaceFindMatchesAtIndices(object matchIndicesArray, DOMString replacementText, boolean selectionOnly);

    // Evaluating script in a special context.
    [PassContext] void evaluateScriptInIsolatedWorld(unsigned long worldID, DOMString script);

    // For Web Inspector tests
    void showWebInspector();
    void closeWebInspector();
    void evaluateInWebInspector(DOMString script);
    readonly attribute DOMString inspectorTestStubURL;

    void setPOSIXLocale(DOMString locale);

    void setTextDirection(DOMString direction);

    void setWillSendRequestReturnsNull(boolean flag);
    void setWillSendRequestReturnsNullOnRedirect(boolean flag);
    void setWillSendRequestAddsHTTPBody(DOMString body);
    
    void setShouldStayOnPageAfterHandlingBeforeUnload(boolean flag);

    void setStopProvisionalFrameLoads();

    readonly attribute boolean didReceiveServerRedirectForProvisionalNavigation;
    void clearDidReceiveServerRedirectForProvisionalNavigation();

    // Focus testing.
    void addChromeInputField(object callback);
    void removeChromeInputField(object callback);
    void focusWebView(object callback);

    // Window/view state
    void setBackingScaleFactor(double backingScaleFactor, object callback);

    void setWindowIsKey(boolean isKey);
    void setViewSize(double width, double height);

    // Cookies testing
    void setAlwaysAcceptCookies(boolean accept);
    void setOnlyAcceptFirstPartyCookies(boolean accept);

    void overridePreference(DOMString preference, DOMString value);

    // Page Visibility API
    void setPageVisibility(DOMString state);
    void resetPageVisibility();

    // Control full screen behavior.
    void setHasCustomFullScreenBehavior(boolean value);

    // Web notifications support
    void grantWebNotificationPermission(DOMString origin);
    void denyWebNotificationPermission(DOMString origin);
    void removeAllWebNotificationPermissions();
    void simulateWebNotificationClick(object notification);

    // Geolocation
    void setGeolocationPermission(boolean value);
    void setMockGeolocationPosition(double latitude, double longitude, double accuracy, optional object altitude, optional object altitudeAccuracy, optional object heading, optional object speed, optional object floorLevel);
    void setMockGeolocationPositionUnavailableError(DOMString errorMessage);
    boolean isGeolocationProviderActive();

    // MediaStream
    void setUserMediaPermission(boolean value);
    void resetUserMediaPermission();
    void setUserMediaPersistentPermissionForOrigin(boolean permission, DOMString origin, DOMString parentOrigin);
    unsigned long userMediaPermissionRequestCountForOrigin(DOMString origin, DOMString parentOrigin);
    void resetUserMediaPermissionRequestCountForOrigin(DOMString origin, DOMString parentOrigin);
    readonly attribute boolean isDoingMediaCapture;

    // Audio testing.
    [PassContext] void setAudioResult(object data);

    boolean callShouldCloseOnWebView();

    // Work queue.
    void queueBackNavigation(unsigned long howFarBackward);
    void queueForwardNavigation(unsigned long howFarForward);
    void queueLoad(DOMString url, DOMString target, optional boolean shouldOpenExternalURLs);
    void queueLoadHTMLString(DOMString content, optional DOMString baseURL, optional DOMString unreachableURL);
    void queueReload();
    void queueLoadingScript(DOMString script);
    void queueNonLoadingScript(DOMString script);

    // Authentication
    void setRejectsProtectionSpaceAndContinueForAuthenticationChallenges(boolean value);
    void setHandlesAuthenticationChallenges(boolean value);
    void setShouldLogCanAuthenticateAgainstProtectionSpace(boolean value);
    void setAuthenticationUsername(DOMString username);
    void setAuthenticationPassword(DOMString password);

    void setAllowsAnySSLCertificate(boolean value);

    void setShouldSwapToEphemeralSessionOnNextNavigation(boolean value);
    void setShouldSwapToDefaultSessionOnNextNavigation(boolean value);

    // Secure text input mode (Mac only)
    readonly attribute boolean secureEventInputIsEnabled;
    
    // Override plugin load policy.
    void setBlockAllPlugins(boolean shouldBlock);
    void setPluginSupportedMode(DOMString mode);

    // Hooks to the JSC compiler.
    object failNextNewCodeBlock();
    object numberOfDFGCompiles(object function);
    object neverInlineFunction(object function);

    // Swipe gestures
    void installDidBeginSwipeCallback(object callback);
    void installWillEndSwipeCallback(object callback);
    void installDidEndSwipeCallback(object callback);
    void installDidRemoveSwipeSnapshotCallback(object callback);

    unsigned long imageCountInGeneralPasteboard();

    // UI Process Testing
    void runUIScript(DOMString script, object callback);

    void clearTestRunnerCallbacks();

    void accummulateLogsForChannel(DOMString channel);

    // Contextual menu actions
    void setAllowedMenuActions(object actions);
    void installCustomMenuAction(DOMString name, boolean dismissesAutomatically, object callback);

    // Gamepad
    void setMockGamepadDetails(unsigned long index, DOMString id, DOMString mapping, unsigned long axisCount, unsigned long buttonCount);
    void setMockGamepadAxisValue(unsigned long index, unsigned long axisIndex, double value);
    void setMockGamepadButtonValue(unsigned long index, unsigned long buttonIndex, double value);
    void connectMockGamepad(unsigned long index);
    void disconnectMockGamepad(unsigned long index);

    // Resource Load Statistics
    void setStatisticsEnabled(boolean value);
    void installStatisticsDidModifyDataRecordsCallback(object callback);
    void installStatisticsDidScanDataRecordsCallback(object callback);
    void installStatisticsDidRunTelemetryCallback(object callback);
    void setStatisticsDebugMode(boolean value, object completionHandler);
    void setStatisticsPrevalentResourceForDebugMode(DOMString hostName, object completionHandler);
    void setStatisticsLastSeen(DOMString hostName, double seconds, object completionHandler);
    void setStatisticsMergeStatistic(DOMString hostName, DOMString topFrameDomain1, DOMString topFrameDomain2, double lastSeen, boolean hadUserInteraction, double mostRecentUserInteraction, boolean isGrandfathered, boolean isPrevalent, boolean isVeryPrevalent, unsigned long dataRecordsRemoved, object completionHandler);
    void setStatisticsPrevalentResource(DOMString hostName, boolean value, object completionHandler);
    void setStatisticsVeryPrevalentResource(DOMString hostName, boolean value, object completionHandler);
    boolean isStatisticsPrevalentResource(DOMString hostName);
    boolean isStatisticsVeryPrevalentResource(DOMString hostName);
    boolean isStatisticsRegisteredAsSubresourceUnder(DOMString subresourceHost, DOMString topFrameHost);
    boolean isStatisticsRegisteredAsSubFrameUnder(DOMString subFrameHost, DOMString topFrameHost);
    boolean isStatisticsRegisteredAsRedirectingTo(DOMString hostRedirectedFrom, DOMString hostRedirectedTo);
    void setStatisticsHasHadUserInteraction(DOMString hostName, boolean value, object completionHandler);
    boolean isStatisticsHasHadUserInteraction(DOMString hostName);
    boolean isStatisticsOnlyInDatabaseOnce(DOMString subHost, DOMString topHost);
    void setStatisticsGrandfathered(DOMString hostName, boolean value);
    boolean isStatisticsGrandfathered(DOMString hostName);
    void setUseITPDatabase(boolean value);
    void setStatisticsSubframeUnderTopFrameOrigin(DOMString hostName, DOMString topFrameHostName);
    void setStatisticsSubresourceUnderTopFrameOrigin(DOMString hostName, DOMString topFrameHostName);
    void setStatisticsSubresourceUniqueRedirectTo(DOMString hostName, DOMString hostNameRedirectedTo);
    void setStatisticsSubresourceUniqueRedirectFrom(DOMString hostName, DOMString hostNameRedirectedTo);
    void setStatisticsTopFrameUniqueRedirectTo(DOMString hostName, DOMString hostNameRedirectedTo);
    void setStatisticsTopFrameUniqueRedirectFrom(DOMString hostName, DOMString hostNameRedirectedTo);
    void setStatisticsCrossSiteLoadWithLinkDecoration(DOMString fromHost, DOMString toHost);
    void setStatisticsTimeToLiveUserInteraction(double seconds);
    boolean statisticsNotifyObserver();
    void statisticsProcessStatisticsAndDataRecords();
    void statisticsUpdateCookieBlocking(object completionHandler);
    void statisticsSubmitTelemetry();
    void setStatisticsNotifyPagesWhenDataRecordsWereScanned(boolean value);
    void setStatisticsIsRunningTest(boolean value);
    void setStatisticsShouldClassifyResourcesBeforeDataRecordsRemoval(boolean value);
    void setStatisticsNotifyPagesWhenTelemetryWasCaptured(boolean value);
    void setStatisticsMinimumTimeBetweenDataRecordsRemoval(double seconds);
    void setStatisticsGrandfatheringTime(double seconds);
    void setStatisticsMaxStatisticsEntries(unsigned long entries);
    void setStatisticsPruneEntriesDownTo(unsigned long entries);
    void statisticsClearInMemoryAndPersistentStore(object callback);
    void statisticsClearInMemoryAndPersistentStoreModifiedSinceHours(unsigned long hours, object callback);
    void statisticsClearThroughWebsiteDataRemoval(object callback);
    void statisticsDeleteCookiesForHost(DOMString hostName, boolean includeHttpOnlyCookies);
    boolean isStatisticsHasLocalStorage(DOMString hostName);
    void setStatisticsCacheMaxAgeCap(double seconds);
    void statisticsResetToConsistentState(object completionHandler);
    boolean hasStatisticsIsolatedSession(DOMString hostName);
    void setStatisticsShouldDowngradeReferrer(boolean value, object callback);
    void setStatisticsShouldBlockThirdPartyCookies(boolean value, object callback, optional boolean onlyOnSitesWithoutUserInteraction);
    void setStatisticsFirstPartyWebsiteDataRemovalMode(boolean value, object callback);
    void getPrevalentDomains(object callback);

    // Injected bundle form client.
    void installTextDidChangeInTextFieldCallback(object callback);
    void installTextFieldDidBeginEditingCallback(object callback);
    void installTextFieldDidEndEditingCallback(object callback);

    // Storage Access API
    void setStorageAccessAPIEnabled(boolean enabled);
    void getAllStorageAccessEntries(object callback);

    // Open panel
    void setOpenPanelFiles(object filesArray);
    void setOpenPanelFilesMediaIcon(object mediaIcon);

    // Modal alerts
    void setShouldDismissJavaScriptAlertsAsynchronously(boolean value);
    void abortModal();

    void setWebRTCMDNSICECandidatesEnabled(boolean value);
    void setCustomUserAgent(DOMString userAgent);

    void setWebAPIStatisticsEnabled(boolean value);

    void terminateNetworkProcess();
    void terminateServiceWorkers();
    void setUseSeparateServiceWorkerProcess(boolean value);

    readonly attribute unsigned long serverTrustEvaluationCallbackCallsCount;

    readonly attribute boolean didCancelClientRedirect;

    void removeAllSessionCredentials(object callback);

    void getApplicationManifestThen(object callback);

    void installFakeHelvetica(DOMString configuration);

    void addMockCameraDevice(DOMString persistentId, DOMString label);
    void addMockMicrophoneDevice(DOMString persistentId, DOMString label);
    void addMockScreenDevice(DOMString persistentId, DOMString label);
    void clearMockMediaDevices();
    void removeMockMediaDevice(DOMString persistentId);
    void resetMockMediaDevices();
    void setMockCameraOrientation(unsigned long orientation);
    boolean isMockRealtimeMediaSourceCenterEnabled();

    void injectUserScript(DOMString string);
    readonly attribute unsigned long userScriptInjectedCount;

    void sendDisplayConfigurationChangedMessageForTesting();

    void setServiceWorkerFetchTimeout(double seconds);

    // WebAuthn
    void addTestKeyToKeychain(DOMString privateKeyBase64, DOMString attrLabel, DOMString applicationTagBase64);
    void cleanUpKeychain(DOMString attrLabel, optional DOMString applicationTagBase64);
    boolean keyExistsInKeychain(DOMString attrLabel, DOMString applicationTagBase64);

    // Ad Click Attribution
    void clearAdClickAttribution();
    void clearAdClickAttributionsThroughWebsiteDataRemoval();
    void setAdClickAttributionOverrideTimerForTesting(boolean value);
    void setAdClickAttributionConversionURLForTesting(DOMString url);
    void markAdClickAttributionsAsExpiredForTesting();
};
