/*
 * 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(" */")

import "oaidl.idl";
import "ocidl.idl";
import "IWebUndoTarget.idl";
import "IWebURLRequest.idl";
import "IWebFrame.idl";

interface IWebFrame;
interface IWebView;
interface IWebURLRequest;

/*!
    @enum WebMenuItemTag
    @discussion Each menu item in the default menu items array passed in
    contextMenuItemsForElement:defaultMenuItems: has its tag set to one of the WebMenuItemTags.
    When iterating through the default menu items array, use the tag to differentiate between them.
*/
typedef enum WebMenuItemTag {
    WebMenuItemTagOpenLinkInNewWindow=1,
    WebMenuItemTagDownloadLinkToDisk,
    WebMenuItemTagCopyLinkToClipboard,
    WebMenuItemTagOpenImageInNewWindow,
    WebMenuItemTagDownloadImageToDisk,
    WebMenuItemTagCopyImageToClipboard,
    WebMenuItemTagOpenFrameInNewWindow,
    WebMenuItemTagCopy,
    WebMenuItemTagGoBack,
    WebMenuItemTagGoForward,
    WebMenuItemTagStop,
    WebMenuItemTagReload,
    WebMenuItemTagCut,
    WebMenuItemTagPaste,
    WebMenuItemTagSpellingGuess,
    WebMenuItemTagNoGuessesFound,
    WebMenuItemTagIgnoreSpelling,
    WebMenuItemTagLearnSpelling,
    WebMenuItemTagOther,
    WebMenuItemTagSearchInSpotlight,
    WebMenuItemTagSearchWeb,
    WebMenuItemTagLookUpInDictionary,
    WebMenuItemTagOpenWithDefaultApplication,
    WebMenuItemPDFActualSize,
    WebMenuItemPDFZoomIn,
    WebMenuItemPDFZoomOut,
    WebMenuItemPDFAutoSize,
    WebMenuItemPDFSinglePage,
    WebMenuItemPDFFacingPages,
    WebMenuItemPDFContinuous,
    WebMenuItemPDFNextPage,
    WebMenuItemPDFPreviousPage,
    // FIXME: Review these names before release!
    WebMenuItemTagOpenLink = 2000,
    WebMenuItemTagIgnoreGrammar,
    WebtMenuItemTagSpellingMenu,
    WebMenuItemTagShowSpellingPanel,
    WebMenuItemTagCheckSpelling,
    WebMenuItemTagCheckSpellingWhileTyping,
    WebMenuItemTagCheckGrammarWithSpelling,
    WebMenuItemTagFontMenu,
    WebMenuItemTagShowFonts,
    WebMenuItemTagBold,
    WebMenuItemTagItalic,
    WebMenuItemTagUnderline,
    WebMenuItemTagOutline,
    WebMenuItemTagStyles,
    WebMenuItemTagShowColors,
    WebMenuItemTagSpeechMenu,
    WebMenuItemTagStartSpeaking,
    WebMenuItemTagStopSpeaking,
    WebMenuItemTagWritingDirectionMenu,
    WebMenuItemTagDefaultDirection,
    WebMenuItemTagLeftToRight,
    WebMenuItemTagRightToLeft,
    WebMenuItemTagPDFSinglePageScrolling,
    WebMenuItemTagPDFFacingPagesScrolling,
    WebMenuItemTagInspectElement,
    WebMenuItemBaseApplicationTag=10000
} WebMenuItemTag;

/*!
    @enum WebDragDestinationAction
    @abstract Actions that the destination of a drag can perform.
    @constant WebDragDestinationActionNone No action
    @constant WebDragDestinationActionDHTML Allows DHTML (such as JavaScript) to handle the drag
    @constant WebDragDestinationActionEdit Allows editable documents to be edited from the drag
    @constant WebDragDestinationActionLoad Allows a location change from the drag
    @constant WebDragDestinationActionAny Allows any of the above to occur
*/
typedef enum WebDragDestinationAction {
    WebDragDestinationActionNone    = 0,
    WebDragDestinationActionDHTML   = 1,
    WebDragDestinationActionEdit    = 2,
    WebDragDestinationActionLoad    = 4,
    WebDragDestinationActionAny     = (unsigned long)-1
} WebDragDestinationAction;

