/* -*- Mode: IDL; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
 * Version: NPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Netscape Public License
 * Version 1.1 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://www.mozilla.org/NPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is mozilla.org code.
 *
 * The Initial Developer of the Original Code is 
 * Netscape Communications Corporation.
 * Portions created by the Initial Developer are Copyright (C) 1998
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *
 *   Adam Lock <adamlock@eircom.net>
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the NPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the NPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */
 
#include <olectl.h>

// This file will be processed by the MIDL tool to
// produce the type library (MozillaControl.tlb) and marshalling code.

import "oaidl.idl";
import "ocidl.idl";
import "docobj.idl";

// See note below for why IWebBrowser is not imported this way
// import "exdisp.idl";

#include <exdispid.h>

[
	uuid(1339B53E-3453-11D2-93B9-000000000000),
	version(1.0),
	helpstring("MozillaControl 1.0 Type Library")
]
library MOZILLACONTROLLib
{
	importlib("stdole32.tlb");
	importlib("stdole2.tlb");

	// Stop interfaces and other bits from being redefined by the IE header file

	cpp_quote("#ifndef __exdisp_h__")
	cpp_quote("#define __exdisp_h__")

	// NOTE: There is a very specific reason for repeating the IWebBrowser
	//       and other bits verbatim rather than import'ing exdisp.idl -
	//       MIDL fails with a MIDL2020 error if we try that!

    [
        uuid(EAB22AC1-30C1-11CF-A7EB-0000C05BAE0B), // IID_IWebBrowser
        helpstring("Web Browser interface"),
        helpcontext(0x0000),
        hidden,
        dual,
        oleautomation,
        odl
    ]
    interface IWebBrowser : IDispatch 
    {
        [id(100), helpstring("Navigates to the previous item in the history list."), helpcontext(0x0000)]
        HRESULT GoBack();
        [id(101), helpstring("Navigates to the next item in the history list."), helpcontext(0x0000)]
        HRESULT GoForward();
        [id(102), helpstring("Go home/start page."), helpcontext(0x0000)]
        HRESULT GoHome();
        [id(103), helpstring("Go Search Page."), helpcontext(0x0000)]
        HRESULT GoSearch();

        [id(104), helpstring("Navigates to a URL or file."), helpcontext(0x0000)]
        HRESULT Navigate([in] BSTR URL,
                         [in, optional] VARIANT * Flags,
                         [in, optional] VARIANT * TargetFrameName,
                         [in, optional] VARIANT * PostData,
                         [in, optional] VARIANT * Headers);
        typedef
        [
            uuid(14EE5380-A378-11cf-A731-00A0C9082637),
            helpstring("Constants for WebBrowser navigation flags")
        ]
        enum BrowserNavConstants {
            [helpstring("Open in new window")]          navOpenInNewWindow = 0x0001,
            [helpstring("Exclude from history list")]   navNoHistory = 0x0002,
            [helpstring("Don't read from cache")]       navNoReadFromCache = 0x0004,
            [helpstring("Don't write from cache")]      navNoWriteToCache = 0x0008,
            [helpstring("Try other sites on failure")]  navAllowAutosearch = 0x0010,
            [helpstring("OpenBrowserBar")]              navBrowserBar = 0x0020,
        } BrowserNavConstants;

        [id(DISPID_REFRESH), helpstring("Refresh the currently viewed page."), helpcontext(0x0000)]
        HRESULT Refresh();

        // The standard Refresh takes no parameters and we need some... use a new name
        [id(105), helpstring("Refresh the currently viewed page."), helpcontext(0x0000)]
        HRESULT Refresh2([in,optional] VARIANT * Level);

        typedef
        [
            uuid(C317C261-A991-11cf-A731-00A0C9082637),
            helpstring("Constants for Refresh")
        ]
        enum RefreshConstants {                                         // must map to these in sdk\inc\docobj.h
            [helpstring("Refresh normal")]     REFRESH_NORMAL     = 0,  //== OLECMDIDF_REFRESH_NORMAL
            [helpstring("Refresh if expired")] REFRESH_IFEXPIRED  = 1,  //== OLECMDIDF_REFRESH_IFEXPIRED
            [helpstring("Refresh completely")] REFRESH_COMPLETELY = 3   //== OLECMDIDF_REFRESH_COMPLETELY
        } RefreshConstants;

        [id(106), helpstring("Stops opening a file."), helpcontext(0x0000)]
        HRESULT Stop();

        // Automation heirarchy...
        [id(200), propget, helpstring("Returns the application automation object if accessible, this automation object otherwise.."), helpcontext(0x0000)]
        HRESULT Application([out,retval] IDispatch** ppDisp);

        [id(201), propget, helpstring("Returns the automation object of the container/parent if one exists or this automation object."), helpcontext(0x0000)]
        HRESULT Parent([out,retval] IDispatch** ppDisp);

        [id(202), propget, helpstring("Returns the container/parent automation object, if any."), helpcontext(0x0000)]
        HRESULT Container([out,retval] IDispatch** ppDisp);

        [id(203), propget, helpstring("Returns the active Document automation object, if any."), helpcontext(0x0000)]
        HRESULT Document([out,retval] IDispatch** ppDisp);

        [id(204), propget, helpstring("Returns True if this is the top level object."), helpcontext(0x0000)]
        HRESULT TopLevelContainer([out, retval] VARIANT_BOOL* pBool);

        [id(205), propget, helpstring("Returns the type of the contained document object."), helpcontext(0x0000)]
        HRESULT Type([out,retval] BSTR* Type);

        // Window stuff...
        [id(206), propget, helpstring("The horizontal position (pixels) of the frame window relative to the screen/container."), helpcontext(0x0000)]
        HRESULT Left([out, retval] long *pl);
        [id(206), propput]
        HRESULT Left([in] long Left);
        [id(207), propget, helpstring("The vertical position (pixels) of the frame window relative to the screen/container."), helpcontext(0x0000)]
        HRESULT Top([out, retval] long *pl);
        [id(207), propput]
        HRESULT Top([in] long Top);
        [id(208), propget, helpstring("The horizontal dimension (pixels) of the frame window/object."), helpcontext(0x0000)]
        HRESULT Width([out, retval] long *pl);
        [id(208), propput]
        HRESULT Width([in] long Width);
        [id(209), propget, helpstring("The vertical dimension (pixels) of the frame window/object."), helpcontext(0x0000)]
        HRESULT Height([out, retval] long *pl);
        [id(209), propput]
        HRESULT Height([in] long Height);

        // WebBrowser stuff...
        [id(210), propget, helpstring("Gets the short (UI-friendly) name of the URL/file currently viewed."), helpcontext(0x0000)]
        HRESULT LocationName([out,retval] BSTR *LocationName);

        [id(211), propget, helpstring("Gets the full URL/path currently viewed."), helpcontext(0x0000)]
        HRESULT LocationURL([out,retval] BSTR * LocationURL);

        // Added a property to see if the viewer is currenly busy or not...
        [id(212), propget, helpstring("Query to see if something is still in progress."), helpcontext(0x0000)]
        HRESULT Busy([out,retval] VARIANT_BOOL *pBool);
    }

    [
        uuid(0002DF05-0000-0000-C000-000000000046), // IID_IWebBrowserApp
        helpstring("Web Browser Application Interface."),
        helpcontext(0x0000),
        hidden,
        oleautomation,
        dual
    ]
    interface IWebBrowserApp : IWebBrowser
    {
        [id(300), helpstring("Exits application and closes the open document."), helpcontext(0x0000)]
        HRESULT Quit();

        [id(301), helpstring("Converts client sizes into window sizes."), helpcontext(0x0000)]
        HRESULT ClientToWindow([in,out] int* pcx, [in,out] int* pcy);

        [id(302), helpstring("Associates vtValue with the name szProperty in the context of the object."), helpcontext(0x0000)]
        HRESULT PutProperty([in] BSTR Property, [in] VARIANT vtValue);

        [id(303), helpstring("Retrieve the Associated value for the property vtValue in the context of the object."), helpcontext(0x0000)]
        HRESULT GetProperty([in] BSTR Property, [out, retval] VARIANT *pvtValue);

        [id(0), propget, helpstring("Returns name of the application."), helpcontext(0x0000)]
        HRESULT Name([out,retval] BSTR* Name);

        [id(DISPID_HWND), propget, helpstring("Returns the HWND of the current IE window."), helpcontext(0x0000)]
        HRESULT HWND([out,retval] long *pHWND);

        [id(400), propget, helpstring("Returns file specification of the application, including path."), helpcontext(0x0000)]
        HRESULT FullName([out,retval] BSTR* FullName);

        [id(401), propget, helpstring("Returns the path to the application."), helpcontext(0x0000)]
        HRESULT Path([out,retval] BSTR* Path);

        [id(402), propget, helpstring("Determines whether the application is visible or hidden."), helpcontext(0x0000)]
        HRESULT Visible([out, retval] VARIANT_BOOL* pBool);
        [id(402), propput, helpstring("Determines whether the application is visible or hidden."), helpcontext(0x0000)]
        HRESULT Visible([in] VARIANT_BOOL Value);

        [id(403), propget, helpstring("Turn on or off the statusbar."), helpcontext(0x0000)]
        HRESULT StatusBar([out, retval] VARIANT_BOOL* pBool);
        [id(403), propput, helpstring("Turn on or off the statusbar."), helpcontext(0x0000)]
        HRESULT StatusBar([in] VARIANT_BOOL Value);

        [id(404), propget, helpstring("Text of Status window."), helpcontext(0x0000)]
        HRESULT StatusText([out, retval] BSTR *StatusText);
        [id(404), propput, helpstring("Text of Status window."), helpcontext(0x0000)]
        HRESULT StatusText([in] BSTR StatusText);

        [id(405), propget, helpstring("Controls which toolbar is shown."), helpcontext(0x0000)]
        HRESULT ToolBar([out, retval] int * Value);
        [id(405), propput, helpstring("Controls which toolbar is shown."), helpcontext(0x0000)]
        HRESULT ToolBar([in] int Value);

        [id(406), propget, helpstring("Controls whether menubar is shown."), helpcontext(0x0000)]
        HRESULT MenuBar([out, retval] VARIANT_BOOL * Value);
        [id(406), propput, helpstring("Controls whether menubar is shown."), helpcontext(0x0000)]
        HRESULT MenuBar([in] VARIANT_BOOL Value);

        [id(407), propget, helpstring("Maximizes window and turns off statusbar, toolbar, menubar, and titlebar."), helpcontext(0x0000)]
        HRESULT FullScreen([out, retval] VARIANT_BOOL * pbFullScreen);
        [id(407), propput, helpstring("Maximizes window and turns off statusbar, toolbar, menubar, and titlebar."), helpcontext(0x0000)]
        HRESULT FullScreen([in] VARIANT_BOOL bFullScreen);
    }

    [
        uuid(D30C1661-CDAF-11d0-8A3E-00C04FC9E26E), // IID_IWebBrowser2
        helpstring("Web Browser Interface for IE4."),
        helpcontext(0x0000),
        hidden,
        oleautomation,
        dual
    ]
    interface IWebBrowser2 : IWebBrowserApp
    {
        [id(500), helpstring("Navigates to a URL or file or pidl."), helpcontext(0x0000)]
        HRESULT Navigate2([in] VARIANT * URL,
                          [in, optional] VARIANT * Flags,
                          [in, optional] VARIANT * TargetFrameName,
                          [in, optional] VARIANT * PostData,
                          [in, optional] VARIANT * Headers);


        [id(501), helpstring("IOleCommandTarget::QueryStatus"), helpcontext(0x0000)]
        HRESULT QueryStatusWB([in] OLECMDID cmdID, [out, retval] OLECMDF * pcmdf);
        [id(502), helpstring("IOleCommandTarget::Exec"), helpcontext(0x0000)]
        HRESULT ExecWB([in] OLECMDID cmdID, [in] OLECMDEXECOPT cmdexecopt, [in, optional] VARIANT * pvaIn, [out, in, optional] VARIANT * pvaOut);
        [id(503), helpstring("Set BrowserBar to Clsid"), helpcontext(0x0000)]
        HRESULT ShowBrowserBar( [in] VARIANT * pvaClsid,
                                [in, optional] VARIANT * pvarShow,
                                [in, optional] VARIANT * pvarSize );

        [id(DISPID_READYSTATE), propget, bindable]
        HRESULT ReadyState([retval, out] READYSTATE * plReadyState);

        [id(550), propget, helpstring("Controls if the frame is offline (read from cache)"), helpcontext(0x0000)]
        HRESULT Offline([out, retval] VARIANT_BOOL * pbOffline);
        [id(550), propput, helpstring("Controls if the frame is offline (read from cache)"), helpcontext(0x0000)]
        HRESULT Offline([in] VARIANT_BOOL bOffline);

        [id(551), propget, helpstring("Controls if any dialog boxes can be shown"), helpcontext(0x0000)]
        HRESULT Silent([out, retval] VARIANT_BOOL * pbSilent);
        [id(551), propput, helpstring("Controls if any dialog boxes can be shown"), helpcontext(0x0000)]
        HRESULT Silent([in] VARIANT_BOOL bSilent);

        [id(552), propget, helpstring("Registers OC as a top-level browser (for target name resolution)"), helpcontext(0x0000)]
        HRESULT RegisterAsBrowser([out, retval] VARIANT_BOOL * pbRegister);
        [id(552), propput, helpstring("Registers OC as a top-level browser (for target name resolution)"), helpcontext(0x0000)]
        HRESULT RegisterAsBrowser([in] VARIANT_BOOL bRegister);

        [id(553), propget, helpstring("Registers OC as a drop target for navigation"), helpcontext(0x0000)]
        HRESULT RegisterAsDropTarget([out, retval] VARIANT_BOOL * pbRegister);
        [id(553), propput, helpstring("Registers OC as a drop target for navigation"), helpcontext(0x0000)]
        HRESULT RegisterAsDropTarget([in] VARIANT_BOOL bRegister);

        [id(554), propget, helpstring("Controls if the browser is in theater mode"), helpcontext(0x0000)]
        HRESULT TheaterMode([out, retval] VARIANT_BOOL * pbRegister);
        [id(554), propput, helpstring("Controls if the browser is in theater mode"), helpcontext(0x0000)]
        HRESULT TheaterMode([in] VARIANT_BOOL bRegister);

        [id(555), propget, helpstring("Controls whether address bar is shown"), helpcontext(0x0000)]
        HRESULT AddressBar([out, retval] VARIANT_BOOL * Value);
        [id(555), propput, helpstring("Controls whether address bar is shown"), helpcontext(0x0000)]
        HRESULT AddressBar([in] VARIANT_BOOL Value);

        [id(556), propget, helpstring("Controls whether the window is resizable"), helpcontext(0x0000)]
        HRESULT Resizable([out, retval] VARIANT_BOOL * Value);
        [id(556), propput, helpstring("Controls whether the window is resizable"), helpcontext(0x0000)]
        HRESULT Resizable([in] VARIANT_BOOL Value);
    }

    [
        uuid(EAB22AC2-30C1-11CF-A7EB-0000C05BAE0B), // DIID_DWebBrowserEvents
        helpstring("Web Browser Control Events (old)"),
        hidden
    ]
    dispinterface DWebBrowserEvents
    {
        properties:
        methods:
        [id(DISPID_BEFORENAVIGATE), helpstring("Fired when a new hyperlink is being navigated to."), helpcontext(0x0000)]
        void BeforeNavigate([in] BSTR URL, long Flags, BSTR TargetFrameName, VARIANT * PostData, BSTR Headers, [in, out]VARIANT_BOOL * Cancel);

        [id(DISPID_NAVIGATECOMPLETE), helpstring("Fired when the document being navigated to becomes visible and enters the navigation stack."), helpcontext(0x0000)]
        void NavigateComplete([in] BSTR URL );

        [id(DISPID_STATUSTEXTCHANGE), helpstring("Statusbar text changed."), helpcontext(0x0000)]
        void StatusTextChange([in]BSTR Text);

        [id(DISPID_PROGRESSCHANGE), helpstring("Fired when download progress is updated."), helpcontext(0x0000)]
        void ProgressChange([in] long Progress, [in] long ProgressMax);

        [id(DISPID_DOWNLOADCOMPLETE), helpstring("Download of page complete."), helpcontext(0x0000)]
        void DownloadComplete();

        [id(DISPID_COMMANDSTATECHANGE), helpstring("The enabled state of a command changed"), helpcontext(0x0000)]
        void CommandStateChange([in] long Command, [in] VARIANT_BOOL Enable);

        [id(DISPID_DOWNLOADBEGIN), helpstring("Download of a page started."), helpcontext(0x000)]
        void DownloadBegin();

        [id(DISPID_NEWWINDOW), helpstring("Fired when a new window should be created."), helpcontext(0x0000)]
        void NewWindow([in] BSTR URL, [in] long Flags, [in] BSTR TargetFrameName, [in] VARIANT * PostData, [in] BSTR Headers, [in,out] VARIANT_BOOL * Processed);

        [id(DISPID_TITLECHANGE), helpstring("Document title changed."), helpcontext(0x0000)]
        void TitleChange([in]BSTR Text);

        [id(DISPID_FRAMEBEFORENAVIGATE), helpstring("Fired when a new hyperlink is being navigated to in a frame."), helpcontext(0x0000)]
        void FrameBeforeNavigate([in] BSTR URL, long Flags, BSTR TargetFrameName, VARIANT * PostData, BSTR Headers, [in, out]VARIANT_BOOL * Cancel);

        [id(DISPID_FRAMENAVIGATECOMPLETE), helpstring("Fired when a new hyperlink is being navigated to in a frame."), helpcontext(0x0000)]
        void FrameNavigateComplete([in] BSTR URL );

        [id(DISPID_FRAMENEWWINDOW), helpstring("Fired when a new window should be created."), helpcontext(0x0000)]
        void FrameNewWindow([in] BSTR URL, [in] long Flags, [in] BSTR TargetFrameName, [in] VARIANT * PostData, [in] BSTR Headers, [in,out] VARIANT_BOOL * Processed);

        // The following are IWebBrowserApp specific:
        //
        [id(DISPID_QUIT), helpstring("Fired when application is quiting."), helpcontext(0x0000)]
        void Quit([in, out] VARIANT_BOOL * Cancel);

        [id(DISPID_WINDOWMOVE), helpstring("Fired when window has been moved."), helpcontext(0x0000)]
        void WindowMove();

        [id(DISPID_WINDOWRESIZE), helpstring("Fired when window has been sized."), helpcontext(0x0000)]
        void WindowResize();

        [id(DISPID_WINDOWACTIVATE), helpstring("Fired when window has been activated."), helpcontext(0x0000)]
        void WindowActivate();

        [id(DISPID_PROPERTYCHANGE), helpstring("Fired when the PutProperty method has been called."), helpcontext(0x0000)]
        void PropertyChange([in] BSTR Property);
    }

    [
        uuid(34A715A0-6587-11D0-924A-0020AFC7AC4D), // IID_DWebBrowserEvents2
        helpstring("Web Browser Control events interface"),
        hidden
    ]
    dispinterface DWebBrowserEvents2
    {
        properties:
        methods:
        [id(DISPID_STATUSTEXTCHANGE), helpstring("Statusbar text changed."), helpcontext(0x0000)]
        void StatusTextChange([in]BSTR Text);

        [id(DISPID_PROGRESSCHANGE), helpstring("Fired when download progress is updated."), helpcontext(0x0000)]
        void ProgressChange([in] long Progress, [in] long ProgressMax);

        [id(DISPID_COMMANDSTATECHANGE), helpstring("The enabled state of a command changed."), helpcontext(0x0000)]
        void CommandStateChange([in] long Command, [in] VARIANT_BOOL Enable);

        [id(DISPID_DOWNLOADBEGIN), helpstring("Download of a page started."), helpcontext(0x000)]
        void DownloadBegin();

        [id(DISPID_DOWNLOADCOMPLETE), helpstring("Download of page complete."), helpcontext(0x0000)]
        void DownloadComplete();

        [id(DISPID_TITLECHANGE), helpstring("Document title changed."), helpcontext(0x0000)]
        void TitleChange([in] BSTR Text);

        [id(DISPID_PROPERTYCHANGE), helpstring("Fired when the PutProperty method has been called."), helpcontext(0x0000)]
        void PropertyChange([in] BSTR szProperty);

        // New events for IE40:
        //
        [id(DISPID_BEFORENAVIGATE2), helpstring("Fired before navigate occurs in the given WebBrowser (window or frameset element). The processing of this navigation may be modified."), helpcontext(0x0000)]
        void BeforeNavigate2([in] IDispatch* pDisp,
                             [in] VARIANT * URL, [in] VARIANT * Flags, [in] VARIANT * TargetFrameName, [in] VARIANT * PostData, [in] VARIANT * Headers,
                             [in,out] VARIANT_BOOL * Cancel);

        [id(DISPID_NEWWINDOW2), helpstring("A new, hidden, non-navigated WebBrowser window is needed."), helpcontext(0x0000)]
        void NewWindow2([in, out] IDispatch** ppDisp, [in, out] VARIANT_BOOL * Cancel);

        [id(DISPID_NAVIGATECOMPLETE2), helpstring("Fired when the document being navigated to becomes visible and enters the navigation stack."), helpcontext(0x0000)]
        void NavigateComplete2([in] IDispatch* pDisp, [in] VARIANT * URL );

        [id(DISPID_DOCUMENTCOMPLETE), helpstring("Fired when the document being navigated to reaches ReadyState_Complete."), helpcontext(0x0000)]
        void DocumentComplete([in] IDispatch* pDisp, [in] VARIANT * URL );

        [id(DISPID_ONQUIT), helpstring("Fired when application is quiting."), helpcontext(0x0000)]
        void OnQuit();

        [id(DISPID_ONVISIBLE), helpstring("Fired when the window should be shown/hidden"), helpcontext(0x0000)]
        void OnVisible([in] VARIANT_BOOL Visible);

        [id(DISPID_ONTOOLBAR), helpstring("Fired when the toolbar  should be shown/hidden"), helpcontext(0x0000)]
        void OnToolBar([in] VARIANT_BOOL ToolBar);

        [id(DISPID_ONMENUBAR), helpstring("Fired when the menubar should be shown/hidden"), helpcontext(0x0000)]
        void OnMenuBar([in] VARIANT_BOOL MenuBar);

        [id(DISPID_ONSTATUSBAR), helpstring("Fired when the statusbar should be shown/hidden"), helpcontext(0x0000)]
        void OnStatusBar([in] VARIANT_BOOL StatusBar);

        [id(DISPID_ONFULLSCREEN), helpstring("Fired when fullscreen mode should be on/off"), helpcontext(0x0000)]
        void OnFullScreen([in] VARIANT_BOOL FullScreen);

        [id(DISPID_ONTHEATERMODE), helpstring("Fired when theater mode should be on/off"), helpcontext(0x0000)]
        void OnTheaterMode([in] VARIANT_BOOL TheaterMode);
	}

	// Now a private interface for those ActiveX programmers who want to get
	// their hands on the Mozilla internal interfaces. Note that XPCOM
	// interfaces are cast into void * parameters but they follow
	// the normal COM refcounting rules for in, in-out & out parameters.

    [
        uuid(D6131E69-4A89-4ab5-B916-5A581D66C84F),
    ]
    interface IMozControlBridge : IUnknown 
    {
		// Method to get the nsIWebBrowser interface (refcounted but cast into a void)
        HRESULT GetWebBrowser([out] void **aBrowser);
	}

    typedef
    [
        uuid(34A226E0-DF30-11CF-89A9-00A0C9054129),
        helpstring("Constants for WebBrowser CommandStateChange")
    ]
    enum CommandStateChangeConstants {
        [helpstring("Command Change")]      CSC_UPDATECOMMANDS  = 0xFFFFFFFF,
        [helpstring("Navigate Forward")]    CSC_NAVIGATEFORWARD = 0x00000001,
        [helpstring("Navigate Back")]       CSC_NAVIGATEBACK    = 0x00000002,
    } CommandStateChangeConstants;

	[
		uuid(1339B54C-3453-11D2-93B9-000000000000),
		helpstring("MozillaBrowser Class")
	]
	coclass MozillaBrowser
	{
		[default] interface IWebBrowser2;
		interface IWebBrowser;
		interface IWebBrowserApp;
		interface IDispatch;
		[source] dispinterface DWebBrowserEvents;
		[default, source] dispinterface DWebBrowserEvents2;
	};

	cpp_quote("#endif")
};
