/*
 * 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. 
 */

#ifndef DO_NO_IMPORTS
import "oaidl.idl";
import "ocidl.idl";
import "IWebFormDelegate.idl";
import "IWebFrameLoadDelegatePrivate.idl";
import "IWebHistoryDelegate.idl";
import "IWebInspector.idl";
import "IWebInspectorPrivate.idl";
#endif

// Sent when IWebView::close is called. No userInfo is associated with this notification.
cpp_quote("#define WebViewWillCloseNotification L\"WebViewWillCloseNotification\"")

interface IEnumTextMatches;
interface IWebFormDelegate;
interface IWebFrameLoadDelegatePrivate;
interface IWebHistoryDelegate;
interface IWebInspector;
interface IWebInspectorPrivate;
interface IWebPluginHalterDelegate;
interface IWebURLRequest;
interface IWebView;

typedef enum {
    WebInjectAtDocumentStart = 0,
    WebInjectAtDocumentEnd,
} WebUserScriptInjectionTime;

[
    object,
    oleautomation,
    uuid(44914369-DEB5-4fcf-A6A3-30C02E73154F),
    pointer_default(unique)
]
interface IWebViewPrivate : IUnknown
{
    /*!
        @method _setInViewSourceMode:
        @abstract Used to place a WebView into a special source-viewing mode.
        - (void)_setInViewSourceMode:(BOOL)flag;
      */
    HRESULT setInViewSourceMode([in] BOOL flag);

    /*!
        @method _inViewSourceMode;
        @abstract Whether or not the WebView is in source-view mode for HTML.
        - (BOOL)_inViewSourceMode;
      */
    HRESULT inViewSourceMode([out, retval] BOOL* flag);

    HRESULT viewWindow([out, retval] OLE_HANDLE* window);

    // May well become public
    //- (void)_setFormDelegate:(id<WebFormDelegate>)delegate;
    HRESULT setFormDelegate([in] IWebFormDelegate* formDelegate);

    //- (id<WebFormDelegate>)_formDelegate;
    HRESULT formDelegate([out, retval] IWebFormDelegate** formDelegate);

    HRESULT setFrameLoadDelegatePrivate([in] IWebFrameLoadDelegatePrivate* frameLoadDelegatePrivate);
    HRESULT frameLoadDelegatePrivate([out, retval] IWebFrameLoadDelegatePrivate** frameLoadDelegatePrivate);

    HRESULT scrollOffset([out, retval] LPPOINT offset);
    HRESULT scrollBy([in] LPPOINT offset);
    HRESULT visibleContentRect([out, retval] LPRECT rect);
    
    // SPI for DumpRenderTree
    HRESULT updateFocusedAndActiveState();

    // Support for displaying multiple text matches.
    HRESULT markAllMatchesForText([in] BSTR search, [in] BOOL caseSensitive, [in] BOOL highlight, [in] UINT limit, [out] UINT* matches);
    HRESULT unmarkAllTextMatches();
    HRESULT rectsForTextMatches([out]IEnumTextMatches** pmatches);
    HRESULT selectionRect([in, out] RECT* rc);
    HRESULT generateSelectionImage(BOOL forceWhiteText, [out, retval] OLE_HANDLE* hBitmap);

    HRESULT canHandleRequest([in] IWebURLRequest* request, [out, retval] BOOL* result);

    HRESULT clearFocusNode();

    HRESULT setTabKeyCyclesThroughElements([in] BOOL cycles);
    HRESULT tabKeyCyclesThroughElements([out, retval] BOOL* result);

    HRESULT setAllowSiteSpecificHacks([in] BOOL allows);
    HRESULT addAdditionalPluginDirectory([in] BSTR directory);

    HRESULT loadBackForwardListFromOtherView([in] IWebView* otherView);

    HRESULT setCustomDropTarget([in] IDropTarget* dt);
    HRESULT removeCustomDropTarget();

    HRESULT setInitialFocus([in] BOOL forward);

    HRESULT inspector([out, retval] IWebInspector**);

    HRESULT clearUndoRedoOperations();

    HRESULT setProhibitsMainFrameScrolling([in] BOOL prohibits);

    // SPI for DumpRenderTree. This is global to all WebViews.
    HRESULT setShouldApplyMacFontAscentHack([in] BOOL shouldApply);

    /*!
        @method shouldClose:
        @abstract This function will fire the before unload handler for a page.  
        If the user cancels the closing of a webview from the alert popped up by the 
        before unload handler, then this function will return false.
    */
    HRESULT shouldClose([out, retval] BOOL* result);

    // SPI for DumpRenderTree
    HRESULT executeCoreCommandByName([in] BSTR name, [in] BSTR value);

    HRESULT windowAncestryDidChange();

    HRESULT paintDocumentRectToContext([in] RECT rect, [in] OLE_HANDLE dc);

    HRESULT setDefersCallbacks([in] BOOL defersCallbacks);
    HRESULT defersCallbacks([out, retval] BOOL* defersCallbacks);

    HRESULT standardUserAgentWithApplicationName([in] BSTR applicationName, [retval][out] BSTR* groupName);

    HRESULT setCustomHTMLTokenizerTimeDelay([in] double timeDelay);
    HRESULT setCustomHTMLTokenizerChunkSize([in] int chunkSize);

    HRESULT backingStore([out, retval] OLE_HANDLE* hBitmap);

    HRESULT setTransparent([in] BOOL transparent);
    HRESULT transparent([out, retval] BOOL* transparent);

    HRESULT setAlwaysUsesComplexTextCodePath([in] BOOL complex);
    HRESULT alwaysUsesComplexTextCodePath([out, retval] BOOL* complex);

    HRESULT setCookieEnabled([in] BOOL enable);
    HRESULT cookieEnabled([out, retval] BOOL* enabled);

