/*
 * Copyright (C) 2012 Google Inc. All rights reserved.
 * Copyright (C) 2013-2021 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 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.
 */

enum PageOverlayType {
    "view",
    "document"
};

// These map to ResourceRequestCachePolicy.
enum CachePolicy {
    "UseProtocolCachePolicy",
    "ReloadIgnoringCacheData",
    "ReturnCacheDataElseLoad",
    "ReturnCacheDataDontLoad"
};

// FIXME: Strings in an enum should not have the name of the enum as a prefix.
enum ResourceLoadPriority {
    "ResourceLoadPriorityVeryLow",
    "ResourceLoadPriorityLow",
    "ResourceLoadPriorityMedium",
    "ResourceLoadPriorityHigh",
    "ResourceLoadPriorityVeryHigh"
};

enum AutoFillButtonType {
    "None",
    "Contacts",
    "Credentials",
    "StrongPassword",
    "CreditCard"
};

enum UserInterfaceLayoutDirection {
    "LTR",
    "RTL"
};

enum BaseWritingDirection {
    "Natural",
    "Ltr",
    "Rtl"
};

enum EventThrottlingBehavior {
    "responsive",
    "unresponsive"
};

enum CompositingPolicy {
    "normal",
    "conservative"
};

[Conditional=VIDEO] enum PlaybackControlsPurpose {
    "ControlsManager",
    "NowPlaying"
};

[Conditional=VIDEO] enum MediaSessionState {
    "Idle",
    "Autoplaying",
    "Playing",
    "Paused",
    "Interrupted"
};

enum ContentSizeCategory {
    "L",
    "XXXL"
};

enum TreeType {
    "Tree",
    "ShadowIncludingTree",
    "ComposedTree"
};

[Conditional=WEBGL] enum SimulatedWebGLContextEvent {
    "ContextChange",
    "GPUStatusFailure",
    "Timeout"
};

enum AutoplayPolicy {
    "Default",
    "Allow",
    "AllowWithoutSound",
    "Deny"
};

[Conditional=WEBGL] enum RequestedGPU {
    "default",
    "low-power",
    "high-performance"
};

[
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
    Conditional=VIDEO,
    JSGenerateToJSObject,
] dictionary NowPlayingState {
    DOMString title;
    unrestricted double duration;
    unrestricted double elapsedTime;
    unsigned long long uniqueIdentifier;
    boolean hasActiveSession;
    boolean registeredAsNowPlayingApplication;
    boolean haveEverRegisteredAsNowPlayingApplication;
};

[
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
    Conditional=VIDEO,
    JSGenerateToJSObject,
] dictionary MediaUsageState {
    DOMString mediaURL;
    boolean isPlaying;
    boolean canShowControlsManager;
    boolean canShowNowPlayingControls;
    boolean isSuspended;
    boolean isInActiveDocument;
    boolean isFullscreen;
    boolean isMuted;
    boolean isMediaDocumentInMainFrame;
    boolean isVideo;
    boolean isAudio;
    boolean hasVideo;
    boolean hasAudio;
    boolean hasRenderer;
    boolean audioElementWithUserGesture;
    boolean userHasPlayedAudioBefore;
    boolean isElementRectMostlyInMainFrame;
    boolean playbackPermitted;
    boolean pageMediaPlaybackSuspended;
    boolean isMediaDocumentAndNotOwnerElement;
    boolean pageExplicitlyAllowsElementToAutoplayInline;
    boolean requiresFullscreenForVideoPlaybackAndFullscreenNotPermitted;
    boolean hasHadUserInteractionAndQuirksContainsShouldAutoplayForArbitraryUserGesture;
    boolean isVideoAndRequiresUserGestureForVideoRateChange;
    boolean isAudioAndRequiresUserGestureForAudioRateChange;
    boolean isVideoAndRequiresUserGestureForVideoDueToLowPowerMode;
    boolean noUserGestureRequired;
    boolean requiresPlaybackAndIsNotPlaying;
    boolean hasEverNotifiedAboutPlaying;
    boolean outsideOfFullscreen;
    boolean isLargeEnoughForMainContent;
};

[
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
    JSGenerateToJSObject,
] dictionary FullscreenInsets {
    double top;
    double left;
    double bottom;
    double right;
};

enum HEVCParameterCodec {
    "hev1",
    "hvc1"
};

[
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
    JSGenerateToJSObject,
] dictionary HEVCParameterSet {
    HEVCParameterCodec codec;
    unsigned short generalProfileSpace;
    unsigned short generalProfileIDC;
    unsigned long generalProfileCompatibilityFlags;
    octet generalTierFlag;
    required FrozenArray<octet> generalConstraintIndicatorFlags;
    unsigned short generalLevelIDC;
};

[
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
    JSGenerateToJSObject,
] dictionary DoViParameterSet {
    DOMString codecName;
    unsigned short bitstreamProfileID;
    unsigned short bitstreamLevelID;
};

[
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
    JSGenerateToJSObject,
] dictionary VPCodecConfigurationRecord {
    DOMString codecName;
    octet profile;
    octet level;
    octet bitDepth;
    octet chromaSubsampling;
    octet videoFullRangeFlag;
    octet colorPrimaries;
    octet transferCharacteristics;
    octet matrixCoefficients;
};

[
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
    JSGenerateToJSObject,
] dictionary AcceleratedAnimation {
    DOMString property;
    double speed;
};

[
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
    JSGenerateToJSObject,
] dictionary CookieData {
    DOMString name;
    DOMString value;
    DOMString domain;
    double expires;
    boolean isHttpOnly;
    boolean isSecure;
    boolean isSession;
    boolean isSameSiteLax;
    boolean isSameSiteStrict;
};

[
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
    JSGenerateToJSObject,
] dictionary TextIndicatorInfo {
    DOMRectReadOnly textBoundingRectInRootViewCoordinates;
    DOMRectList textRectsInBoundingRectCoordinates;
};

[
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
    Conditional=ATTACHMENT_ELEMENT,
    JSGenerateToJSObject,
] dictionary AttachmentThumbnailInfo {
    unsigned long width;
    unsigned long height;
};

[
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
    JSGenerateToJSObject,
] dictionary TextIndicatorOptions {
    boolean useBoundingRectAndPaintAllContentForComplexRanges = false;
    boolean computeEstimatedBackgroundColor = false;
    boolean respectTextColor = false;
};

