/*
 * Copyright (C) 2007, 2008, 2009 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. 
 * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
 *     its contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission. 
 *
 * 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.
 */

#ifndef DO_NO_IMPORTS
import "oaidl.idl";
import "ocidl.idl";
#endif

typedef enum WebKitJavaScriptRuntimeFlags {
    WebKitJavaScriptRuntimeFlagsAllEnabled = 0
} WebKitJavaScriptRuntimeFlags;

[
    object,
    oleautomation,
    hidden,
    uuid(1380DE41-42CF-4170-9D5D-7840EDE5B36C),
    pointer_default(unique)
]
interface IWebPreferencesPrivate : IUnknown
{
    HRESULT setDeveloperExtrasEnabled([in] BOOL enabled);
    HRESULT developerExtrasEnabled([out, retval] BOOL* enabled);

    HRESULT setAutomaticallyDetectsCacheModel([in] BOOL automaticallyDetectsCacheModel);
    HRESULT automaticallyDetectsCacheModel([out, retval] BOOL* automaticallyDetectsCacheModel);

    HRESULT setAuthorAndUserStylesEnabled([in] BOOL enabled);
    HRESULT authorAndUserStylesEnabled([out, retval] BOOL* enabled);

    HRESULT inApplicationChromeMode([out, retval] BOOL *allowed);
    HRESULT setApplicationChromeMode([in] BOOL allowed);

    HRESULT setOfflineWebApplicationCacheEnabled([in] BOOL enabled);
    HRESULT offlineWebApplicationCacheEnabled([out, retval] BOOL *enabled);

    HRESULT localStorageDatabasePath([out, retval] BSTR* location);
    HRESULT setLocalStorageDatabasePath([in] BSTR location);

    // These two methods are no-ops, and only retained to keep
    // the Interface consistent. DO NOT USE THEM.
    HRESULT setShouldPaintNativeControls([in] BOOL shouldPaint);
    HRESULT shouldPaintNativeControls([out, retval] BOOL* enabled);

    HRESULT setDatabasesEnabled([in] BOOL enabled);
    HRESULT databasesEnabled([out, retval] BOOL *enabled);

    HRESULT setLocalStorageEnabled([in] BOOL enabled);
    HRESULT localStorageEnabled([out, retval] BOOL* enabled);

    HRESULT setFontSmoothingContrast([in] float contrast);
    HRESULT fontSmoothingContrast([out, retval] float* contrast);

    HRESULT isWebSecurityEnabled([out, retval] BOOL* enabled);
    HRESULT setWebSecurityEnabled([in] BOOL enabled);

    HRESULT allowUniversalAccessFromFileURLs([out, retval] BOOL *allowAccess);
    HRESULT setAllowUniversalAccessFromFileURLs([in] BOOL allowAccess);

    HRESULT isXSSAuditorEnabled([out, retval] BOOL *enabled);
    HRESULT setXSSAuditorEnabled([in] BOOL enabled);

    HRESULT isFrameFlatteningEnabled([out, retval] BOOL *enabled);
    HRESULT setFrameFlatteningEnabled([in] BOOL enabled);

    HRESULT experimentalNotificationsEnabled([out, retval] BOOL *enabled);
    HRESULT setExperimentalNotificationsEnabled([in] BOOL enabled);

    HRESULT setShouldUseHighResolutionTimers([in] BOOL useHighResolutionTimers);
    HRESULT shouldUseHighResolutionTimers([out, retval] BOOL* useHighResolutionTimers);

    // Used to set preference specified by a test via TestRunner.overridePreference(..).
    // Used by DumpRenderTree.
    HRESULT setPreferenceForTest([in] BSTR key, [in] BSTR value);

    HRESULT unused1();
    HRESULT unused2();

    HRESULT setAcceleratedCompositingEnabled([in] BOOL);
    HRESULT acceleratedCompositingEnabled([out, retval] BOOL*);

    HRESULT setCustomDragCursorsEnabled([in] BOOL);
    HRESULT customDragCursorsEnabled([out, retval] BOOL*);

    HRESULT allowFileAccessFromFileURLs([out, retval] BOOL *allowAccess);
    HRESULT setAllowFileAccessFromFileURLs([in] BOOL allowAccess);

    HRESULT setShowDebugBorders([in] BOOL);
    HRESULT showDebugBorders([out, retval] BOOL*);

    HRESULT setShowRepaintCounter([in] BOOL);
    HRESULT showRepaintCounter([out, retval] BOOL*);

    HRESULT javaScriptCanAccessClipboard([out, retval] BOOL *enabled);
    HRESULT setJavaScriptCanAccessClipboard([in] BOOL enabled);

    HRESULT isDNSPrefetchingEnabled([out, retval] BOOL *enabled);
    HRESULT setDNSPrefetchingEnabled([in] BOOL enabled);

    HRESULT hyperlinkAuditingEnabled(BOOL *hyperlinkAuditingEnabled);
    HRESULT setHyperlinkAuditingEnabled(BOOL hyperlinkAuditingEnabled);