    HRESULT setMediaVolume([in] float volume);
    HRESULT mediaVolume([out, retval] float* volume);

    // SPI for DumpRenderTree
    HRESULT clearMainFrameName();

    HRESULT globalHistoryItem([out, retval] IWebHistoryItem**);

    HRESULT registerEmbeddedViewMIMEType([in] BSTR mimeType);

    HRESULT setMemoryCacheDelegateCallsEnabled([in] BOOL enabled);

    HRESULT setJavaScriptURLsAreAllowed([in] BOOL areAllowed);

    HRESULT setCanStartPlugins([in] BOOL canStartPlugins);

    /*!
        @method MIMETypeForExtension:
        @abstract Returns the mime type for a certian file extension.
        @param path The extension of the file to check.
        @result The mime type of the specified extension.
        + (BSTR)MIMETypeForPath:(NSString *)path;
    */
    HRESULT MIMETypeForExtension([in] BSTR extension, [out, retval] BSTR* mimeType);

    HRESULT addUserScriptToGroup([in] BSTR groupName, [in] IWebScriptWorld*, [in] BSTR source, [in] BSTR url,
                                 [in] unsigned whitelistCount, [in, size_is(whitelistCount)] BSTR* whitelist,
                                 [in] unsigned blacklistCount, [in, size_is(blacklistCount)] BSTR* blacklist,
                                 [in] WebUserScriptInjectionTime injectionTime);
    HRESULT addUserStyleSheetToGroup([in] BSTR groupName, [in] IWebScriptWorld*, [in] BSTR source, [in] BSTR url,
                                     [in] unsigned whitelistCount, [in, size_is(whitelistCount)] BSTR* whitelist,
                                     [in] unsigned blacklistCount, [in, size_is(blacklistCount)] BSTR* blacklist);
    HRESULT removeUserScriptFromGroup([in] BSTR groupName, [in] IWebScriptWorld*, [in] BSTR url);
    HRESULT removeUserStyleSheetFromGroup([in] BSTR groupName, [in] IWebScriptWorld*, [in] BSTR url);
    HRESULT removeUserScriptsFromGroup([in] BSTR groupName, [in] IWebScriptWorld*);
    HRESULT removeUserStyleSheetsFromGroup([in] BSTR groupName, [in] IWebScriptWorld*);
    HRESULT removeAllUserContentFromGroup([in] BSTR groupName);

    HRESULT setPluginHalterDelegate([in] IWebPluginHalterDelegate* d);
    HRESULT pluginHalterDelegate([retval, out] IWebPluginHalterDelegate** d);

    // If rect is 0, the entire backing store will be invalidated.
    HRESULT invalidateBackingStore([in] const RECT* rect);

    // Whitelists access from an origin (sourceOrigin) to a set of one or more origins described by the parameters:
    // - destinationProtocol: The protocol to grant access to.
    // - destinationHost: The host to grant access to.
    // - allowDestinationSubdomains: If host is a domain, setting this to YES will whitelist host and all its subdomains, recursively.
    HRESULT addOriginAccessWhitelistEntry([in] BSTR sourceOrigin, [in] BSTR destinationProtocol, [in] BSTR destinationHost, [in] BOOL allowDestinationSubdomains);

    // Removes a white list entry created with addOriginAccessWhitelistEntry. See above.
    HRESULT removeOriginAccessWhitelistEntry([in] BSTR sourceOrigin, [in] BSTR destinationProtocol, [in] BSTR destinationHost, [in] BOOL allowDestinationSubdomains);

    // Removes all white list entries created with addOriginAccessWhitelistEntry.
    HRESULT resetOriginAccessWhitelists();

    HRESULT setHistoryDelegate([in] IWebHistoryDelegate* historyDelegate);
    HRESULT historyDelegate([out,retval] IWebHistoryDelegate** historyDelegate);
    HRESULT addVisitedLinks([in] BSTR* visitedURLs, [in] unsigned visitedURLCount);

    HRESULT isNodeHaltedPlugin([in] IDOMNode*, [retval, out] BOOL*);
    HRESULT restartHaltedPluginForNode([in] IDOMNode*);
    HRESULT hasPluginForNodeBeenHalted([in] IDOMNode*, [retval, out] BOOL*);

    HRESULT setGeolocationProvider([in] IWebGeolocationProvider* locationProvider);
    HRESULT geolocationProvider([out, retval] IWebGeolocationProvider** locationProvider);
    HRESULT geolocationDidChangePosition([in] IWebGeolocationPosition* position);
    HRESULT geolocationDidFailWithError([in] IWebError* error);

    HRESULT setDomainRelaxationForbiddenForURLScheme([in] BOOL forbidden, [in] BSTR scheme);

    HRESULT registerURLSchemeAsSecure([in] BSTR scheme);

    HRESULT nextDisplayIsSynchronous();

    HRESULT paintScrollViewRectToContextAtPoint([in] RECT rect, [in] POINT pt, [in] OLE_HANDLE dc);

    [local] HRESULT reportException([in] JSContextRef context, [in] JSValueRef exception);

    [local] HRESULT elementFromJS([in] JSContextRef context, [in] JSValueRef nodeObject, [out, retval] IDOMElement** element);


    /*!
        @method defaultMinimumTimerInterval
        @discussion Returns the default minimum interval for DOMTimers on all pages, not
        just the one associated with this receiver.
        - (double)interval;
    */
    HRESULT defaultMinimumTimerInterval([out, retval] double* interval);

    /*!
        @method setMinimumTimerInterval
        @discussion Sets the minimum interval for DOMTimers on the web page associated
        with the receiver.
        - (double)interval;
    */
    HRESULT setMinimumTimerInterval([in] double interval);
}
