/*
 * Copyright (C) 2006, 2007 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("/*")
cpp_quote(" * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.")
cpp_quote(" *")
cpp_quote(" * Redistribution and use in source and binary forms, with or without")
cpp_quote(" * modification, are permitted provided that the following conditions")
cpp_quote(" * are met:")
cpp_quote(" * 1. Redistributions of source code must retain the above copyright")
cpp_quote(" *    notice, this list of conditions and the following disclaimer.")
cpp_quote(" * 2. Redistributions in binary form must reproduce the above copyright")
cpp_quote(" *    notice, this list of conditions and the following disclaimer in the")
cpp_quote(" *    documentation and/or other materials provided with the distribution.")
cpp_quote(" *")
cpp_quote(" * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY")
cpp_quote(" * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE")
cpp_quote(" * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR")
cpp_quote(" * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR")
cpp_quote(" * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,")
cpp_quote(" * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,")
cpp_quote(" * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR")
cpp_quote(" * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY")
cpp_quote(" * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT")
cpp_quote(" * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE")
cpp_quote(" * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ")
cpp_quote(" */")

cpp_quote("/* identifiers for commands that can be called by the webview's frame */")
cpp_quote("enum WebViewCmd { Cut = 100, Copy, Paste, ForwardDelete, SelectAll, Undo, Redo };")

cpp_quote("#define WebViewProgressStartedNotification TEXT(\"WebProgressStartedNotification\")")
cpp_quote("#define WebViewProgressEstimateChangedNotification TEXT(\"WebProgressEstimateChangedNotification\")")
cpp_quote("#define WebViewProgressFinishedNotification TEXT(\"WebProgressFinishedNotification\")")

import "oaidl.idl";
import "ocidl.idl";
import "IWebUIDelegate.idl";
import "IWebURLResponse.idl";
import "IWebResourceLoadDelegate.idl";
import "IWebDownload.idl";
import "IWebFrameLoadDelegate.idl";
import "IWebPolicyDelegate.idl";
import "IWebBackForwardList.idl";
import "IWebHistoryItem.idl";
import "IWebPreferences.idl";
import "DOMCSS.idl";
import "IWebUndoManager.idl";
import "IWebEditingDelegate.idl";
import "DOMRange.idl";

interface IDOMCSSStyleDeclaration;
interface IDOMDocument;
interface IDOMElement;
interface IDOMNode;
interface IDOMRange;

interface IWebArchive;
interface IWebBackForwardList;
interface IWebDataSource;
interface IWebFrame;
interface IWebFrameView;
interface IWebHistoryItem;
interface IWebPreferences;
interface IWebScriptObject;

interface IWebUIDelegate;
interface IWebResourceLoadDelegate;
interface IWebDownloadDelegate;
interface IWebEditingDelegate;
interface IWebFrameLoadDelegate;
interface IWebPolicyDelegate;
interface IWebDocumentView;
interface IWebDocumentRepresentation;
interface IWebUndoManager;

/* These are the keys for the WebElementPropertyBag */
const LPCOLESTR WebElementDOMNodeKey = L"WebElementDOMNodeKey";
const LPCOLESTR WebElementFrameKey = L"WebElementFrameKey";
const LPCOLESTR WebElementImageAltStringKey = L"WebElementImageAltStringKey";
const LPCOLESTR WebElementImageKey = L"WebElementImageKey";
const LPCOLESTR WebElementImageRectKey = L"WebElementImageRectKey";
const LPCOLESTR WebElementImageURLKey = L"WebElementImageURLKey";
const LPCOLESTR WebElementIsSelectedKey = L"WebElementIsSelectedKey";
const LPCOLESTR WebElementSpellingToolTipKey = L"WebElementSpellingToolTipKey";
const LPCOLESTR WebElementTitleKey = L"WebElementTitleKey";
const LPCOLESTR WebElementLinkURLKey = L"WebElementLinkURLKey";
const LPCOLESTR WebElementLinkTargetFrameKey = L"WebElementLinkTargetFrameKey";
const LPCOLESTR WebElementLinkTitleKey = L"WebElementLinkTitleKey";
const LPCOLESTR WebElementLinkLabelKey = L"WebElementLinkLabelKey";
const LPCOLESTR WebElementIsContentEditableKey = L"WebElementIsContentEditableKey";

/*!
    @class IEnumTextMatches
*/
[
    object,
    oleautomation,
    uuid(C0CDE63A-5ED1-453f-B937-93B1A61AD3B3),
    pointer_default(unique)
]
interface IEnumTextMatches : IUnknown
{
    HRESULT Next(ULONG celt, RECT* rect, ULONG* pceltFetched);
    HRESULT Skip(ULONG celt);
    HRESULT Reset(void);
    HRESULT Clone(IEnumTextMatches** ppenum);
};