/*!
    @enum WebDragSourceAction
    @abstract Actions that the source of a drag can perform.
    @constant WebDragSourceActionNone No action
    @constant WebDragSourceActionDHTML Allows DHTML (such as JavaScript) to start a drag
    @constant WebDragSourceActionImage Allows an image drag to occur
    @constant WebDragSourceActionLink Allows a link drag to occur
    @constant WebDragSourceActionSelection Allows a selection drag to occur
    @constant WebDragSourceActionAny Allows any of the above to occur
*/
typedef enum WebDragSourceAction {
    WebDragSourceActionNone         = 0,
    WebDragSourceActionDHTML        = 1,
    WebDragSourceActionImage        = 2,
    WebDragSourceActionLink         = 4,
    WebDragSourceActionSelection    = 8,
    WebDragSourceActionAny          = (unsigned long)-1
} WebDragSourceAction;


/*!
    @protocol WebOpenPanelResultListener
    @discussion This protocol is used to call back with the results of
    the file open panel requested by runOpenPanelForFileButtonWithResultListener:
    @protocol WebOpenPanelResultListener <NSObject>
*/
[
    object,
    oleautomation,
    uuid(634198C7-9DFC-4aba-9E8C-90AEEA7A4144),
    pointer_default(unique)
]
interface IWebOpenPanelResultListener : IUnknown
{
    /*!
        @method chooseFilename:
        @abstract Call this method to return a filename from the file open panel.
        @param fileName
        - (void)chooseFilename:(NSString *)fileName;
    */
    HRESULT chooseFilename([out, retval] BSTR* fileName);

    /*!
        @method cancel
        @abstract Call this method to indicate that the file open panel was cancelled.
        - (void)cancel;
    */
    HRESULT cancel();
}

/*!
    @category WebUIDelegate
    @discussion A class that implements WebUIDelegate provides
    window-related methods that may be used by Javascript, plugins and
    other aspects of web pages. These methods are used to open new
    windows and control aspects of existing windows.
    @interface NSObject (WebUIDelegate)
*/
[
    object,
    oleautomation,
    uuid(2452A889-A74A-4fbc-9617-326A0A953630),
    pointer_default(unique)
]
interface IWebUIDelegate : IUnknown
{
    /*!
        @method webView:createWebViewWithRequest:
        @abstract Create a new window and begin to load the specified request.
        @discussion The newly created window is hidden, and the window operations delegate on the
        new WebViews will get a webViewShow: call.
        @param sender The WebView sending the delegate method.
        @param request The request to load.
        @result The WebView for the new window.
        - (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request;
    */
    HRESULT createWebViewWithRequest([in] IWebView* sender, [in] IWebURLRequest* request, [out, retval] IWebView** newWebView);

    /*!
        @method webViewShow:
        @param sender The WebView sending the delegate method.
        @abstract Show the window that contains the top level view of the WebView,
        ordering it frontmost.
        @discussion This will only be called just after createWindowWithRequest:
        is used to create a new window.
        - (void)webViewShow:(WebView *)sender;
    */
    HRESULT webViewShow([in] IWebView* sender);

    /*!
        @method webViewClose:
        @abstract Close the current window. 
        @param sender The WebView sending the delegate method.
        @discussion Clients showing multiple views in one window may
        choose to close only the one corresponding to this
        WebView. Other clients may choose to ignore this method
        entirely.
        - (void)webViewClose:(WebView *)sender;
    */
    HRESULT webViewClose([in] IWebView* sender);

    /*!
        @method webViewFocus:
        @abstract Focus the current window (i.e. makeKeyAndOrderFront:).
        @param The WebView sending the delegate method.
        @discussion Clients showing multiple views in one window may want to
        also do something to focus the one corresponding to this WebView.
        - (void)webViewFocus:(WebView *)sender;
    */
    HRESULT webViewFocus([in] IWebView* sender);

