/*
 * Copyright 2005-2007 Jacek Caban for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

/* 
 * NOTE:
 * This file is not a typical idl file. Interfaces in this file are XPCOM
 * interfaces (NOT MSCOM!), but we generate the header file with WIDL
 * compatible with XPCOM, usable in C code.
 */

cpp_quote("#define GECKO_VERSION \"0.9.1\"")
cpp_quote("#define GECKO_VERSION_STRING \"Wine Gecko \" GECKO_VERSION")

import "wtypes.idl";

cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
cpp_quote("#undef GetForm")
cpp_quote("#undef SetPort")
cpp_quote("#endif")

typedef HRESULT nsresult;
typedef ULONG nsrefcnt;

typedef IID nsID;
typedef IID nsIID;
typedef nsIID nsCID;
typedef REFIID nsIIDRef;
typedef nsIIDRef nsCIDRef;

typedef void** nsQIResult;
typedef WCHAR PRUnichar;
typedef ULONG PRUint32;
typedef LONG PRInt32;
typedef WORD PRUint16;
typedef INT16 PRInt16;
typedef BYTE PRUint8;
typedef BOOL PRBool;
typedef LARGE_INTEGER PRInt64;
typedef ULARGE_INTEGER PRUint64;
typedef PRUint64 DOMTimeStamp;
typedef PRUint32 nsLoadFlags;

typedef struct {
    void *v;
    void *d1;
    PRUint32 d2;
    void *d3;
} nsCStringContainer;

typedef struct {
    void *v;
    void *d1;
    PRUint32 d2;
    void *d3;
} nsStringContainer;

typedef nsCStringContainer nsACString;
typedef nsStringContainer nsAString;

interface nsIWebBrowserChrome;
interface nsILoadGroup;
interface nsIDOMNode;
interface nsIDOMDocument;
interface nsIDOMEvent;
interface nsIEditor;
interface nsISelectionController;
interface nsITransactionManager;
interface nsITransaction;
interface nsIInlineSpellChecker;
interface nsIOutputStream;
interface nsIEditorObserver;
interface nsIEditActionListener;
interface nsIDocumentStateListener;
interface nsIDOMCSSStyleSheet;
interface nsIDOMDocumentView;
interface nsIDocumentObserver;

interface IMoniker;

[
    object,
    uuid(00000000-0000-0000-c000-000000000046),
    local
]
interface nsISupports
{
    nsresult QueryInterface(nsIIDRef riid, nsQIResult result);
    nsrefcnt AddRef();
    nsrefcnt Release();
}

/* Currently we don't need a full declaration of these interfaces */
typedef nsISupports nsISHistory;
typedef nsISupports nsIWidget;
typedef nsISupports nsIHttpHeaderVisitor;
typedef nsISupports nsIDOMBarProp;
typedef nsISupports nsIDOMWindowCollection;
typedef nsISupports nsIPrompt;
typedef nsISupports nsIAuthPrompt;
typedef nsISupports nsIDOMNamedNodeMap;
typedef nsISupports nsIDOMAttr;
typedef nsISupports nsIDOMDocumentType;
typedef nsISupports nsIDOMDOMImplementation;
typedef nsISupports nsIDOMCDATASection;
typedef nsISupports nsIDOMProcessingInstruction;
typedef nsISupports nsIDOMEntityReference;
typedef nsISupports nsIDOMHTMLFormElement;
typedef nsISupports nsIDOMHTMLOptionsCollection;
typedef nsISupports nsIWebProgressListener;
typedef nsISupports nsIDOMCSSValue;
typedef nsISupports nsIPrintSession;
typedef nsISupports nsIControllerCommandTable;
typedef nsISupports nsIPrincipal;
typedef nsISupports nsIAtom;
typedef nsISupports nsISupportsArray;
typedef nsISupports nsIContentFilter;
typedef nsISupports nsIDOMMediaList;
typedef nsISupports nsIDOMHTMLTableCaptionElement;
typedef nsISupports nsIDOMHTMLTableSectionElement;
typedef nsISupports nsIDOMClientRectList;
typedef nsISupports nsIDOMClientRect;
typedef nsISupports nsIDOMLocation;
typedef nsISupports nsIBoxObject;
typedef nsISupports nsIDocument;
typedef nsISupports nsIContent;
typedef nsISupports nsINode;
typedef nsISupports nsIStyleSheet;
typedef nsISupports nsIStyleRule;

[
    object,
    uuid(8bb35ed9-e332-462d-9155-4a002ab5c958),
    local
    /* FROZEN */
]
interface nsIServiceManager : nsISupports
{
    nsresult GetService(nsCIDRef aClass, nsIIDRef aIID, void **result);
    nsresult GetServiceByContractID(const char *aContractID, nsIIDRef aIID, void **result);
    nsresult IsServiceInstantiated(nsCIDRef aClass, nsIIDRef aIID, BOOL *_retval);
    nsresult IsServiceInstantiatedByContractID(const char *aContractID, nsIIDRef aIID, BOOL *_retval);
}

[
    object,
    uuid(00000001-0000-0000-c000-000000000046),
    local
    /* FROZEN */
]
interface nsIFactory : nsISupports
{
    nsresult CreateInstance(nsISupports *aOuter, const nsIID *iid, void **result);
    nsresult LockFactory(PRBool lock);
}

[
    object,
    uuid(db242e01-e4d9-11d2-9dde-000064657374),
    local
    /* FROZEN */
]
interface nsIObserver : nsISupports
{
    nsresult Observe(nsISupports *aSubject, const char *aTopic, const PRUnichar *aData);
}

[
    object,
    uuid(a88e5a60-205a-4bb1-94e1-2628daf51eae),
    local
    /* FROZEN */
]
interface nsIComponentManager : nsISupports
{
    nsresult GetClassObject(nsCIDRef aClass, nsIIDRef aIID, nsQIResult result);
    nsresult GetClassObjectByContractID(const char *aContractID, nsIIDRef aIID, nsQIResult result);
    nsresult CreateInstance(nsCIDRef aClass, nsISupports *aDelegate, nsIIDRef aIID,
            nsQIResult result);
    nsresult CreateInstanceByContractID(const char *aContractID, nsISupports *aDelegate,
            nsIIDRef aIID, nsQIResult result);
}

[
    object,
    uuid(59e7e77a-38e4-11d4-8cf5-0060b0fc14a3),
    local
    /* FROZEN */
]
interface nsIMemory : nsISupports
{
    void *Alloc(/*size_t*/ int size);
    void *Realloc(void *_ptr, /*size_t*/ int newSize);
    void Free(void *_ptr);
    nsresult HeapMinimize(PRBool immediate);
    nsresult IsLowMemory(PRBool *_retval);
}

[
    object,
    uuid(9188bc85-f92e-11d2-81ef-0060083a0bcf),
    local
    /* FROZEN */
]
interface nsIWeakReference : nsISupports
{
    nsresult QueryReferent(const nsIID *riid, void **result);
}

[
    object,
    uuid(9188bc86-f92e-11d2-81ef-0060083a0bcf),
    local
    /* FROZEN */
]
interface nsISupportsWeakReference : nsISupports
{
    nsresult GetWeakReference(nsIWeakReference **_retval);
}

[
    object,
    uuid(033a1470-8b2a-11d3-af88-00a024ffc08c),
    local
    /* FROZEN */
]
interface nsIInterfaceRequestor : nsISupports
{
    nsresult GetInterface(const nsIID *riid, void **result);
}

[
    object,
    uuid(4a2abaf0-6886-11d3-9382-00104ba0fd40),
    local
    /* NOT_FROZEN */
]
interface nsIRunnable : nsISupports
{
    nsresult Run();
}

[
    object,
    uuid(d1899240-f9d2-11d2-bdd6-000064657374),
    local
    /* FROZEN */
]
interface nsISimpleEnumerator : nsISupports
{
    nsresult HasMoreElements(PRBool *_retval);
    nsresult GetNext(nsISupports **_retval);
}

[
    object,
    uuid(fa9c7f6c-61b3-11d4-9877-00c04fa0cf4a),
    local
    /* FROZEN */
]
interface nsIInputStream : nsISupports
{
    nsresult Close();
    nsresult Available(PRUint32 *_retval);
    nsresult Read(char *aBuf, PRUint32 aCount, PRUint32 *_retval);
    nsresult ReadSegments(nsresult (*aWriter)(nsIInputStream *aInStream, 
            void *aClosure, const char *aFromSegment, PRUint32 aToOffset,
            PRUint32 aCount, PRUint32 *aWriteCount),
            void *aClosure, PRUint32 aCount, PRUint32 *_retval);
    nsresult IsNonBlocking(PRBool *_retval);
}

[
    object,
    uuid(450cd2d4-f0fd-424d-b365-b1251f80fd53),
    local
    /* NOT_FROZEN */
]
interface nsIStringInputStream : nsIInputStream
{
    nsresult SetData(const char *data, PRInt32 dataLen);
    nsresult AdoptData(char *data, PRInt32 dataLen);
    nsresult ShareData(const char *data, PRInt32 dataLen);
}

[
    object,
    uuid(07a22cc0-0ce5-11d3-9331-00104ba0fd40),
    local
    /* FROZEN */
]
interface nsIURI : nsISupports
{
    nsresult GetSpec(nsACString *aSpec);
    nsresult SetSpec(const nsACString *aSpec);
    nsresult GetPrePath(nsACString *aPrePath);
    nsresult GetScheme(nsACString *aScheme);
    nsresult SetScheme(const nsACString *aScheme);
    nsresult GetUserPass(nsACString *aUserPass);
    nsresult SetUserPass(const nsACString *aUserPass);
    nsresult GetUsername(nsACString *aUsername);
    nsresult SetUsername(const nsACString *aUsername);
    nsresult GetPassword(nsACString *aPassword);
    nsresult SetPassword(const nsACString *aPassword);
    nsresult GetHostPort(nsACString *aHostPort);
    nsresult SetHostPort(const nsACString *aHostPort);
    nsresult GetHost(nsACString *aHost);
    nsresult SetHost(const nsACString *aHost);
    nsresult GetPort(PRInt32 *aPort);
    nsresult SetPort(PRInt32 aPort);
    nsresult GetPath(nsACString *aPath);
    nsresult SetPath(const nsACString *aPath);
    nsresult Equals(nsIURI *other, PRBool *_retval);
    nsresult SchemeIs(const char *scheme, PRBool *_retval);
    nsresult Clone(nsIURI **_retval);
    nsresult Resolve(const nsACString *relativePath, nsACString *_retval);
    nsresult GetAsciiSpec(nsACString *aAsciiSpec);
    nsresult GetAsciiHost(nsACString *aAsciiHost);
    nsresult GetOriginCharset(nsACString *aOriginCharset);
}

[
    object,
    uuid(ef6bfbd2-fd46-48d8-96b7-9f8f0fd387fe),
    local
    /* FROZEN */
]
interface nsIRequest : nsISupports
{
    nsresult GetName(nsACString *aName);
    nsresult IsPending(PRBool *_retval);
    nsresult GetStatus(nsresult *aStatus);
    nsresult Cancel(nsresult aStatus);
    nsresult Suspend();
    nsresult Resume();
    nsresult GetLoadGroup(nsILoadGroup **aLoadGroup);
    nsresult SetLoadGroup(nsILoadGroup *aLoadGroup);
    nsresult GetLoadFlags(nsLoadFlags *aLoadFlags);
    nsresult SetLoadFlags(nsLoadFlags aLoadFlags);
}

[
    object,
    uuid(fd91e2e0-1481-11d3-9333-00104ba0fd40),
    local
    /* FROZEN */
]
interface nsIRequestObserver : nsISupports
{
    nsresult OnStartRequest(nsIRequest *aRequest, nsISupports *aContext);
    nsresult OnStopRequest(nsIRequest *aRequest, nsISupports *aContext, nsresult aStatusCode);
}

[
    object,
    uuid(1a637020-1482-11d3-9333-00104ba0fd40),
    local
    /* FROZEN */
] 
interface nsIStreamListener : nsIRequestObserver
{
    nsresult OnDataAvailable(nsIRequest *aRequest, nsISupports *aContext,
                             nsIInputStream *aInputStream, PRUint32 aOffset, PRUint32 aCount);
}

[
    object,
    uuid(3de0a31c-feaf-400f-9f1e-4ef71f8b20cc),
    local
    /* FROZEN */
]
interface nsILoadGroup : nsIRequest
{
    nsresult GetGroupObserver(nsIRequestObserver **aGroupObserver);
    nsresult SetGroupObserver(nsIRequestObserver *aGroupObserver);
    nsresult GetDefaultLoadRequest(nsIRequest **aDefaultLoadRequest);
    nsresult SetDefaultLoadRequest(nsIRequest *aDefaultLoadRequest);
    nsresult AddRequest(nsIRequest *aRequest, nsISupports *aContext);
    nsresult RemoveRequest(nsIRequest *aRequest, nsISupports *aContext, nsresult aStatus);
    nsresult GetRequests(nsISimpleEnumerator **aRequests);
    nsresult GetActiveCount(PRUint32 *aActiveCount);
    nsresult GetNotificationCallbacks(nsIInterfaceRequestor **aNotificationCallbacks);
    nsresult SetNotificationCallbacks(nsIInterfaceRequestor *aNotificationCallbacks);
}

[
    object,
    uuid(c63a055a-a676-4e71-bf3c-6cfa11082018),
    local
    /* FROZEN */
]
interface nsIChannel : nsIRequest
{
    nsresult GetOriginalURI(nsIURI **aOriginalURI);
    nsresult SetOriginalURI(nsIURI *aOriginalURI);
    nsresult GetURI(nsIURI **aURI);
    nsresult GetOwner(nsISupports **aOwner);
    nsresult SetOwner(nsISupports *aOwner);
    nsresult GetNotificationCallbacks(nsIInterfaceRequestor **aNotificationCallbacks);
    nsresult SetNotificationCallbacks(nsIInterfaceRequestor *aNotificationCallbacks);
    nsresult GetSecurityInfo(nsISupports **aSecurityInfo);
    nsresult GetContentType(nsACString *aContentType);
    nsresult SetContentType(const nsACString *aContentType);
    nsresult GetContentCharset(nsACString *aContentCharset);
    nsresult SetContentCharset(const nsACString *aContentCharset);
    nsresult GetContentLength(PRInt32 *aContentLength);
    nsresult SetContentLength(PRInt32 aContentLength);
    nsresult Open(nsIInputStream **_retval);
    nsresult AsyncOpen(nsIStreamListener *aListener, nsISupports *aContext);
}