/*!
    @class WebView
    WebView manages the interaction between WebFrameViews and WebDataSources.  Modification
    of the policies and behavior of the WebKit is largely managed by WebViews and their
    delegates.
    
    <p>
    Typical usage:
    </p>
    <pre>
    WebView *webView;
    WebFrame *mainFrame;
    
    webView  = [[WebView alloc] initWithFrame: NSMakeRect (0,0,640,480)];
    mainFrame = [webView mainFrame];
    [mainFrame loadRequest:request];
    </pre>
    
    WebViews have the following delegates:  WebUIDelegate, WebResourceLoadDelegate,
    WebFrameLoadDelegate, and WebPolicyDelegate.
    
    WebKit depends on the WebView's WebUIDelegate for all window
    related management, including opening new windows and controlling the user interface
    elements in those windows.
    
    WebResourceLoadDelegate is used to monitor the progress of resources as they are
    loaded.  This delegate may be used to present users with a progress monitor.
    
    The WebFrameLoadDelegate receives messages when the URL in a WebFrame is
    changed.
    
    WebView's WebPolicyDelegate can make determinations about how
    content should be handled, based on the resource's URL and MIME type.

    @interface WebView : NSView
*/
[
    object,
    oleautomation,
    hidden,
    uuid(174BBEFD-058E-49c7-91DF-6F110AA4AC28),
    pointer_default(unique)
]
interface IWebView : IUnknown
{
    /*!
        @method canShowMIMEType:
        @abstract Checks if the WebKit can show content of a certain MIME type.
        @param MIMEType The MIME type to check.
        @result YES if the WebKit can show content with MIMEtype.
        + (BOOL)canShowMIMEType:(NSString *)MIMEType;
    */
    HRESULT canShowMIMEType([in] BSTR mimeType, [out, retval] BOOL* canShow);

    /*!
        @method canShowMIMETypeAsHTML:
        @abstract Checks if the the MIME type is a type that the WebKit will interpret as HTML.
        @param MIMEType The MIME type to check.
        @result YES if the MIMEtype in an HTML type.
        + (BOOL)canShowMIMETypeAsHTML:(NSString *)MIMEType;
    */
    HRESULT canShowMIMETypeAsHTML([in] BSTR mimeType, [out, retval] BOOL* canShow);

    /*!
        @method MIMETypesShownAsHTML
        @result Returns an array of NSStrings that describe the MIME types
        WebKit will attempt to render as HTML.
        + (NSArray *)MIMETypesShownAsHTML;
    */
    HRESULT MIMETypesShownAsHTML([out, retval] IEnumVARIANT** enumVariant);

    /*!
        @method setMIMETypesShownAsHTML:
        @discussion Sets the array of NSString MIME types that WebKit will
        attempt to render as HTML.  Typically you will retrieve the built-in
        array using MIMETypesShownAsHTML and add additional MIME types to that
        array.
        + (void)setMIMETypesShownAsHTML:(NSArray *)MIMETypes;
    */
    HRESULT setMIMETypesShownAsHTML([in, size_is(cMimeTypes)] BSTR* mimeTypes, [in] int cMimeTypes);

    /*!
        @method URLFromPasteboard:
        @abstract Returns a URL from a pasteboard
        @param pasteboard The pasteboard with a URL
        @result A URL if the pasteboard has one. Nil if it does not.
        @discussion This method differs than NSURL's URLFromPasteboard method in that it tries multiple pasteboard types
        including NSURLPboardType to find a URL on the pasteboard.
        + (NSURL *)URLFromPasteboard:(NSPasteboard *)pasteboard;
    */
    HRESULT URLFromPasteboard([in] IDataObject* pasteboard, [out, retval] BSTR* url);

    /*!
        @method URLTitleFromPasteboard:
        @abstract Returns a URL title from a pasteboard
        @param pasteboard The pasteboard with a URL title
        @result A URL title if the pasteboard has one. Nil if it does not.
        @discussion This method returns a title that refers a URL on the pasteboard. An example of this is the link label
        which is the text inside the anchor tag.
        + (NSString *)URLTitleFromPasteboard:(NSPasteboard *)pasteboard;
    */
    HRESULT URLTitleFromPasteboard([in] IDataObject* pasteboard, [out, retval] BSTR* urlTitle);

    /*!
        @method initWithFrame:frameName:groupName:
        @abstract The designated initializer for WebView.
        @discussion Initialize a WebView with the supplied parameters. This method will 
        create a main WebFrame with the view. Passing a top level frame name is useful if you
        handle a targetted frame navigation that would normally open a window in some other 
        way that still ends up creating a new WebView.
        @param frame The frame used to create the view.
        @param frameName The name to use for the top level frame. May be nil.
        @param groupName The name of the webView set to which this webView will be added.  May be nil.
        @result Returns an initialized WebView.
        - (id)initWithFrame:(NSRect)frame frameName:(NSString *)frameName groupName:(NSString *)groupName;
    */
    HRESULT initWithFrame([in] RECT frame, [in] BSTR frameName, [in] BSTR groupName);

    /*!
        @method setUIDelegate:
        @abstract Set the WebView's WebUIDelegate.
        @param delegate The WebUIDelegate to set as the delegate.
        - (void)setUIDelegate:(id)delegate;
    */
    HRESULT setUIDelegate([in] IWebUIDelegate* d);

    /*!
        @method UIDelegate
        @abstract Return the WebView's WebUIDelegate.
        @result The WebView's WebUIDelegate.
        - (id)UIDelegate;
    */
    HRESULT uiDelegate([retval, out] IWebUIDelegate** d);