    /*!
        @method webViewUnfocus:
        @abstract Unfocus the current window.
        @param sender The WebView sending the delegate method.
        @discussion Clients showing multiple views in one window may want to
        also do something to unfocus the one corresponding to this WebView.
        - (void)webViewUnfocus:(WebView *)sender;
    */
    HRESULT webViewUnfocus([in] IWebView* sender);

    /*!
        @method webViewFirstResponder:
        @abstract Get the first responder for this window.
        @param sender The WebView sending the delegate method.
        @discussion This method should return the focused control in the
        WebView's view, if any. If the view is out of the window
        hierarchy, this might return something than calling firstResponder
        on the real NSWindow would. It's OK to return either nil or the
        real first responder if some control not in the window has focus.
        - (NSResponder *)webViewFirstResponder:(WebView *)sender;
    */
    HRESULT webViewFirstResponder([in] IWebView* sender, [out, retval] OLE_HANDLE* responderHWnd);

    /*!
        @method webView:makeFirstResponder:
        @abstract Set the first responder for this window.
        @param sender The WebView sending the delegate method.
        @param responder The responder to make first (will always be a view)
        @discussion responder will always be a view that is in the view
        subhierarchy of the top-level web view for this WebView. If the
        WebView's top level view is currently out of the view
        hierarchy, it may be desirable to save the first responder
        elsewhere, or possibly ignore this call.
        - (void)webView:(WebView *)sender makeFirstResponder:(NSResponder *)responder;
    */
    HRESULT makeFirstResponder([in] IWebView* sender, [in] OLE_HANDLE responderHWnd);

    /*!
        @method webView:setStatusText:
        @abstract Set the window's status display, if any, to the specified string.
        @param sender The WebView sending the delegate method.
        @param text The status text to set
        - (void)webView:(WebView *)sender setStatusText:(NSString *)text;
    */
    HRESULT setStatusText([in] IWebView* sender, [in] BSTR text);

    /*!
        @method webViewStatusText:
        @abstract Get the currently displayed status text.
        @param sender The WebView sending the delegate method.
        @result The status text
        - (NSString *)webViewStatusText:(WebView *)sender;
    */
    HRESULT webViewStatusText([in] IWebView* sender, [out, retval] BSTR* text);

    /*!
        @method webViewAreToolbarsVisible:
        @abstract Determine whether the window's toolbars are currently visible
        @param sender The WebView sending the delegate method.
        @discussion This method should return YES if the window has any
        toolbars that are currently on, besides the status bar. If the app
        has more than one toolbar per window, for example a regular
        command toolbar and a favorites bar, it should return YES from
        this method if at least one is on.
        @result YES if at least one toolbar is visible, otherwise NO.
        - (BOOL)webViewAreToolbarsVisible:(WebView *)sender;
    */
    HRESULT webViewAreToolbarsVisible([in] IWebView* sender, [out, retval] BOOL* visible);

    /*!
        @method webView:setToolbarsVisible:
        @param sender The WebView sending the delegate method.
        @abstract Set whether the window's toolbars are currently visible.
        @param visible New value for toolbar visibility
        @discussion Setting this to YES should turn on all toolbars
        (except for a possible status bar). Setting it to NO should turn
        off all toolbars (with the same exception).
        - (void)webView:(WebView *)sender setToolbarsVisible:(BOOL)visible;
    */
    HRESULT setToolbarsVisible([in] IWebView* sender, [in] BOOL visible);

    /*!
        @method webViewIsStatusBarVisible:
        @abstract Determine whether the status bar is visible.
        @param sender The WebView sending the delegate method.
        @result YES if the status bar is visible, otherwise NO.
        - (BOOL)webViewIsStatusBarVisible:(WebView *)sender;
    */
    HRESULT webViewIsStatusBarVisible([in] IWebView* sender, [out, retval] BOOL* visible);

    /*!
        @method webView:setStatusBarVisible:
        @abstract Set whether the status bar is currently visible.
        @param visible The new visibility value
        @discussion Setting this to YES should show the status bar,
        setting it to NO should hide it.
        - (void)webView:(WebView *)sender setStatusBarVisible:(BOOL)visible;
    */
    HRESULT setStatusBarVisible([in] IWebView* sender, [in] BOOL visible);

