/*
 * Copyright (C) 2006, 2007, 2008 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 INC. ``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 INC. OR
 * 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. 
 */

cpp_quote("#define WebPreferencesChangedNotification TEXT(\"WebPreferencesChangedNotification\")")
cpp_quote("#define WebPreferencesRemovedNotification TEXT(\"WebPreferencesRemovedNotification\")")

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

typedef enum FontSmoothingType {
    FontSmoothingTypeStandard=0,
    FontSmoothingTypeLight,
    FontSmoothingTypeMedium,
    FontSmoothingTypeStrong,
    FontSmoothingTypeWindows
} FontSmoothingType;

typedef enum WebKitEditableLinkBehavior {
    WebKitEditableLinkDefaultBehavior = 0,
    WebKitEditableLinkAlwaysLive,
    WebKitEditableLinkOnlyLiveWithShiftKey,
    WebKitEditableLinkLiveWhenNotFocused,
    WebKitEditableLinkNeverLive
} WebKitEditableLinkBehavior;

typedef enum WebKitCookieStorageAcceptPolicy {
    WebKitCookieStorageAcceptPolicyAlways = 0,
    WebKitCookieStorageAcceptPolicyNever,
    WebKitCookieStorageAcceptPolicyOnlyFromMainDocumentDomain
} WebKitCookieStorageAcceptPolicy;

typedef enum WebCacheModel {
    WebCacheModelDocumentViewer = 0,
    WebCacheModelDocumentBrowser = 1,
    WebCacheModelPrimaryWebBrowser = 2
} WebCacheModel;

[
    object,
    oleautomation,
    hidden,
    uuid(0930D594-A5A3-46e1-858E-AB17A13CD28E),
    pointer_default(unique)
]
interface IWebPreferences : IUnknown
{
    HRESULT standardPreferences([out, retval] IWebPreferences** standardPreferences);

    HRESULT initWithIdentifier([in] BSTR anIdentifier, [out, retval] IWebPreferences** preferences);
    HRESULT identifier([out, retval] BSTR* ident);

    HRESULT standardFontFamily([out, retval] BSTR* family);
    HRESULT setStandardFontFamily([in] BSTR family);

    HRESULT fixedFontFamily([out, retval] BSTR* family);
    HRESULT setFixedFontFamily([in] BSTR family);

    HRESULT serifFontFamily([out, retval] BSTR* fontFamily);
    HRESULT setSerifFontFamily([in] BSTR family);

    HRESULT sansSerifFontFamily([out, retval] BSTR* family);
    HRESULT setSansSerifFontFamily([in] BSTR family);

    HRESULT cursiveFontFamily([out, retval] BSTR* family);
    HRESULT setCursiveFontFamily([in] BSTR family);

    HRESULT fantasyFontFamily([out, retval] BSTR* family);
    HRESULT setFantasyFontFamily([in] BSTR family);

    HRESULT defaultFontSize([out, retval] int* fontSize);
    HRESULT setDefaultFontSize([in] int fontSize);

    HRESULT defaultFixedFontSize([out, retval] int* fontSize);
    HRESULT setDefaultFixedFontSize([in] int fontSize);

    HRESULT minimumFontSize([out, retval] int* fontSize);
    HRESULT setMinimumFontSize([in] int fontSize);

    HRESULT minimumLogicalFontSize([out, retval] int* fontSize);
    HRESULT setMinimumLogicalFontSize([in] int fontSize);

    HRESULT defaultTextEncodingName([out, retval] BSTR* name);
    HRESULT setDefaultTextEncodingName([in] BSTR name);

    HRESULT userStyleSheetEnabled([out, retval] BOOL* enabled);
    HRESULT setUserStyleSheetEnabled([in] BOOL enabled);

    HRESULT userStyleSheetLocation([out, retval] BSTR* location);
    HRESULT setUserStyleSheetLocation([in] BSTR location);

    HRESULT isJavaEnabled([out, retval] BOOL* enabled);
    HRESULT setJavaEnabled([in] BOOL enabled);

    HRESULT isJavaScriptEnabled([out, retval] BOOL* enabled);
    HRESULT setJavaScriptEnabled([in] BOOL enabled);

    HRESULT javaScriptCanOpenWindowsAutomatically([out, retval] BOOL* enabled);
    HRESULT setJavaScriptCanOpenWindowsAutomatically([in] BOOL enabled);

    HRESULT arePlugInsEnabled([out, retval] BOOL* enabled);
    HRESULT setPlugInsEnabled([in] BOOL enabled);