    /*!
        @method setResourceLoadDelegate:
        @abstract Set the WebView's WebResourceLoadDelegate load delegate.
        @param delegate The WebResourceLoadDelegate to set as the load delegate.
        - (void)setResourceLoadDelegate:(id)delegate;
    */
    HRESULT setResourceLoadDelegate([in] IWebResourceLoadDelegate* d);

    /*!
        @method resourceLoadDelegate
        @result Return the WebView's WebResourceLoadDelegate.
        - (id)resourceLoadDelegate;
    */    
    HRESULT resourceLoadDelegate([retval, out] IWebResourceLoadDelegate** d);

    /*!
        @method setDownloadDelegate:
        @abstract Set the WebView's WebDownloadDelegate.
        @discussion The download delegate is retained by WebDownload when any downloads are in progress.
        @param delegate The WebDownloadDelegate to set as the download delegate.
        - (void)setDownloadDelegate:(id)delegate;
    */
    HRESULT setDownloadDelegate([in] IWebDownloadDelegate* d);

    /*!
        @method downloadDelegate
        @abstract Return the WebView's WebDownloadDelegate.
        @result The WebView's WebDownloadDelegate.
        - (id)downloadDelegate;
    */    
    HRESULT downloadDelegate([retval, out] IWebDownloadDelegate** d);

    /*!
        @method setFrameLoadDelegate:
        @abstract Set the WebView's WebFrameLoadDelegate delegate.
        @param delegate The WebFrameLoadDelegate to set as the delegate.
        - (void)setFrameLoadDelegate:(id)delegate;
    */
    HRESULT setFrameLoadDelegate([in] IWebFrameLoadDelegate* d);

    /*!
        @method frameLoadDelegate
        @abstract Return the WebView's WebFrameLoadDelegate delegate.
        @result The WebView's WebFrameLoadDelegate delegate.
        - (id)frameLoadDelegate;
    */    
    HRESULT frameLoadDelegate([retval, out] IWebFrameLoadDelegate** d);

    /*!
        @method setPolicyDelegate:
        @abstract Set the WebView's WebPolicyDelegate delegate.
        @param delegate The WebPolicyDelegate to set as the delegate.
        - (void)setPolicyDelegate:(id)delegate;
    */    
    HRESULT setPolicyDelegate([in] IWebPolicyDelegate* d);

    /*!
        @method policyDelegate
        @abstract Return the WebView's WebPolicyDelegate.
        @result The WebView's WebPolicyDelegate.
        - (id)policyDelegate;
    */    
    HRESULT policyDelegate([retval, out] IWebPolicyDelegate** d);

    /*!
        @method mainFrame
        @abstract Return the top level frame.  
        @discussion Note that even document that are not framesets will have a
        mainFrame.
        @result The main frame.
        - (WebFrame *)mainFrame;
    */    
    HRESULT mainFrame([retval, out] IWebFrame** frame);

    /*!
        @method focusedFrame
    @abstract Return the frame that has the current focus.  
    */
    HRESULT focusedFrame([retval, out] IWebFrame** frame);

    /*!
        @method backForwardList
        @result The backforward list for this webView.
        - (WebBackForwardList *)backForwardList;
    */    
    HRESULT backForwardList([retval, out] IWebBackForwardList** list);

    /*!
        @method setMaintainsBackForwardList:
        @abstract Enable or disable the use of a backforward list for this webView.
        @param flag Turns use of the back forward list on or off
        - (void)setMaintainsBackForwardList:(BOOL)flag;
    */    
    HRESULT setMaintainsBackForwardList([in] BOOL flag);

    /*!
        @method goBack
        @abstract Go back to the previous URL in the backforward list.
        @result YES if able to go back in the backforward list, NO otherwise.
        - (BOOL)goBack;
    */
    HRESULT goBack([out, retval] BOOL* succeeded);

    /*!
        @method goForward
        @abstract Go forward to the next URL in the backforward list.
        @result YES if able to go forward in the backforward list, NO otherwise.
        - (BOOL)goForward;
    */    
    HRESULT goForward([out, retval] BOOL* succeeded);

    /*!
        @method goToBackForwardItem:
        @abstract Go back or forward to an item in the backforward list.
        @result YES if able to go to the item, NO otherwise.
        - (BOOL)goToBackForwardItem:(WebHistoryItem *)item;
    */    
    HRESULT goToBackForwardItem([in] IWebHistoryItem* item, [out, retval] BOOL* succeeded);

    /*!
        @method setTextSizeMultiplier:
        @abstract Change the size of the text rendering in views managed by this webView.
        @param multiplier A fractional percentage value, 1.0 is 100%.
        - (void)setTextSizeMultiplier:(float)multiplier;
    */
    HRESULT setTextSizeMultiplier([in] float multiplier);

    /*!
        @method textSizeMultiplier
        @result The text size multipler.
        - (float)textSizeMultiplier;
    */    
    HRESULT textSizeMultiplier([out, retval] float* multiplier);