    /*!
        @method webViewIsResizable:
        @abstract Determine whether the window is resizable or not.
        @param sender The WebView sending the delegate method.
        @result YES if resizable, NO if not.
        @discussion If there are multiple views in the same window, they
        have have their own separate resize controls and this may need to
        be handled specially.
        - (BOOL)webViewIsResizable:(WebView *)sender;
    */
    HRESULT webViewIsResizable([in] IWebView* sender, [out, retval] BOOL* resizable);

    /*!
        @method webView:setResizable:
        @abstract Set the window to resizable or not
        @param sender The WebView sending the delegate method.
        @param resizable YES if the window should be made resizable, NO if not.
        @discussion If there are multiple views in the same window, they
        have have their own separate resize controls and this may need to
        be handled specially.
        - (void)webView:(WebView *)sender setResizable:(BOOL)resizable;
    */
    HRESULT setResizable([in] IWebView* sender, [in] BOOL resizable);

    /*!
        @method webView:setFrame:
        @abstract Set the window's frame rect
        @param sender The WebView sending the delegate method.
        @param frame The new window frame size
        @discussion Even though a caller could set the frame directly using the NSWindow,
        this method is provided so implementors of this protocol can do special
        things on programmatic move/resize, like avoiding autosaving of the size.
        - (void)webView:(WebView *)sender setFrame:(NSRect)frame;
    */
    HRESULT setFrame([in] IWebView* sender, [in] RECT* frame);

    /*!
        @method webViewFrame:
        @param sender The WebView sending the delegate method.
        @abstract REturn the window's frame rect
        @discussion 
        - (NSRect)webViewFrame:(WebView *)sender;
    */
    HRESULT webViewFrame([in] IWebView* sender, [out, retval] RECT* frame);

    /*!
        @method webView:setContentRect:
        @abstract Set the window's content rect
        @param sender The WebView sending the delegate method.
        @param frame The new window content rect
        @discussion Even though a caller could set the content rect
        directly using the NSWindow, this method is provided so
        implementors of this protocol can do special things on
        programmatic move/resize, like avoiding autosaving of the size.
        - (void)webView:(WebView *)sender setContentRect:(NSRect)contentRect;
    */
    HRESULT setContentRect([in] IWebView* sender, [in] RECT* contentRect);

    /*!
        @method webViewContentRect:
        @abstract Return the window's content rect
        @discussion 
        - (NSRect)webViewContentRect:(WebView *)sender;
    */
    HRESULT webViewContentRect([in] IWebView* sender, [out, retval] RECT* contentRect);

    /*!
        @method webView:runJavaScriptAlertPanelWithMessage:
        @abstract Display a JavaScript alert panel
        @param sender The WebView sending the delegate method.
        @param message The message to display
        @discussion Clients should visually indicate that this panel comes
        from JavaScript. The panel should have a single OK button.
        - (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message;
    */
    HRESULT runJavaScriptAlertPanelWithMessage([in] IWebView* sender, [in] BSTR message);

    /*!
        @method webView:runJavaScriptConfirmPanelWithMessage:
        @abstract Display a JavaScript confirm panel
        @param sender The WebView sending the delegate method.
        @param message The message to display
        @result YES if the user hit OK, no if the user chose Cancel.
        @discussion Clients should visually indicate that this panel comes
        from JavaScript. The panel should have two buttons, e.g. "OK" and
        "Cancel".
        - (BOOL)webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message;
    */
    HRESULT runJavaScriptConfirmPanelWithMessage([in] IWebView* sender, [in] BSTR message, [out, retval] BOOL* result);

    /*!
        @method webView:runJavaScriptTextInputPanelWithPrompt:defaultText:
        @abstract Display a JavaScript text input panel
        @param sender The WebView sending the delegate method.
        @param message The message to display
        @param defaultText The initial text for the text entry area.
        @result The typed text if the user hit OK, otherwise nil.
        @discussion Clients should visually indicate that this panel comes
        from JavaScript. The panel should have two buttons, e.g. "OK" and
        "Cancel", and an area to type text.
        - (NSString *)webView:(WebView *)sender runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText;
    */
    HRESULT runJavaScriptTextInputPanelWithPrompt([in] IWebView* sender, [in] BSTR message, [in] BSTR defaultText, [out, retval] BSTR* result);