    HRESULT allowsAnimatedImages([out, retval] BOOL* enabled);
    HRESULT setAllowsAnimatedImages([in] BOOL enabled);
    HRESULT allowAnimatedImageLooping([out, retval] BOOL* enabled);
    HRESULT setAllowAnimatedImageLooping([in] BOOL enabled);

    HRESULT setLoadsImagesAutomatically([in] BOOL enabled);
    HRESULT loadsImagesAutomatically([out, retval] BOOL* enabled);

    HRESULT setAutosaves([in] BOOL enabled);
    HRESULT autosaves([out, retval] BOOL* enabled);

    HRESULT setShouldPrintBackgrounds([in] BOOL enabled);
    HRESULT shouldPrintBackgrounds([out, retval] BOOL* enabled);

    HRESULT setPrivateBrowsingEnabled([in] BOOL enabled);
    HRESULT privateBrowsingEnabled([out, retval] BOOL* enabled);

    HRESULT setTabsToLinks([in] BOOL enabled);
    HRESULT tabsToLinks([out, retval] BOOL* enabled);

    HRESULT textAreasAreResizable([out, retval] BOOL* enabled);
    HRESULT setTextAreasAreResizable([in] BOOL enabled);

    HRESULT unused1();
    HRESULT unused2();

    HRESULT iconDatabaseLocation([out, retval] BSTR* location);
    HRESULT setIconDatabaseLocation([in] BSTR location);

    HRESULT iconDatabaseEnabled([out, retval] BOOL* enabled);
    HRESULT setIconDatabaseEnabled([in] BOOL enabled);

    HRESULT fontSmoothing([out, retval] FontSmoothingType* smoothingType);
    HRESULT setFontSmoothing([in] FontSmoothingType smoothingType);

    HRESULT editableLinkBehavior([out, retval] WebKitEditableLinkBehavior* editableLinkBehavior);
    HRESULT setEditableLinkBehavior([in] WebKitEditableLinkBehavior behavior);

    HRESULT cookieStorageAcceptPolicy([out, retval] WebKitCookieStorageAcceptPolicy* acceptPolicy);
    HRESULT setCookieStorageAcceptPolicy([in] WebKitCookieStorageAcceptPolicy acceptPolicy);

    HRESULT continuousSpellCheckingEnabled([out, retval] BOOL* enabled);
    HRESULT setContinuousSpellCheckingEnabled([in] BOOL enabled);
    HRESULT grammarCheckingEnabled([out, retval] BOOL* enabled);
    HRESULT setGrammarCheckingEnabled([in] BOOL enabled);
    HRESULT allowContinuousSpellChecking([out, retval] BOOL *allowed);
    HRESULT setAllowContinuousSpellChecking([in] BOOL allowed);

    HRESULT isDOMPasteAllowed([out, retval] BOOL *allowed);
    HRESULT setDOMPasteAllowed([in] BOOL allowed);

    HRESULT usesPageCache([out, retval] BOOL* usesPageCache);
    HRESULT setUsesPageCache([in] BOOL usesPageCache);

    HRESULT cacheModel([out, retval] WebCacheModel* cacheModel);
    HRESULT setCacheModel([in] WebCacheModel cacheModel);

    HRESULT unused3();
    HRESULT unused4();

    HRESULT setZoomsTextOnly(BOOL zoomsTextOnly);
    HRESULT zoomsTextOnly(BOOL *zoomsTextOnly);

    HRESULT setAcceleratedCompositingEnabled(BOOL acceleratedCompositingEnabled);
    HRESULT acceleratedCompositingEnabled(BOOL *acceleratedCompositingEnabled);

    HRESULT unused5();
    HRESULT unused6();

    HRESULT setAVFoundationEnabled(BOOL avFoundationEnabled);
    HRESULT avFoundationEnabled(BOOL *avFoundationEnabled);

    HRESULT pictographFontFamily([out, retval] BSTR* family);
    HRESULT setPictographFontFamily([in] BSTR family);

    HRESULT setShouldDisplaySubtitles(BOOL shouldDisplaySubtitles);
    HRESULT shouldDisplaySubtitles(BOOL *shouldDisplaySubtitles);

    HRESULT setShouldDisplayCaptions(BOOL shouldDisplayCaptions);
    HRESULT shouldDisplayCaptions(BOOL *shouldDisplayCaptions);

    HRESULT setShouldDisplayTextDescriptions(BOOL shouldDisplayTextDescriptions);
    HRESULT shouldDisplayTextDescriptions(BOOL *shouldDisplayTextDescriptions);

    HRESULT isCSSRegionsEnabled([out, retval] BOOL* enabled);
    HRESULT setCSSRegionsEnabled([in] BOOL enabled);

    HRESULT unused7();
    HRESULT unused8();
}