    /*!
        @method setApplicationNameForUserAgent:
        @abstract Set the application name. 
        @discussion This name will be used in user-agent strings
        that are chosen for best results in rendering web pages.
        @param applicationName The application name
        - (void)setApplicationNameForUserAgent:(NSString *)applicationName;
    */
    HRESULT setApplicationNameForUserAgent([in] BSTR applicationName);

    /*!
        @method applicationNameForUserAgent
        @result The name of the application as used in the user-agent string.
        - (NSString *)applicationNameForUserAgent;
    */
    HRESULT applicationNameForUserAgent([out, retval] BSTR* applicationName);

    /*!
        @method setCustomUserAgent:
        @abstract Set the user agent. 
        @discussion Setting this means that the webView should use this user-agent string
        instead of constructing a user-agent string for each URL. Setting it to nil
        causes the webView to construct the user-agent string for each URL
        for best results rendering web pages.
        @param userAgentString The user agent description
        - (void)setCustomUserAgent:(NSString *)userAgentString;
    */
    HRESULT setCustomUserAgent([in] BSTR userAgentString);

    /*!
        @method customUserAgent
        @result The custom user-agent string or nil if no custom user-agent string has been set.
        - (NSString *)customUserAgent;
    */
    HRESULT customUserAgent([out, retval] BSTR* userAgentString);

    /*!
        @method userAgentForURL:
        @abstract Get the appropriate user-agent string for a particular URL.
        @param URL The URL.
        @result The user-agent string for the supplied URL.
        - (NSString *)userAgentForURL:(NSURL *)URL;
    */
    HRESULT userAgentForURL([in] BSTR url, [out, retval] BSTR* userAgent);

    /*!
        @method supportsTextEncoding
        @abstract Find out if the current web page supports text encodings.
        @result YES if the document view of the current web page can
        support different text encodings.
        - (BOOL)supportsTextEncoding;
    */
    HRESULT supportsTextEncoding([out, retval] BOOL* supports);

    /*!
        @method setCustomTextEncodingName:
        @discussion Make the page display with a different text encoding; stops any load in progress.
        The text encoding passed in overrides the normal text encoding smarts including
        what's specified in a web page's header or HTTP response.
        The text encoding automatically goes back to the default when the top level frame
        changes to a new location.
        Setting the text encoding name to nil makes the webView use default encoding rules.
        @param encoding The text encoding name to use to display a page or nil.
        - (void)setCustomTextEncodingName:(NSString *)encodingName;
    */
    HRESULT setCustomTextEncodingName([in] BSTR encodingName);

    /*!
        @method customTextEncodingName
        @result The custom text encoding name or nil if no custom text encoding name has been set.
        - (NSString *)customTextEncodingName;
    */
    HRESULT customTextEncodingName([out, retval] BSTR* encodingName);

    /*!
        @method setMediaStyle:
        @discussion Set the media style for the WebView.  The mediaStyle will override the normal value
        of the CSS media property.  Setting the value to nil will restore the normal value.
        @param mediaStyle The value to use for the CSS media property.
        - (void)setMediaStyle:(NSString *)mediaStyle;
    */
    HRESULT setMediaStyle([in] BSTR media);

    /*!
        @method mediaStyle
        @result mediaStyle The value to use for the CSS media property, as set by setMediaStyle:.  It
        will be nil unless set by that method.
        - (NSString *)mediaStyle;
    */
    HRESULT mediaStyle([out, retval] BSTR* media);

    /*!
        @method stringByEvaluatingJavaScriptFromString:
        @param script The text of the JavaScript.
        @result The result of the script, converted to a string, or nil for failure.
        - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
    */
    HRESULT stringByEvaluatingJavaScriptFromString([in] BSTR script, [out, retval] BSTR* result);

    /*!
        @method windowScriptObject
        @discussion windowScriptObject return a WebScriptObject that represents the
        window object from the script environment.
        @result Returns the window object from the script environment.
        - (WebScriptObject *)windowScriptObject;
    */
    HRESULT windowScriptObject([out, retval] IWebScriptObject** webScriptObject);

    /*!
        @method setPreferences:
        @param preferences The preferences to use for the webView.
        @abstract Override the standard setting for the webView. 
        - (void)setPreferences: (WebPreferences *)prefs;
    */
    HRESULT setPreferences([in] IWebPreferences* prefs);

    /*!
        @method preferences
        @result Returns the preferences used by this webView.
        @discussion This method will return [WebPreferences standardPreferences] if no
        other instance of WebPreferences has been set.
        - (WebPreferences *)preferences;
    */
    HRESULT preferences([out, retval] IWebPreferences** prefs);

    /*!
        @method setPreferencesIdentifier:
        @param anIdentifier The string to use a prefix for storing values for this WebView in the user
        defaults database.
        @discussion If the WebPreferences for this WebView are stored in the user defaults database, the
        string set in this method will be used a key prefix.
        - (void)setPreferencesIdentifier:(NSString *)anIdentifier;
    */
    HRESULT setPreferencesIdentifier([in] BSTR anIdentifier);

    /*!
        @method preferencesIdentifier
        @result Returns the WebPreferences key prefix.
        - (NSString *)preferencesIdentifier;
    */
    HRESULT preferencesIdentifier([out, retval] BSTR* anIdentifier);