    /*!
        @method webView:runJavaScriptConfirmPanelWithMessage:initiatedByFrame:
        @abstract Display a confirm panel by an "before unload" event handler.
        @param sender The WebView sending the delegate method.
        @param message The message to display.
        @param frame The WebFrame whose JavaScript initiated this call.
        @result YES if the user hit OK, NO if the user chose Cancel.
        @discussion Clients should include a message in addition to the one
        supplied by the web page that indicates. The panel should have 
        two buttons, e.g. "OK" and "Cancel".
        - (BOOL)webView:(WebView *)sender runBeforeUnloadConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame;
    */
    HRESULT runBeforeUnloadConfirmPanelWithMessage([in] IWebView* sender, [in] BSTR message, [in] IWebFrame* initiatedByFrame, [out, retval] BOOL* result);

    /*!
        @method webView:runOpenPanelForFileButtonWithResultListener:
        @abstract Display a file open panel for a file input control.
        @param sender The WebView sending the delegate method.
        @param resultListener The object to call back with the results.
        @discussion This method is passed a callback object instead of giving a return
        value so that it can be handled with a sheet.
        - (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id<WebOpenPanelResultListener>)resultListener;
    */
    HRESULT runOpenPanelForFileButtonWithResultListener([in] IWebView* sender, [in] IWebOpenPanelResultListener* resultListener);

    /*!
        @method webView:mouseDidMoveOverElement:modifierFlags:
        @abstract Update the window's feedback for mousing over links to reflect a new item the mouse is over
        or new modifier flags.
        @param sender The WebView sending the delegate method.
        @param elementInformation Dictionary that describes the element that the mouse is over, or nil.
        @param modifierFlags The modifier flags as in NSEvent.
        - (void)webView:(WebView *)sender mouseDidMoveOverElement:(NSDictionary *)elementInformation modifierFlags:(WebNSUInt)modifierFlags;
    */
    HRESULT mouseDidMoveOverElement([in] IWebView* sender, [in] IPropertyBag* elementInformation, [in] UINT modifierFlags);

    /*!
        @method webView:contextMenuItemsForElement:defaultMenuItems:
        @abstract Returns the menu items to display in an element's contextual menu.
        @param sender The WebView sending the delegate method.
        @param element A dictionary representation of the clicked element.
        @param defaultMenuItems An array of default NSMenuItems to include in all contextual menus.
        @result An array of NSMenuItems to include in the contextual menu.
        - (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems;
    */
    HRESULT contextMenuItemsForElement([in] IWebView* sender, [in] IPropertyBag* element, [in] OLE_HANDLE defaultItemsHMenu, [out, retval] OLE_HANDLE* resultHMenu);

    /*!
        @method webView:validateUserInterfaceItem:defaultValidation:
        @abstract Controls UI validation
        @param webView The WebView sending the delegate method
        @param item The user interface item being validated
        @pararm defaultValidation Whether or not the WebView thinks the item is valid
        @discussion This method allows the UI delegate to control WebView's validation of user interface items.
        See WebView.h to see the methods to that WebView can currently validate. See NSUserInterfaceValidations and
        NSValidatedUserInterfaceItem for information about UI validation.
        - (BOOL)webView:(WebView *)webView validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item defaultValidation:(BOOL)defaultValidation;
    */
    HRESULT validateUserInterfaceItem([in] IWebView* webView, [in] UINT itemCommandID, [in] BOOL defaultValidation, [out, retval] BOOL* isValid);

    /*!
        @method webView:shouldPerformAction:fromSender:
        @abstract Controls actions
        @param webView The WebView sending the delegate method
        @param action The action being sent
        @param sender The sender of the action
        @discussion This method allows the UI delegate to control WebView's behavior when an action is being sent.
        For example, if the action is copy:, the delegate can return YES to allow WebView to perform its default
        copy behavior or return NO and perform copy: in some other way. See WebView.h to see the actions that
        WebView can perform.
        - (BOOL)webView:(WebView *)webView shouldPerformAction:(SEL)action fromSender:(id)sender;
    */
    HRESULT shouldPerformAction([in] IWebView* webView, [in] UINT itemCommandID, [in] UINT sender);