[
    object,
    uuid(9277fe09-f0cc-4cd9-bbce-581dd94b0260),
    local
    /* FROZEN */
]
interface nsIHttpChannel : nsIChannel
{
    nsresult GetRequestMethod(nsACString *aRequestMethod);
    nsresult SetRequestMethod(const nsACString *aRequestMethod);
    nsresult GetReferrer(nsIURI **aReferrer);
    nsresult SetReferrer(nsIURI *aReferrer);
    nsresult GetRequestHeader(const nsACString *aHeader, nsACString *_retval);
    nsresult SetRequestHeader(const nsACString *aHeader, const nsACString *aValue, PRBool aMerge);
    nsresult VisitRequestHeaders(nsIHttpHeaderVisitor *aVisitor);
    nsresult GetAllowPipelining(PRBool *aAllowPipelining);
    nsresult SetAllowPipelining(PRBool aAllowPipelining);
    nsresult GetRedirectionLimit(PRUint32 *aRedirectionLimit);
    nsresult SetRedirectionLimit(PRUint32 aRedirectionLimit);
    nsresult GetResponseStatus(PRUint32 *aResponseStatus);
    nsresult GetResponseStatusText(nsACString *aResponseStatusText);
    nsresult GetRequestSucceeded(PRBool *aRequestSucceeded);
    nsresult GetResponseHeader(const nsACString *header, nsACString *_retval);
    nsresult SetResponseHeader(const nsACString *header, const nsACString *value, PRBool merge);
    nsresult VisitResponseHeaders(nsIHttpHeaderVisitor *aVisitor);
    nsresult IsNoStoreResponse(PRBool *_retval);
    nsresult IsNoCacheResponse(PRBool *_retval);
}

[
    object,
    uuid(ddf633d8-e9a4-439d-ad88-de636fd9bb75),
    local
    /* FROZEN */
]
interface nsIUploadChannel : nsISupports
{
    nsresult SetUploadStream(nsIInputStream *aStream, const nsACString *aContentType,
                             PRInt32 aContentLength);
    nsresult GetUploadStream(nsIInputStream **aUploadStream);
}