    /*!
        @method setHostWindow:
        @param hostWindow The host window for the web view.
        @discussion Parts of WebKit (such as plug-ins and JavaScript) depend on a window to function
        properly. Set a host window so these parts continue to function even when the web view is
        not in an actual window.
        - (void)setHostWindow:(NSWindow *)hostWindow;
    */
    HRESULT setHostWindow([in] OLE_HANDLE window);

    /*!
        @method hostWindow
        @result The host window for the web view.
        - (NSWindow *)hostWindow;
    */
    HRESULT hostWindow([out, retval] OLE_HANDLE* window);

    /*!
        @method searchFor:direction:caseSensitive:
        @abstract Searches a document view for a string and highlights the string if it is found.
        Starts the search from the current selection.  Will search across all frames.
        @param string The string to search for.
        @param forward YES to search forward, NO to seach backwards.
        @param caseFlag YES to for case-sensitive search, NO for case-insensitive search.
        @result YES if found, NO if not found.
        - (BOOL)searchFor:(NSString *)string direction:(BOOL)forward caseSensitive:(BOOL)caseFlag wrap:(BOOL)wrapFlag;
    */
    HRESULT searchFor([in] BSTR str, [in] BOOL forward, [in] BOOL caseFlag, [in] BOOL wrapFlag, [out, retval] BOOL* found);

    /*!
        @method registerViewClass:representationClass:forMIMEType:
        @discussion Register classes that implement WebDocumentView and WebDocumentRepresentation respectively.
        A document class may register for a primary MIME type by excluding
        a subtype, i.e. "video/" will match the document class with
        all video types.  More specific matching takes precedence
        over general matching.
        @param viewClass The WebDocumentView class to use to render data for a given MIME type.
        @param representationClass The WebDocumentRepresentation class to use to represent data of the given MIME type.
        @param MIMEType The MIME type to represent with an object of the given class.
        + (void)registerViewClass:(Class)viewClass representationClass:(Class)representationClass forMIMEType:(NSString *)MIMEType;
    */
    HRESULT registerViewClass([in] IWebDocumentView* view, [in] IWebDocumentRepresentation* representation, [in] BSTR forMIMEType);

    /*!
        @method setGroupName:
        @param groupName The name of the group for this WebView.
        @discussion JavaScript may access named frames within the same group. 
        - (void)setGroupName:(NSString *)groupName;
    */
    HRESULT setGroupName([in] BSTR groupName);

    /*!
        @method groupName
        @discussion The group name for this WebView.
        - (NSString *)groupName;
    */
    HRESULT groupName([out, retval] BSTR* groupName);

    /*!
        @method estimatedProgress
        @discussion An estimate of the percent complete for a document load.  This
        value will range from 0 to 1.0 and, once a load completes, will remain at 1.0 
        until a new load starts, at which point it will be reset to 0.  The value is an
        estimate based on the total number of bytes expected to be received
        for a document, including all it's possible subresources.  For more accurate progress
        indication it is recommended that you implement a WebFrameLoadDelegate and a
        WebResourceLoadDelegate.
        - (double)estimatedProgress;
    */
    HRESULT estimatedProgress([out, retval] double* estimatedProgress);

    /*!
        @method isLoading
        @discussion Returns YES if there are any pending loads.
        - (BOOL)isLoading;
    */
    HRESULT isLoading([out, retval] BOOL* isLoading);

    /*!
        @method elementAtPoint:
        @param point A point in the coordinates of the WebView
        @result An element dictionary describing the point
        - (NSDictionary *)elementAtPoint:(NSPoint)point;
    */
    HRESULT elementAtPoint([in] LPPOINT point, [out, retval] IPropertyBag** elementDictionary);

    /*!
        @method pasteboardTypesForSelection
        @abstract Returns the pasteboard types that WebView can use for the current selection
        - (NSArray *)pasteboardTypesForSelection;
    */
    HRESULT pasteboardTypesForSelection([out, retval] IEnumVARIANT** enumVariant);

    /*!
        @method writeSelectionWithPasteboardTypes:toPasteboard:
        @abstract Writes the current selection to the pasteboard
        @param types The types that WebView will write to the pasteboard
        @param pasteboard The pasteboard to write to
        - (void)writeSelectionWithPasteboardTypes:(NSArray *)types toPasteboard:(NSPasteboard *)pasteboard;
    */
    HRESULT writeSelectionWithPasteboardTypes([in, size_is(cTypes)] BSTR* types, [in] int cTypes, [in] IDataObject* pasteboard);

    /*!
        @method pasteboardTypesForElement:
        @abstract Returns the pasteboard types that WebView can use for an element
        @param element The element
        - (NSArray *)pasteboardTypesForElement:(NSDictionary *)element;
    */
    HRESULT pasteboardTypesForElement([in] IPropertyBag* elementDictionary, [out, retval] IEnumVARIANT** enumVariant);

