/*
 * 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 COMPUTER, 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 COMPUTER, 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 WebKitEditingBehavior {
    WebKitEditingMacBehavior = 0,
    WebKitEditingWinBehavior,
    WebKitEditingUnixBehavior
} WebKitEditingBehavior;


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 setShouldPaintCustomScrollbars(BOOL shouldPaint);
    HRESULT shouldPaintCustomScrollbars(BOOL *shouldPaint);

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

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

    HRESULT editingBehavior([out, retval] WebKitEditingBehavior* editingBehavior);
    HRESULT setEditingBehavior([in] WebKitEditingBehavior behavior);
}