    /*!
        @method webView:dragDestinationActionMaskForDraggingInfo:
        @abstract Controls behavior when dragging to a WebView
        @param webView The WebView sending the delegate method
        @param draggingInfo The dragging info of the drag
        @discussion This method is called periodically as something is dragged over a WebView. The UI delegate can return a mask
        indicating which drag destination actions can occur, WebDragDestinationActionAny to allow any kind of action or
        WebDragDestinationActionNone to not accept the drag.
        - (unsigned)webView:(WebView *)webView dragDestinationActionMaskForDraggingInfo:(id <NSDraggingInfo>)draggingInfo;
    */
    HRESULT dragDestinationActionMaskForDraggingInfo([in] IWebView* webView, [in] IDataObject* draggingInfo, [out, retval] WebDragDestinationAction* action);

    /*!
        @method webView:willPerformDragDestinationAction:forDraggingInfo:
        @abstract Informs that WebView will perform a drag destination action
        @param webView The WebView sending the delegate method
        @param action The drag destination action
        @param draggingInfo The dragging info of the drag
        @discussion This method is called after the last call to webView:dragDestinationActionMaskForDraggingInfo: after something is dropped on a WebView.
        This method informs the UI delegate of the drag destination action that WebView will perform.
        - (void)webView:(WebView *)webView willPerformDragDestinationAction:(WebDragDestinationAction)action forDraggingInfo:(id <NSDraggingInfo>)draggingInfo;
    */
    HRESULT willPerformDragDestinationAction([in] IWebView* webView, [in] WebDragDestinationAction action, [in] IDataObject* draggingInfo);

    /*!
        @method webView:dragSourceActionMaskForPoint:
        @abstract Controls behavior when dragging from a WebView
        @param webView The WebView sending the delegate method
        @param point The point where the drag started in the coordinates of the WebView
        @discussion This method is called after the user has begun a drag from a WebView. The UI delegate can return a mask indicating
        which drag source actions can occur, WebDragSourceActionAny to allow any kind of action or WebDragSourceActionNone to not begin a drag.
        - (unsigned)webView:(WebView *)webView dragSourceActionMaskForPoint:(NSPoint)point;
    */
    HRESULT dragSourceActionMaskForPoint([in] IWebView* webView, [in] LPPOINT point, [out, retval] WebDragSourceAction* action);

    /*!
        @method webView:willPerformDragSourceAction:fromPoint:withPasteboard:
        @abstract Informs that a drag a has begun from a WebView
        @param webView The WebView sending the delegate method
        @param action The drag source action
        @param point The point where the drag started in the coordinates of the WebView
        @param pasteboard The drag pasteboard
        @discussion This method is called after webView:dragSourceActionMaskForPoint: is called after the user has begun a drag from a WebView.
        This method informs the UI delegate of the drag source action that will be performed and gives the delegate an opportunity to modify
        the contents of the dragging pasteboard.
        - (void)webView:(WebView *)webView willPerformDragSourceAction:(WebDragSourceAction)action fromPoint:(NSPoint)point withPasteboard:(NSPasteboard *)pasteboard;
    */
    HRESULT willPerformDragSourceAction([in] IWebView* webView, [in] WebDragSourceAction action, [in] LPPOINT point, [in] IDataObject* pasteboard);

    /*!
        @method webView:contextMenuItemSelected:ForElement:
        @abstract Perform the action associated with the selected item.
        @param sender The WebView sending the delegate method.
        @param item The menu item that was selected.
        @param element A dictionary representation of the clicked element.
    */
    [local] HRESULT contextMenuItemSelected([in] IWebView* sender, [in] void* item, [in] IPropertyBag* element);

    /*
        @method hasCustomMenuImplementation:
        @abstract Returns whether the application uses the following functions to create a custom menu impementation.
    */
    HRESULT hasCustomMenuImplementation([out, retval] BOOL* hasCustomMenus);
    