[
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
    JSGenerateToJSObject,
] dictionary ImageOverlayText {
    required DOMString text;
    required DOMPointReadOnly topLeft;
    required DOMPointReadOnly topRight;
    required DOMPointReadOnly bottomRight;
    required DOMPointReadOnly bottomLeft;
    boolean hasLeadingWhitespace = true;
};

[
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
    JSGenerateToJSObject,
] dictionary ImageOverlayLine {
    required DOMPointReadOnly topLeft;
    required DOMPointReadOnly topRight;
    required DOMPointReadOnly bottomRight;
    required DOMPointReadOnly bottomLeft;
    sequence<ImageOverlayText> children;
    boolean hasTrailingNewline = true;
};

[
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
    JSGenerateToJSObject,
] dictionary ImageOverlayBlock {
    required DOMString text;
    required DOMPointReadOnly topLeft;
    required DOMPointReadOnly topRight;
    required DOMPointReadOnly bottomRight;
    required DOMPointReadOnly bottomLeft;
};

typedef (FetchRequest or FetchResponse) FetchObject;

[
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
    LegacyNoInterfaceObject,
] interface Internals {
    DOMString address(Node node);
    boolean nodeNeedsStyleRecalc(Node node);
    DOMString styleChangeType(Node node);
    DOMString description(any value);
    undefined log(DOMString value);

    // Animated image pausing testing.
    boolean hasPausedImageAnimations(Element element);

    // Must be called on an element whose enclosingLayer() is self-painting.
    boolean isPaintingFrequently(Element element);
    undefined incrementFrequentPaintCounter(Element element);

    DOMString elementRenderTreeAsText(Element element);
    boolean isPreloaded(DOMString url);
    boolean isLoadingFromMemoryCache(DOMString url);
    DOMString fetchResponseSource(FetchResponse response);
    DOMString xhrResponseSource(XMLHttpRequest xhr);
    boolean isSharingStyleSheetContents(HTMLLinkElement a, HTMLLinkElement b);
    boolean isStyleSheetLoadingSubresources(HTMLLinkElement link);
    undefined clearMemoryCache();
    undefined pruneMemoryCacheToSize(long size);
    undefined destroyDecodedDataForAllImages();
    long memoryCacheSize();
    undefined setOverrideCachePolicy(CachePolicy policy);
    undefined setOverrideResourceLoadPriority(ResourceLoadPriority priority);
    undefined setStrictRawResourceValidationPolicyDisabled(boolean disabled);

    boolean isFetchObjectContextStopped(FetchObject object);

    undefined clearBackForwardCache();
    unsigned long backForwardCacheSize();
    undefined preventDocumentFromEnteringBackForwardCache();

    CSSStyleDeclaration computedStyleIncludingVisitedInfo(Element element);

    Node ensureUserAgentShadowRoot(Element host);
    Node shadowRoot(Element host);

    // CSS Deferred Parsing Testing.
    long deferredStyleRulesCount(StyleSheet sheet);
    long deferredGroupRulesCount(StyleSheet sheet);
    long deferredKeyframesRulesCount(StyleSheet sheet);

    DOMString shadowRootType(Node root);
    DOMString shadowPseudoId(Element element);
    undefined setShadowPseudoId(Element element, DOMString id);
    Node treeScopeRootNode(Node node);
    Node parentTreeScope(Node node);

    // Spatial Navigation testing
    unsigned long lastSpatialNavigationCandidateCount();

    readonly attribute unsigned long inflightBeaconsCount;

    // CSS Animation testing.
    boolean animationWithIdExists(DOMString id);
    unsigned long numberOfActiveAnimations();
    undefined suspendAnimations();
    undefined resumeAnimations();
    boolean animationsAreSuspended();
    readonly attribute double animationsInterval;

    // Web Animations testing.
    sequence<AcceleratedAnimation> acceleratedAnimationsForElement(Element element);
    unsigned long numberOfAnimationTimelineInvalidations();
    double timeToNextAnimationTick(WebAnimation animation);

    // For animations testing, we need a way to get at pseudo elements.
    Element? pseudoElement(Element element, DOMString pseudoId);

    DOMString visiblePlaceholder(Element element);
    undefined selectColorInColorChooser(HTMLInputElement element, DOMString colorValue);
    sequence<DOMString> formControlStateOfPreviousHistoryItem();
    undefined setFormControlStateOfPreviousHistoryItem(sequence<DOMString> values);

    DOMRect absoluteLineRectFromPoint(long x, long y);

    DOMRect absoluteCaretBounds();
    boolean isCaretBlinkingSuspended();

    DOMRect boundingBox(Element element);

    unsigned long inspectorGridOverlayCount();
    DOMRectList inspectorHighlightRects();
    unsigned long inspectorPaintRectCount();

    unsigned long markerCountForNode(Node node, DOMString markerType);
    Range? markerRangeForNode(Node node, DOMString markerType, unsigned long index);
    DOMString markerDescriptionForNode(Node node, DOMString markerType, unsigned long index);
    DOMString dumpMarkerRects(DOMString markerType);
    undefined setMarkedTextMatchesAreHighlighted(boolean flag);

    undefined invalidateFontCache();
    undefined setFontSmoothingEnabled(boolean enabled);

    undefined setScrollViewPosition(long x, long y);

    // Like Element.scrollTo(), but without constaints, for testing rubber-banding.
    undefined unconstrainedScrollTo(Element element, unrestricted double x, unrestricted double y);

    // Scrolls the element by the given delta, approximating the async wheel event handling code path where available.
    undefined scrollBySimulatingWheelEvent(Element element, unrestricted double deltaX, unrestricted double deltaY);

    DOMRect layoutViewportRect();
    DOMRect visualViewportRect();

    undefined setViewIsTransparent(boolean trnasparent);

    DOMString viewBaseBackgroundColor();
    undefined setViewBaseBackgroundColor(DOMString colorValue);

    undefined setPagination(DOMString mode, long gap, optional long pageLength = 0);
    undefined setPaginationLineGridEnabled(boolean enabled);

    DOMString configurationForViewport(unrestricted float devicePixelRatio, long deviceWidth, long deviceHeight, long availableWidth, long availableHeight);

    boolean wasLastChangeUserEdit(Element textField);
    boolean elementShouldAutoComplete(HTMLInputElement inputElement);
    undefined setAutofilled(HTMLInputElement inputElement, boolean enabled);
    undefined setAutoFilledAndViewable(HTMLInputElement inputElement, boolean enabled);
    undefined setAutoFilledAndObscured(HTMLInputElement inputElement, boolean enabled);
    undefined setShowAutoFillButton(HTMLInputElement inputElement, AutoFillButtonType autoFillButtonType);
    AutoFillButtonType autoFillButtonType(HTMLInputElement inputElement);
    AutoFillButtonType lastAutoFillButtonType(HTMLInputElement inputElement);

    undefined setCanShowPlaceholder(Element element, boolean canShowPlaceholder);

    Element insertTextPlaceholder(long width, long height);
    undefined removeTextPlaceholder(Element element);

    Range? rangeOfString(DOMString text, Range? referenceRange, sequence<DOMString> findOptions);
    unsigned long countMatchesForText(DOMString text, sequence<DOMString> findOptions, DOMString markMatches);
    unsigned long countFindMatches(DOMString text, sequence<DOMString> findOptions);

    DOMString autofillFieldName(Element formControlElement);
    boolean isSpellcheckDisabledExceptTextReplacement(HTMLInputElement inputElement);

    undefined invalidateControlTints();

    undefined scrollElementToRect(Element element, long x, long y, long w, long h);

    Range? rangeFromLocationAndLength(Element scope, unsigned long rangeLocation, unsigned long rangeLength);
    unsigned long locationFromRange(Element scope, Range range);
    unsigned long lengthFromRange(Element scope, Range range);
    DOMString rangeAsText(Range range);
    DOMString rangeAsTextUsingBackwardsTextIterator(Range range);
    Range subrange(Range range, unsigned long rangeLocation, unsigned long rangeLength);
    Range? rangeForDictionaryLookupAtLocation(long x, long y);
    Range? rangeOfStringNearLocation(Range range, DOMString text, long targetOffset);

    undefined setDelegatesScrolling(boolean enabled);

    unsigned long long lastSpellCheckRequestSequence();
    unsigned long long lastSpellCheckProcessedSequence();
    undefined advanceToNextMisspelling();

    sequence<DOMString> userPreferredLanguages();
    undefined setUserPreferredLanguages(sequence<DOMString> languages);

    sequence<DOMString> userPreferredAudioCharacteristics();
    undefined setUserPreferredAudioCharacteristic(DOMString characteristic);

    unsigned long wheelEventHandlerCount();
    unsigned long touchEventHandlerCount();

    DOMRectList touchEventRectsForEvent(DOMString eventName);
    DOMRectList passiveTouchEventListenerRects();

    NodeList? nodesFromRect(Document document, long x, long y,
        unsigned long topPadding, unsigned long rightPadding, unsigned long bottomPadding, unsigned long leftPadding,
        boolean ignoreClipping, boolean allowShadowContent, boolean allowChildFrameContent);

    // Calling parserMetaData() with no arguments gets the metadata for the script of the current scope.
    DOMString parserMetaData(optional any func);

    undefined updateEditorUINowIfScheduled();

    readonly attribute boolean sentenceRetroCorrectionEnabled;
    boolean hasSpellingMarker(long from, long length);
    boolean hasGrammarMarker(long from, long length);
    boolean hasAutocorrectedMarker(long from, long length);
    boolean hasDictationAlternativesMarker(long from, long length);
    undefined setContinuousSpellCheckingEnabled(boolean enabled);
    undefined setAutomaticQuoteSubstitutionEnabled(boolean enabled);
    undefined setAutomaticLinkDetectionEnabled(boolean enabled);
    undefined setAutomaticDashSubstitutionEnabled(boolean enabled);
    undefined setAutomaticTextReplacementEnabled(boolean enabled);
    undefined setAutomaticSpellingCorrectionEnabled(boolean enabled);

    undefined handleAcceptedCandidate(DOMString candidate, unsigned long location, unsigned long length);
    undefined changeSelectionListType();
    undefined changeBackToReplacedString(DOMString replacedString);

    boolean isOverwriteModeEnabled();
    undefined toggleOverwriteModeEnabled();

    unsigned long numberOfScrollableAreas();

    boolean isPageBoxVisible(long pageNumber);

    unsigned long imageFrameIndex(HTMLImageElement element);
    unsigned long imageFrameCount(HTMLImageElement element);
    float imageFrameDurationAtIndex(HTMLImageElement element, unsigned long index);
    undefined setImageFrameDecodingDuration(HTMLImageElement element, unrestricted float duration);
    undefined resetImageAnimation(HTMLImageElement element);
    boolean isImageAnimating(HTMLImageElement element);
    unsigned long imagePendingDecodePromisesCountForTesting(HTMLImageElement element);
    undefined setClearDecoderAfterAsyncFrameRequestForTesting(HTMLImageElement element, boolean enabled);
    unsigned long imageDecodeCount(HTMLImageElement element);
    unsigned long pdfDocumentCachingCount(HTMLImageElement element);
    unsigned long remoteImagesCountForTesting();
    undefined setLargeImageAsyncDecodingEnabledForTesting(HTMLImageElement element, boolean enabled);
    undefined setForceUpdateImageDataEnabledForTesting(HTMLImageElement element, boolean enabled);

    undefined setGridMaxTracksLimit(unsigned long maxTracksLimit);

    readonly attribute InternalSettings settings;
    readonly attribute unsigned long workerThreadCount;

    readonly attribute boolean areSVGAnimationsPaused;
    double svgAnimationsInterval(SVGSVGElement element);

    boolean testProcessIncomingSyncMessagesWhenWaitingForSyncReply();

    // Flags for layerTreeAsText.
    const unsigned short LAYER_TREE_INCLUDES_VISIBLE_RECTS = 1;
    const unsigned short LAYER_TREE_INCLUDES_TILE_CACHES = 2;
    const unsigned short LAYER_TREE_INCLUDES_REPAINT_RECTS = 4;
    const unsigned short LAYER_TREE_INCLUDES_PAINTING_PHASES = 8;
    const unsigned short LAYER_TREE_INCLUDES_CONTENT_LAYERS = 16;
    const unsigned short LAYER_TREE_INCLUDES_ACCELERATES_DRAWING = 32;
    const unsigned short LAYER_TREE_INCLUDES_CLIPPING = 64;
    const unsigned short LAYER_TREE_INCLUDES_BACKING_STORE_ATTACHED = 128;
    const unsigned short LAYER_TREE_INCLUDES_ROOT_LAYER_PROPERTIES = 256;
    const unsigned short LAYER_TREE_INCLUDES_EVENT_REGION = 512;
    const unsigned short LAYER_TREE_INCLUDES_DEEP_COLOR = 1024;
    DOMString layerTreeAsText(Document document, optional unsigned short flags = 0);

    unsigned long long layerIDForElement(Element element);

    // Flags for platformLayerTreeAsText.
    const unsigned short PLATFORM_LAYER_TREE_DEBUG = 1;
    const unsigned short PLATFORM_LAYER_TREE_IGNORES_CHILDREN = 2;
    const unsigned short PLATFORM_LAYER_TREE_INCLUDE_MODELS = 4;
    DOMString platformLayerTreeAsText(Element element, optional unsigned short flags = 0);

    DOMString scrollbarOverlayStyle(optional Node? node = null);
    boolean scrollbarUsingDarkAppearance(optional Node? node = null);
    DOMString horizontalScrollbarState(optional Node? node = null);
    DOMString verticalScrollbarState(optional Node? node = null);

    DOMString scrollingStateTreeAsText();
    DOMString scrollingTreeAsText();
    DOMString synchronousScrollingReasons();
    DOMRectList nonFastScrollableRects();

    DOMString repaintRectsAsText();

    // These throw if the element does not have a compositing layer.
    undefined setElementUsesDisplayListDrawing(Element element, boolean usesDisplayListDrawing);
    undefined setElementTracksDisplayListReplay(Element element, boolean trackReplay);

    // Flags for displayListForElement.
    const unsigned short DISPLAY_LIST_INCLUDES_PLATFORM_OPERATIONS = 1;
    // Returns the recorded display list.
    DOMString displayListForElement(Element element, optional unsigned short flags = 0);
    // Returns the display list that was actually painted.
    DOMString replayDisplayListForElement(Element element, optional unsigned short flags = 0);

    undefined garbageCollectDocumentResources();

    undefined insertAuthorCSS(DOMString css);
    undefined insertUserCSS(DOMString css);

    readonly attribute boolean isUnderMemoryPressure;
    undefined beginSimulatedMemoryPressure();
    undefined endSimulatedMemoryPressure();

    unsigned long numberOfIDBTransactions();

    unsigned long numberOfLiveNodes();
    unsigned long numberOfLiveDocuments();
    unsigned long referencingNodeCount(Document document);
    unsigned long numberOfIntersectionObservers(Document document);
    unsigned long numberOfResizeObservers(Document document);
    WindowProxy? openDummyInspectorFrontend(DOMString url);
    undefined closeDummyInspectorFrontend();
    undefined setInspectorIsUnderTest(boolean isUnderTest);

    // BaseAudioContext lifetime testing.
    [Conditional=WEB_AUDIO] unsigned long long baseAudioContextIdentifier(BaseAudioContext context);
    [Conditional=WEB_AUDIO] boolean isBaseAudioContextAlive(unsigned long long contextID);

    DOMString counterValue(Element element);
    long pageNumber(Element element, optional unrestricted float pageWidth = 800, optional unrestricted float pageHeight = 600);
    sequence<DOMString> shortcutIconURLs();
    long numberOfPages(optional unrestricted double pageWidthInPixels = 800, optional unrestricted double pageHeightInPixels = 600);
    DOMString pageProperty(DOMString propertyName, long pageNumber);
    DOMString pageSizeAndMarginsInPixels(long pageIndex, long width, long height, long marginTop, long marginRight, long marginBottom, long marginLeft);

    undefined setPageScaleFactor(unrestricted float scaleFactor, long x, long y);
    float pageScaleFactor();

    undefined setPageZoomFactor(unrestricted float zoomFactor);
    undefined setTextZoomFactor(unrestricted float zoomFactor);

    undefined setUseFixedLayout(boolean useFixedLayout);
    undefined setFixedLayoutSize(long width, long height);
    undefined setPrinting(long width, long height);

    undefined setViewExposedRect(unrestricted float x, unrestricted float y, unrestricted float width, unrestricted float height);

    undefined setHeaderHeight(unrestricted float height);
    undefined setFooterHeight(unrestricted float height);

    undefined setTopContentInset(unrestricted float contentInset);

    [Conditional=FULLSCREEN_API] undefined webkitWillEnterFullScreenForElement(Element element);
    [Conditional=FULLSCREEN_API] undefined webkitDidEnterFullScreenForElement(Element element);
    [Conditional=FULLSCREEN_API] undefined webkitWillExitFullScreenForElement(Element element);
    [Conditional=FULLSCREEN_API] undefined webkitDidExitFullScreenForElement(Element element);
    [Conditional=FULLSCREEN_API] readonly attribute boolean isAnimatingFullScreen;

    undefined setFullscreenInsets(FullscreenInsets insets);
    undefined setFullscreenAutoHideDuration(double duration);
    undefined setFullscreenControlsHidden(boolean hidden);

    [Conditional=VIDEO] boolean isChangingPresentationMode(HTMLVideoElement element);
    [Conditional=VIDEO_PRESENTATION_MODE] undefined setMockVideoPresentationModeEnabled(boolean enabled);

    undefined setApplicationCacheOriginQuota(unsigned long long quota);

    undefined registerURLSchemeAsBypassingContentSecurityPolicy(DOMString scheme);
    undefined removeURLSchemeRegisteredAsBypassingContentSecurityPolicy(DOMString scheme);

    undefined registerDefaultPortForProtocol(unsigned short port, DOMString scheme);

    MallocStatistics mallocStatistics();
    TypeConversions typeConversions();
    MemoryInfo memoryInfo();

    sequence<DOMString> getReferencedFilePaths();

    // These functions both reset the tracked repaint rects. They are intended to be used in the following order:
    //  startTrackingRepaints, repaintRectsAsText, stopTrackingRepaints.
    undefined startTrackingRepaints();
    undefined stopTrackingRepaints();

    undefined startTrackingLayerFlushes();
    unsigned long layerFlushCount();

    // Query if a timer is currently throttled, to debug timer throttling.
    boolean isTimerThrottled(long timerHandle);

    DOMString requestAnimationFrameThrottlingReasons();
    boolean areTimersThrottled();

    undefined setLowPowerModeEnabled(boolean enabled);
    undefined setOutsideViewportThrottlingEnabled(boolean enabled);
    readonly attribute double requestAnimationFrameInterval;
    readonly attribute boolean scriptedAnimationsAreSuspended;

    // Override the behavior of WebPage::eventThrottlingDelay(), which only affects iOS.
    attribute EventThrottlingBehavior? eventThrottlingBehaviorOverride;

    undefined startTrackingStyleRecalcs();
    unsigned long styleRecalcCount();
    readonly attribute unsigned long lastStyleUpdateSize;

    undefined startTrackingCompositingUpdates();
    unsigned long compositingUpdateCount();

    undefined startTrackingRenderingUpdates();
    unsigned long renderingUpdateCount();

    attribute CompositingPolicy? compositingPolicyOverride;

    undefined updateLayoutAndStyleForAllFrames();

    // |node| should be Document, HTMLIFrameElement, or unspecified.
    // If |node| is an HTMLIFrameElement, it assumes node.contentDocument is
    // specified without security checks. Unspecified or null means this document.
    undefined updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(optional Node? node = null);

    readonly attribute unsigned long layoutCount;

    // Returns a string with information about the mouse cursor used at the specified client location.
    DOMString getCurrentCursorInfo();

    DOMString markerTextForListItem(Element element);

    DOMString toolTipFromElement(Element element);

    SerializedScriptValue deserializeBuffer(ArrayBuffer buffer);
    ArrayBuffer serializeObject(SerializedScriptValue object);

    boolean isFromCurrentWorld(any obj);
    any evaluateInWorldIgnoringException(DOMString name, DOMString source);

    undefined setUsesOverlayScrollbars(boolean enabled);

    undefined forceReload(boolean endToEnd);
    undefined reloadExpiredOnly();

    undefined enableFixedWidthAutoSizeMode(boolean enabled, long width, long height);
    undefined enableSizeToContentAutoSizeMode(boolean enabled, long width, long height);

    [Conditional=VIDEO] sequence<DOMString> mediaResponseSources(HTMLMediaElement media);
    [Conditional=VIDEO] sequence<DOMString> mediaResponseContentRanges(HTMLMediaElement media);
    [Conditional=VIDEO] undefined simulateAudioInterruption(HTMLMediaElement element);
    [Conditional=VIDEO] boolean mediaElementHasCharacteristic(HTMLMediaElement element, DOMString characteristic);
    [Conditional=VIDEO] undefined beginSimulatedHDCPError(HTMLMediaElement media);
    [Conditional=VIDEO] undefined endSimulatedHDCPError(HTMLMediaElement media);
    [Conditional=VIDEO] boolean mediaPlayerRenderingCanBeAccelerated(HTMLMediaElement media);

    [Conditional=VIDEO] boolean elementShouldBufferData(HTMLMediaElement media);
    [Conditional=VIDEO] DOMString elementBufferingPolicy(HTMLMediaElement media);
    [Conditional=VIDEO] double privatePlayerVolume(HTMLMediaElement media);
    [Conditional=VIDEO] boolean privatePlayerMuted(HTMLMediaElement media);
    [Conditional=VIDEO] boolean isMediaElementHidden(HTMLMediaElement media);
    [Conditional=VIDEO] undefined setOverridePreferredDynamicRangeMode(HTMLMediaElement media, DOMString mode);
    [Conditional=VIDEO] double elementEffectivePlaybackRate(HTMLMediaElement media);

    undefined setIsPlayingToBluetoothOverride(optional boolean? isPlaying = null);

    [Conditional=LEGACY_ENCRYPTED_MEDIA] undefined initializeMockCDM();
    [Conditional=ENCRYPTED_MEDIA] MockCDMFactory registerMockCDM();
    undefined enableMockMediaCapabilities();

    [Conditional=SPEECH_SYNTHESIS] undefined enableMockSpeechSynthesizer();

    DOMString getImageSourceURL(Element element);

    [Conditional=VIDEO] DOMString captionsStyleSheetOverride();
    [Conditional=VIDEO] undefined setCaptionsStyleSheetOverride(DOMString override);
    [Conditional=VIDEO] undefined setPrimaryAudioTrackLanguageOverride(DOMString language);
    [Conditional=VIDEO] undefined setCaptionDisplayMode(DOMString mode);
    [Conditional=VIDEO] TextTrackCueGeneric createGenericCue(double startTime, double endTime, DOMString text);
    [Conditional=VIDEO] DOMString textTrackBCP47Language(TextTrack track);

    [Conditional=VIDEO] TimeRanges createTimeRanges(Float32Array startTimes, Float32Array
     endTimes);
    [Conditional=VIDEO] unrestricted double closestTimeToTimeRanges(unrestricted double time, TimeRanges ranges);

    boolean isSelectPopupVisible(HTMLSelectElement element);

    boolean isPluginUnavailabilityIndicatorObscured(Element element);
    DOMString unavailablePluginReplacementText(Element element);
    boolean isPluginSnapshotted(Element element);
    boolean pluginIsBelowSizeThreshold(Element element);

    DOMRect selectionBounds();
    undefined setSelectionWithoutValidation(Node baseNode, unsigned long baseOffset, Node? extentNode, unsigned long extentOffset);

    [Conditional=MEDIA_SOURCE] undefined initializeMockMediaSource();
    [Conditional=MEDIA_SOURCE] Promise<sequence<DOMString>> bufferedSamplesForTrackId(SourceBuffer buffer, DOMString trackId);
    [Conditional=MEDIA_SOURCE] Promise<sequence<DOMString>> enqueuedSamplesForTrackID(SourceBuffer buffer, DOMString trackID);
    [Conditional=MEDIA_SOURCE] undefined setShouldGenerateTimestamps(SourceBuffer buffer, boolean flag);
    [Conditional=MEDIA_SOURCE] double minimumUpcomingPresentationTimeForTrackID(SourceBuffer buffer, DOMString trackID);
    [Conditional=MEDIA_SOURCE] undefined setMaximumQueueDepthForTrackID(SourceBuffer buffer, DOMString trackID, unsigned long maxQueueDepth);

    [Conditional=VIDEO] undefined beginMediaSessionInterruption(DOMString interruptionType);
    [Conditional=VIDEO] undefined endMediaSessionInterruption(DOMString flags);
    [Conditional=VIDEO] undefined applicationWillBecomeInactive();
    [Conditional=VIDEO] undefined applicationDidBecomeActive();
    [Conditional=VIDEO] undefined applicationWillEnterForeground(optional boolean suspendedUnderLock = false);
    [Conditional=VIDEO] undefined applicationDidEnterBackground(optional boolean suspendedUnderLock = false);
    [Conditional=VIDEO] undefined setMediaSessionRestrictions(DOMString mediaType, DOMString restrictions);
    [Conditional=VIDEO] DOMString mediaSessionRestrictions(DOMString mediaType);
    [Conditional=VIDEO] undefined setMediaElementRestrictions(HTMLMediaElement element, DOMString restrictions);
    [Conditional=WEB_AUDIO] undefined setAudioContextRestrictions(AudioContext context, DOMString restrictions);
    [Conditional=VIDEO] undefined postRemoteControlCommand(DOMString command, optional unrestricted float argument = 0);
    [Conditional=VIDEO] undefined activeAudioRouteDidChange(boolean shouldPause);

    [Conditional=WIRELESS_PLAYBACK_TARGET] undefined setMockMediaPlaybackTargetPickerEnabled(boolean enabled);
    [Conditional=WIRELESS_PLAYBACK_TARGET] undefined setMockMediaPlaybackTargetPickerState(DOMString deviceName, DOMString deviceState);
    [Conditional=WIRELESS_PLAYBACK_TARGET] undefined mockMediaPlaybackTargetPickerDismissPopup();
    [Conditional=MEDIA_STREAM] undefined setCustomPrivateRecorderCreator();

    [Conditional=WEB_AUDIO] undefined useMockAudioDestinationCocoa();

    [Conditional=WEB_RTC] undefined emulateRTCPeerConnectionPlatformEvent(RTCPeerConnection connection, DOMString action);
    [Conditional=WEB_RTC] undefined useMockRTCPeerConnectionFactory(DOMString testCase);
    [Conditional=WEB_RTC] undefined setICECandidateFiltering(boolean enabled);
    [Conditional=WEB_RTC] undefined setEnumeratingAllNetworkInterfacesEnabled(boolean enabled);
    [Conditional=WEB_RTC] undefined stopPeerConnection(RTCPeerConnection connection);
    [Conditional=WEB_RTC] undefined clearPeerConnectionFactory();
    [Conditional=WEB_RTC] undefined setEnableWebRTCEncryption(boolean enabled);
    [Conditional=WEB_RTC] undefined setUseDTLS10(boolean use);

    [Conditional=VIDEO] undefined simulateSystemSleep();
    [Conditional=VIDEO] undefined simulateSystemWake();
    [Conditional=VIDEO] boolean elementIsBlockingDisplaySleep(HTMLMediaElement element);
    [Conditional=VIDEO] boolean isPlayerVisibleInViewport(HTMLMediaElement element);

    MockPageOverlay installMockPageOverlay(PageOverlayType type);
    DOMString pageOverlayLayerTreeAsText(optional unsigned short flags = 0);

    undefined setPageMuted(DOMString mutedState);
    DOMString pageMediaState();

    undefined setPageDefersLoading(boolean defersLoading);
    boolean pageDefersLoading();

    File? createFile(DOMString url);
    undefined queueMicroTask(long testNumber);
    boolean testPreloaderSettingViewport();

    [Conditional=CONTENT_FILTERING] readonly attribute MockContentFilterSettings mockContentFilterSettings;

    DOMString scrollSnapOffsets(Element element);
    boolean isScrollSnapInProgress(Element element);
    undefined setPlatformMomentumScrollingPredictionEnabled(boolean enabled);

    DOMString pathStringWithShrinkWrappedRects(sequence<double> rectComponents, double radius);

    [Conditional=VIDEO] DOMString getCurrentMediaControlsStatusForElement(HTMLMediaElement element);
    [Conditional=VIDEO] undefined setMediaControlsMaximumRightContainerButtonCountOverride(HTMLMediaElement element, unsigned long count);
    [Conditional=VIDEO] undefined setMediaControlsHidePlaybackRates(HTMLMediaElement element, boolean hidePlaybackRates);

    DOMString userVisibleString(DOMURL url);
    undefined setPageMediaVolume(float volume);

    undefined setShowAllPlugins(boolean showAll);

    [CallWith=GlobalObject] any cloneArrayBuffer(any buffer, any srcByteOffset, any byteLength);
    [CallWith=GlobalObject] boolean isReadableStreamDisturbed(any stream);

    DOMString resourceLoadStatisticsForURL(DOMURL url);
    undefined setResourceLoadStatisticsEnabled(boolean enable);

    undefined setCanShowModalDialogOverride(boolean allow);

    DOMString composedTreeAsText(Node parent);

    boolean isProcessingUserGesture();
    double lastHandledUserGestureTimestamp();

    undefined withUserGesture(VoidCallback callback);
    undefined withoutUserGesture(VoidCallback callback);

    boolean userIsInteracting();

    GCObservation? observeGC(any observed);

    undefined setUserInterfaceLayoutDirection(UserInterfaceLayoutDirection userInterfaceLayoutDirection);
    undefined setBaseWritingDirection(BaseWritingDirection direction);

    boolean userPrefersContrast();
    boolean userPrefersReducedMotion();

    undefined reportBacktrace();

    [Conditional=POINTER_LOCK] boolean pageHasPendingPointerLock();
    [Conditional=POINTER_LOCK] boolean pageHasPointerLock();

    sequence<DOMString> accessKeyModifiers();

    undefined setQuickLookPassword(DOMString password);

    [CallWith=Document] undefined setAsRunningUserScripts();
    [CallWith=Document, Conditional=APPLE_PAY] undefined setApplePayIsActive();

    undefined disableTileSizeUpdateDelay();
    undefined setSpeculativeTilingDelayDisabledForTesting(boolean disabled);

    [Conditional=WEBGL] undefined simulateEventForWebGLContext(SimulatedWebGLContextEvent event, WebGLRenderingContext context);
    [Conditional=WEBGL] boolean hasLowAndHighPowerGPUs();
    [Conditional=WEBGL] RequestedGPU requestedGPU(WebGLRenderingContext context);
    [Conditional=WEBGL] boolean requestedMetal(WebGLRenderingContext context);
    [Conditional=WEBGL] boolean platformSupportsMetal(boolean isWebGL2);

    undefined setPageVisibility(boolean isVisible);
    undefined setPageIsFocused(boolean isFocused);
    undefined setPageIsFocusedAndActive(boolean isFocused);
    undefined setPageIsInWindow(boolean isInWindow);
    boolean isPageActive();

    [Conditional=WEB_RTC] undefined setH264HardwareEncoderAllowed(boolean allowed);
    [Conditional=WEB_RTC] undefined applyRotationForOutgoingVideoSources(RTCPeerConnection connection);
    [Conditional=WEB_RTC] undefined setWebRTCH265Support(boolean allowed);
    [Conditional=WEB_RTC] undefined setWebRTCVP9Support(boolean supportVP9Profile0, boolean supportVP9Profile2);
    [Conditional=WEB_RTC] undefined setWebRTCVP9VTBSupport(boolean allowed);
    [Conditional=WEB_RTC] boolean isSupportingVP9VTB();
    [Conditional=WEB_RTC] Promise<boolean> isVP9VTBDeccoderUsed(RTCPeerConnection connection);
    [Conditional=WEB_RTC] undefined setSFrameCounter(RTCRtpSFrameTransform transform, DOMString counter);
    [Conditional=WEB_RTC] unsigned long long sframeCounter(RTCRtpSFrameTransform transform);
    [Conditional=WEB_RTC] unsigned long long sframeKeyId(RTCRtpSFrameTransform transform);

    [Conditional=MEDIA_STREAM] undefined setMockAudioTrackChannelNumber(MediaStreamTrack track, unsigned short count);
    [Conditional=MEDIA_STREAM] undefined setShouldInterruptAudioOnPageVisibilityChange(boolean shouldInterrupt);
    [Conditional=MEDIA_STREAM] undefined setCameraMediaStreamTrackOrientation(MediaStreamTrack track, short orientation);
    [Conditional=MEDIA_STREAM] undefined observeMediaStreamTrack(MediaStreamTrack track);
    [Conditional=MEDIA_STREAM] Promise<ImageData> grabNextMediaStreamTrackFrame();
    [Conditional=MEDIA_STREAM] readonly attribute unsigned long trackAudioSampleCount;
    [Conditional=MEDIA_STREAM] readonly attribute unsigned long trackVideoSampleCount;
    [Conditional=MEDIA_STREAM] undefined delayMediaStreamTrackSamples(MediaStreamTrack track, float delay);
    [Conditional=MEDIA_STREAM] undefined setMediaStreamTrackMuted(MediaStreamTrack track, boolean muted);
    [Conditional=MEDIA_STREAM] undefined removeMediaStreamTrack(MediaStream stream, MediaStreamTrack track);
    [Conditional=MEDIA_STREAM] undefined simulateMediaStreamTrackCaptureSourceFailure(MediaStreamTrack track);
    [Conditional=MEDIA_STREAM] undefined setMediaStreamTrackIdentifier(MediaStreamTrack track, DOMString identifier);
    [Conditional=MEDIA_STREAM] undefined setMediaStreamSourceInterrupted(MediaStreamTrack track, boolean interrupted);
    [Conditional=MEDIA_STREAM] boolean isMediaStreamSourceInterrupted(MediaStreamTrack track);
    [Conditional=MEDIA_STREAM] boolean isMediaStreamSourceEnded(MediaStreamTrack track);
    [Conditional=MEDIA_STREAM] boolean isMockRealtimeMediaSourceCenterEnabled();
    [Conditional=MEDIA_STREAM] boolean shouldAudioTrackPlay(AudioTrack track);

    DOMString documentIdentifier(Document document);
    boolean isDocumentAlive(DOMString documentIdentifier);

    readonly attribute unsigned long long storageAreaMapCount;

    unsigned long long elementIdentifier(Element element);
    [CallWith=Document] boolean isElementAlive(unsigned long long documentIdentifier);
    unsigned long long frameIdentifier(Document document);
    unsigned long long pageIdentifier(Document document);

    boolean isAnyWorkletGlobalScopeAlive();

    readonly attribute long processIdentifier;
    DOMString serviceWorkerClientInternalIdentifier(Document document);
    Promise<undefined> storeRegistrationsOnDisk();
    Promise<double> sendH2Ping(DOMString url);

    Promise<undefined> clearCacheStorageMemoryRepresentation();
    Promise<DOMString> cacheStorageEngineRepresentation();
    undefined setResponseSizeWithPadding(FetchResponse response, unsigned long long size);
    unsigned long long responseSizeWithPadding(FetchResponse response);
    DOMString responseNetworkLoadMetricsProtocol(FetchResponse response);

    DOMString blobInternalURL(Blob blob);
    Promise<boolean> isBlobInternalURLRegistered(DOMString url);

    undefined updateQuotaBasedOnSpaceUsage();

    undefined setConsoleMessageListener(StringCallback callback);

    readonly attribute boolean supportsAudioSession;
    DOMString audioSessionCategory();
    double preferredAudioBufferSize();
    double currentAudioBufferSize();
    boolean audioSessionActive();

    [Conditional=SERVICE_WORKER] Promise<boolean> hasServiceWorkerRegistration(DOMString scopeURL);
    [Conditional=SERVICE_WORKER] Promise<undefined> terminateServiceWorker(ServiceWorker worker);
    [Conditional=SERVICE_WORKER] Promise<undefined> whenServiceWorkerIsTerminated(ServiceWorker worker);

    [CallWith=Document, Conditional=APPLE_PAY] readonly attribute MockPaymentCoordinator mockPaymentCoordinator;

    boolean isSystemPreviewLink(Element element);
    boolean isSystemPreviewImage(Element element);

    [Conditional=IMAGE_ANALYSIS] readonly attribute Element? textRecognitionCandidate;
    [Conditional=IMAGE_ANALYSIS] undefined requestTextRecognition(Element element, VoidCallback callback);
    undefined installImageOverlay(Element element, sequence<ImageOverlayLine> lines, optional sequence<ImageOverlayBlock> blocks = []);

    boolean usingAppleInternalSDK();
    boolean usingGStreamer();

    undefined postTask(VoidCallback callback);
    [CallWith=ScriptExecutionContext] undefined queueTask(DOMString source, VoidCallback callback);
    [CallWith=Document] undefined queueTaskToQueueMicrotask(DOMString source, VoidCallback callback);
    boolean hasSameEventLoopAs(WindowProxy windowProxy);

    DOMString windowLocationHost(DOMWindow window);

    undefined markContextAsInsecure();

    undefined setMaxCanvasPixelMemory(unsigned long size);
    undefined setMaxCanvasArea(unsigned long size);

    [Conditional=VIDEO] readonly attribute NowPlayingState nowPlayingState;

    [Conditional=VIDEO] HTMLMediaElement bestMediaElementForRemoteControls(PlaybackControlsPurpose purpose);
    [Conditional=VIDEO] MediaSessionState mediaSessionState(HTMLMediaElement element);

    [Conditional=VIDEO] MediaUsageState mediaUsageState(HTMLMediaElement element);
    [Conditional=VIDEO] boolean elementShouldDisplayPosterImage(HTMLVideoElement element);
    [Conditional=VIDEO] readonly attribute unsigned long mediaElementCount;
    [Conditional=VIDEO] undefined setMediaElementVolumeLocked(HTMLMediaElement element, boolean volumeLocked);

    DOMString ongoingLoadsDescriptions();
    undefined setCaptureExtraNetworkLoadMetricsEnabled(boolean value);

    undefined reloadWithoutContentExtensions();

    undefined setUseSystemAppearance(boolean value);

    unsigned long pluginCount();

    undefined notifyResourceLoadObserver();

    unsigned long primaryScreenDisplayID();

    boolean capsLockIsOn();

    HEVCParameterSet? parseHEVCCodecParameters(DOMString codecParameters);
    DOMString createHEVCCodecParametersString(HEVCParameterSet parameters);
    DoViParameterSet? parseDoViCodecParameters(DOMString codecParameters);
    DOMString createDoViCodecParametersString(DoViParameterSet parameters);
    VPCodecConfigurationRecord? parseVPCodecParameters(DOMString codecParameters);

    sequence<CookieData> getCookies();

    undefined setAlwaysAllowLocalWebarchive(boolean alwaysAllowLocalWebarchive);

    undefined processWillSuspend();
    undefined processDidResume();

    undefined testDictionaryLogging();

    undefined setMaximumIntervalForUserGestureForwardingForFetch(double interval);
    undefined setTransientActivationDuration(double seconds);

    undefined setIsPlayingToAutomotiveHeadUnit(boolean value);

    TextIndicatorInfo textIndicatorForRange(Range range, TextIndicatorOptions options);

    undefined addPrefetchLoadEventListener(HTMLLinkElement link, EventListener? callback);

    [Conditional=WEB_AUTHN] undefined setMockWebAuthenticationConfiguration(MockWebAuthenticationConfiguration configuration);

    InternalsMapLike createInternalsMapLike();
    InternalsSetLike createInternalsSetLike();

    DOMString highlightPseudoElementColor(DOMString highlightName, Element element);

    boolean hasSandboxMachLookupAccessToGlobalName(DOMString process, DOMString service);
    boolean hasSandboxMachLookupAccessToXPCServiceName(DOMString process, DOMString service);
    boolean hasSandboxIOKitOpenAccessToClass(DOMString process, DOMString ioKitClass);

    DOMString systemColorForCSSValue(DOMString cssValue, boolean useDarkModeAppearance, boolean useElevatedUserInterfaceLevel);
    DOMString focusRingColor();

    boolean systemHasBattery();

    undefined setSystemHasBatteryForTesting(boolean hasBattery);
    undefined setSystemHasACForTesting(boolean hasAC);

    undefined setHardwareVP9DecoderDisabledForTesting(boolean disabled);
    undefined setVP9ScreenSizeAndScaleForTesting(double width, double height, double scale);

    long readPreferenceInteger(DOMString domain, DOMString key);
    DOMString encodedPreferenceValue(DOMString domain, DOMString key);

    DOMString getUTIFromTag(DOMString tagClass, DOMString tag, DOMString conformingToUTI);

    boolean supportsPictureInPicture();

    boolean isRemoteUIAppForAccessibility();

    unsigned long createSleepDisabler(DOMString reason, boolean display);
    boolean destroySleepDisabler(unsigned long identifier);
    
    [Conditional=APP_HIGHLIGHTS] readonly attribute sequence<DOMString> appHighlightContextMenuItemTitles;
    [Conditional=APP_HIGHLIGHTS] unsigned long numberOfAppHighlights();

    [Conditional=WEBXR] readonly attribute WebXRTest xrTest;

    [Conditional=ENCRYPTED_MEDIA] unsigned long mediaKeysInternalInstanceObjectRefCount(MediaKeys mediaKeys);
    [Conditional=ENCRYPTED_MEDIA] unsigned long mediaKeySessionInternalInstanceSessionObjectRefCount(MediaKeySession session);

    undefined setContentSizeCategory(ContentSizeCategory category);

    [Conditional=ATTACHMENT_ELEMENT] AttachmentThumbnailInfo attachmentThumbnailInfo(HTMLAttachmentElement element);
    [Conditional=ATTACHMENT_ELEMENT, Conditional=SERVICE_CONTROLS] boolean hasImageControls(HTMLImageElement element);

    [Conditional=MEDIA_SESSION] double currentMediaSessionPosition(MediaSession session);
    [Conditional=MEDIA_SESSION] undefined sendMediaSessionAction(MediaSession session, MediaSessionActionDetails actionDetails);
    [Conditional=MEDIA_SESSION] Promise<ImageData> loadArtworkImage(DOMString url);
    [Conditional=MEDIA_SESSION] sequence<DOMString> platformSupportedCommands();

    [Conditional=MEDIA_SESSION_COORDINATOR, CallWith=ScriptExecutionContext] undefined registerMockMediaSessionCoordinator(StringCallback callback);
    [Conditional=MEDIA_SESSION_COORDINATOR] undefined setMockMediaSessionCoordinatorCommandsShouldFail(boolean shouldFail);

    DOMString treeOrder(Node a, Node b, optional TreeType tree = "Tree");
    DOMString treeOrderBoundaryPoints(Node containerA, unsigned long offsetA, Node containerB, unsigned long offsetB, optional TreeType tree = "Tree");
    boolean rangeContainsNode(AbstractRange range, Node node, optional TreeType tree = "Tree");
    boolean rangeContainsRange(AbstractRange outerRange, AbstractRange innerRange, optional TreeType tree = "Tree");
    boolean rangeContainsBoundaryPoint(AbstractRange outerRange, Node container, unsigned long offset, optional TreeType tree = "Tree");
    boolean rangeIntersectsNode(AbstractRange range, Node node, optional TreeType tree = "Tree");
    boolean rangeIntersectsRange(AbstractRange outerRange, AbstractRange innerRange, optional TreeType tree = "Tree");

    undefined systemBeep();

    DOMString dumpStyleResolvers();

    undefined setDocumentAutoplayPolicy(Document document, AutoplayPolicy policy);

    undefined retainTextIteratorForDocumentContent();

    [Conditional=SERVICE_WORKER] PushSubscription createPushSubscription(USVString endpoint, EpochTimeStamp? expirationTime, ArrayBuffer serverVAPIDPublicKey, ArrayBuffer clientECDHPublicKey, ArrayBuffer auth);

    undefined overrideModalContainerSearchTermForTesting(DOMString term);
};