    /*!
        @method writeElement:withPasteboardTypes:toPasteboard:
        @abstract Writes an element to the pasteboard
        @param element The element to write to the pasteboard
        @param types The types that WebView will write to the pasteboard
        @param pasteboard The pasteboard to write to
        - (void)writeElement:(NSDictionary *)element withPasteboardTypes:(NSArray *)types toPasteboard:(NSPasteboard *)pasteboard;
    */
    HRESULT writeElement([in] IPropertyBag* elementDictionary, [in, size_is(cWithPasteboardTypes)] BSTR* withPasteboardTypes, [in] int cWithPasteboardTypes, [in] IDataObject* pasteboard);

    /*!
        @method selectedText
        @abstract Returns the selection as a string
    */
    HRESULT selectedText([out, retval] BSTR* text);

    /*!
        @method centerSelectionInVisibleArea
        @abstract Centers the selected text in the WebView
        - (void)centerSelectionInVisibleArea:(id)sender;
    */
    HRESULT centerSelectionInVisibleArea([in] IUnknown* sender);

    /*!
        @method moveDragCaretToPoint:
        @param point A point in the coordinates of the WebView
        @discussion This method moves the caret that shows where something being dragged will be dropped. It may cause the WebView to scroll
        to make the new position of the drag caret visible.
        - (void)moveDragCaretToPoint:(NSPoint)point;
    */
    HRESULT moveDragCaretToPoint([in] LPPOINT point);

    /*!
        @method removeDragCaret
        @abstract Removes the drag caret from the WebView
        - (void)removeDragCaret;
    */
    HRESULT removeDragCaret();

    /*!
        @method setDrawsBackground:
        @param drawsBackround YES to cause the receiver to draw a default white background, NO otherwise.
        @abstract Sets whether the receiver draws a default white background when the loaded page has no background specified.
        - (void)setDrawsBackground:(BOOL)drawsBackround;
    */
    HRESULT setDrawsBackground([in] BOOL drawsBackground);

    /*!
        @method drawsBackground
        @result Returns YES if the receiver draws a default white background, NO otherwise.
        - (BOOL)drawsBackground;
    */
    HRESULT drawsBackground([out, retval] BOOL* drawsBackground);

    /*!
        @method setMainFrameURL:
        @param URLString The URL to load in the mainFrame.
        - (void)setMainFrameURL:(NSString *)URLString;
    */
    HRESULT setMainFrameURL([in] BSTR urlString);

    /*!
        @method mainFrameURL
        @result Returns the main frame's current URL.
        - (NSString *)mainFrameURL;
    */
    HRESULT mainFrameURL([out, retval] BSTR* urlString);

    /*!
        @method mainFrameDocument
        @result Returns the main frame's DOMDocument.
        - (DOMDocument *)mainFrameDocument;
    */
    HRESULT mainFrameDocument([out, retval] IDOMDocument** document);

    /*!
        @method mainFrameTitle
        @result Returns the main frame's title if any, otherwise an empty string.
        - (NSString *)mainFrameTitle;
    */
    HRESULT mainFrameTitle([out, retval] BSTR* title);

    /*!
        @method mainFrameIcon
        @discussion The methods returns the site icon for the current page loaded in the mainFrame.
        @result Returns the main frame's icon if any, otherwise nil.
        - (NSImage *)mainFrameIcon;
    */
    HRESULT mainFrameIcon([out, retval] OLE_HANDLE* hBitmap);

    /*!
        @method registerURLSchemeAsLocal
        @discussion Adds the scheme to the list of schemes to be treated as local.
        @param scheme The scheme to register.
        + (void)registerURLSchemeAsLocal:(NSString *)scheme;
    */
    HRESULT registerURLSchemeAsLocal([in] BSTR scheme);
}

/*
    @interface WebView (WebIBActions) <NSUserInterfaceValidations>
*/
[
    object,
    oleautomation,
    uuid(8F0E3A30-B924-44f8-990A-1AE61ED6C632),
    pointer_default(unique)
]
interface IWebIBActions : IUnknown
{
    /*
        - (IBAction)takeStringURLFrom:(id)sender;
    */
    HRESULT takeStringURLFrom([in] IUnknown* sender);

    /*
        - (IBAction)stopLoading:(id)sender;
    */
    HRESULT stopLoading([in] IUnknown* sender);

    /*
        - (IBAction)reload:(id)sender;
    */
    HRESULT reload([in] IUnknown* sender);

    /*
        - (BOOL)canGoBack;
    */
    HRESULT canGoBack([in] IUnknown* sender, [out, retval] BOOL* result);

    /*
        - (IBAction)goBack:(id)sender;
    */
    HRESULT goBack([in] IUnknown* sender);

    /*
        - (BOOL)canGoForward;
    */
    HRESULT canGoForward([in] IUnknown* sender, [out, retval] BOOL* result);

    /*
        - (IBAction)goForward:(id)sender;
    */
    HRESULT goForward([in] IUnknown* sender);

    /*
        - (BOOL)canMakeTextLarger;
    */
    HRESULT canMakeTextLarger([in] IUnknown* sender, [out, retval] BOOL* result);

    /*
        - (IBAction)makeTextLarger:(id)sender;
    */
    HRESULT makeTextLarger([in] IUnknown* sender);

