/*
 * Copyright (C) 2012 Google Inc. All rights reserved.
 * Copyright (C) 2015 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 ForcedAccessibilityValue { "system", "on", "off" };
enum FrameFlatteningValue { "Disabled", "EnabledForNonFullScreenIFrames", "FullyEnabled" };
enum FontLoadTimingOverride { "Block", "Swap", "Failure" };

[
    NoInterfaceObject,
    JSGenerateToJSObject,
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
] interface InternalSettings : InternalSettingsGenerated {
    [MayThrowException] void setTouchEventEmulationEnabled(boolean enabled);

    // Fonts, text
    [MayThrowException] void setStandardFontFamily(DOMString family, DOMString script);
    [MayThrowException] void setSerifFontFamily(DOMString family, DOMString script);
    [MayThrowException] void setSansSerifFontFamily(DOMString family, DOMString script);
    [MayThrowException] void setFixedFontFamily(DOMString family, DOMString script);
    [MayThrowException] void setCursiveFontFamily(DOMString family, DOMString script);
    [MayThrowException] void setFantasyFontFamily(DOMString family, DOMString script);
    [MayThrowException] void setPictographFontFamily(DOMString family, DOMString script);
    [MayThrowException] void setFontFallbackPrefersPictographs(boolean preferPictographs);
    [MayThrowException] void setFontLoadTimingOverride(FontLoadTimingOverride override);
    [MayThrowException] void setShouldIgnoreFontLoadCompletions(boolean ignore);

    [MayThrowException] void setTextAutosizingEnabled(boolean enabled);
    [MayThrowException] void setTextAutosizingWindowSizeOverride(long width, long height);
    [MayThrowException] void setTextAutosizingUsesIdempotentMode(boolean enabled);

    // Media
    [MayThrowException] void setCanStartMedia(boolean enabled);
    [MayThrowException] void setShouldDisplayTrackKind(DOMString kind, boolean enabled);
    [MayThrowException] boolean shouldDisplayTrackKind(DOMString trackKind);
    [MayThrowException] void setDefaultVideoPosterURL(DOMString poster);
    [MayThrowException] void setTimeWithoutMouseMovementBeforeHidingControls(unrestricted double time);
    [MayThrowException] void setMediaTypeOverride(DOMString mediaTypeOverride);
    void setAllowsAirPlayForMediaPlayback(boolean available);
    [Conditional=MEDIA_STREAM, MayThrowException] void setMediaCaptureRequiresSecureConnection(boolean enable);

    [MayThrowException] void setForcePendingWebGLPolicy(boolean forced);

    [MayThrowException] void setQuickTimePluginReplacementEnabled(boolean enabled);
    [MayThrowException] void setYouTubeFlashPluginReplacementEnabled(boolean enabled);

    // Editing, forms
    [MayThrowException] void setEditingBehavior(DOMString behavior);
    [MayThrowException] void setShouldConvertPositionStyleOnCopy(boolean convertPosition);
    [MayThrowException] void setPreferMIMETypeForImages(boolean preferMimeTypeForImage);

    // Other switches
    [MayThrowException] void setUseDarkAppearance(boolean enabled);
    [MayThrowException] void setStorageBlockingPolicy(DOMString policy);
    [MayThrowException] void setImagesEnabled(boolean enabled);
    [MayThrowException] void setPDFImageCachingPolicy(DOMString policy);
    [MayThrowException] void setUseLegacyBackgroundSizeShorthandBehavior(boolean enabled);
    [MayThrowException] void setAutoscrollForDragAndDropEnabled(boolean enabled);
    [MayThrowException] void setBackgroundShouldExtendBeyondPage(boolean hasExtendedBackground);
    [MayThrowException] void setScrollingTreeIncludesFrames(boolean enabled);
    [MayThrowException] void setAllowUnclampedScrollPosition(boolean allowUnclamped);
    [MayThrowException] void setAnimatedImageDebugCanvasDrawingEnabled(boolean enable);

    [MayThrowException] void setMinimumTimerInterval(unrestricted double intervalInSeconds);
    [MayThrowException] void setAllowsInlineMediaPlayback(boolean allows);
    [MayThrowException] void setAllowsInlineMediaPlaybackAfterFullscreen(boolean allows);
    [MayThrowException] void setInlineMediaPlaybackRequiresPlaysInlineAttribute(boolean requires);
    [MayThrowException] void setFrameFlattening(FrameFlatteningValue frameFlattening);
    [MayThrowException] void setIncompleteImageBorderEnabled(boolean enabled);
    [MayThrowException] void setShouldDispatchSyntheticMouseEventsWhenModifyingSelection(boolean shouldDispatch);
    [MayThrowException] void setShouldDispatchSyntheticMouseOutAfterSyntheticClick(boolean shouldDispatch);

    // RuntimeEnabledFeatures.
    void setIndexedDBWorkersEnabled(boolean enabled);
    void setWebGL2Enabled(boolean enabled);
    void setWebGPUEnabled(boolean enabled);
    void setScreenCaptureEnabled(boolean enabled);
    void setFetchAPIKeepAliveEnabled(boolean enabled);

    [MayThrowException] DOMString userInterfaceDirectionPolicy();
    [MayThrowException] void setUserInterfaceDirectionPolicy(DOMString policy);
    [MayThrowException] DOMString systemLayoutDirection();
    [MayThrowException] void setSystemLayoutDirection(DOMString direction);

    [MayThrowException] boolean deferredCSSParserEnabled();
    [MayThrowException] void setDeferredCSSParserEnabled(boolean enabled);

    [MayThrowException] void setShouldMockBoldSystemFontForAccessibility(boolean shouldMock);

    attribute ForcedAccessibilityValue forcedColorsAreInvertedAccessibilityValue;
    attribute ForcedAccessibilityValue forcedDisplayIsMonochromeAccessibilityValue;
    attribute ForcedAccessibilityValue forcedPrefersReducedMotionAccessibilityValue;
    attribute ForcedAccessibilityValue forcedSupportsHighDynamicRangeValue;

    [MayThrowException] void setShouldManageAudioSessionCategory(boolean should);
    [MayThrowException] void setCustomPasteboardDataEnabled(boolean enabled);

    [EnabledAtRuntime=WebAnimations] boolean webAnimationsCSSIntegrationEnabled();

    void setShouldDeactivateAudioSession(boolean shouldDeactivate);
    
    void setStorageAccessAPIPerPageScopeEnabled(boolean enabled);
};