    /*
        @method webView:trackCutsomPopupMenu
        @abstract Adds custom draw data to the menu items and calls a custom trackPopupMenu.
        @param sender The WebView sending the delegate method.
        @param menu The menu that we want to pop up.
        @param point The point associated with the context menu event in the coordinates of the WebView
    */
    HRESULT trackCustomPopupMenu([in] IWebView* sender, [in] OLE_HANDLE hMenu, [in] LPPOINT point);

    /*
        @method webView:measureCustomMenuItem
        @abstract This is called when the WM_MEASUREITEM command is received to measure the custom menu items
        @param sender The WebView sending the delegate method.
        @param measureItem The LPMEASUREITEMSTRUCT associated with the item.
    */
    [local] HRESULT measureCustomMenuItem([in] IWebView* sender, [in] void* measureItem);

    /*
        @method webView:drawCustomMenuItem
        @abstract This is called when the WM_DRAWITEM command is received to draw the custom menu item
        @param sender The WebView sending the delegate method.
        @param drawItem The LPDRAWITEMSTRUCT associated with the item.
    */
    [local] HRESULT drawCustomMenuItem([in] IWebView* sender, [in] void* drawItem);

    /*
        @method webView:addCustomMenuDrawingData
        @abstract Add custom data to the menu that the delegate can use when asked to draw.
        @param sender The WebView sending the delegate method.
        @param menu The cutsom menu to clean up.
        @discussion This method is called for submenus as well.
    */
    HRESULT addCustomMenuDrawingData([in] IWebView* sender, [in] OLE_HANDLE hMenu);

    /*
        @method webView:cleanUpCustomMenuDrawingData
        @abstract Clean up any custom data added to the menu items
        @param sender The WebView sending the delegate method.
        @param menu The cutsom menu to clean up.
    */
    HRESULT cleanUpCustomMenuDrawingData([in] IWebView* sender, [in] OLE_HANDLE hMenu);

    /*!
        @method webView:canTakeFocus:
        @abstract Informs whether focus can be transferred out of the WebView in the specified direction
        @param sender The WebView sending the delegate method.
        @param forward Whether focus is moving forward or backward.
    */
    HRESULT canTakeFocus([in] IWebView* sender, [in] BOOL forward, [out] BOOL* result);

    /*!
        @method webView:takeFocus:
        @abstract Instructs the delegate to take focus out of the WebView
        @param sender The WebView sending the delegate method.
        @param forward Whether focus is moving forward or backward.
    */
    HRESULT takeFocus([in] IWebView* sender, [in] BOOL forward);

    /// Undo related UI delegate methods --------------------------------------------------------------------------------

    /*!
        @method registerUndoWithTarget:
        @abstract Registers an undo operation of a IWebUndoTarget on the undo/redo stack.
        @param target The target that will be called back when the action is undone
        @param actionName The name of the action - this will be passed back to the target when we need to undo the operation
        @param actionArg An object that target used to save undo information
    */
    HRESULT registerUndoWithTarget([in] IWebUndoTarget* target, [in] BSTR actionName, [in] IUnknown* actionArg);

    /*!
        @method removeAllActionsWithTarget:
        @abstract remove all the undo operations that are registered for the passed in target on the undo/redo stack.
        @param target 
    */
    HRESULT removeAllActionsWithTarget([in] IWebUndoTarget* target);

    /*!
        @method setActionTitle:
        @abstract Sets the name of the action for the current group of undo operations
        @param actionName Name of the action
    */
    HRESULT setActionTitle([in] BSTR actionTitle);

    /*!
        @method undo:
        @abstract Undo the last group of operations
    */
    HRESULT undo();

    /*!
        @method redo:
        @abstract Redo the last group of operations
    */
    HRESULT redo();

    /*!
        @method canUndo:
        @abstract Returns whether there's anything on the undo stack to be undone
    */
    HRESULT canUndo([out, retval] BOOL* result);

    /*!
        @method canRedo:
        @abstract Returns whether there's anything on the redo stack to be redone
    */
    HRESULT canRedo([out, retval] BOOL* result);
}