    HRESULT setLoadsSiteIconsIgnoringImageLoadingPreference([in] BOOL enabled);
    HRESULT loadsSiteIconsIgnoringImageLoadingPreference([out, retval] BOOL* enabled);

    HRESULT setFullScreenEnabled([in] BOOL enabled);
    HRESULT isFullScreenEnabled([out, retval] BOOL* enabled);

    HRESULT setHixie76WebSocketProtocolEnabled([in] BOOL enabled);
    HRESULT hixie76WebSocketProtocolEnabled([out, retval] BOOL* enabled);

    HRESULT setMediaPlaybackRequiresUserGesture([in] BOOL);
    HRESULT mediaPlaybackRequiresUserGesture([out, retval] BOOL*);

    HRESULT setMediaPlaybackAllowsInline([in] BOOL);
    HRESULT mediaPlaybackAllowsInline([out, retval] BOOL*);

    HRESULT setShowsToolTipOverTruncatedText([in] BOOL);
    HRESULT showsToolTipOverTruncatedText([out, retval] BOOL*);

    HRESULT setShouldInvertColors([in] BOOL);
    HRESULT shouldInvertColors([out, retval] BOOL*);

    HRESULT setRequestAnimationFrameEnabled([in] BOOL);
    HRESULT requestAnimationFrameEnabled([out, retval] BOOL*);

    HRESULT mockScrollbarsEnabled([out, retval] BOOL* enabled);
    HRESULT setMockScrollbarsEnabled([in] BOOL enabled);

    // These two methods are no-ops, and only retained to keep
    // the Interface consistent. DO NOT USE THEM.
    HRESULT screenFontSubstitutionEnabled([out, retval] BOOL* enabled);
    HRESULT setScreenFontSubstitutionEnabled([in] BOOL enabled);

    HRESULT isInheritURIQueryComponentEnabled([out, retval] BOOL* enabled);
    HRESULT setEnableInheritURIQueryComponent([in] BOOL enabled);
}

[ uuid(0E1DDB80-6B38-4ABC-A252-B58A83EB6D8C) ]
interface IWebPreferencesPrivate2 : IWebPreferencesPrivate
{
    HRESULT javaScriptRuntimeFlags([out, retval] unsigned* flags);
    HRESULT setJavaScriptRuntimeFlags([in] unsigned flags);
    HRESULT allowDisplayAndRunningOfInsecureContent([out, retval] BOOL* enabled);
    HRESULT setAllowDisplayAndRunningOfInsecureContent([in] BOOL enabled);
}

[uuid(92809BFB-C24F-43AD-863F-601B08CC268D)]
interface IWebPreferencesPrivate3 : IWebPreferencesPrivate2
{
    HRESULT showTiledScrollingIndicator([out, retval] BOOL* enabled);
    HRESULT setShowTiledScrollingIndicator([in] BOOL enabled);
    HRESULT fetchAPIEnabled([out, retval] BOOL* enabled);
    HRESULT setFetchAPIEnabled([in] BOOL enabled);
    HRESULT shadowDOMEnabled([out, retval] BOOL* enabled);
    HRESULT setShadowDOMEnabled([in] BOOL enabled);
    HRESULT customElementsEnabled([out, retval] BOOL* enabled);
    HRESULT setCustomElementsEnabled([in] BOOL enabled);
}

[uuid(F9582D72-6348-45B1-AB09-39E33459B5B9)]
interface IWebPreferencesPrivate4 : IWebPreferencesPrivate3
{
    HRESULT setApplicationId([in] BSTR applicationId);
    HRESULT userTimingEnabled([out, retval] BOOL*);
    HRESULT setUserTimingEnabled([in] BOOL enabled);
    HRESULT resourceTimingEnabled([out, retval] BOOL*);
    HRESULT setResourceTimingEnabled([in] BOOL enabled);
    HRESULT linkPreloadEnabled([out, retval] BOOL*);
    HRESULT setLinkPreloadEnabled([in] BOOL enabled);
    HRESULT mediaPreloadingEnabled([out, retval] BOOL*);
    HRESULT setMediaPreloadingEnabled([in] BOOL enabled);
    HRESULT clearNetworkLoaderSession();
    HRESULT switchNetworkLoaderToNewTestingSession();
}

[uuid(9C4CBF53-19BC-46B3-831E-6A8B88200F20)]
interface IWebPreferencesPrivate5 : IWebPreferencesPrivate4
{
    HRESULT isSecureContextAttributeEnabled([out, retval] BOOL*);
    HRESULT setIsSecureContextAttributeEnabled([in] BOOL enabled);
}