[
    object,
    uuid(a6cf90c1-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMCSSRule : nsISupports
{
    nsresult GetType(PRUint16 *aType);
    nsresult GetCssText(nsAString *aCssText);
    nsresult SetCssText(const nsAString *aCssText);
    nsresult GetParentStyleSheet(nsIDOMCSSStyleSheet **aParentStyleSheet);
    nsresult GetParentRule(nsIDOMCSSRule **aParentRule);
}

[
    object,
    uuid(a6cf90be-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMCSSStyleDeclaration : nsISupports
{
    nsresult GetCssText(nsAString *aCssText);
    nsresult SetCssText(const nsAString *aCssText);
    nsresult GetPropertyValue(const nsAString *propertyName, nsAString *_retval);
    nsresult GetPropertyCSSValue(const nsAString *propertyName, nsIDOMCSSValue **_retval);
    nsresult RemoveProperty(const nsAString *propertyName, nsAString *_retval);
    nsresult GetPropertyPriority(const nsAString *propertyName, nsAString *_retval);
    nsresult SetProperty(const nsAString *propertyName, const nsAString *value,
                         const nsAString *priority);
    nsresult GetLength(PRUint32 *aLength);
    nsresult Item(PRUint32 index, nsAString *_retval);
    nsresult GetParentRule(nsIDOMCSSRule **aParentRule);
}

[
    object,
    uuid(a6cf90c0-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMCSSRuleList : nsISupports
{
    nsresult GetLength(PRUint32 *aLength);
    nsresult Item(PRUint32 index, nsIDOMCSSRule **_retval);
}

[
    object,
    uuid(a6cf9080-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMStyleSheet : nsISupports
{
    nsresult GetType(nsAString *aType);
    nsresult GetDisabled(PRBool *aDisabled);
    nsresult SetDisabled(PRBool aDisabled);
    nsresult GetOwnerNode(nsIDOMNode **aOwnerNode);
    nsresult GetParentStyleSheet(nsIDOMStyleSheet **aParentStyleSheet);
    nsresult GetHref(nsAString *aHref);
    nsresult GetTitle(nsAString *aTitle);
    nsresult GetMedia(nsIDOMMediaList **aMedia);
}

[
    object,
    uuid(a6cf90c2-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMCSSStyleSheet : nsIDOMStyleSheet
{
    nsresult GetOwnerRule(nsIDOMCSSRule **aOwnerRule);
    nsresult GetCssRules(nsIDOMCSSRuleList **aCssRules);
    nsresult InsertRule(const nsAString *rule, PRUint32 index, PRUint32 *_retval);
    nsresult DeleteRule(PRUint32 index);
}

[
    object,
    uuid(a6cf9081-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMStyleSheetList : nsISupports
{
    nsresult GetLength(PRUint32 *aLength);
    nsresult Item(PRUint32 index, nsIDOMStyleSheet **_retval);
}

[
    object,
    uuid(a6cf907d-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMNodeList : nsISupports
{
    nsresult Item(PRUint32 index, nsIDOMNode **_retval);
    nsresult GetLength(PRUint32 *aLength);
}

[
    object,
    uuid(a6cf907c-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMNode : nsISupports
{
    enum NSNODETYPE {
        ELEMENT_NODE = 1,
        ATTRIBUTE_NODE = 2,
        TEXT_NODE = 3,
        CDATA_SELECTION_NODE = 4,
        ENTITY_REFERENCE_NODE = 5,
        ENTITY_NODE = 6,
        PROCESSING_INSTRUCTION_NODE = 7,
        COMMENT_NODE = 8,
        DOCUMENT_NODE = 9,
        DOCUMENT_TYPE_NODE = 10,
        DOCUMENT_FRAGMENT_NODE = 11,
        NOTATION_NODE = 12
    };

    nsresult GetNodeName(nsAString *aNodeName);
    nsresult GetNodeValue(nsAString *aNodeValue);
    nsresult SetNodeValue(const nsAString *aNodeValue);
    nsresult GetNodeType(PRUint16 *aNodeType);
    nsresult GetParentNode(nsIDOMNode **aParentNode);
    nsresult GetChildNodes(nsIDOMNodeList **aChildNodes);
    nsresult GetFirstChild(nsIDOMNode **aFirstChild);
    nsresult GetLastChild(nsIDOMNode **aLastChild);
    nsresult GetPreviousSibling(nsIDOMNode **aPreviousSibling);
    nsresult GetNextSibling(nsIDOMNode **aNextSibling);
    nsresult GetAttributes(nsIDOMNamedNodeMap **aAttributes);
    nsresult GetOwnerDocument(nsIDOMDocument **aOwnerDocument);
    nsresult InsertBefore(nsIDOMNode *newChild, nsIDOMNode *refChild, nsIDOMNode **_retval);
    nsresult ReplaceChild(nsIDOMNode *newChild, nsIDOMNode *oldChild, nsIDOMNode **_retval);
    nsresult RemoveChild(nsIDOMNode *oldChild, nsIDOMNode **_retval);
    nsresult AppendChild(nsIDOMNode *newChild, nsIDOMNode **_retval);
    nsresult HasChildNodes(PRBool *_retval);
    nsresult CloneNode(PRBool deep, nsIDOMNode **_retval);
    nsresult Normalize();
    nsresult IsSupported(const nsAString *feature, const nsAString *version, PRBool *_retval);
    nsresult GetNamespaceURI(nsAString *aNamespaceURI);
    nsresult GetPrefix(nsAString *aPrefix);
    nsresult SetPrefix(const nsAString *aPrefix);
    nsresult GetLocalName(nsAString *aLocalName);
    nsresult HasAttributes(PRBool *_retval);
}

[
    object,
    uuid(a6cf9078-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMElement : nsIDOMNode
{
    nsresult GetTagName(nsAString *aTagName);
    nsresult GetAttribute(const nsAString *name, nsAString *_retval);
    nsresult SetAttribute(const nsAString *name, const nsAString *value);
    nsresult RemoveAttribute(const nsAString *name);
    nsresult GetAttributeNode(const nsAString *name, nsIDOMAttr **_retval);
    nsresult SetAttributeNode(nsIDOMAttr *newAttr, nsIDOMAttr **_retval);
    nsresult RemoveAttributeNode(nsIDOMAttr *oldAttr, nsIDOMAttr **_retval);
    nsresult GetElementsByTagName(const nsAString *name, nsIDOMNodeList **_retval);
    nsresult GetAttributeNS(const nsAString *namespaceURI, const nsAString *localName,
                            nsAString *_retval);
    nsresult SetAttributeNS(const nsAString *namespaceURI, const nsAString *qualifiedName,
                            const nsAString *value);
    nsresult RemoveAttributeNS(const nsAString *namespaceURI, const nsAString *localName);
    nsresult GetAttributeNodeNS(const nsAString *namespaceURI, const nsAString *localName,
                                nsIDOMAttr **_retval);
    nsresult SetAttributeNodeNS(nsIDOMAttr *newAttr, nsIDOMAttr **_retval);
    nsresult GetElementsByTagNameNS(const nsAString *namespaceURI, const nsAString *localName,
                                    nsIDOMNodeList **_retval);
    nsresult HasAttribute(const nsAString *name, PRBool *_retval);
    nsresult HasAttributeNS(const nsAString *namespaceURI, const nsAString *localName,
                            PRBool *_retval);
}

[
    object,
    uuid(99715845-95fc-4a56-aa53-214b65c26e22),
    local
    /* FROZEN */
]
interface nsIDOMElementCSSInlineStyle : nsISupports
{
    nsresult GetStyle(nsIDOMCSSStyleDeclaration **aStyle);
}

[
    object,
    uuid(f0aef489-18c5-4de6-99d5-58b3758b098c),
    local
    /* NOT_FROZEN */
]
interface nsIDOMNSElement : nsISupports
{
    nsresult GetElementsByClassName(const nsAString *classes, nsIDOMNodeList **_retval);
    nsresult GetClientRects(nsIDOMClientRectList **_retval);
    nsresult GetBoundingClientRect(nsIDOMClientRect **_retval);
    nsresult GetScrollTop(PRInt32 *aScrollTop);
    nsresult SetScrollTop(PRInt32 aScrollTop);
    nsresult GetScrollLeft(PRInt32 *aScrollLeft);
    nsresult SetScrollLeft(PRInt32 aScrollLeft);
    nsresult GetScrollHeight(PRInt32 *aScrollHeight);
    nsresult GetScrollWidth(PRInt32 *aScrollWidth);
    nsresult GetClientTop(PRInt32 *aClientTop);
    nsresult GetClientLeft(PRInt32 *aClientLeft);
    nsresult GetClientHeight(PRInt32 *aClientHeight);
    nsresult GetClientWidth(PRInt32 *aClientWidth);
    nsresult GetFirstElementChild(nsIDOMElement **aFirstElementChild);
    nsresult GetLastElementChild(nsIDOMElement **aLastElementChild);
    nsresult GetPreviousElementSibling(nsIDOMElement **aPreviousElementSibling);
    nsresult GetNextElementSibling(nsIDOMElement **aNextElementSibling);
    nsresult GetChildElementCount(PRUint32 *aChildElementCount);
    nsresult GetChildren(nsIDOMNodeList **aChildren);
}

cpp_quote("#undef GetClassName")

[
    object,
    uuid(a6cf9085-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMHTMLElement : nsIDOMElement
{
    nsresult GetId(nsAString *aId);
    nsresult SetId(const nsAString *aId);
    nsresult GetTitle(nsAString *aTitle);
    nsresult SetTitle(const nsAString *aTitle);
    nsresult GetLang(nsAString *aLang);
    nsresult SetLang(const nsAString *aLang);
    nsresult GetDir(nsAString *aDir);
    nsresult SetDir(const nsAString *aDir);
    nsresult GetClassName(nsAString *aClassName);
    nsresult SetClassName(const nsAString *aClassName);
}

[
    object,
    uuid(7f142f9a-fba7-4949-93d6-cf08a974ac51),
    local
    /* NOT_FROZEN */
]
interface nsIDOMNSHTMLElement : nsISupports
{
    nsresult GetOffsetTop(PRInt32 *aOffsetTop);
    nsresult GetOffsetLeft(PRInt32 *aOffsetLeft);
    nsresult GetOffsetWidth(PRInt32 *aOffsetWidth);
    nsresult GetOffsetHeight(PRInt32 *aOffsetHeight);
    nsresult GetOffsetParent(nsIDOMElement **aOffsetParent);
    nsresult GetInnerHTML(nsAString *aInnerHTML);
    nsresult SetInnerHTML(const nsAString *aInnerHTML);
    nsresult GetTabIndex(PRInt32 *aTabIndex);
    nsresult SetTabIndex(PRInt32 aTabIndex);
    nsresult GetContentEditable(nsAString *aContentEditable);
    nsresult SetContentEditable(const nsAString *aContentEditable);
    nsresult blur();
    nsresult focus();
    nsresult ScrollIntoView(PRBool top);
    nsresult GetSpellcheck(PRBool *aSpellcheck);
    nsresult SetSpellcheck(PRBool aSpellcheck);
}

[
    object,
    uuid(a6cf9083-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMHTMLCollection : nsISupports
{
    nsresult GetLength(PRUint32 *aLength);
    nsresult Item(PRUint32 index, nsIDOMNode **_retval);
    nsresult NamedItem(const nsAString *name, nsIDOMNode **_retval);
}

[
    object,
    uuid(a6cf9072-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMCharacterData : nsIDOMNode
{
    nsresult GetData(nsAString *aData);
    nsresult SetData(const nsAString *aData);
    nsresult GetLength(PRUint32 *aLength);
    nsresult SubstringData(PRUint32 offset, PRUint32 count, nsAString *_retval);
    nsresult AppendData(const nsAString *arg);
    nsresult InsertData(PRUint32 offset, const nsAString *arg);
    nsresult DeleteData(PRUint32 offset, PRUint32 count);
    nsresult ReplaceData(PRUint32 offset, PRUint32 count, const nsAString *arg);
}

[
    object,
    uuid(a6cf9082-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMText : nsIDOMCharacterData
{
    nsresult SplitText(PRUint32 offset, nsIDOMText **_retval);
}

[
    object,
    uuid(a6cf9073-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMComment : nsIDOMCharacterData
{
}

[
    object,
    uuid(a6cf9076-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMDocumentFragment : nsIDOMNode
{
}

[
    object,
    uuid(f51ebade-8b1a-11d3-aae7-0010830123b4),
    local
    /* FROZEN */
]
interface nsIDOMAbstractView : nsISupports
{
    nsresult GetDocument(nsIDOMDocumentView **aDocument);
}

[
    object,
    uuid(0b9341f3-95d4-4fa4-adcd-e119e0db2889),
    local
    /* NOT_FROZEN */
]
interface nsIDOMViewCSS : nsIDOMAbstractView
{
    nsresult GetComputedStyle(nsIDOMElement *elt, const nsAString *pseudoElt, nsIDOMCSSStyleDeclaration **_retval);
}

[
    object,
    uuid(a6cf9075-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMDocument : nsIDOMNode
{
    nsresult GetDoctype(nsIDOMDocumentType **aDoctype);
    nsresult GetImplementation(nsIDOMDOMImplementation **aImplementation);
    nsresult GetDocumentElement(nsIDOMElement **aDocumentElement);
    nsresult CreateElement(const nsAString *tagName, nsIDOMElement **_retval);
    nsresult CreateDocumentFragment(nsIDOMDocumentFragment **_retval);
    nsresult CreateTextNode(const nsAString *data, nsIDOMText **_retval);
    nsresult CreateComment(const nsAString *data, nsIDOMComment **_retval);
    nsresult CreateCDATASection(const nsAString *data, nsIDOMCDATASection **_retval);
    nsresult CreateProcessingInstruction(const nsAString *target, const nsAString *data,
                                         nsIDOMProcessingInstruction **_retval);
    nsresult CreateAttribute(const nsAString *name, nsIDOMAttr **_retval);
    nsresult CreateEntityReference(const nsAString *name, nsIDOMEntityReference **_retval);
    nsresult GetElementsByTagName(const nsAString *tagname, nsIDOMNodeList **_retval);
    nsresult ImportNode(nsIDOMNode *importedNode, PRBool deep, nsIDOMNode **_retval);
    nsresult CreateElementNS(const nsAString *namespaceURI, const nsAString *qualifiedName,
                             nsIDOMElement **_retval);
    nsresult CreateAttributeNS(const nsAString *namespaceURI, const nsAString *qualifiedName,
                               nsIDOMAttr **_retval);
    nsresult GetElementsByTagNameNS(const nsAString *namespaceURI, const nsAString *localName,
                                    nsIDOMNodeList **_retval);
    nsresult GetElementById(const nsAString *elementId, nsIDOMElement **_retval);
}

[
    object,
    uuid(533a8131-8d0c-4ebf-990b-7fad7cd51466),
    local
    /* NOT_FROZEN */
]
interface nsIDOMNSDocument : nsISupports
{
    nsresult GetCharacterSet(nsAString *aCharacterSet);
    nsresult GetDir(nsAString *aDir);
    nsresult SetDir(const nsAString *aDir);
    nsresult GetLocation(nsIDOMLocation **aLocation);
    nsresult GetTitle(nsAString *aTitle);
    nsresult SetTitle(const nsAString *aTitle);
    nsresult GetContentType(nsAString *aContentType);
    nsresult GetLastModified(nsAString *aLastModified);
    nsresult GetReferrer(nsAString *aReferrer);
    nsresult GetBoxObjectFor(nsIDOMElement *elt, nsIBoxObject **_retval);
    nsresult HasFocus(PRBool *_retval);
    nsresult GetActiveElement(nsIDOMElement **aActiveElement);
    nsresult GetElementsByClassName(const nsAString *classes, nsIDOMNodeList **_retval);
    nsresult ElementFromPoint(PRInt32 x, PRInt32 y, nsIDOMElement **_retval);

    /* Wine extensions */
    nsresult WineAddObserver(nsIDocumentObserver *aObserver);
    nsresult WineRemoveObserver(nsIDocumentObserver *aObserver);
    nsresult WineAddScriptRunner(nsIRunnable *aRunnable);
}

[
    object,
    uuid(a6cf9084-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMHTMLDocument : nsIDOMDocument
{
    nsresult GetTitle(nsAString *aTitle);
    nsresult SetTitle(const nsAString *aTitle);
    nsresult GetReferrer(nsAString *aReferrer);
    nsresult GetDomain(nsAString *aDomain);
    nsresult GetURL(nsAString *aURL);
    nsresult GetBody(nsIDOMHTMLElement **aBody);
    nsresult SetBody(nsIDOMHTMLElement *aBody);
    nsresult GetImages(nsIDOMHTMLCollection **aImages);
    nsresult GetApplets(nsIDOMHTMLCollection **aApplets);
    nsresult GetLinks(nsIDOMHTMLCollection **aLinks);
    nsresult GetForms(nsIDOMHTMLCollection **aForms);
    nsresult GetAnchors(nsIDOMHTMLCollection **aAnchors);
    nsresult GetCookie(nsAString *aCookie);
    nsresult SetCookie(const nsAString *aCookie);
    nsresult Open();
    nsresult Close();
    nsresult Write(const nsAString *text);
    nsresult Writeln(const nsAString *text);
    nsresult GetElementsByName(const nsAString *elementName, nsIDOMNodeList **_retval);
}

[
    object,
    uuid(79beb289-3644-4b54-9432-9fb993945629),
    local
    /* NOT_FROZEN */
]
interface nsIDOMNSHTMLDocument : nsISupports
{
    nsresult GetWidth(PRInt32 *aWidth);
    nsresult GetHeight(PRInt32 *aHeight);
    nsresult GetAlinkColor(nsAString *aAlinkColor);
    nsresult SetAlinkColor(const nsAString *aAlinkColor);
    nsresult GetLinkColor(nsAString *aLinkColor);
    nsresult SetLinkColor(const nsAString *aLinkColor);
    nsresult GetVlinkColor(nsAString *aVlinkColor);
    nsresult SetVlinkColor(const nsAString *aVlinkColor);
    nsresult GetBgColor(nsAString *aBgColor);
    nsresult SetBgColor(const nsAString *aBgColor);
    nsresult GetFgColor(nsAString *aFgColor);
    nsresult SetFgColor(const nsAString *aFgColor);
    nsresult GetDomain(nsAString *aDomain);
    nsresult SetDomain(const nsAString *aDomain);
    nsresult GetEmbeds(nsIDOMHTMLCollection **aEmbeds);
    nsresult GetSelection(nsAString *_retval);
    nsresult Open(nsACString *aContentType, PRBool aReplace, nsIDOMDocument **_retval);
    nsresult Write();
    nsresult Writeln();
    nsresult Clear();
    nsresult CaptureEvents(PRInt32 eventFlags);
    nsresult ReleaseEvents(PRInt32 eventFlags);
    nsresult RouteEvent(nsIDOMEvent *evt);
    nsresult GetCompatMode(nsAString *aCompatMode);
    nsresult GetPlugins(nsIDOMHTMLCollection **aPlugins);
    nsresult GetDesignMode(nsAString *aDesignMode);
    nsresult SetDesignMode(const nsAString *aDesignMode);
    nsresult ExecCommand(const nsAString *commandID, PRBool doShowUI, const nsAString *value, PRBool *_retval);
    nsresult ExecCommandShowHelp(const nsAString *commandID, PRBool *_retval);
    nsresult QueryCommandEnabled(const nsAString *commandID, PRBool *_retval);
    nsresult QueryCommandIndeterm(const nsAString *commandID, PRBool *_retval);
    nsresult QueryCommandState(const nsAString *commandID, PRBool *_retval);
    nsresult QueryCommandSupported(const nsAString *commandID, PRBool *_retval);
    nsresult QueryCommandText(const nsAString *commandID, nsAString *_retval);
    nsresult QueryCommandValue(const nsAString *commandID, nsAString *_retval);
}

[
    object,
    uuid(3d9f4973-dd2e-48f5-b5f7-2634e09eadd9),
    local
    /* FROZEN */
]
interface nsIDOMDocumentStyle : nsISupports
{
    nsresult GetStyleSheets(nsIDOMStyleSheetList **aStyleSheets);
}

[
    object,
    uuid(1acdb2ba-1dd2-11b2-95bc-9542495d2569),
    local
    /* FROZEN */
]
interface nsIDOMDocumentView : nsISupports
{
    nsresult GetDefaultView(nsIDOMAbstractView **aDefaultView);
}

[
    object,
    uuid(a6cf90ce-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMRange : nsISupports
{
    enum {
        NS_START_TO_START,
        NS_START_TO_END,
        NS_END_TO_END,
        NS_END_TO_START
    };

    nsresult GetStartContainer(nsIDOMNode **aStartContainer);
    nsresult GetStartOffset(PRInt32 *aStartOffset);
    nsresult GetEndContainer(nsIDOMNode **aEndContainer);
    nsresult GetEndOffset(PRInt32 *aEndOffset);
    nsresult GetCollapsed(PRBool *aCollapsed);
    nsresult GetCommonAncestorContainer(nsIDOMNode **aCommonAncestorContainer);
    nsresult SetStart(nsIDOMNode *refNode, PRInt32 offset);
    nsresult SetEnd(nsIDOMNode *refNode, PRInt32 offset);
    nsresult SetStartBefore(nsIDOMNode *refNode);
    nsresult SetStartAfter(nsIDOMNode *refNode);
    nsresult SetEndBefore(nsIDOMNode *refNode);
    nsresult SetEndAfter(nsIDOMNode *refNode);
    nsresult Collapse(PRBool toStart);
    nsresult SelectNode(nsIDOMNode *refNode);
    nsresult SelectNodeContents(nsIDOMNode *refNode);
    nsresult CompareBoundaryPoints(PRUint16 how, nsIDOMRange *sourceRange, PRInt16 *_retval);
    nsresult DeleteContents();
    nsresult ExtractContents(nsIDOMDocumentFragment **_retval);
    nsresult CloneContents(nsIDOMDocumentFragment **_retval);
    nsresult InsertNode(nsIDOMNode *newNode);
    nsresult SurroundContents(nsIDOMNode *newParent);
    nsresult CloneRange(nsIDOMRange **_retval);
    nsresult ToString(nsAString *_retval);
    nsresult Detach();
}

[
    object,
    uuid(59188642-23b4-41d6-bde1-302c3906d1f0),
    local
    /* NOT_FROZEN */
]
interface nsIDOMNSRange : nsISupports
{
    nsresult CreateContextualFragment([in] const nsAString *fragment, [out] nsIDOMDocumentFragment **_retval);
    nsresult IsPointInRange([in] nsIDOMNode *parent, [in] PRInt32 offset, [out] PRBool *_retval);
    nsresult ComparePoint([in] nsIDOMNode *parent, [in] PRInt32 offset, [out] PRInt16 *_retval);
}


[
    object,
    uuid(7b9badc6-c9bc-447a-8670-dbd195aed24b),
    local
    /* FROZEN */
]
interface nsIDOMDocumentRange : nsISupports
{
    nsresult CreateRange(nsIDOMRange **_retval);
}

[
    object,
    uuid(b2c7ed59-8634-4352-9e37-5484c8b6e4e1),
    local
    /* FROZEN */
]
interface nsISelection : nsISupports
{
    nsresult GetAnchorNode(nsIDOMNode **aAnchorNode);
    nsresult GetAnchorOffset(PRInt32 *aAnchorOffset);
    nsresult GetFocusNode(nsIDOMNode **aFocusNode);
    nsresult GetFocusOffset(PRInt32 *aFocusOffset);
    nsresult GetIsCollapsed(PRBool *aIsCollapsed);
    nsresult GetRangeCount(PRInt32 *aRangeCount);
    nsresult GetRangeAt(PRInt32 index, nsIDOMRange **_retval);
    nsresult Collapse(nsIDOMNode *parentNode, PRInt32 offset);
    nsresult Extend(nsIDOMNode *parentNode, PRInt32 offset);
    nsresult CollapseToStart();
    nsresult CollapseToEnd();
    nsresult ContainsNode(nsIDOMNode *node, PRBool entirelyContained, PRBool *_retval);
    nsresult SelectAllChildren(nsIDOMNode *parentNode);
    nsresult AddRange(nsIDOMRange *range);
    nsresult RemoveRange(nsIDOMRange *range);
    nsresult RemoveAllRanges();
    nsresult DeleteFromDocument();
    nsresult SelectionLanguageChange(PRBool langRTL);
    nsresult ToString(PRUnichar **_retval);
}

[
    object,
    uuid(a6cf906b-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMWindow : nsISupports
{
    nsresult GetDocument(nsIDOMDocument **aDocument);
    nsresult GetParent(nsIDOMWindow **aParent);
    nsresult GetTop(nsIDOMWindow **aTop);
    nsresult GetScrollbars(nsIDOMBarProp **aScrollbars);
    nsresult GetFrames(nsIDOMWindowCollection **aFrames);
    nsresult GetName(nsAString *aName);
    nsresult SetName(const nsAString *aName);
    nsresult GetTextZoom(float *aTextZoom);
    nsresult SetTextZoom(float aTextZoom);
    nsresult GetScrollX(PRInt32 *aScrollX);
    nsresult GetScrollY(PRInt32 *aScrollY);
    nsresult ScrollTo(PRInt32 xScroll, PRInt32 yScroll);
    nsresult ScrollBy(PRInt32 xScrollDif, PRInt32 yScrollDif);
    nsresult GetSelection(nsISelection **_retval);
    nsresult ScrollByLines(PRInt32 numLines);
    nsresult ScrollByPages(PRInt32 numPages);
    nsresult SizeToContent();
}

[
    object,
    uuid(a6cf908e-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMHTMLBodyElement : nsIDOMHTMLElement
{
    nsresult GetALink(nsAString *aALink);
    nsresult SetALink(const nsAString *aALink);
    nsresult GetBackground(nsAString *aBackground);
    nsresult SetBackground(const nsAString *aBackground);
    nsresult GetBgColor(nsAString *aBgColor);
    nsresult SetBgColor(const nsAString *aBgColor);
    nsresult GetLink(nsAString *aLink);
    nsresult SetLink(const nsAString *aLink);
    nsresult GetText(nsAString *aText);
    nsresult SetText(const nsAString *aText);
    nsresult GetVLink(nsAString *aVLink);
    nsresult SetVLink(const nsAString *aVLink);
}

[
    object,
    uuid(a6cf9093-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMHTMLInputElement : nsIDOMHTMLElement
{
    nsresult GetDefaultValue(nsAString *aDefaultValue);
    nsresult SetDefaultValue(const nsAString *aDefaultValue);
    nsresult GetDefaultChecked(PRBool *aDefaultChecked);
    nsresult SetDefaultChecked(PRBool aDefaultChecked);
    nsresult GetForm(nsIDOMHTMLFormElement **aForm);
    nsresult GetAccept(nsAString *aAccept);
    nsresult SetAccept(const nsAString *aAccept);
    nsresult GetAccessKey(nsAString *aAccessKey);
    nsresult SetAccessKey(const nsAString *aAccessKey);
    nsresult GetAlign(nsAString *aAlign);
    nsresult SetAlign(const nsAString *aAlign);
    nsresult GetAlt(nsAString *aAlt);
    nsresult SetAlt(const nsAString *aAlt);
    nsresult GetChecked(PRBool *aChecked);
    nsresult SetChecked(PRBool aChecked);
    nsresult GetDisabled(PRBool *aDisabled);
    nsresult SetDisabled(PRBool aDisabled);
    nsresult GetMaxLength(PRInt32 *aMaxLength);
    nsresult SetMaxLength(PRInt32 aMaxLength);
    nsresult GetName(nsAString *aName);
    nsresult SetName(const nsAString *aName);
    nsresult GetReadOnly(PRBool *aReadOnly);
    nsresult SetReadOnly(PRBool aReadOnly);
    nsresult GetSize(PRUint32 *aSize);
    nsresult SetSize(PRUint32 aSize);
    nsresult GetSrc(nsAString *aSrc);
    nsresult SetSrc(const nsAString *aSrc);
    nsresult GetTabIndex(PRInt32 *aTabIndex);
    nsresult SetTabIndex(PRInt32 aTabIndex);
    nsresult GetType(nsAString *aType);
    nsresult SetType(const nsAString *aType);
    nsresult GetUseMap(nsAString *aUseMap);
    nsresult SetUseMap(const nsAString *aUseMap);
    nsresult GetValue(nsAString *aValue);
    nsresult SetValue(const nsAString *aValue);
    nsresult Blur();
    nsresult Focus();
    nsresult Select();
    nsresult Click();
}

[
    object,
    uuid(a6cf9092-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMHTMLOptionElement : nsIDOMHTMLElement
{
    nsresult GetForm(nsIDOMHTMLFormElement **aForm);
    nsresult GetDefaultSelected(PRBool *aDefaultSelected);
    nsresult SetDefaultSelected(PRBool aDefaultSelected);
    nsresult GetText(nsAString *aText);
    nsresult GetIndex(PRInt32 *aIndex);
    nsresult GetDisabled(PRBool *aDisabled);
    nsresult SetDisabled(PRBool aDisabled);
    nsresult GetLabel(nsAString *aLabel);
    nsresult SetLabel(const nsAString *aLabel);
    nsresult GetSelected(PRBool *aSelected);
    nsresult SetSelected(PRBool aSelected);
    nsresult GetValue(nsAString *aValue);
    nsresult SetValue(const nsAString *aValue);
}

[
    object,
    uuid(a6cf9090-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMHTMLSelectElement : nsIDOMHTMLElement
{
    nsresult GetType(nsAString *aType);
    nsresult GetSelectedIndex(PRInt32 *aSelectedIndex);
    nsresult SetSelectedIndex(PRInt32 aSelectedIndex);
    nsresult GetValue(nsAString *aValue);
    nsresult SetValue(const nsAString *aValue);
    nsresult GetLength(PRUint32 *aLength);
    nsresult SetLength(PRUint32 aLength);
    nsresult GetForm(nsIDOMHTMLFormElement **aForm);
    nsresult GetOptions(nsIDOMHTMLOptionsCollection **aOptions);
    nsresult GetDisabled(PRBool *aDisabled);
    nsresult SetDisabled(PRBool aDisabled);
    nsresult GetMultiple(PRBool *aMultiple);
    nsresult SetMultiple(PRBool aMultiple);
    nsresult GetName(nsAString *aName);
    nsresult SetName(const nsAString *aName);
    nsresult GetSize(PRInt32 *aSize);
    nsresult SetSize(PRInt32 aSize);
    nsresult GetTabIndex(PRInt32 *aTabIndex);
    nsresult SetTabIndex(PRInt32 aTabIndex);
    nsresult Add(nsIDOMHTMLElement *element, nsIDOMHTMLElement *before);
    nsresult Remove(PRInt32 index);
    nsresult Blur();
    nsresult Focus();
}

[
    object,
    uuid(a6cf9094-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMHTMLTextAreaElement : nsIDOMHTMLElement
{
    nsresult GetDefaultValue(nsAString *aDefaultValue);
    nsresult SetDefaultValue(const nsAString *aDefaultValue);
    nsresult GetForm(nsIDOMHTMLFormElement **aForm);
    nsresult GetAccessKey(nsAString *aAccessKey);
    nsresult SetAccessKey(const nsAString *aAccessKey);
    nsresult GetCols(PRInt32 *aCols);
    nsresult SetCols(PRInt32 aCols);
    nsresult GetDisabled(PRBool *aDisabled);
    nsresult SetDisabled(PRBool aDisabled);
    nsresult GetName(nsAString *aName);
    nsresult SetName(const nsAString *aName);
    nsresult GetReadOnly(PRBool *aReadOnly);
    nsresult SetReadOnly(PRBool aReadOnly);
    nsresult GetRows(PRInt32 *aRows);
    nsresult SetRows(PRInt32 aRows);
    nsresult GetTabIndex(PRInt32 *aTabIndex);
    nsresult SetTabIndex(PRInt32 aTabIndex);
    nsresult GetType(nsAString *aType);
    nsresult GetValue(nsAString *aValue);
    nsresult SetValue(const nsAString *aValue);
    nsresult Blur();
    nsresult Focus();
    nsresult Select();
}

[
    object,
    uuid(a6cf90b1-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMHTMLScriptElement : nsIDOMHTMLElement
{
    nsresult GetText(nsAString *aText);
    nsresult SetText(const nsAString *aText);
    nsresult GetHtmlFor(nsAString *aHtmlFor);
    nsresult SetHtmlFor(const nsAString *aHtmlFor);
    nsresult GetEvent(nsAString *aEvent);
    nsresult SetEvent(const nsAString *aEvent);
    nsresult GetCharset(nsAString *aCharset);
    nsresult SetCharset(const nsAString *aCharset);
    nsresult GetDefer(PRBool *aDefer);
    nsresult SetDefer(PRBool aDefer);
    nsresult GetSrc(nsAString *aSrc);
    nsresult SetSrc(const nsAString *aSrc);
    nsresult GetType(nsAString *aType);
    nsresult SetType(const nsAString *aType);
}

[
    object,
    uuid(a6cf90ab-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMHTMLImageElement : nsIDOMHTMLElement
{
    nsresult GetName(nsAString *aName);
    nsresult SetName(const nsAString *aName);
    nsresult GetAlign(nsAString *aAlign);
    nsresult SetAlign(const nsAString *aAlign);
    nsresult GetAlt(nsAString *aAlt);
    nsresult SetAlt(const nsAString *aAlt);
    nsresult GetBorder(nsAString *aBorder);
    nsresult SetBorder(const nsAString *aBorder);
    nsresult GetHeight(PRInt32 *aHeight);
    nsresult SetHeight(PRInt32 aHeight);
    nsresult GetHspace(PRInt32 *aHspace);
    nsresult SetHspace(PRInt32 aHspace);
    nsresult GetIsMap(PRBool *aIsMap);
    nsresult SetIsMap(PRBool aIsMap);
    nsresult GetLongDesc(nsAString *aLongDesc);
    nsresult SetLongDesc(const nsAString *aLongDesc);
    nsresult GetSrc(nsAString *aSrc);
    nsresult SetSrc(const nsAString *aSrc);
    nsresult GetUseMap(nsAString *aUseMap);
    nsresult SetUseMap(const nsAString *aUseMap);
    nsresult GetVspace(PRInt32 *aVspace);
    nsresult SetVspace(PRInt32 aVspace);
    nsresult GetWidth(PRInt32 *aWidth);
    nsresult SetWidth(PRInt32 aWidth);
}

[
    object,
    uuid(a6cf90b2-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMHTMLTableElement : nsIDOMHTMLElement
{
    nsresult GetCaption(nsIDOMHTMLTableCaptionElement **aCaption);
    nsresult SetCaption(nsIDOMHTMLTableCaptionElement *aCaption);
    nsresult GetTHead(nsIDOMHTMLTableSectionElement **aTHead);
    nsresult SetTHead(nsIDOMHTMLTableSectionElement *aTHead);
    nsresult GetTFoot(nsIDOMHTMLTableSectionElement **aTFoot);
    nsresult SetTFoot(nsIDOMHTMLTableSectionElement *aTFoot);
    nsresult GetRows(nsIDOMHTMLCollection **aRows);
    nsresult GetTBodies(nsIDOMHTMLCollection **aTBodies);
    nsresult GetAlign(nsAString *aAlign);
    nsresult SetAlign(const nsAString *aAlign);
    nsresult GetBgColor(nsAString *aBgColor);
    nsresult SetBgColor(const nsAString *aBgColor);
    nsresult GetBorder(nsAString *aBorder);
    nsresult SetBorder(const nsAString *aBorder);
    nsresult GetCellPadding(nsAString *aCellPadding);
    nsresult SetCellPadding(const nsAString *aCellPadding);
    nsresult GetCellSpacing(nsAString *aCellSpacing);
    nsresult SetCellSpacing(const nsAString *aCellSpacing);
    nsresult GetFrame(nsAString *aFrame);
    nsresult SetFrame(const nsAString *aFrame);
    nsresult GetRules(nsAString *aRules);
    nsresult SetRules(const nsAString *aRules);
    nsresult GetSummary(nsAString *aSummary);
    nsresult SetSummary(const nsAString *aSummary);
    nsresult GetWidth(nsAString *aWidth);
    nsresult SetWidth(const nsAString *aWidth);
    nsresult CreateTHead(nsIDOMHTMLElement **_retval);
    nsresult DeleteTHead();
    nsresult CreateTFoot(nsIDOMHTMLElement **_retval);
    nsresult DeleteTFoot();
    nsresult CreateCaption(nsIDOMHTMLElement **_retval);
    nsresult DeleteCaption();
    nsresult InsertRow(PRInt32 index, nsIDOMHTMLElement **_retval);
    nsresult DeleteRow(PRInt32 index);
}

[
    object,
    uuid(a6cf90b6-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMHTMLTableRowElement : nsIDOMHTMLElement
{
    nsresult GetRowIndex(PRInt32 *aRowIndex);
    nsresult GetSectionRowIndex(PRInt32 *aSectionRowIndex);
    nsresult GetCells(nsIDOMHTMLCollection **aCells);
    nsresult GetAlign(nsAString *aAlign);
    nsresult SetAlign(const nsAString *aAlign);
    nsresult GetBgColor(nsAString *aBgColor);
    nsresult SetBgColor(const nsAString *aBgColor);
    nsresult GetCh(nsAString *aCh);
    nsresult SetCh(const nsAString *aCh);
    nsresult GetChOff(nsAString *aChOff);
    nsresult SetChOff(const nsAString *aChOff);
    nsresult GetVAlign(nsAString *aVAlign);
    nsresult SetVAlign(const nsAString *aVAlign);
    nsresult InsertCell(PRInt32 index, nsIDOMHTMLElement **_retval);
    nsresult DeleteCell(PRInt32 index);
}

[
    object,
    uuid(a6cf90ba-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMHTMLIFrameElement : nsIDOMHTMLElement
{
    nsresult GetAlign(nsAString *aAlign);
    nsresult SetAlign(const nsAString *aAlign);
    nsresult GetFrameBorder(nsAString *aFrameBorder);
    nsresult SetFrameBorder(const nsAString *aFrameBorder);
    nsresult GetHeight(nsAString *aHeight);
    nsresult SetHeight(const nsAString *aHeight);
    nsresult GetLongDesc(nsAString *aLongDesc);
    nsresult SetLongDesc(const nsAString *aLongDesc);
    nsresult GetMarginHeight(nsAString *aMarginHeight);
    nsresult SetMarginHeight(const nsAString *aMarginHeight);
    nsresult GetMarginWidth(nsAString *aMarginWidth);
    nsresult SetMarginWidth(const nsAString *aMarginWidth);
    nsresult GetName(nsAString *aName);
    nsresult SetName(const nsAString *aName);
    nsresult GetScrolling(nsAString *aScrolling);
    nsresult SetScrolling(const nsAString *aScrolling);
    nsresult GetSrc(nsAString *aSrc);
    nsresult SetSrc(const nsAString *aSrc);
    nsresult GetWidth(nsAString *aWidth);
    nsresult SetWidth(const nsAString *aWidth);
    nsresult GetContentDocument(nsIDOMDocument **aContentDocument);
}

[
    object,
    uuid(94928ab3-8b63-11d3-989d-001083010e9b),
    local
    /* FROZEN */
]
interface nsIURIContentListener : nsISupports
{
    nsresult OnStartURIOpen(nsIURI *aURI, PRBool *_retval);
    nsresult DoContent(const char *aContentType, PRBool aIsContentPreferred, nsIRequest *aRequest,
        nsIStreamListener **aContentHandler, PRBool *_retval);
    nsresult IsPreferred(const char *aContentType, char **aDesiredContentType, PRBool *_retval);
    nsresult CanHandleContent(const char *aContentType, PRBool aIsContentPreferred,
        char **aDesiredContentType, PRBool *_retval);
    nsresult GetLoadCookie(nsISupports **aLoadCookie);
    nsresult SetLoadCookie(nsISupports *aLoadCookie);
    nsresult GetParentContentListener(nsIURIContentListener **aParentContentListener);
    nsresult SetParentContentListener(nsIURIContentListener *aParentContentListener);
}

[
    object,
    uuid(44b78386-1dd2-11b2-9ad2-e4eee2ca1916),
    local
    /* FROZEN */
]
interface nsITooltipListener : nsISupports
{
    nsresult OnShowTooltip(PRInt32 aXCoords, PRInt32 aYCoords, const PRUnichar *aTipText);
    nsresult OnHideTooltip();
}

[
    object,
    uuid(69e5df00-7b8b-11d3-af61-00a024ffc08c),
    local
    /* FROZEN */
]
interface nsIWebBrowser : nsISupports
{
    nsresult AddWebBrowserListener(nsIWeakReference *aListener, const nsIID *aIID);
    nsresult RemoveWebBrowserListener(nsIWeakReference *aListener, const nsIID *aIID);
    nsresult GetContainerWindow(nsIWebBrowserChrome **aContainerWindow);
    nsresult SetContainerWindow(nsIWebBrowserChrome *aContainerWindow);
    nsresult GetParentURIContentListener(nsIURIContentListener **aParentURIContentListener);
    nsresult SetParentURIContentListener(nsIURIContentListener *aParentURIContentListener);
    nsresult GetContentDOMWindow(nsIDOMWindow **aContentDOMWindow);
}

cpp_quote("#define SETUP_ALLOW_JAVASCRIPT  2")
cpp_quote("#define SETUP_IS_CHROME_WRAPPER 7")

[
    object,
    uuid(f15398a0-8018-11d3-af70-00a024ffc08c),
    local
    /* FROZEN */
]
interface nsIWebBrowserSetup : nsISupports
{
    nsresult SetProperty(PRUint32 aId, PRUint32 aValue);
}

typedef void* nativeWindow;

[
    object,
    uuid(046bc8a0-8015-11d3-af70-00a024ffc08c),
    local
    /* NOT_FROZEN */
]
interface nsIBaseWindow : nsISupports
{
    nsresult InitWindow(nativeWindow parentNativeWindow, nsIWidget *parentWidget, PRInt32 x,
            PRInt32 y, PRInt32 cx, PRInt32 cy);
    nsresult Create();
    nsresult Destroy();
    nsresult SetPosition(PRInt32 x, PRInt32 y);
    nsresult GetPosition(PRInt32 *x, PRInt32 *y);
    nsresult SetSize(PRInt32 cx, PRInt32 cy, PRBool fRepaint);
    nsresult GetSize(PRInt32 *cx, PRInt32 *cy);
    nsresult SetPositionAndSize(PRInt32 x, PRInt32 y, PRInt32 cx, PRInt32 cy, PRBool fRepaint);
    nsresult GetPositionAndSize(PRInt32 *x, PRInt32 *y, PRInt32 *cx, PRInt32 *cy);
    nsresult Repaint(PRBool force);
    nsresult GetParentWidget(nsIWidget **aParentWidget); 
    nsresult SetParentWidget(nsIWidget *aParentWidget);
    nsresult GetParentNativeWindow(nativeWindow *aParentNativeWindow);
    nsresult SetParentNativeWindow(nativeWindow aParentNativeWindow);
    nsresult GetVisibility(PRBool *aVisibility);
    nsresult SetVisibility(PRBool aVisibility);
    nsresult GetEnabled(PRBool *aEnabled);
    nsresult SetEnabled(PRBool aEnabled);
    nsresult GetBlurSuppression(PRBool *aBlurSuppression);
    nsresult SetBlurSuppression(PRBool aBlurSuppression);
    nsresult GetMainWidget(nsIWidget **aMainWidget);
    nsresult SetFocus();
    nsresult GetTitle(PRUnichar **aTitle);
    nsresult SetTitle(const PRUnichar *aTitle);
}

cpp_quote("#define LOAD_FLAGS_NONE 0")

[
    object,
    uuid(f5d9e7b0-d930-11d3-b057-00a024ffc08c),
    local
    /* NOT_FROZEN */
]
interface nsIWebNavigation : nsISupports
{
    nsresult GetCanGoBack(PRBool *aCanGoBack);
    nsresult GetCanGoForward(PRBool *aCanGoForward);
    nsresult GoBack();
    nsresult GoForward();
    nsresult GotoIndex(PRInt32 index);
    nsresult LoadURI(const PRUnichar *aURI, PRUint32 aLoadFlags, nsIURI *aReferrer,
            nsIInputStream *aPostData, nsIInputStream *aHeaders);
    nsresult Reload(PRUint32 aReloadFlags);
    nsresult Stop(PRUint32 aStopFlags);
    nsresult GetDocument(nsIDOMDocument **aDocument);
    nsresult GetCurrentURI(nsIURI **aCurrentURI);
    nsresult GetReferringURI(nsIURI **aReferringURI);
    nsresult GetSessionHistory(nsISHistory **aSessionHistory);
    nsresult SetSessionHistory(nsISHistory *aSessionHistory);
}

[
    object,
    uuid(5af07661-6477-4235-8814-4a45215855b8),
    local
    /* NOT_FROZEN */
]
interface nsIPrintSettings : nsISupports
{
    typedef struct { char dummy; } nsMargin;

    nsresult SetPrintOptions(PRInt32 aType, PRBool aTurnOnOff);
    nsresult GetPrintOptions(PRInt32 aType, PRBool *_retval);
    nsresult GetPrintOptionsBits(PRInt32 *_retval);
    nsresult GetEffectivePageSize(double *aWidth, double *aHeight);
    nsresult Clone(nsIPrintSettings **_retval);
    nsresult Assign(nsIPrintSettings *aPS);
    nsresult GetPrintSession(nsIPrintSession **aPrintSession);
    nsresult SetPrintSession(nsIPrintSession *aPrintSession);
    nsresult GetStartPageRange(PRInt32 *aStartPageRange);
    nsresult SetStartPageRange(PRInt32 aStartPageRange);
    nsresult GetEndPageRange(PRInt32 *aEndPageRange);
    nsresult SetEndPageRange(PRInt32 aEndPageRange);
    nsresult GetEdgeTop(double *aEdgeTop);
    nsresult SetEdgeTop(double aEdgeTop);
    nsresult GetEdgeLeft(double *aEdgeLeft);
    nsresult SetEdgeLeft(double aEdgeLeft);
    nsresult GetEdgeBottom(double *aEdgeBottom);
    nsresult SetEdgeBottom(double aEdgeBottom);
    nsresult GetEdgeRight(double *aEdgeRight);
    nsresult SetEdgeRight(double aEdgeRight);
    nsresult GetMarginTop(double *aMarginTop);
    nsresult SetMarginTop(double aMarginTop);
    nsresult GetMarginLeft(double *aMarginLeft);
    nsresult SetMarginLeft(double aMarginLeft);
    nsresult GetMarginBottom(double *aMarginBottom);
    nsresult SetMarginBottom(double aMarginBottom);
    nsresult GetMarginRight(double *aMarginRight);
    nsresult SetMarginRight(double aMarginRight);
    nsresult GetUnwriteableMarginTop(double *aUnwriteableMarginTop);
    nsresult SetUnwriteableMarginTop(double aUnwriteableMarginTop);
    nsresult GetUnwriteableMarginLeft(double *aUnwriteableMarginLeft);
    nsresult SetUnwriteableMarginLeft(double aUnwriteableMarginLeft);
    nsresult GetUnwriteableMarginBottom(double *aUnwriteableMarginBottom);
    nsresult SetUnwriteableMarginBottom(double aUnwriteableMarginBottom);
    nsresult GetUnwriteableMarginRight(double *aUnwriteableMarginRight);
    nsresult SetUnwriteableMarginRight(double aUnwriteableMarginRight);
    nsresult GetScaling(double *aScaling);
    nsresult SetScaling(double aScaling);
    nsresult GetPrintBGColors(PRBool *aPrintBGColors);
    nsresult SetPrintBGColors(PRBool aPrintBGColors);
    nsresult GetPrintBGImages(PRBool *aPrintBGImages);
    nsresult SetPrintBGImages(PRBool aPrintBGImages);
    nsresult GetPrintRange(PRInt16 *aPrintRange);
    nsresult SetPrintRange(PRInt16 aPrintRange);
    nsresult GetTitle(PRUnichar **aTitle);
    nsresult SetTitle(const PRUnichar *aTitle);
    nsresult GetDocURL(PRUnichar **aDocURL);
    nsresult SetDocURL(const PRUnichar *aDocURL);
    nsresult GetHeaderStrLeft(PRUnichar **aHeaderStrLeft);
    nsresult SetHeaderStrLeft(const PRUnichar *aHeaderStrLeft);
    nsresult GetHeaderStrCenter(PRUnichar **aHeaderStrCenter);
    nsresult SetHeaderStrCenter(const PRUnichar *aHeaderStrCenter);
    nsresult GetHeaderStrRight(PRUnichar **aHeaderStrRight);
    nsresult SetHeaderStrRight(const PRUnichar *aHeaderStrRight);
    nsresult GetFooterStrLeft(PRUnichar **aFooterStrLeft);
    nsresult SetFooterStrLeft(const PRUnichar *aFooterStrLeft);
    nsresult GetFooterStrCenter(PRUnichar **aFooterStrCenter);
    nsresult SetFooterStrCenter(const PRUnichar *aFooterStrCenter);
    nsresult GetFooterStrRight(PRUnichar **aFooterStrRight);
    nsresult SetFooterStrRight(const PRUnichar *aFooterStrRight);
    nsresult GetHowToEnableFrameUI(PRInt16 *aHowToEnableFrameUI);
    nsresult SetHowToEnableFrameUI(PRInt16 aHowToEnableFrameUI);
    nsresult GetIsCancelled(PRBool *aIsCancelled);
    nsresult SetIsCancelled(PRBool aIsCancelled);
    nsresult GetPrintFrameTypeUsage(PRInt16 *aPrintFrameTypeUsage);
    nsresult SetPrintFrameTypeUsage(PRInt16 aPrintFrameTypeUsage);
    nsresult GetPrintFrameType(PRInt16 *aPrintFrameType);
    nsresult SetPrintFrameType(PRInt16 aPrintFrameType);
    nsresult GetPrintSilent(PRBool *aPrintSilent);
    nsresult SetPrintSilent(PRBool aPrintSilent);
    nsresult GetShrinkToFit(PRBool *aShrinkToFit);
    nsresult SetShrinkToFit(PRBool aShrinkToFit);
    nsresult GetShowPrintProgress(PRBool *aShowPrintProgress);
    nsresult SetShowPrintProgress(PRBool aShowPrintProgress);
    nsresult GetPaperName(PRUnichar **aPaperName);
    nsresult SetPaperName(const PRUnichar *aPaperName);
    nsresult GetPaperSizeType(PRInt16 *aPaperSizeType);
    nsresult SetPaperSizeType(PRInt16 aPaperSizeType);
    nsresult GetPaperData(PRInt16 *aPaperData);
    nsresult SetPaperData(PRInt16 aPaperData);
    nsresult GetPaperWidth(double *aPaperWidth);
    nsresult SetPaperWidth(double aPaperWidth);
    nsresult GetPaperHeight(double *aPaperHeight);
    nsresult SetPaperHeight(double aPaperHeight);
    nsresult GetPaperSizeUnit(PRInt16 *aPaperSizeUnit);
    nsresult SetPaperSizeUnit(PRInt16 aPaperSizeUnit);
    nsresult GetPlexName(PRUnichar **aPlexName);
    nsresult SetPlexName(const PRUnichar *aPlexName);
    nsresult GetColorspace(PRUnichar **aColorspace);
    nsresult SetColorspace(const PRUnichar *aColorspace);
    nsresult GetResolutionName(PRUnichar **aResolutionName);
    nsresult SetResolutionName(const PRUnichar aResolutionName);
    nsresult GetDownloadFonts(PRBool *aDownloadFonts);
    nsresult SetDownloadFonts(PRBool aDownloadFonts);
    nsresult GetPrintReversed(PRBool *aPrintReversed);
    nsresult SetPrintReversed(PRBool aPrintReversed);
    nsresult GetPrintInColor(PRBool *aPrintInColor);
    nsresult SetPrintInColor(PRBool aPrintInColor);
    nsresult GetOrientation(PRInt32 *aOrientation);
    nsresult SetOrientation(PRInt32 aOrientation);
    nsresult GetPrintCommand(PRUnichar **aPrintCommand);
    nsresult SetPrintCommand(const PRUnichar *aPrintCommand);
    nsresult GetNumCopies(PRInt32 *aNumCopies);
    nsresult SetNumCopies(PRInt32 aNumCopies);
    nsresult GetPrinterName(PRUnichar **aPrinterName);
    nsresult SetPrinterName(const PRUnichar *aPrinterName);
    nsresult GetPrintToFile(PRBool *aPrintToFile);
    nsresult SetPrintToFile(PRBool aPrintToFile);
    nsresult GetToFileName(PRUnichar **aToFileName);
    nsresult SetToFileName(const PRUnichar *aToFileName);
    nsresult GetOutputFormat(PRInt16 *aOutputFormat);
    nsresult SetOutputFormat(PRInt16 aOutputFormat);
    nsresult GetPrintPageDelay(PRInt32 *aPrintPageDelay);
    nsresult SetPrintPageDelay(PRInt32 aPrintPageDelay);
    nsresult GetIsInitializedFromPrinter(PRBool *aIsInitializedFromPrinter);
    nsresult SetIsInitializedFromPrinter(PRBool aIsInitializedFromPrinter);
    nsresult GetIsInitializedFromPrefs(PRBool *aIsInitializedFromPrefs);
    nsresult SetIsInitializedFromPrefs(PRBool aIsInitializedFromPrefs);
    nsresult SetMarginInTwips(nsMargin *aMargin);
    nsresult SetEdgeInTwips(nsMargin *aEdge);
    nsresult GetMarginInTwips(nsMargin *aMargin);
    nsresult GetEdgeInTwips(nsMargin *aEdge);
    nsresult SetupSilentPrinting();
    nsresult SetUnwriteableMarginInTwips(nsMargin *aEdge);
    nsresult GetUnwriteableMarginInTwips(nsMargin *aEdge);
}

[
    object,
    uuid(9a7ca4b0-fbba-11d4-a869-00105a183419),
    local
    /* FROZEN */
]
interface nsIWebBrowserPrint : nsISupports
{
    nsresult GetGlobalPrintSettings(nsIPrintSettings **aGlobalPrintSettings);
    nsresult GetCurrentPrintSettings(nsIPrintSettings **aCurrentPrintSettings);
    nsresult GetCurrentChildDOMWindow(nsIDOMWindow **aCurrentChildDOMWindow);
    nsresult GetDoingPrint(PRBool *aDoingPrint);
    nsresult GetDoingPrintPreview(PRBool *aDoingPrintPreview);
    nsresult GetIsFramesetDocument(PRBool *aIsFramesetDocument);
    nsresult GetIsFramesetFrameSelected(PRBool *aIsFramesetFrameSelected);
    nsresult GetIsIFrameSelected(PRBool *aIsIFrameSelected);
    nsresult GetIsRangeSelection(PRBool *aIsRangeSelection);
    nsresult GetPrintPreviewNumPages(PRInt32 *aPrintPreviewNumPages);
    nsresult Print(nsIPrintSettings *aThePrintSettings, nsIWebProgressListener *aWPListener);
    nsresult PrintPreview(nsIPrintSettings *aThePrintSettings, nsIDOMWindow *aChildDOMWin,
                          nsIWebProgressListener *aWPListener);
    nsresult PrintPreviewNavigate(PRInt16 aNavType, PRInt32 aPageNum);
    nsresult Cancel();
    nsresult EnumerateDocumentNames(PRUint32 *aCount, PRUnichar ***aResult);
    nsresult ExitPrintPreview();
}

[
    object,
    uuid(919e792a-6490-40b8-bba5-f9e9ad5640c8),
    local
    /* NOT_FROZEN */
]
interface nsIScrollable : nsISupports
{
    enum {
        ScrollOrientation_X = 1,
        ScrollOrientation_Y = 2
    };

    enum {
        Scrollbar_Auto   = 1,
        Scrollbar_Never  = 2,
        Scrollbar_Always = 3
    };

    nsresult GetCurScrollPos(PRInt32 scrollOrientation, PRInt32 *curPos);
    nsresult SetCurScrollPos(PRInt32 scrollOrientation, PRInt32 curPos);
    nsresult SetCurScrollPosEx(PRInt32 curHorizontalPos, PRInt32 curVerticalPos);
    nsresult GetScrollRange(PRInt32 scrollOrientation, PRInt32 *minPos, PRInt32 *maxPos);
    nsresult SetScrollRange(PRInt32 scrollOrientation, PRInt32 minPos, PRInt32 maxPos);
    nsresult SetScrollRangeEx(PRInt32 minHorizontalPos, PRInt32 maxHorizontalPos,
            PRInt32 minVerticalPos, PRInt32 maxVerticalPos);
    nsresult GetDefaultScrollbarPreferences(PRInt32 scrollOrientation, PRInt32 *scrollbarPref);
    nsresult SetDefaultScrollbarPreferences(PRInt32 scrollOrientation, PRInt32 scrollbarPref);
    nsresult GetScrollbarVisibility(PRBool *verticalVisible, PRBool *horizontalVisible);
}

[
    object,
    uuid(c8c0a080-0868-11d3-915f-d9d889d48e3c),
    local
    /* FROZEN */
]
interface nsIFile : nsISupports
{
    nsresult Append(const nsAString *node);
    nsresult AppendNative(const nsAString *node);
    nsresult Normalize();
    nsresult Create(PRUint32 type, PRUint32 permission);
    nsresult GetLeafName(nsAString *aLeafName);
    nsresult SetLeafName(const nsAString *aLeafName);
    nsresult GetNativeLeafName(nsAString *aLeafName);
    nsresult SetNativeLeafName(const nsAString *aLeafName);
    nsresult CopyTo(nsIFile *newParentDir, const nsAString *newName);
    nsresult CopyToNative(nsIFile *newParentDir, const nsAString *newName);
    nsresult CopyToFollowingLinks(nsIFile *newParentDir, const nsAString *newName);
    nsresult CopyToFollowingLinksNative(nsIFile *newParentDir, const nsAString *newName);
    nsresult MoveTo(nsIFile *newParentDir, const nsAString *newName);
    nsresult MoveToNative(nsIFile *newParentDir, const nsAString *newName);
    nsresult Remove(PRBool recursive);
    nsresult GetPermissions(PRUint32 *aPermissions);
    nsresult SetPermissions(PRUint32 pPermissions);
    nsresult GetPermissionsOfLink(PRUint32 *aPermissions);
    nsresult SetPermissionsOfLink(PRUint32 pPermissions);
    nsresult GetLastModifiedTime(PRInt64 *aLastModifiedTime);
    nsresult SetLastModifiedTime(PRInt64 aLastModifiedTime);
    nsresult GetFileSize(PRInt64 *aFileSize);
    nsresult SetFileSize(PRInt64 aFileSize);
    nsresult GetFileSizeOfLink(PRInt64 *aFileSizeOfLink);
    nsresult GetTarget(nsAString *aTarget);
    nsresult GetNativeTarget(nsACString *aNativeTarget);
    nsresult GetPath(nsAString *aPath);
    nsresult GetNativePath(nsACString *aNativePath);
    nsresult Exists(PRBool *_retval);
    nsresult IsWritable(PRBool *_retval);
    nsresult IsReadable(PRBool *_retval);
    nsresult IsExecutable(PRBool *_retval);
    nsresult IsHidden(PRBool *_retval);
    nsresult IsDirectory(PRBool *_retval);
    nsresult IsFile(PRBool *_retval);
    nsresult IsSymlink(PRBool *_retval);
    nsresult IsSpecial(PRBool *_retval);
    nsresult CreateUnique(PRUint32 type, PRUint32 permission);
    nsresult Clone(nsIFile **_retval);
    nsresult Equals(nsIFile *inFile, PRBool *_retval);
    nsresult Contains(nsIFile *inFile, PRBool recir, PRBool *_retval);
    nsresult GetParent(nsIFile **aParent);
    nsresult GetDirectoryEntries(nsISimpleEnumerator **aDirectoryEntries);
}

[
    object,
    uuid(56c35506-f14b-11d3-99d3-ddbfac2ccf65),
    local
    /* FROZEN */
]
interface nsIPrefBranch : nsISupports
{
    nsresult GetRoot(char **aRoot);
    nsresult GetPrefType(const char *aPrefName, PRInt32 *_retval);
    nsresult GetBoolPref(const char *aPrefName, PRBool *_retval);
    nsresult SetBoolPref(const char *aPrefName, PRInt32 aValue);
    nsresult GetCharPref(const char *aPrefName, char **_retval);
    nsresult SetCharPref(const char *aPrefName, const char *aValue);
    nsresult GetIntPref(const char *aPrefName, PRInt32 *_retval);
    nsresult SetIntPref(const char *aPrefName, PRInt32 aValue);
    nsresult GetComplexValue(const char *aPrefName, const nsIID *aType, void **aValue);
    nsresult SetComplexValue(const char *aPrefName, const nsIID *aType, nsISupports *aValue);
    nsresult ClearUserPref(const char *aPrefName);
    nsresult LockPref(const char *aPrefName);
    nsresult PrefHasUserValue(const char *aPrefName, PRBool *_retval);
    nsresult PrefIsLocked(const char *aPrefName, PRBool *_retval);
    nsresult UnlockPref(const char *aPrefName);
    nsresult DeleteBranch(const char *aStartingAt);
    nsresult GetChildList(const char *aStartingAt, PRUint32 *aCount, char ***aChildArray);
    nsresult ResetBranch(const char *aStartingAt);
}

[
    object,
    uuid(15fd6940-8ea7-11d3-93ad-00104ba0fd40),
    local
    /* FROZEN */
]
interface nsIProtocolHandler : nsISupports
{
    nsresult GetScheme(nsACString *aScheme);
    nsresult GetDefaultPort(PRInt32 *aDefaultPort);
    nsresult GetProtocolFlags(PRUint32 *aProtocolFlags);
    nsresult NewURI(const nsACString *aSpec, const char *aOriginCharset,
                    nsIURI *aBaseURI, nsIURI **_retval);
    nsresult NewChannel(nsIURI *aURI, nsIChannel **_retval);
    nsresult AllowPort(PRInt32 port, const char *scheme, PRBool *_retval);
}

[
    object,
    uuid(0e61f3b2-34d7-4c79-bfdc-4860bc7341b7),
    local
    /* NOT_FROZEN */
]
interface nsIExternalProtocolHandler : nsIProtocolHandler
{
    nsresult ExternalAppExistsForScheme(const nsACString *scheme, PRBool *_retval);
}

[
    object,
    uuid(bddeda3f-9020-4d12-8c70-984ee9f7935e),
    local
    /* FROZEN */
]
interface nsIIOService : nsISupports
{
    nsresult GetProtocolHandler(const char *aScheme, nsIProtocolHandler **_retval);
    nsresult GetProtocolFlags(const char *aScheme, PRUint32 *_retval);
    nsresult NewURI(const nsACString *aSpec, const char *aOriginCharset, nsIURI *aBaseURI,
                    nsIURI **_retval);
    nsresult NewFileURI(nsIFile *aFile, nsIURI **_retval);
    nsresult NewChannelFromURI(nsIURI *aURI, nsIChannel **_retval);
    nsresult NewChannel(const nsACString *aSpec, const char *aOriginCharset, nsIURI *aBaseURI,
                        nsIChannel **_retval);
    nsresult GetOffline(PRBool *aOffline);
    nsresult SetOffline(PRBool aOffline);
    nsresult AllowPort(PRInt32 aPort, const char *aScheme, PRBool *_retval);
    nsresult ExtractScheme(const nsACString *urlString, nsACString * _retval);
}

[
    object,
    uuid(57322c6f-f4ec-4e46-8253-b74be220de16),
    local,
    /* NOT_FROZEN */
]
interface nsINetUtil : nsISupports
{
    nsresult ParseContentType(const nsACString *aTypeHeader, nsACString *aCharset,
            PRBool *aHadCharset, nsACString *_retval);
    nsresult ProtocolHasFlags(nsIURI *aURI, PRUint32 aFlag, PRBool *_retval);
    nsresult URIChainHasFlags(nsIURI *aURI, PRUint32 aFlags, PRBool *_retval);
    nsresult ToImmutableURI(nsIURI *aURI, nsIURI **_retval);
    nsresult EscapeString(const nsACString *aString, PRUint32 aEscapeType, nsACString *_retval);
    nsresult EscapeURL(const nsACString *aStr, PRUint32 aFlags, nsACString *_retval);
    nsresult UnescapeString(const nsACString *aStr, PRUint32 aFlags, nsACString *_retval);
    nsresult ExtractCharsetFromContentType(const nsACString *aTypeHeader, nsACString *aCharset,
            PRInt32 *aCharsetStart, PRInt32 *aCharsetEnd, PRBool *_retval);
}

[
    object,
    uuid(9c5d3c58-1dd1-11b2-a1c9-f3699284657a),
    local
    /* FROZEN */
]
interface nsIWebBrowserFocus : nsISupports
{
    nsresult Activate();
    nsresult Deactivate();
    nsresult SetFocusAtFirstElement();
    nsresult SetFocusAtLastElement();
    nsresult GetFocusedWindow(nsIDOMWindow **aFocusedWindow);
    nsresult SetFocusedWindow(nsIDOMWindow *aFocusedWindow);
    nsresult GetFocusedElement(nsIDOMElement **aFocusedElement);
    nsresult SetFocusedElement(nsIDOMElement *aFocusedElement);
}

[
    object,
    uuid(ba434c60-9d52-11d3-afb0-00a024ffc08c),
    local
    /* FROZEN */
]
interface nsIWebBrowserChrome : nsISupports
{
    nsresult SetStatus(PRUint32 statusType, const PRUnichar *status);
    nsresult GetWebBrowser(nsIWebBrowser **aWebBrowser);
    nsresult SetWebBrowser(nsIWebBrowser *aWebBrowser);
    nsresult GetChromeFlags(PRUint32 *aChromeFlags);
    nsresult SetChromeFlags(PRUint32 aChromeFlags);
    nsresult DestroyBrowserWindow();
    nsresult SizeBrowserTo(PRInt32 aCX, PRInt32 aCY);
    nsresult ShowAsModal();
    nsresult IsWindowModal(PRBool *_retval);
    nsresult ExitModalEventLoop(nsresult aStatus);
}

[
    object,
    uuid(df31c120-ded6-11d1-bd85-00805f8ae3f4),
    local
    /* FROZEN */
]
interface nsIDOMEventListener : nsISupports
{
    nsresult HandleEvent(nsIDOMEvent *event);
}

[
    object,
    uuid(1c773b30-d1cf-11d2-bd95-00805f8ae3f4),
    local
    /* FROZEN */
]
interface nsIDOMEventTarget : nsISupports
{
    nsresult AddEventListener(const nsAString *type, nsIDOMEventListener *listener, PRBool useCapture);
    nsresult RemoveEventListener(const nsAString *type, nsIDOMEventListener *listener, PRBool useCapture);
    nsresult DispatchEvent(nsIDOMEvent *evt, PRBool *_retval);
}

[
    object,
    uuid(a66b7b80-ff46-bd97-0080-5f8ae38add32),
    local
    /* FROZEN */
]
interface nsIDOMEvent : nsISupports
{
    nsresult GetType(nsAString *aType);
    nsresult GetTarget(nsIDOMEventTarget **aTarget);
    nsresult GetCurrentTarget(nsIDOMEventTarget **aCurrentTarget);
    nsresult GetEventPhase(PRUint16 *aEventPhase);
    nsresult GetBubbles(PRBool *aBubbles);
    nsresult GetCancelable(PRBool *aCancelable);
    nsresult GetTimeStamp(DOMTimeStamp *aTimeStamp);
    nsresult StopPropagation();
    nsresult PreventDefault();
    nsresult InitEvent(const nsAString *eventTypeArg, PRBool canBubbleArg, PRBool cancelableArg);
}

cpp_quote("#define CONTEXT_NONE              0x00")
cpp_quote("#define CONTEXT_LINK              0x01")
cpp_quote("#define CONTEXT_IMAGE             0x02")
cpp_quote("#define CONTEXT_DOCUMENT          0x04")
cpp_quote("#define CONTEXT_TEXT              0x08")
cpp_quote("#define CONTEXT_INPUT             0x10")
cpp_quote("#define CONTEXT_BACKGROUND_IMAGE  0x20")

[
    object,
    uuid(3478b6b0-3875-11d4-94ef-0020183bf181),
    local
    /* FROZEN */
]
interface nsIContextMenuListener : nsISupports
{
    nsresult OnShowContextMenu(PRUint32 aContextFlags, nsIDOMEvent *aEvent, nsIDOMNode *aNode);
}

[
    object,
    uuid(a6cf90c3-15b3-11d2-932e-00805f8add32),
    local
    /* FROZEN */
]
interface nsIDOMUIEvent : nsIDOMEvent
{
    nsresult GetView(nsIDOMAbstractView **aView);
    nsresult GetDetail(PRInt32 *aDetail);
    nsresult InitUIEvent(const nsAString *typeArg, PRBool canBubbleArg, PRBool cancelableArg,
            nsIDOMAbstractView *viewArg, PRInt32 detailArg);
}

[
    object,
    uuid(ff751edc-8b02-aae7-0010-8301838a3123),
    local
    /* FROZEN */
]
interface nsIDOMMouseEvent : nsIDOMUIEvent
{
    nsresult GetScreenX(PRInt32 *aScreenX);
    nsresult GetScreenY(PRInt32 *aScreenY);
    nsresult GetClientX(PRInt32 *aClientX);
    nsresult GetClientY(PRInt32 *aClientY);
    nsresult GetCtrlKey(PRBool *aCtrlKey);
    nsresult GetShiftKey(PRBool *aShiftKey);
    nsresult GetAltKey(PRBool *aAltKey);
    nsresult GetMetaKey(PRBool *aMetaKey);
    nsresult GetButton(PRUint16 *aButton);
    nsresult GetRelatedTarget(nsIDOMEventTarget * *aRelatedTarget);
    nsresult InitMouseEvent(const nsAString *typeArg, PRBool canBubbleArg, PRBool cancelableArg,
            nsIDOMAbstractView *viewArg, PRInt32 detailArg, PRInt32 screenXArg, PRInt32 screenYArg,
            PRInt32 clientXArg, PRInt32 clientYArg, PRBool ctrlKeyArg, PRBool altKeyArg,
            PRBool shiftKeyArg, PRBool metaKeyArg, PRUint16 buttonArg,
            nsIDOMEventTarget *relatedTargetArg);
}

[
    object,
    uuid(028e0e6e-8b01-11d3-aae7-0010838a3123),
    local
    /* NOT_FROZEN */
]
interface nsIDOMKeyEvent : nsIDOMUIEvent
{
    nsresult GetCharCode(PRUint32 *aCharCode);
    nsresult GetKeyCode(PRUint32 *aKeyCode);
    nsresult GetAltKey(PRBool *aAltKey);
    nsresult GetCtrlKey(PRBool *aCtrlKey);
    nsresult GetShiftKey(PRBool *aShiftKey);
    nsresult GetMetaKey(PRBool *aMetaKey);
    nsresult InitKeyEvent(const nsAString *typeArg, PRBool canBubbleArg,
            PRBool cancelableArg, nsIDOMAbstractView *viewArg, PRBool ctrlKeyArg,
            PRBool altKeyArg, PRBool shiftKeyArg, PRBool metaKeyArg, PRUint32 keyCodeArg,
            PRUint32 charCodeArg);
}

[
    object,
    uuid(3e5432cd-9568-4bd1-8cbe-d50aba110743),
    local
    /* FROZEN */
]
interface nsIEmbeddingSiteWindow : nsISupports
{
    nsresult SetDimensions(PRUint32 flags, PRInt32 x, PRInt32 y, PRInt32 cx, PRInt32 cy);
    nsresult GetDimensions(PRUint32 flags, PRInt32 *x, PRInt32 *y, PRInt32 *cx, PRInt32 *cy);
    nsresult SetFocus();
    nsresult GetVisibility(PRBool *aVisibility);
    nsresult SetVisibility(PRBool aVisibility);
    nsresult GetTitle(PRUnichar **aTitle);
    nsresult SetTitle(const PRUnichar *aTitle);
    nsresult GetSiteWindow(void **aSiteWindow);
}

[
    object,
    uuid(2417cbfe-65ad-48a6-b4b6-eb84db174392),
    local
    /* FROZEN */
]
interface nsIComponentRegistrar : nsISupports
{
    nsresult AutoRegister(nsIFile *aSpec);
    nsresult AutoUnregister(nsIFile *aSpec);
    nsresult RegisterFactory(const nsCID *aClass, const char *aClassName,
            const char *aContractID, nsIFactory *aFactory);
    nsresult UnregisterFactory(const nsCID *aClass, nsIFactory *aFactory);
    nsresult RegisterFactoryLocation(const nsCID *aClass, const char *aClassName,
            const char *aContractID, nsIFile *aFile, const char *aLoaderStr,
            const char *aType);
    nsresult UnregisterFactoryLocation(const nsCID *aClass, nsIFile *aFile);
    nsresult IsCIDRegistered(const nsCID *aClass, PRBool *_retval);
    nsresult IsContractIDRegistered(const char *aContractID, PRBool *_retval);
    nsresult EnumerateCIDs(nsISimpleEnumerator **_retval);
    nsresult EnumerateContractIDs(nsISimpleEnumerator **_retval);
    nsresult CIDToContractID(const nsCID *aClass, char **_retval);
    nsresult ContractIDToCID(const char *aContractID, nsCID **_retval);
}

[
    object,
    uuid(1630c61a-325e-49ca-8759-a31b16c47aa5),
    local
    /* FROZEN */
]
interface nsIPromptService : nsISupports
{
    nsresult Alert(nsIDOMWindow *aParent, const PRUnichar *aDialogTitle,
            const PRUnichar *aText);
    nsresult AlertCheck(nsIDOMWindow *aParent, const PRUnichar *aDialogTitle,
            const PRUnichar *aText, const PRUnichar *aCheckMsg, PRBool *aCheckState);
    nsresult Confirm(nsIDOMWindow *aParent, const PRUnichar *aDialogTitle,
            const PRUnichar *aText, PRBool *_retval);
    nsresult ConfirmCheck(nsIDOMWindow *aParent, const PRUnichar *aDialogTitle,
            const PRUnichar *aText, const PRUnichar *aCheckMsg, PRBool *aCheckState,
            PRBool *_retval);
    nsresult ConfirmEx(nsIDOMWindow *aParent, const PRUnichar *aDialogTitle,
            const PRUnichar *aText, PRUint32 aButtonFlags, const PRUnichar *aButton0Title,
            const PRUnichar *aButton1Title, const PRUnichar *aButton2Title,
            const PRUnichar *aCheckMsg, PRBool *aCheckState, PRInt32 *_retval);
    nsresult Prompt(nsIDOMWindow *aParent, const PRUnichar *aDialogTitle,
            const PRUnichar *aText, PRUnichar **aValue, const PRUnichar *aCheckMsg,
            PRBool *aCheckState, PRBool *_retval);
    nsresult PromptUsernameAndPassword(nsIDOMWindow *aParent, const PRUnichar *aDialogTitle,
            const PRUnichar *aText, PRUnichar **aUsername, PRUnichar **aPassword,
            const PRUnichar *aCheckMsg, PRBool *aCheckState, PRBool *_retval);
    nsresult PromptPassword(nsIDOMWindow *aParent, const PRUnichar *aDialogTitle,
            const PRUnichar *aText, PRUnichar **aPassword, const PRUnichar *aCheckMsg,
            PRBool *aCheckState, PRBool *_retval);
    nsresult Select(nsIDOMWindow *aParent, const PRUnichar *aDialogTitle,
            const PRUnichar *aText, PRUint32 aCount, const PRUnichar **aSelectList,
            PRInt32 *aOutSelection, PRBool *_retval);
}

[
    object,
    uuid(b128a1e6-44f3-4331-8fbe-5af360ff21ee),
    local
    /* FROZEN */
]
interface nsITooltipTextProvider : nsISupports
{
    nsresult GetNodeText(nsIDOMNode *aNode, PRUnichar **aText, PRBool *_retval);
}

[
    object,
    uuid(02b0625a-e7f3-11d2-9f5a-006008a6efe9),
    local
    /* FROZEN */
]
interface nsIProfile : nsISupports
{
    nsresult GetProfileCount(PRInt32 *aProfileCount);
    nsresult GetProfileList(PRUint32 *length, PRUnichar ***profileNames);
    nsresult ProfileExists(const PRUnichar *profileName, PRBool *_retval);
    nsresult GetCurrentProfile(PRUnichar * *aCurrentProfile);
    nsresult SetCurrentProfile(const PRUnichar * aCurrentProfile);
    nsresult ShutDownCurrentProfile(PRUint32 shutDownType);
    nsresult CreateNewProfile(const PRUnichar *profileName,
            const PRUnichar *nativeProfileDir, const PRUnichar *langcode,
            PRBool useExistingDir);
    nsresult RenameProfile(const PRUnichar *oldName, const PRUnichar *newName);
    nsresult DeleteProfile(const PRUnichar *name, PRBool canDeleteFiles);
    nsresult CloneProfile(const PRUnichar *profileName);
}

[
    object,
    uuid(30465632-a777-44cc-90f9-8145475ef999),
    local
    /* FROZEN */
]
interface nsIWindowCreator : nsISupports
{
    nsresult CreateChromeWindow(nsIWebBrowserChrome *parent, PRUint32 chromeFlags,
                                   nsIWebBrowserChrome **_retval);
}

[
    object,
    uuid(f673ec81-a4b0-11d6-964b-eb5a2bf216fc),
    local
    /* NOT_FROZEN */
]
interface nsIWindowCreator2 : nsIWindowCreator
{
    nsresult CreateChromeWindow2(nsIWebBrowserChrome *parent, PRUint32 chromeFlags,
                                 PRUint32 contextFlags, nsIURI *uri, PRBool *cancel,
                                 nsIWebBrowserChrome **_retval);
}

[
    object,
    uuid(002286a8-494b-43b3-8ddd-49e3fc50622b),
    local
    /* FROZEN */
]
interface nsIWindowWatcher : nsISupports
{
    nsresult OpenWindow(nsIDOMWindow *aParent, const char *aUrl, const char *aName,
                        const char *aFeatures, nsISupports *aArguments, nsIDOMWindow **_retval);
    nsresult RegisterNotification(nsIObserver *aObserver);
    nsresult UnregisterNotification(nsIObserver *aObserver);
    nsresult GetWindowEnumerator(nsISimpleEnumerator **_retval);
    nsresult GetNewPrompter(nsIDOMWindow *aParent, nsIPrompt **_retval);
    nsresult GetNewAuthPrompter(nsIDOMWindow *aParent, nsIAuthPrompt **_retval);
    nsresult SetWindowCreator(nsIWindowCreator *creator);
    nsresult GetChromeForWindow(nsIDOMWindow *aWindow, nsIWebBrowserChrome **_retval);
    nsresult GetWindowByName(const PRUnichar *aTargetName, nsIDOMWindow *aCurrentWindow,
                             nsIDOMWindow **_retval);
    nsresult GetActiveWindow(nsIDOMWindow **aActiveWindow);
    nsresult SetActiveWindow(nsIDOMWindow *aActiveWindow);
}

[
    object,
    uuid(274cd32e-3675-47e1-9d8a-fc6504ded9ce),
    local
    /* NOT_FROZEN */
]
interface nsIEditingSession : nsISupports
{
    nsresult GetEditorStatus(PRUint32 *aEditorStatus);
    nsresult MakeWindowEditable(nsIDOMWindow *window, const char *aEditorType,
            PRBool doAfterUriLoad, PRBool aMakeWholeDocumentEditable, PRBool aInteractive);
    nsresult WindowIsEditable(nsIDOMWindow *window, PRBool *_retval);
    nsresult GetEditorForWindow(nsIDOMWindow *window, nsIEditor **_retval);
    nsresult SetupEditorOnWindow(nsIDOMWindow *window);
    nsresult TearDownEditorOnWindow(nsIDOMWindow *window);
    nsresult SetEditorOnControllers(nsIDOMWindow *aWindow, nsIEditor *aEditor);
    nsresult DisableJSAndPlugins(nsIDOMWindow *aWindow);
    nsresult RestoreJSAndPlugins(nsIDOMWindow *aWindow);
    nsresult DetachFromWindow(nsIDOMWindow *aWindow);
    nsresult ReattachToWindow(nsIDOMWindow *aWindow);
}

[
    object,
    uuid(83f892cf-7ed3-490e-967a-62640f3158e1),
    local
    /* NOT_FROZEN */
]
interface nsICommandParams : nsISupports
{
    nsresult GetValueType(const char *name, PRInt16 *_retval);
    nsresult GetBooleanValue(const char *name, PRBool *_retval);
    nsresult GetLongValue(const char *name, PRInt32 *_retval);
    nsresult GetDoubleValue(const char *name, double *_retval);
    nsresult GetStringValue(const char *name, nsAString *_retval);
    nsresult GetCStringValue(const char *name, char **_retval);
    nsresult GetISupportsValue(const char *name, nsISupports **_retval);
    nsresult SetBooleanValue(const char *name, PRBool value);
    nsresult SetLongValue(const char *name, PRInt32 value);
    nsresult SetDoubleValue(const char *name, double value);
    nsresult SetStringValue(const char *name, const nsAString *value);
    nsresult SetCStringValue(const char *name, const char *value);
    nsresult SetISupportsValue(const char *name, nsISupports *value);
    nsresult RemoveValue(const char *name);
    nsresult HasMoreElements(PRBool *_retval);
    nsresult First();
    nsresult GetNext(char **_retval);
}

[
    object,
    uuid(080d2001-f91e-11d4-a73c-f9242928207c),
    local
    /* NOT_FROZEN */
]
interface nsICommandManager : nsISupports
{
    nsresult AddCommandObserver(nsIObserver *aCommandObserver, const char *aCommandToObserve);
    nsresult RemoveCommandObserver(nsIObserver *aCommandObserver, const char *aCommandObserved);
    nsresult IsCommandSupported(const char *aCommandName, nsIDOMWindow *aTargetWindow, PRBool *_retval);
    nsresult IsCommandEnabled(const char *aCommandName, nsIDOMWindow *aTargetWindow, PRBool *_retval);
    nsresult GetCommandState(const char *aCommandName, nsIDOMWindow *aTargetWindow,
            nsICommandParams *aCommandParams);
    nsresult DoCommand(const char *aCommandName, nsICommandParams *aCommandParams,
            nsIDOMWindow *aTargetWindow);
}

[
    object,
    uuid(47b82b60-a36f-4167-8072-6f421151ed50),
    local
    /* NOT_FROZEN */
]
interface nsIControllerContext : nsISupports
{
    nsresult Init(nsIControllerCommandTable *aCommandTable);
    nsresult SetCommandContext(nsISupports *aCommandContext);
}

[
    object,
    uuid(d5b61b82-1da4-11d3-bf87-00105a1b0627),
    local
    /* NOT_FROZEN */
]
interface nsIController : nsISupports
{
    nsresult IsCommandEnabled(const char *command, PRBool *_retval);
    nsresult SupportsCommand(const char *command, PRBool *_retval);
    nsresult DoCommand(const char *command);
    nsresult OnEvent(const char *eventName);
}

[
    object,
    uuid(34769de0-30d0-4cef-894a-fcd8bb27c4b4),
    local
    /* NOT_FROZEN */
]
interface nsIContentSerializer : nsISupports
{
    nsresult Init(PRUint32 flags, PRUint32 aWrapColumn, const char* aCharSet, PRBool aIsCopying,
            PRBool aIsWholeDocument);
    nsresult AppendText(nsIDOMText *aText, PRInt32 aStartOffset, PRInt32 aEndOffset, nsAString *aStr);
    nsresult AppendCDATASection(nsIDOMCDATASection *aCDATASection, PRInt32 aStartOffset,
            PRInt32 aEndOffset, nsAString *aStr);
    nsresult AppendProcessingInstruction(nsIDOMProcessingInstruction* aPI, PRInt32 aStartOffset,
            PRInt32 aEndOffset, nsAString *aStr);
    nsresult AppendComment(nsIDOMComment *aComment, PRInt32 aStartOffset, PRInt32 aEndOffset,
            nsAString *aStr);
    nsresult AppendDoctype(nsIDOMDocumentType *aDoctype, nsAString *aStr);
    nsresult AppendElementStart(nsIDOMElement *aElement, nsIDOMElement *aOriginalElement,
            nsAString *aStr);
    nsresult AppendElementEnd(nsIDOMElement *aElement, nsAString *aStr);
    nsresult Flush(nsAString *aStr);
    nsresult AppendDocumentStart(nsIDOMDocument *aDocument, nsAString *aStr);
}

[
    object,
    uuid(96b60ba0-634a-41e4-928e-78ab0b3c4b46),
    local
    /* NOT_FROZEN */
]
interface nsIEditor  : nsISupports
{
    typedef void *nsIPresShellPtr;
    typedef void *nsIContentPtr;

    nsresult GetSelection([out] nsISelection *_retval);
    nsresult Init([in] nsIDOMDocument *doc, [in] nsIPresShellPtr shell, [in] nsIContentPtr aRoot, [in] nsISelectionController *aSelCon, [in] PRUint32 aFlags);
    nsresult SetAttributeOrEquivalent([in] nsIDOMElement *element, [in] const nsAString *sourceAttrName, [in] const nsAString *sourceAttrValue, [in] PRBool aSuppressTransaction);
    nsresult RemoveAttributeOrEquivalent([in] nsIDOMElement *element, [in] const nsAString *sourceAttrName, [in] PRBool aSuppressTransaction);
    nsresult PostCreate();
    nsresult PreDestroy();
    nsresult GetFlags([out] PRUint32 *_retval);
    nsresult SetFlags([in] PRUint32 val);
    nsresult GetContentsMIMEType([out] char **_retval);
    nsresult SetContentsMIMEType([in] const char *val);
    nsresult GetIsDocumentEditable([out] PRBool *_retval);
    nsresult GetDocument([out] nsIDOMDocument **_retval);
    nsresult GetRootElement([out] nsIDOMElement **_retval);
    nsresult GetSelectionController([out] nsISelectionController **_retval);
    nsresult DeleteSelection([in] PRInt16 action);
    nsresult GetDocumentIsEmpty([out] PRBool *_retval);
    nsresult GetDocumentModified([out] PRBool *_retval);
    nsresult GetDocumentCharacterSet([out] nsACString *_retval);
    nsresult SetDocumentCharacterSet([in] const nsACString *val);
    nsresult ResetModificationCount();
    nsresult GetModificationCount([out] PRInt32 *_retval);
    nsresult IncrementModificationCount([in] PRInt32 aModCount);
    nsresult GetTransactionManager([out] nsITransactionManager **_retval);
    nsresult SetTransactionManager(nsITransactionManager *aTransactionManager);
    nsresult DoTransaction([in] nsITransaction *txn);
    nsresult EnableUndo([in] PRBool enable);
    nsresult Undo([in] PRUint32 count);
    nsresult CanUndo([out] PRBool *isEnabled, [out] PRBool *canUndo);
    nsresult Redo([in] PRUint32 count);
    nsresult CanRedo([out] PRBool *isEnabled, [out] PRBool *canRedo);
    nsresult BeginTransaction();
    nsresult EndTransaction();
    nsresult BeginPlaceHolderTransaction([in] nsIAtom *name);
    nsresult EndPlaceHolderTransaction();
    nsresult ShouldTxnSetSelection([out] PRBool *_retval);
    nsresult SetShouldTxnSetSelection([in] PRBool should);
    nsresult GetInlineSpellChecker([out] nsIInlineSpellChecker **_retval);
    nsresult SyncRealTimeSpell();
    nsresult SetSpellcheckUserOverride(PRBool enable);
    nsresult Cut();
    nsresult CanCut([out] PRBool *_retval);
    nsresult Copy();
    nsresult CanCopy([out] PRBool *_retval);
    nsresult Paste([in] PRInt32 aSelectionType);
    nsresult CanPaste([in] PRInt32 aSelectionType, [out] PRBool *_retval);
    nsresult SelectAll();
    nsresult BeginningOfDocument();
    nsresult EndOfDocument();
    nsresult CanDrag([in] nsIDOMEvent *aEvent, [out] PRBool *_retval);
    nsresult DoDrag([in] nsIDOMEvent *aEvent);
    nsresult InsertFromDrop([in] nsIDOMEvent *aEvent);
    nsresult SetAttribute([in] nsIDOMElement *aElement, [in] const nsAString *attributestr, [in] const nsAString *attvalue);
    nsresult GetAttributeValue([in] nsIDOMElement *aElement, [in] const nsAString *attributestr, [out] nsAString *resultValue, PRBool *_retval);
    nsresult RemoveAttribute([in] nsIDOMElement *aElement, [in] const nsAString *aAttribute);
    nsresult CloneAttribute([in] const nsAString *aAttribute, [in] nsIDOMNode *aDestNode, [in] nsIDOMNode *aSourceNode);
    nsresult CloneAttributes([in] nsIDOMNode *destNode, [in] nsIDOMNode *sourceNode);
    nsresult CreateNode([in] const nsAString *tag, [in] nsIDOMNode *parent, [in] PRInt32 position, [out] nsIDOMNode **_retval);
    nsresult InsertNode([in] nsIDOMNode *node, [in] nsIDOMNode *parent, [in] PRInt32 aPosition);
    nsresult SplitNode([in] nsIDOMNode *existingRightNode, [in] PRInt32 offset, [out] nsIDOMNode **newLeftNode);
    nsresult JoinNodes([in] nsIDOMNode *leftNode, [in] nsIDOMNode *rightNode, [in] nsIDOMNode *parent);
    nsresult DeleteNode([in] nsIDOMNode *child);
    nsresult MarkNodeDirty([in] nsIDOMNode *node);
    nsresult SwitchTextDirection();
    nsresult OutputToString([in] nsAString formatType, [in] PRUint32 flags, [out] nsAString *_retval);
    nsresult OutputToStream([in] nsIOutputStream *aStream, [in] nsAString *formatType, [in] nsACString *charsetOverride, [in] PRUint32 flags);
    nsresult AddEditorObserver([in] nsIEditorObserver *observer);
    nsresult RemoveEditorObserver([in] nsIEditorObserver *observer);
    nsresult AddEditActionListener([in] nsIEditActionListener *listener);
    nsresult RemoveEditActionListener([in] nsIEditActionListener *listener);
    nsresult AddDocumentStateListener([in] nsIDocumentStateListener *listener);
    nsresult RemoveDocumentStateListener([in] nsIDocumentStateListener *listener);
    nsresult DumpContentTree();
    nsresult DebugDumpContent();
    nsresult DebugUnitTests([out] PRInt32 *outNumTests, [out] PRInt32 *outNumTestsFailed);
    PRBool IsModifiableNode(nsIDOMNode *aNode);
}

[
    object,
    uuid(afc36593-5787-4420-93d9-b2c0ccbf0cad),
    local
    /* NOT_FROZEN */
]
interface nsIHTMLEditor : nsISupports
{
    nsresult AddDefaultProperty([in] nsIAtom *aProperty, [in] nsAString *aAttribute, [in] nsAString *aValue);
    nsresult RemoveDefaultProperty([in] nsIAtom *aProperty, [in] nsAString *aAttribute, [in] nsAString *aValue);
    nsresult RemoveAllDefaultProperties();
    nsresult SetCSSInlineProperty([in] nsIAtom *aProperty, [in] nsAString *aAttribute, [in] nsAString *aValue);
    nsresult SetInlineProperty([in] nsIAtom *aProperty, [in] nsAString *aAttribute, [in] nsAString *aValue);
    nsresult GetInlineProperty([in] nsIAtom *aProperty, [in] nsAString *aAttribute, [in] nsAString *aValue, [out] PRBool *aFirst, [out] PRBool *aAny, [out] PRBool *aAll);
    nsresult GetInlinePropertyWithAttrValue([in] nsIAtom *aProperty, [in] nsAString *aAttribute, [in] nsAString *aValue, [out] PRBool *aFirst, [out] PRBool *aAny, [out] PRBool *aAll, [out] nsAString *_retval);
    nsresult RemoveAllInlineProperties();
    nsresult RemoveInlineProperty([in] nsIAtom *aProperty, [in] nsAString *aAttribute);
    nsresult IncreaseFontSize();
    nsresult DecreaseFontSize();
    nsresult CanDrag([in] nsIDOMEvent *aEvent, [out] PRBool *_retval);
    nsresult DoDrag([in] nsIDOMEvent *aEvent);
    nsresult InsertFromDrop([in] nsIDOMEvent *aEvent);
    nsresult NodeIsBlock([in] nsIDOMNode *node, PRBool *_retval);
    nsresult InsertHTML([in] nsAString *aInputString);
    nsresult PasteNoFormatting([in] PRInt32 aSelectionType);
    nsresult RebuildDocumentFromSource([in] nsAString *aSourceString);
    nsresult InsertHTMLWithContext([in] nsAString *aInputString, [in] nsAString *aContextStr, [in] nsAString *aInfoStr, [in] nsAString *aFlavor, [in] nsIDOMDocument *aSourceDoc, [in] nsIDOMNode *aDestinationNode, [in] PRInt32 aDestinationOffset, [in] PRBool aDeleteSelection);
    nsresult InsertElementAtSelection([in] nsIDOMElement *aElement, [in] PRBool aDeleteSelection);
    nsresult SetDocumentTitle([in] nsAString *aTitle);
    nsresult UpdateBaseURL();
    nsresult SelectElement([in] nsIDOMElement *aElement);
    nsresult SetCaretAfterElement([in] nsIDOMElement *aElement);
    nsresult SetParagraphFormat([in] nsAString *aParagraphFormat);
    nsresult GetParagraphState([out] PRBool *aMixed, [out] nsAString *_retval);
    nsresult GetFontFaceState([out] PRBool *aMixed, [out] nsAString *_retval);
    nsresult GetFontColorState([out] PRBool *aMixed, [out] nsAString *_retval);
    nsresult GetBackgroundColorState([out] PRBool *aMixed, [out] nsAString *_retval);
    nsresult GetHighlightColorState([out] PRBool *aMixed, [out] nsAString *_retval);
    nsresult GetListState([out] PRBool *aMixed, [out] PRBool *aOL, [out] PRBool *aUL, [out] PRBool *aDL);
    nsresult GetListItemState([out] PRBool *aMixed, [out] PRBool *aLI, [out] PRBool *aDT, [out] PRBool *aDD);
    nsresult GetAlignment([out] PRBool *aMixed, [out] PRInt16 *aAlign);
    nsresult GetIndentState([out] PRBool *aCanIndent, [out] PRBool *aCanOutdent);
    nsresult MakeOrChangeList([in] nsAString *aListType, [in] PRBool entireList, [in] nsAString *aBulletType);
    nsresult RemoveList([in] nsAString *aListType);
    nsresult Indent([in] nsAString *aIndent);
    nsresult Align([in] nsAString *aAlign);
    nsresult GetElementOrParentByTagName([in] nsAString *aTagName, [in] nsIDOMNode *aNode, [out] nsIDOMElement **_retval);
    nsresult GetSelectedElement([in] nsAString *aTagName, [out] nsIDOMElement **_retval);
    nsresult GetHeadContentsAsHTML([out] nsAString *_retval);
    nsresult ReplaceHeadContentsWithHTML([in] nsAString *aSourceToInsert);
    nsresult CreateElementWithDefaults([in] nsAString *aTagName, [out] nsIDOMElement **_retval);
    nsresult InsertLinkAroundSelection([in] nsIDOMElement *aAnchorElement);
    nsresult SetBackgroundColor([in] nsAString *aColor);
    nsresult SetBodyAttribute([in] nsAString *aAttr, [in] nsAString *aValue);
    nsresult IgnoreSpuriousDragEvent([in] PRBool aIgnoreSpuriousDragEvent);
    nsresult GetLinkedObjects([out] nsISupportsArray **_retval);
    nsresult GetIsCSSEnabled([out] PRBool *_retval);
    nsresult SetIsCSSEnabled([in] PRBool prb);
    nsresult AddInsertionListener([in] nsIContentFilter *inFilter);
    nsresult RemoveInsertionListener([in] nsIContentFilter *inFilter);
    nsresult CreateAnonymousElement([in] nsAString *aTag, [in] nsIDOMNode *aParentNode, [in] nsAString *aAnonClass, [in] PRBool aIsCreatedHidden, [out] nsIDOMElement **_retval);
    nsresult GetSelectionContainer([out] nsIDOMElement **_retval);
    nsresult CheckSelectionStateForAnonymousButtons([in] nsISelection *aSelection);
    nsresult IsAnonymousElement([in] nsIDOMElement *aElement, [out] PRBool *_retval);
    nsresult GetReturnInParagraphCreatesNewParagraph([out] PRBool *_retval);
    nsresult SetReturnInParagraphCreatesNewParagraph([in] PRBool prb);
}

[
    object,
    uuid(32e68316-67d4-44a5-8d35-0d390fa9df11),
    local
    /* NOT_FROZEN */
]
interface nsIMutationObserver : nsISupports
{
    void CharacterDataWillChange(nsIDocument *aDocument, nsIContent *aContent,
                                 void /*CharacterDataChangeInfo*/ *aInfo);
    void CharacterDataChanged(nsIDocument *aDocument, nsIContent *aContent,
                              void /*CharacterDataChangeInfo*/ *aInfo);
    void AttributeChanged(nsIDocument *aDocument, nsIContent *aContent, PRInt32 aNameSpaceID,
                          nsIAtom *aAttribute, PRInt32 aModType, PRUint32 aStateMask);
    void ContentAppended(nsIDocument *aDocument, nsIContent *aContainer, PRInt32 aNewIndexInContainer);
    void ContentInserted(nsIDocument *aDocument, nsIContent *aContainer, nsIContent *aChild,
                         PRInt32 aIndexInContainer);
    void ContentRemoved(nsIDocument *aDocument, nsIContent *aContainer, nsIContent *aChild,
                        PRInt32 aIndexInContainer);
    void NodeWillBeDestroyed(const nsINode *aNode);
    void ParentChainChanged(nsIContent *aContent);
}

[
    object,
    uuid(4e14e321-a4bb-49f8-a57a-2363668d14d0),
    local
    /* NOT_FROZEN */
]
interface nsIDocumentObserver : nsIMutationObserver
{
    typedef int nsUpdateType;

    void BeginUpdate(nsIDocument *aDocument, nsUpdateType aUpdateType);
    void EndUpdate(nsIDocument *aDocument, nsUpdateType aUpdateType);
    void BeginLoad(nsIDocument *aDocument);
    void EndLoad(nsIDocument *aDocument);
    void ContentStatesChanged(nsIDocument *aDocument, nsIContent *aContent1, nsIContent *aContent2,
                              PRInt32 aStateMask);
    void StyleSheetAdded(nsIDocument *aDocument, nsIStyleSheet *aStyleSheet, PRBool aDocumentSheet);
    void StyleSheetRemoved(nsIDocument *aDocument, nsIStyleSheet *aStyleSheet, PRBool aDocumentSheet);
    void StyleSheetApplicableStateChanged(nsIDocument *aDocument, nsIStyleSheet *aStyleSheet,
                                          PRBool aApplicable);
    void StyleRuleChanged(nsIDocument *aDocument, nsIStyleSheet *aStyleSheet, nsIStyleRule *aOldStyleRule,
                          nsIStyleRule *aNewStyleRule);
    void StyleRuleAdded(nsIDocument *aDocument, nsIStyleSheet *aStyleSheet, nsIStyleRule *aStyleRule);
    void StyleRuleRemoved(nsIDocument *aDocument, nsIStyleSheet *aStyleSheet, nsIStyleRule *aStyleRule);
    void BindToDocument(nsIDocument *aDocument, nsIContent *aContent);
    void DoneAddingContent(nsIContent *aContent, PRBool aHaveNotified);
}

/*
 * NOTE:
 * This is a private Wine interface that is implemented by our implementation
 * of nsIURI to store its owner.
 */
[
    object,
    uuid(5088272e-900b-11da-c687-000fea57f21a),
    local
    /* INTERNAL */
]
interface nsIWineURI : nsIURI
{
    typedef struct NSContainer NSContainer;

    nsresult GetNSContainer(NSContainer **aNSContainer);
    nsresult SetNSContainer(NSContainer *aNSContainer);
    nsresult GetIsDocumentURI(PRBool *aIsDocumentURI);
    nsresult SetIsDocumentURI(PRBool aIsDocumentURI);
    nsresult GetWineURL(LPCWSTR *aURL);
    nsresult SetWineURL(LPCWSTR aURL);
}
