/*
 * Copyright (C) 2012 Google Inc. All rights reserved.
 * Copyright (C) 2015-2020 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 EditingBehaviorType { "mac", "windows", "unix", "ios" };
enum FontLoadTimingOverride { "None", "Block", "Swap", "Failure" };
enum ForcedAccessibilityValue { "system", "on", "off" };
enum FrameFlatteningValue { "Disabled", "EnabledForNonFullScreenIFrames", "FullyEnabled" };
enum PDFImageCachingPolicy { "Enabled", "BelowMemoryLimit", "Disabled", "ClipBoundsOnly" };
enum StorageBlockingPolicy { "AllowAll", "BlockThirdParty", "BlockAll" };
enum SystemLayoutDirection { "LTR", "RTL" };
enum TrackKind { "Subtitles", "Captions", "TextDescriptions" };
enum UserInterfaceDirectionPolicy { "Content", "System" };

[
    LegacyNoInterfaceObject,
    JSGenerateToJSObject,
    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
] interface InternalSettings : InternalSettingsGenerated {
    // Settings
    undefined setStandardFontFamily(DOMString family, DOMString script);
    undefined setSerifFontFamily(DOMString family, DOMString script);
    undefined setSansSerifFontFamily(DOMString family, DOMString script);
    undefined setFixedFontFamily(DOMString family, DOMString script);
    undefined setCursiveFontFamily(DOMString family, DOMString script);
    undefined setFantasyFontFamily(DOMString family, DOMString script);
    undefined setPictographFontFamily(DOMString family, DOMString script);
    undefined setFontLoadTimingOverride(FontLoadTimingOverride override);
    // Forwards to TextAutosizingWindowSizeOverrideHeight and TextAutosizingWindowSizeOverrideWidth.
    undefined setTextAutosizingWindowSizeOverride(long width, long height);
    undefined setTimeWithoutMouseMovementBeforeHidingControls(unrestricted double intervalInSeconds);
    undefined setMinimumTimerInterval(unrestricted double intervalInSeconds);
    undefined setEditingBehavior(EditingBehaviorType behavior);
    undefined setStorageBlockingPolicy(StorageBlockingPolicy policy);
    undefined setPDFImageCachingPolicy(PDFImageCachingPolicy policy);
    undefined setFrameFlattening(FrameFlatteningValue frameFlattening);
    undefined setUserInterfaceDirectionPolicy(UserInterfaceDirectionPolicy policy);
    undefined setSystemLayoutDirection(SystemLayoutDirection direction);
    attribute ForcedAccessibilityValue forcedColorsAreInvertedAccessibilityValue;
    attribute ForcedAccessibilityValue forcedDisplayIsMonochromeAccessibilityValue;
    attribute ForcedAccessibilityValue forcedPrefersContrastAccessibilityValue;
    attribute ForcedAccessibilityValue forcedPrefersReducedMotionAccessibilityValue;
    attribute ForcedAccessibilityValue forcedSupportsHighDynamicRangeValue;

    // RuntimeEnabledFeatures.
    undefined setFetchAPIKeepAliveEnabled(boolean enabled);
    undefined setCustomPasteboardDataEnabled(boolean enabled);

    readonly attribute boolean vp9DecoderEnabled;

    // DeprecatedGlobalSettings.
    undefined setShouldManageAudioSessionCategory(boolean should);

    // CaptionUserPreferences
    undefined setShouldDisplayTrackKind(TrackKind kind, boolean enabled);
    boolean shouldDisplayTrackKind(TrackKind kind);

    // Page
    undefined setCanStartMedia(boolean enabled);
    undefined setEditableRegionEnabled(boolean enabled);
    undefined setUseDarkAppearance(boolean enabled);
    undefined setUseElevatedUserInterfaceLevel(boolean enabled);

    // ScrollView
    undefined setAllowUnclampedScrollPosition(boolean allowUnclamped);

    // PlatformMediaSessionManager.
    undefined setShouldDeactivateAudioSession(boolean shouldDeactivate);

    // RenderTheme/FontCache
    undefined setShouldMockBoldSystemFontForAccessibility(boolean shouldMock);

    // AudioContext
    undefined setDefaultAudioContextSampleRate(float sampleRate);
};