    /*
        - (BOOL)canMakeTextSmaller;
    */
    HRESULT canMakeTextSmaller([in] IUnknown* sender, [out, retval] BOOL* result);

    /*
        - (IBAction)makeTextSmaller:(id)sender;
    */
    HRESULT makeTextSmaller([in] IUnknown* sender);

    /*
        - (BOOL)canMakeTextStandardSize;
    */
    HRESULT canMakeTextStandardSize([in] IUnknown* sender, [out, retval] BOOL* result);

    /*
        - (IBAction)makeTextStandardSize:(id)sender;
    */
    HRESULT makeTextStandardSize([in] IUnknown* sender);

    /*
        - (IBAction)toggleContinuousSpellChecking:(id)sender;
    */
    HRESULT toggleContinuousSpellChecking([in] IUnknown* sender);

    /*
        - (IBAction)toggleSmartInsertDelete:(id)sender;
    */
    HRESULT toggleSmartInsertDelete([in] IUnknown* sender);

    /*
        - (void)toggleGrammarChecking:(id)sender
    */
    HRESULT toggleGrammarChecking([in] IUnknown* sender);
}

/*
    @interface WebView (WebViewCSS)
*/
[
    object,
    oleautomation,
    uuid(ADF68A8C-336F-405c-A053-3D11A9D5B092),
    pointer_default(unique)
]
interface IWebViewCSS : IUnknown
{
    /*
        - (DOMCSSStyleDeclaration *)computedStyleForElement:(DOMElement *)element pseudoElement:(NSString *)pseudoElement;
    */
    HRESULT computedStyleForElement([in] IDOMElement* element, [in] BSTR pseudoElement, [out, retval] IDOMCSSStyleDeclaration** style);
}

/*
    @interface WebView (WebViewEditing)
*/
[
    object,
    oleautomation,
    uuid(07BDAC9A-19A1-4086-864D-BAD9E0F00D5C),
    pointer_default(unique)
]
interface IWebViewEditing : IUnknown
{
    /*
        - (DOMRange *)editableDOMRangeForPoint:(NSPoint)point;
    */
    HRESULT editableDOMRangeForPoint([in] LPPOINT point, [out, retval] IDOMRange** range);

    /*
        - (void)setSelectedDOMRange:(DOMRange *)range affinity:(NSSelectionAffinity)selectionAffinity;
    */
    HRESULT setSelectedDOMRange([in] IDOMRange* range, [in] WebSelectionAffinity affinity);

    /*
        - (DOMRange *)selectedDOMRange;
    */
    HRESULT selectedDOMRange([out, retval] IDOMRange** range);

    /*
        - (NSSelectionAffinity)selectionAffinity;
    */
    HRESULT selectionAffinity([out, retval] [out, retval] WebSelectionAffinity* affinity);

    /*
        - (void)setEditable:(BOOL)flag;
    */
    HRESULT setEditable([in] BOOL flag);

    /*
        - (BOOL)isEditable;
    */
    HRESULT isEditable([out, retval] BOOL* isEditable);

    /*
        - (void)setTypingStyle:(DOMCSSStyleDeclaration *)style;
    */
    HRESULT setTypingStyle([in] IDOMCSSStyleDeclaration* style);

    /*
        - (DOMCSSStyleDeclaration *)typingStyle;
    */
    HRESULT typingStyle([out, retval] IDOMCSSStyleDeclaration** style);

    /*
        - (void)setSmartInsertDeleteEnabled:(BOOL)flag;
    */
    HRESULT setSmartInsertDeleteEnabled([in] BOOL flag);

    /*
        - (BOOL)smartInsertDeleteEnabled;
    */
    HRESULT smartInsertDeleteEnabled([out, retval] BOOL* enabled);

    /*
        - (void)setContinuousSpellCheckingEnabled:(BOOL)flag;
    */
    HRESULT setContinuousSpellCheckingEnabled([in] BOOL flag);

    /*
        - (BOOL)isContinuousSpellCheckingEnabled;
    */
    HRESULT isContinuousSpellCheckingEnabled([out, retval] BOOL* enabled);

    /*
        - (WebNSInt)spellCheckerDocumentTag;
    */
    HRESULT spellCheckerDocumentTag([out, retval] int* tag);

    /*
        - (NSUndoManager *)undoManager;
    */
    HRESULT undoManager([out, retval] IWebUndoManager** manager);

    /*
        - (void)setEditingDelegate:(id)delegate;
    */
    HRESULT setEditingDelegate([in] IWebEditingDelegate* d);

    /*
        - (id)editingDelegate;
    */
    HRESULT editingDelegate([out, retval] IWebEditingDelegate** d);

    /*
        - (DOMCSSStyleDeclaration *)styleDeclarationWithText:(NSString *)text;
    */
    HRESULT styleDeclarationWithText([in] BSTR text, [out, retval] IDOMCSSStyleDeclaration** style);

    /*
        - (BOOL)hasSelectedRange;
    */
    HRESULT hasSelectedRange([out, retval] BOOL* hasSelectedRange);

    /*
        - (BOOL)cutEnabled;
    */
    HRESULT cutEnabled([out, retval] BOOL* enabled);

