/*
 * 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;
    readonly attribute boolean mediaSourceInlinePaintingEnabled;

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

    undefined setAllowedMediaContainerTypes(DOMString? types);
    undefined setAllowedMediaCodecTypes(DOMString? types);
    undefined setAllowedMediaVideoCodecIDs(DOMString? types);
    undefined setAllowedMediaAudioCodecIDs(DOMString? types);
    undefined setAllowedMediaCaptionFormatTypes(DOMString? types);
};