[uuid(B8BC62C9-1CA9-4FD1-B328-CB0BD171249F)]
interface IWebPreferencesPrivate6 : IWebPreferencesPrivate5
{
    HRESULT dataTransferItemsEnabled([out, retval] BOOL*);
    HRESULT setDataTransferItemsEnabled([in] BOOL enabled);
    HRESULT inspectorAdditionsEnabled([out, retval] BOOL*);
    HRESULT setInspectorAdditionsEnabled([in] BOOL enabled);
    HRESULT visualViewportAPIEnabled([out, retval] BOOL*);
    HRESULT setVisualViewportAPIEnabled([in] BOOL enabled);
    HRESULT CSSOMViewScrollingAPIEnabled([out, retval] BOOL*);
    HRESULT setCSSOMViewScrollingAPIEnabled([in] BOOL enabled);
    HRESULT CSSOMViewSmoothScrollingEnabled([out, retval] BOOL*);
    HRESULT setCSSOMViewSmoothScrollingEnabled([in] BOOL enabled);
    HRESULT fetchAPIKeepAliveEnabled([out, retval] BOOL* enabled);
    HRESULT setFetchAPIKeepAliveEnabled([in] BOOL enabled);
    HRESULT spatialNavigationEnabled([out, retval] BOOL *enabled);
    HRESULT setSpatialNavigationEnabled([in] BOOL enabled);
    HRESULT menuItemElementEnabled([out, retval] BOOL* enabled);
    HRESULT setMenuItemElementEnabled([in] BOOL enabled);
    HRESULT keygenElementEnabled([out, retval] BOOL* enabled);
    HRESULT setKeygenElementEnabled([in] BOOL enabled);
    HRESULT serverTimingEnabled([out, retval] BOOL* enabled);
    HRESULT setServerTimingEnabled([in] BOOL enabled);
}

[uuid(9A49D1DE-53DD-11E8-95E6-003EE1C28AB6)]
interface IWebPreferencesPrivate7 : IWebPreferencesPrivate6
{
    HRESULT crossOriginWindowPolicySupportEnabled([out, retval] BOOL* enabled);
    HRESULT setCrossOriginWindowPolicySupportEnabled([in] BOOL enabled);
    HRESULT resizeObserverEnabled([out, retval] BOOL*);
    HRESULT setResizeObserverEnabled([in] BOOL enabled);
    HRESULT coreMathMLEnabled([out, retval] BOOL* enabled);
    HRESULT setCoreMathMLEnabled([in] BOOL enabled);
    HRESULT requestIdleCallbackEnabled([out, retval] BOOL* enabled);
    HRESULT setRequestIdleCallbackEnabled([in] BOOL enabled);
    HRESULT asyncClipboardAPIEnabled([out, retval] BOOL* enabled);
    HRESULT setAsyncClipboardAPIEnabled([in] BOOL enabled);
    HRESULT webAnimationsCompositeOperationsEnabled([out, retval] BOOL*);
    HRESULT setWebAnimationsCompositeOperationsEnabled([in] BOOL enabled);
    HRESULT webAnimationsMutableTimelinesEnabled([out, retval] BOOL*);
    HRESULT setWebAnimationsMutableTimelinesEnabled([in] BOOL enabled);
    HRESULT CSSCustomPropertiesAndValuesEnabled([out, retval] BOOL*);
    HRESULT setCSSCustomPropertiesAndValuesEnabled([in] BOOL enabled);
    HRESULT aspectRatioOfImgFromWidthAndHeightEnabled([out, retval] BOOL*);
    HRESULT setAspectRatioOfImgFromWidthAndHeightEnabled([in] BOOL enabled);
    HRESULT setWebSQLEnabled([in] BOOL enabled);
    HRESULT webSQLEnabled([out, retval] BOOL* enabled);
    HRESULT CSSIndividualTransformPropertiesEnabled([out, retval] BOOL* enabled);
    HRESULT setCSSIndividualTransformPropertiesEnabled([in] BOOL enabled);
}

[uuid(04D4AAE1-5D01-4CCD-B46E-C022F10A6826)]
interface IWebPreferencesPrivate8 : IWebPreferencesPrivate7
{
    HRESULT allowTopNavigationToDataURLs([out, retval] BOOL* enabled);
    HRESULT setAllowTopNavigationToDataURLs([in] BOOL enabled);
    HRESULT modernUnprefixedWebAudioEnabled([out, retval] BOOL* enabled);
    HRESULT setModernUnprefixedWebAudioEnabled([in] BOOL enabled);
    HRESULT contactPickerAPIEnabled([out, retval] BOOL* enabled);
    HRESULT setContactPickerAPIEnabled([in] BOOL enabled);
    HRESULT setBoolPreferenceForTesting([in] BSTR key, [in] BOOL value);
    HRESULT setUInt32PreferenceForTesting([in] BSTR key, [in] unsigned value);
    HRESULT setDoublePreferenceForTesting([in] BSTR key, [in] double value);
    HRESULT setStringPreferenceForTesting([in] BSTR key, [in] BSTR value);
    HRESULT speechRecognitionEnabled([out, retval] BOOL* enabled);
    HRESULT setSpeechRecognitionEnabled([in] BOOL enabled);
    HRESULT overscrollBehaviorEnabled([ out, retval ] BOOL*);
    HRESULT setOverscrollBehaviorEnabled([in] BOOL enabled);
    HRESULT resetForTesting();
    HRESULT startBatchingUpdates();
    HRESULT stopBatchingUpdates();
}

// NOTE: Please do not add any more preferences that are only for testing purposes. Instead,
// please use the generalized set<type>PreferenceForTesting() functions.