    /*
        - (BOOL)copyEnabled;
    */
    HRESULT copyEnabled([out, retval] BOOL* enabled);

    /*
        - (BOOL)pasteEnabled;
    */
    HRESULT pasteEnabled([out, retval] BOOL* enabled);

    /*
        - (BOOL)deleteEnabled;
    */
    HRESULT deleteEnabled([out, retval] BOOL* enabled);

    /*
        - (BOOL)editingEnabled;
    */
    HRESULT editingEnabled([out, retval] BOOL* enabled);

    /*
        - (BOOL)isGrammarCheckingEnabled
    */
    HRESULT isGrammarCheckingEnabled([out, retval] BOOL* enabled);

    /*
        - (void)setGrammarCheckingEnabled:(BOOL)flag
    */
    HRESULT setGrammarCheckingEnabled(BOOL enabled);
}

/*
    @interface WebView (WebViewUndoableEditing)
*/
[
    object,
    oleautomation,
    uuid(639E7121-13C8-4a12-BC18-6E1F3D68F3C3),
    pointer_default(unique)
]
interface IWebViewUndoableEditing : IUnknown
{
    /*
        - (void)replaceSelectionWithNode:(DOMNode *)node; 
    */
    HRESULT replaceSelectionWithNode([in] IDOMNode* node);

    /*
        - (void)replaceSelectionWithText:(NSString *)text;    
    */
    HRESULT replaceSelectionWithText([in] BSTR text);

    /*
        - (void)replaceSelectionWithMarkupString:(NSString *)markupString;
    */
    HRESULT replaceSelectionWithMarkupString([in] BSTR markupString);

    /*
        - (void)replaceSelectionWithArchive:(WebArchive *)archive;
    */
    HRESULT replaceSelectionWithArchive([in] IWebArchive* archive);

    /*
        - (void)deleteSelection;    
    */
    HRESULT deleteSelection();

    /*
        - (void)clearSelection;    
    */
    HRESULT clearSelection();

    /*
        - (void)applyStyle:(DOMCSSStyleDeclaration *)style;
    */
    HRESULT applyStyle([in] IDOMCSSStyleDeclaration* style);
}

/*
    @interface WebView (WebViewEditingActions)
*/
[
    object,
    oleautomation,
    uuid(7E066C42-8E81-4778-888D-D6CC93E27D4C),
    pointer_default(unique)
]
interface IWebViewEditingActions : IUnknown
{
    /*
        - (void)copy:(id)sender;
    */
    HRESULT copy([in] IUnknown* sender);

    /*
        - (void)cut:(id)sender;
    */
    HRESULT cut([in] IUnknown* sender);

    /*
        - (void)paste:(id)sender;
    */
    HRESULT paste([in] IUnknown* sender);

    /*
        - (void)copyURL:(id)sender;
    */
    HRESULT copyURL([in] BSTR url);

    /*
        - (void)copyFont:(id)sender;
    */
    HRESULT copyFont([in] IUnknown* sender);

    /*
        - (void)pasteFont:(id)sender;
    */
    HRESULT pasteFont([in] IUnknown* sender);

    /*
        - (void)delete:(id)sender;
    */
    HRESULT delete_([in] IUnknown* sender);

    /*
        - (void)pasteAsPlainText:(id)sender;
    */
    HRESULT pasteAsPlainText([in] IUnknown* sender);

    /*
        - (void)pasteAsRichText:(id)sender;
    */
    HRESULT pasteAsRichText([in] IUnknown* sender);


    /*
        - (void)changeFont:(id)sender;
    */
    HRESULT changeFont([in] IUnknown* sender);

    /*
        - (void)changeAttributes:(id)sender;
    */
    HRESULT changeAttributes([in] IUnknown* sender);

    /*
        - (void)changeDocumentBackgroundColor:(id)sender;
    */
    HRESULT changeDocumentBackgroundColor([in] IUnknown* sender);

    /*
        - (void)changeColor:(id)sender;
    */
    HRESULT changeColor([in] IUnknown* sender);


    /*
        - (void)alignCenter:(id)sender;
    */
    HRESULT alignCenter([in] IUnknown* sender);

    /*
        - (void)alignJustified:(id)sender;
    */
    HRESULT alignJustified([in] IUnknown* sender);

    /*
        - (void)alignLeft:(id)sender;
    */
    HRESULT alignLeft([in] IUnknown* sender);

    /*
        - (void)alignRight:(id)sender;
    */
    HRESULT alignRight([in] IUnknown* sender);


    /*
        - (void)checkSpelling:(id)sender;
    */
    HRESULT checkSpelling([in] IUnknown* sender);

    /*
        - (void)showGuessPanel:(id)sender;
    */
    HRESULT showGuessPanel([in] IUnknown* sender);

    /*
        - (void)performFindPanelAction:(id)sender;
    */
    HRESULT performFindPanelAction([in] IUnknown* sender);


    /*
        - (void)startSpeaking:(id)sender;
    */
    HRESULT startSpeaking([in] IUnknown* sender);

    /*
        - (void)stopSpeaking:(id)sender;
    */
    HRESULT stopSpeaking([in] IUnknown* sender);
}