/*!
    @category WebUIDelegate2
    @discussion A class that supplements the IWebUIDelegate interface
*/
[
    object,
    oleautomation,
    uuid(C6FF73E1-304D-4129-A60C-66326C2578DB),
    pointer_default(unique)
]
interface IWebUIDelegate2 : IWebUIDelegate
{
/*!
    @method webView:printFrame:
    @abstract Informs that a WebFrame needs to be printed
    @param webView The WebView sending the delegate method
    @param frame The WebFrame needing to be printed
    @discussion This method is called when a script or user requests the page to be printed.
    In this method the delegate can prepare the WebFrame to be printed.
*/
    HRESULT printFrame([in] IWebView* webView, [in] IWebFrame* frame);

/*!
    @method webView:ftpDirectoryTemplatePath
    @abstract Returns the path to the FTP directory listing template document
    @param webView The WebView sending the delegate method
    @param path The path to the template document
    @discussion This method is called when an FTP directory listing is viewed in a webView.  
    In practice, all WebViews show the same template document data that was loaded for the very
    first WebView that displayed a directory listing, so this will only be called once.
*/
    HRESULT ftpDirectoryTemplatePath([in] IWebView* webView, [out, retval] BSTR* path);

/*!
    @method webViewHeaderHeight:
    @param webView The WebView sending the delegate method
    @abstract Reserve a height for the printed page header.
    @result The height to reserve for the printed page header, return 0.0 to not reserve any space for a header.
    @discussion The height returned will be used to calculate the rect passed to webView:drawHeaderInRect:.

    - (float)webViewHeaderHeight:(WebView *)sender;
*/
    HRESULT webViewHeaderHeight([in] IWebView* webView, [out, retval] float* result);

/*!
    @method webViewFooterHeight:
    @param webView The WebView sending the delegate method
    @abstract Reserve a height for the printed page footer.
    @result The height to reserve for the printed page footer, return 0.0 to not reserve any space for a footer.
    @discussion The height returned will be used to calculate the rect passed to webView:drawFooterInRect:.

    - (float)webViewFooterHeight:(WebView *)sender;
*/
    HRESULT webViewFooterHeight([in] IWebView* webView, [out, retval] float* result);

/*!
    @method webView:drawHeaderInRect:
    @param webView The WebView sending the delegate method
    @param rect The NSRect reserved for the header of the page
    @abstract The delegate should draw a header for the sender in the supplied rect.

    - (void)webView:(WebView *)sender drawHeaderInRect:(NSRect)rect;
*/
    HRESULT drawHeaderInRect([in] IWebView* webView, [in] RECT* rect, [in] OLE_HANDLE drawingContext);

/*!
    @method webView:drawFooterInRect:
    @param webView The WebView sending the delegate method
    @param rect The NSRect reserved for the footer of the page
    @abstract The delegate should draw a footer for the sender in the supplied rect.

    - (void)webView:(WebView *)sender drawFooterInRect:(NSRect)rect;
*/
    HRESULT drawFooterInRect([in] IWebView* webView, [in] RECT* rect, [in] OLE_HANDLE drawingContext, [in] UINT pageIndex, [in] UINT pageCount);

    HRESULT webViewPrintingMarginRect([in] IWebView* webView, [out, retval] RECT* rect);
}

/*!
    @category WebUIDelegate3
    @discussion A class that supplements the IWebUIDelegate interface
*/
[
    object,
    oleautomation,
    uuid(DD544D90-C233-4562-8EFD-A8D3A0DEBC19),
    pointer_default(unique)
]
interface IWebUIDelegate3 : IWebUIDelegate2
{
    HRESULT canRunModal([in] IWebView* webView, [out, retval] BOOL* canRunBoolean);
    HRESULT createModalDialog([in] IWebView* sender, [in] IWebURLRequest* request, [out, retval] IWebView** newWebView);
    HRESULT runModal([in] IWebView* webView);
    HRESULT isMenuBarVisible([in] IWebView* webView, [out, retval] BOOL* visible);
    HRESULT setMenuBarVisible([in] IWebView* webView, [in] BOOL visible);
    HRESULT runDatabaseSizeLimitPrompt([in] IWebView* webView, [in] BSTR displayName, [in] IWebFrame* initiatedByFrame, [out, retval] BOOL* allowed);
}
