/*
 * 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;
};

[
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
    JSGenerateToJSObject,
] dictionary HEVCParameterSet {
    unsigned short generalProfileSpace;
    unsigned short generalProfileIDC;
    unsigned long generalProfileCompatibilityFlags;
    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;
};

[
    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);

    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 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);

    unsigned long long documentIdentifier(Document document);
    boolean isDocumentAlive(unsigned long long 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 serviceWorkerClientIdentifier(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 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);

    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);
    DoViParameterSet? parseDoViCodecParameters(DOMString codecParameters);
    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=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);
};
