/*
 * Copyright 2005-2011 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 \"1.5\"")
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 WCHAR PRUnichar;
typedef ULONG PRUint32;
typedef LONG PRInt32;
typedef WORD PRUint16;
typedef INT16 PRInt16;
typedef BYTE PRUint8;
typedef LONGLONG PRInt64;
typedef ULONGLONG PRUint64;
typedef PRUint64 DOMTimeStamp;
typedef PRUint32 nsLoadFlags;

typedef unsigned char cpp_bool;
#define bool cpp_bool

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 nsIDOMWindow;
interface nsIDOMElement;
interface nsIDOMRange;
interface nsIDOMEventTarget;
interface nsISelection;
interface nsIDOMHTMLSelectElement;

interface IMoniker;

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

/* Currently we don't need a full declaration of these interfaces */
typedef nsISupports nsISHistory;
typedef nsISupports nsIWidget;
typedef nsISupports nsIDOMBarProp;
typedef nsISupports nsIPrompt;
typedef nsISupports nsIAuthPrompt;
typedef nsISupports nsIDOMDocumentType;
typedef nsISupports nsIDOMDOMImplementation;
typedef nsISupports nsIDOMCDATASection;
typedef nsISupports nsIDOMProcessingInstruction;
typedef nsISupports nsIDOMEntityReference;
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 nsINode;
typedef nsISupports nsIStyleSheet;
typedef nsISupports nsIStyleRule;
typedef nsISupports nsIDOMUserDataHandler;
typedef nsISupports nsIDocShellLoadInfo;
typedef nsISupports nsISHEntry;
typedef nsISupports nsIPresShell;
typedef nsISupports nsIContentViewer;
typedef nsISupports nsIDocumentCharsetInfo;
typedef nsISupports nsILayoutHistoryState;
typedef nsISupports nsISecureBrowserUI;
typedef nsISupports nsIDOMStorage;
typedef nsISupports nsIDOMDOMTokenList;
typedef nsISupports nsITransferable;
typedef nsISupports nsIDOMHTMLHeadElement;
typedef nsISupports nsIDOMFileList;
typedef nsISupports nsIControllers;
typedef nsISupports nsIDOMValidityState;
typedef nsISupports nsIPluginInstanceOwner;
typedef nsISupports nsIPluginStreamListener;
typedef nsISupports nsIContentSink;
typedef nsISupports nsIParserFilter;
typedef nsISupports nsIDTD;
typedef nsISupports nsIObserver;
typedef nsISupports nsIDOMNodeFilter;
typedef nsISupports nsIDOMNodeIterator;
typedef nsISupports nsIDOMTreeWalker;
typedef nsISupports nsIHttpUpgradeListener;
typedef nsISupports nsIDOMDOMStringMap;
typedef nsISupports nsIDOMDOMStringList;
typedef nsISupports nsIDOMOfflineResourceList;
typedef nsISupports nsIDOMHistory;
typedef nsISupports nsIDOMNavigator;
typedef nsISupports nsIDOMMediaQueryList;
typedef nsISupports nsIDOMScreen;
typedef nsISupports nsIDOMCrypto;
typedef nsISupports nsIDOMPkcs11;
typedef nsISupports nsIAnimationFrameListener;
typedef nsISupports nsIDOMMozURLProperty;
typedef nsISupports nsIDOMStorageList;
typedef nsISupports nsILocalFile;
typedef nsISupports nsIDOMHTMLMenuElement;
typedef nsISupports nsIDOMCaretPosition;
typedef nsISupports nsIFrameRequestCallback;

typedef void *JSContext;
typedef void *JSObject;
typedef PRUint64 jsval;

[
    object,
    uuid(8bb35ed9-e332-462d-9155-4a002ab5c958),
    local
]
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
]
interface nsIFactory : nsISupports
{
    nsresult CreateInstance(nsISupports *aOuter, const nsIID *iid, void **result);
    nsresult LockFactory(bool lock);
}

[
    object,
    uuid(1d940426-5fe5-42c3-84ae-a300f2d9ebd5),
    local
]
interface nsIComponentManager : nsISupports
{
    nsresult GetClassObject(nsCIDRef aClass, nsIIDRef aIID, void **result);
    nsresult GetClassObjectByContractID(const char *aContractID, nsIIDRef aIID, void **result);
    nsresult CreateInstance(nsCIDRef aClass, nsISupports *aDelegate, nsIIDRef aIID,
            void **result);
    nsresult CreateInstanceByContractID(const char *aContractID, nsISupports *aDelegate,
            nsIIDRef aIID, void **result);
    nsresult AddBootstrappedManifestLocation(nsILocalFile *aLocation);
    nsresult RemoveBootstrappedManifestLocation(nsILocalFile *aLocation);
}

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

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

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

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

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

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

[
    object,
    uuid(81e4c2de-acac-4ad6-901a-b5fb1b851a0d),
    local
]
interface nsIVariant : nsISupports
{
    nsresult GetDataType(PRUint16 *aDataType);
    nsresult GetAsInt8(PRUint8 *_retval);
    nsresult GetAsInt16(PRInt16 *_retval);
    nsresult GetAsInt32(PRInt32 *_retval);
    nsresult GetAsInt64(PRInt64 *_retval);
    nsresult GetAsUint8(PRUint8 *_retval);
    nsresult GetAsUint16(PRUint16 *_retval);
    nsresult GetAsUint32(PRUint32 *_retval);
    nsresult GetAsUint64(PRUint64 *_retval);
    nsresult GetAsFloat(float *_retval);
    nsresult GetAsDouble(double *_retval);
    nsresult GetAsBool(bool *_retval);
    nsresult GetAsChar(char *_retval);
    nsresult GetAsWChar(PRUnichar *_retval);
    nsresult GetAsID(nsID *retval);
    nsresult GetAsAString(nsAString *_retval);
    nsresult GetAsDOMString(nsAString *_retval);
    nsresult GetAsACString(nsACString *_retval);
    nsresult GetAsAUTF8String(nsACString *_retval);
    nsresult GetAsString(char * *_retval);
    nsresult GetAsWString(PRUnichar * *_retval);
    nsresult GetAsISupports(nsISupports * *_retval);
    nsresult GetAsJSVal(long /*jsval*/ *_retval);
    nsresult GetAsInterface(nsIID **iid, void **iface);
    nsresult GetAsArray(PRUint16 *type, nsIID *iid, PRUint32 *count, void **ptr);
    nsresult GetAsStringWithSize(PRUint32 *size, char **str);
    nsresult GetAsWStringWithSize(PRUint32 *size, PRUnichar **str);
}

[
    object,
    uuid(5586a590-8c82-11d5-90f3-0010a4e73d9a),
    local
]
interface nsIWritableVariant : nsIVariant
{
    nsresult GetWritable(bool *aWritable);
    nsresult SetWritable(bool aWritable);
    nsresult SetAsInt8(PRUint8 aValue);
    nsresult SetAsInt16(PRInt16 aValue);
    nsresult SetAsInt32(PRInt32 aValue);
    nsresult SetAsInt64(PRInt64 aValue);
    nsresult SetAsUint8(PRUint8 aValue);
    nsresult SetAsUint16(PRUint16 aValue);
    nsresult SetAsUint32(PRUint32 aValue);
    nsresult SetAsUint64(PRUint64 aValue);
    nsresult SetAsFloat(float aValue);
    nsresult SetAsDouble(double aValue);
    nsresult SetAsBool(bool aValue);
    nsresult SetAsChar(char aValue);
    nsresult SetAsWChar(PRUnichar aValue);
    nsresult SetAsID(const nsID *aValue);
    nsresult SetAsAString(const nsAString *aValue);
    nsresult SetAsDOMString(const nsAString *aValue);
    nsresult SetAsACString(const nsACString *aValue);
    nsresult SetAsAUTF8String(const nsACString *aValue);
    nsresult SetAsString(const char * aValue);
    nsresult SetAsWString(const PRUnichar * aValue);
    nsresult SetAsISupports(nsISupports *aValue);
    nsresult SetAsInterface(const nsIID *iid, void *iface);
    nsresult SetAsArray(PRUint16 type, const nsIID *iid, PRUint32 count, void *ptr);
    nsresult SetAsStringWithSize(PRUint32 size, const char *str);
    nsresult SetAsWStringWithSize(PRUint32 size, const PRUnichar *str);
    nsresult SetAsVoid();
    nsresult SetAsEmpty();
    nsresult SetAsEmptyArray();
    nsresult SetFromVariant(nsIVariant *aValue);
}

[
    object,
    uuid(fa9c7f6c-61b3-11d4-9877-00c04fa0cf4a),
    local
]
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(bool *_retval);
}

[
    object,
    uuid(395fe045-7d18-4adb-a3fd-af98c8a1af11),
    local
]
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, bool *_retval);
    nsresult SchemeIs(const char *scheme, bool *_retval);
    nsresult Clone(nsIURI **_retval);
    nsresult Resolve(const nsACString *relativePath, nsACString *_retval);
    nsresult GetAsciiSpec(nsACString *aAsciiSpec);
    nsresult GetAsciiHost(nsACString *aAsciiHost);
    nsresult GetOriginCharset(nsACString *aOriginCharset);
    nsresult GetRef(nsACString *aRef);
    nsresult SetRef(const nsACString *aRef);
    nsresult EqualsExceptRef(nsIURI *other, bool *_retval);
    nsresult CloneIgnoringRef(nsIURI **_retval);
    nsresult GetSpecIgnoringRef(nsACString *aSpecIgnoringRef);
    nsresult GetHasRef(bool *aHasRef);
}

[
    object,
    uuid(1419aa16-f134-4154-9886-00c7c5147a13),
    local
]
interface nsIURL : nsIURI
{
    nsresult GetFilePath(nsACString *aFilePath);
    nsresult SetFilePath(const nsACString *aFilePath);
    nsresult GetQuery(nsACString *aQuery);
    nsresult SetQuery(const nsACString *aQuery);
    nsresult GetDirectory(nsACString *aDirectory);
    nsresult SetDirectory(const nsACString *aDirectory);
    nsresult GetFileName(nsACString *aFileName);
    nsresult SetFileName(const nsACString *aFileName);
    nsresult GetFileBaseName(nsACString *aFileBaseName);
    nsresult SetFileBaseName(const nsACString *aFileBaseName);
    nsresult GetFileExtension(nsACString *aFileExtension);
    nsresult SetFileExtension(const nsACString *aFileExtension);
    nsresult GetCommonBaseSpec(nsIURI *aURIToCompare, nsACString *_retval);
    nsresult GetRelativeSpec(nsIURI *aURIToCompare, nsACString *_retval);
}

[
    object,
    uuid(321578d0-03c1-4d95-8821-021ac612d18d),
    local
]
interface nsIMutable : nsISupports
{
    nsresult GetMutable(bool *aMutable);
    nsresult SetMutable(bool aMutable);
}

[
    object,
    uuid(babd6cca-ebe7-4329-967c-d6b9e33caa81),
    local
]
interface nsIStandardURL : nsIMutable
{
    nsresult Init(PRUint32 aUrlType, PRInt32 aDefaultPort, const nsACString *aSpec, const char *aOriginCharset, nsIURI *aBaseURI);
}

[
    object,
    uuid(ef6bfbd2-fd46-48d8-96b7-9f8f0fd387fe),
    local
]
interface nsIRequest : nsISupports
{
    nsresult GetName(nsACString *aName);
    nsresult IsPending(bool *_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
]
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
]
interface nsIStreamListener : nsIRequestObserver
{
    nsresult OnDataAvailable(nsIRequest *aRequest, nsISupports *aContext,
                             nsIInputStream *aInputStream, PRUint32 aOffset, PRUint32 aCount);
}

[
    object,
    uuid(3de0a31c-feaf-400f-9f1e-4ef71f8b20cc),
    local
]
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(06f6ada3-7729-4e72-8d3f-bf8ba630ff9b),
    local
]
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);
    nsresult GetContentDisposition(PRUint32 *aContentDisposition);
    nsresult GetContentDispositionFilename(nsAString *aContentDispositionFilename);
    nsresult GetContentDispositionHeader(nsACString *aContentDispositionHeader);
}

[
    object,
    uuid(35412859-b9d9-423c-8866-2d4559fdd2be),
    local
]
interface nsIHttpHeaderVisitor : nsISupports
{
    nsresult VisitHeader(const nsACString *aHeader, const nsACString *aValue);
}

[
    object,
    uuid(9277fe09-f0cc-4cd9-bbce-581dd94b0260),
    local
]
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, bool aMerge);
    nsresult VisitRequestHeaders(nsIHttpHeaderVisitor *aVisitor);
    nsresult GetAllowPipelining(bool *aAllowPipelining);
    nsresult SetAllowPipelining(bool aAllowPipelining);
    nsresult GetRedirectionLimit(PRUint32 *aRedirectionLimit);
    nsresult SetRedirectionLimit(PRUint32 aRedirectionLimit);
    nsresult GetResponseStatus(PRUint32 *aResponseStatus);
    nsresult GetResponseStatusText(nsACString *aResponseStatusText);
    nsresult GetRequestSucceeded(bool *aRequestSucceeded);
    nsresult GetResponseHeader(const nsACString *header, nsACString *_retval);
    nsresult SetResponseHeader(const nsACString *header, const nsACString *value, bool merge);
    nsresult VisitResponseHeaders(nsIHttpHeaderVisitor *aVisitor);
    nsresult IsNoStoreResponse(bool *_retval);
    nsresult IsNoCacheResponse(bool *_retval);
}

[
    object,
    uuid(9363fd96-af59-47e8-bddf-1d5e91acd336),
    local
]
interface nsIHttpChannelInternal : nsISupports
{
    nsresult GetDocumentURI(nsIURI **aDocumentURI);
    nsresult SetDocumentURI(nsIURI *aDocumentURI);
    nsresult GetRequestVersion(PRUint32 *major, PRUint32 *minor);
    nsresult GetResponseVersion(PRUint32 *major, PRUint32 *minor);
    nsresult SetCookie(const char *aCookieHeader);
    nsresult SetupFallbackChannel(const char *aFallbackKey);
    nsresult GetForceAllowThirdPartyCookie(bool *aForceAllowThirdPartyCookie);
    nsresult SetForceAllowThirdPartyCookie(bool aForceAllowThirdPartyCookie);
    nsresult GetCanceled(bool *aCanceled);
    nsresult GetChannelIsForDownload(bool *aChannelIsForDownload);
    nsresult SetChannelIsForDownload(bool aChannelIsForDownload);
    nsresult GetLocalAddress(nsACString *aLocalAddress);
    nsresult GetLocalPort(PRInt32 *aLocalPort);
    nsresult GetRemoteAddress(nsACString *aRemoteAddress);
    nsresult GetRemotePort(PRInt32 *aRemotePort);
    nsresult SetCacheKeysRedirectChain(void /*nsTArray<nsCString>*/ *cacheKeys);
    nsresult HTTPUpgrade(const nsACString *aProtocolName, nsIHttpUpgradeListener *aListener);
    nsresult GetAllowSpdy(bool *aAllowSpdy);
    nsresult SetAllowSpdy(bool aAllowSpdy);
}

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

[
    object,
    uuid(8d171460-a716-41f1-92be-8c659db39b45),
    local
]
interface nsIAsyncVerifyRedirectCallback : nsISupports
{
    nsresult OnRedirectVerifyCallback(nsresult result);
}

[
    object,
    uuid(a430d870-df77-4502-9570-d46a8de33154),
    local
]
interface nsIChannelEventSink : nsISupports
{
    cpp_quote("#define REDIRECT_TEMPORARY 1")
    cpp_quote("#define REDIRECT_PERMANENT 2")
    cpp_quote("#define REDIRECT_INTERNAL  4")

    nsresult AsyncOnChannelRedirect(nsIChannel *oldChannel, nsIChannel *newChannel, PRUint32 flags,
                                    nsIAsyncVerifyRedirectCallback *callback);
}

[
    object,
    uuid(a6cf906d-15b3-11d2-932e-00805f8add32),
    local
]
interface nsIDOMLocation : nsISupports
{
    nsresult GetHash(nsAString *aHash);
    nsresult SetHash(const nsAString *aHash);
    nsresult GetHost(nsAString *aHost);
    nsresult SetHost(const nsAString *aHost);
    nsresult GetHostname(nsAString *aHostname);
    nsresult SetHostname(const nsAString *aHostname);
    nsresult GetHref(nsAString *aHref);
    nsresult SetHref(const nsAString *aHref);
    nsresult GetPathname(nsAString *aPathname);
    nsresult SetPathname(const nsAString *aPathname);
    nsresult GetPort(nsAString *aPort);
    nsresult SetPort(const nsAString *aPort);
    nsresult GetProtocol(nsAString *aProtocol);
    nsresult SetProtocol(const nsAString *aProtocol);
    nsresult GetSearch(nsAString *aSearch);
    nsresult SetSearch(const nsAString *aSearch);
    nsresult Reload(bool forceget);
    nsresult Replace(const nsAString *url);
    nsresult Assign(const nsAString *url);
    nsresult ToString(nsAString *_retval);
}

[
    object,
    uuid(2938307a-9d70-4b63-8afc-0197e82318ad),
    local
]
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
]
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
]
interface nsIDOMCSSRuleList : nsISupports
{
    nsresult GetLength(PRUint32 *aLength);
    nsresult Item(PRUint32 index, nsIDOMCSSRule **_retval);
}

[
    object,
    uuid(a6cf9080-15b3-11d2-932e-00805f8add32),
    local
]
interface nsIDOMStyleSheet : nsISupports
{
    nsresult GetType(nsAString *aType);
    nsresult GetDisabled(bool *aDisabled);
    nsresult SetDisabled(bool 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
]
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
]
interface nsIDOMStyleSheetList : nsISupports
{
    nsresult GetLength(PRUint32 *aLength);
    nsresult Item(PRUint32 index, nsIDOMStyleSheet **_retval);
}

[
    object,
    uuid(496852ba-e48d-4fa5-982e-e0dc1b475bf1),
    local
]
interface nsIDOMNodeList : nsISupports
{
    nsresult Item(PRUint32 index, nsIDOMNode **_retval);
    nsresult GetLength(PRUint32 *aLength);
    /* Followed by semi-internal API that we don't want to use */
}

[
    object,
    uuid(a6cf907b-15b3-11d2-932e-00805f8add32),
    local
]
interface nsIDOMNamedNodeMap : nsISupports
{
    nsresult GetNamedItem(const nsAString *name, nsIDOMNode **_retval);
    nsresult SetNamedItem(nsIDOMNode *arg, nsIDOMNode **_retval);
    nsresult RemoveNamedItem(const nsAString *name, nsIDOMNode **_retval);
    nsresult Item(PRUint32 index, nsIDOMNode **_retval);
    nsresult GetLength(PRUint32 *aLength);
    nsresult GetNamedItemNS(const nsAString *namespaceURI, const nsAString *localName, nsIDOMNode **_retval);
    nsresult SetNamedItemNS(nsIDOMNode *arg, nsIDOMNode **_retval);
    nsresult RemoveNamedItemNS(const nsAString *namespaceURI, const nsAString *localName, nsIDOMNode **_retval);
}

[
    object,
    uuid(ce82fb71-60f2-4c38-be31-de5f2f90dada),
    local
]
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
    };

    enum {
        DOCUMENT_POSITION_DISCONNECTED = 1,
        DOCUMENT_POSITION_PRECEDING = 2,
        DOCUMENT_POSITION_FOLLOWING = 4,
        DOCUMENT_POSITION_CONTAINS = 8,
        DOCUMENT_POSITION_CONTAINED_BY = 16,
        DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 32
    };

    nsresult GetNodeName(nsAString *aNodeName);
    nsresult GetNodeValue(nsAString *aNodeValue);
    nsresult SetNodeValue(const nsAString *aNodeValue);
    nsresult GetNodeType(PRUint16 *aNodeType);
    nsresult GetParentNode(nsIDOMNode **aParentNode);
    nsresult GetParentElement(nsIDOMElement **aParentElement);
    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(bool *_retval);
    nsresult CloneNode(bool deep, nsIDOMNode **_retval);
    nsresult Normalize();
    nsresult IsSupported(const nsAString *feature, const nsAString *version, bool *_retval);
    nsresult GetNamespaceURI(nsAString *aNamespaceURI);
    nsresult GetPrefix(nsAString *aPrefix);
    nsresult GetLocalName(nsAString *aLocalName);
    nsresult HasAttributes(bool *_retval);
    nsresult GetDOMBaseURI(nsAString *aBaseURI);
    nsresult CompareDocumentPosition(nsIDOMNode *other, PRUint16 *_retval);
    nsresult GetTextContent(nsAString *aTextContent);
    nsresult SetTextContent(const nsAString *aTextContent);
    nsresult LookupPrefix(const nsAString *namespaceURI, nsAString *_retval);
    nsresult IsDefaultNamespace(const nsAString *namespaceURI, bool *_retval);
    nsresult LookupNamespaceURI(const nsAString *prefix, nsAString *_retval);
    nsresult IsEqualNode(nsIDOMNode *arg, bool *_retval);
    nsresult SetUserData(const nsAString *key, nsIVariant *data, nsIDOMUserDataHandler *handler, nsIVariant **_retval);
    nsresult GetUserData(const nsAString *key, nsIVariant **_retval);
    nsresult Contains(nsIDOMNode *aOther, bool *_retval);
}

[
    object,
    uuid(03da4bc9-1b9a-41dc-a1a4-32414d48d704),
    local
]
interface nsIDOMAttr : nsIDOMNode
{
    nsresult GetName(nsAString *aName);
    nsresult GetSpecified(bool *aSpecified);
    nsresult GetValue(nsAString *aValue);
    nsresult SetValue(const nsAString *aValue);
    nsresult GetOwnerElement(nsIDOMElement **aOwnerElement);
    nsresult GetIsId(bool *aIsId);
}

[
    object,
    uuid(b2f824c4-d9d3-499b-8d3b-45c8245497c6),
    local
]
interface nsIDOMClientRect : nsISupports
{
    nsresult GetLeft(float *aLeft);
    nsresult GetTop(float *aTop);
    nsresult GetRight(float *aRight);
    nsresult GetBottom(float *aBottom);
    nsresult GetWidth(float *aWidth);
    nsresult GetHeight(float *aHeight);
}

[
    object,
    uuid(f561753a-1d4f-40c1-b147-ea955fc6fd94),
    local
]
interface nsIDOMElement : nsIDOMNode
{
    nsresult GetTagName(nsAString *aTagName);
    nsresult GetClassList(nsIDOMDOMTokenList **aClassList);
    nsresult GetAttribute(const nsAString *name, nsAString *_retval);
    nsresult GetAttributeNS(const nsAString *namespaceURI, const nsAString *localName, nsAString *_retval);
    nsresult SetAttribute(const nsAString *name, const nsAString *value);
    nsresult SetAttributeNS(const nsAString *namespaceURI, const nsAString *qualifiedName, const nsAString *value);
    nsresult RemoveAttribute(const nsAString *name);
    nsresult RemoveAttributeNS(const nsAString *namespaceURI, const nsAString *localName);
    nsresult HasAttribute(const nsAString *name, bool *_retval);
    nsresult HasAttributeNS(const nsAString *namespaceURI, const nsAString *localName, bool *_retval);
    nsresult GetAttributeNode(const nsAString *name, nsIDOMAttr **_retval);
    nsresult SetAttributeNode(nsIDOMAttr *newAttr, nsIDOMAttr **_retval);
    nsresult RemoveAttributeNode(nsIDOMAttr *oldAttr, nsIDOMAttr **_retval);
    nsresult GetAttributeNodeNS(const nsAString *namespaceURI, const nsAString *localName, nsIDOMAttr **_retval);
    nsresult SetAttributeNodeNS(nsIDOMAttr *newAttr, nsIDOMAttr **_retval);
    nsresult GetElementsByTagName(const nsAString *name, nsIDOMNodeList **_retval);
    nsresult GetElementsByTagNameNS(const nsAString *namespaceURI, const nsAString *localName, nsIDOMNodeList **_retval);
    nsresult GetElementsByClassName(const nsAString *classes, nsIDOMNodeList **_retval);
    nsresult GetChildElements(nsIDOMNodeList **aChildren);
    nsresult GetFirstElementChild(nsIDOMElement **aFirstElementChild);
    nsresult GetLastElementChild(nsIDOMElement **aLastElementChild);
    nsresult GetPreviousElementSibling(nsIDOMElement **aPreviousElementSibling);
    nsresult GetNextElementSibling(nsIDOMElement **aNextElementSibling);
    nsresult GetChildElementCount(PRUint32 *aChildElementCount);
    nsresult GetOnmouseenter(JSContext *cx, jsval *aOnmouseenter);
    nsresult SetOnmouseenter(JSContext *cx, const jsval *aOnmouseenter);
    nsresult GetOnmouseleave(JSContext *cx, jsval *aOnmouseleave);
    nsresult SetOnmouseleave(JSContext *cx, const jsval *aOnmouseleave);
    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 GetScrollWidth(PRInt32 *aScrollWidth);
    nsresult GetScrollHeight(PRInt32 *aScrollHeight);
    nsresult GetClientTop(PRInt32 *aClientTop);
    nsresult GetClientLeft(PRInt32 *aClientLeft);
    nsresult GetClientWidth(PRInt32 *aClientWidth);
    nsresult GetClientHeight(PRInt32 *aClientHeight);
    nsresult MozMatchesSelector(const nsAString *selector, bool *_retval);
    nsresult SetCapture(bool retargetToElement);
    nsresult ReleaseCapture();
}

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

cpp_quote("#undef GetClassName")

[
    object,
    uuid(3de9f8c1-5d76-4d2e-b6b9-334c6eb0c113),
    local
]
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);
    nsresult GetDataset(nsIDOMDOMStringMap **aDataset);
    nsresult GetHidden(bool *aHidden);
    nsresult SetHidden(bool aHidden);
    nsresult Click();
    nsresult GetTabIndex(PRInt32 *aTabIndex);
    nsresult SetTabIndex(PRInt32 aTabIndex);
    nsresult Focus();
    nsresult Blur();
    nsresult GetAccessKey(nsAString *aAccessKey);
    nsresult SetAccessKey(const nsAString *aAccessKey);
    nsresult GetAccessKeyLabel(nsAString *aAccessKeyLabel);
    nsresult GetDraggable(bool *aDraggable);
    nsresult SetDraggable(bool aDraggable);
    nsresult GetContentEditable(nsAString *aContentEditable);
    nsresult SetContentEditable(const nsAString *aContentEditable);
    nsresult GetIsContentEditable(bool *aIsContentEditable);
    nsresult GetContextMenu(nsIDOMHTMLMenuElement **aContextMenu);
    nsresult GetSpellcheck(bool *aSpellcheck);
    nsresult SetSpellcheck(bool aSpellcheck);
    nsresult GetInnerHTML(nsAString *aInnerHTML);
    nsresult SetInnerHTML(const nsAString *aInnerHTML);
    nsresult GetOuterHTML(nsAString *aInnerHTML);
    nsresult SetOuterHTML(const nsAString *aInnerHTML);
    nsresult InsertAdjacentHTML(const nsAString *position, const nsAString *text);
    nsresult ScrollIntoView(bool top, PRUint8 _argc);
    nsresult GetOffsetParent(nsIDOMElement * *aOffsetParent);
    nsresult GetOffsetTop(PRInt32 *aOffsetTop);
    nsresult GetOffsetLeft(PRInt32 *aOffsetLeft);
    nsresult GetOffsetWidth(PRInt32 *aOffsetWidth);
    nsresult GetOffsetHeight(PRInt32 *aOffsetHeight);
    nsresult MozRequestFullScreen();
}

[
    object,
    uuid(b7ccd7b3-86aa-4322-a50c-b972643bb662),
    local
]
interface nsIDOMHTMLCollection : nsISupports
{
    nsresult GetLength(PRUint32 *aLength);
    nsresult Item(PRUint32 index, nsIDOMNode **_retval);
    nsresult NamedItem(const nsAString *name, nsIDOMNode **_retval);
    /* Followed by semi-internal API that we don't want to use */
}

[
    object,
    uuid(cb75c251-afc7-444f-b2d6-b9635555f3ed),
    local
]
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(437ed60c-febd-4bd0-892f-cf358adc3c96),
    local
]
interface nsIDOMText : nsIDOMCharacterData
{
    nsresult SplitText(PRUint32 offset, nsIDOMText **_retval);
    nsresult GetWholeText(nsAString *aWholeText);
}

[
    object,
    uuid(cea49a35-dac9-4c4d-9830-4660abb3b6bc),
    local
]
interface nsIDOMComment : nsIDOMCharacterData
{
}

[
    object,
    uuid(4a15eb0c-d5bc-4902-9d50-21b12cab47e7),
    local
]
interface nsIDOMDocumentFragment : nsIDOMNode
{
}

[
    object,
    uuid(5c3bff4d-ae7f-4c93-948c-519589672c30),
    local
]
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 GetElementsByTagName(const nsAString *tagname, nsIDOMNodeList **_retval);
    nsresult ImportNode(nsIDOMNode *importedNode, bool deep, PRUint8 _argc, 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);
    nsresult GetInputEncoding(nsAString *aInputEncoding);
    nsresult GetDocumentURI(nsAString *aDocumentURI);
    nsresult AdoptNode(nsIDOMNode *source, nsIDOMNode **_retval);
    nsresult CreateRange(nsIDOMRange **_retval);
    nsresult CreateNodeIterator(nsIDOMNode *root, PRUint32 whatToShow, nsIDOMNodeFilter *filter,
            bool entityReferenceExpansion, nsIDOMNodeIterator **_retval);
    nsresult CreateTreeWalker(nsIDOMNode *root, PRUint32 whatToShow, nsIDOMNodeFilter *filter,
            bool entityReferenceExpansion, nsIDOMTreeWalker **_retval);
    cpp_quote("#undef CreateEvent")
    nsresult CreateEvent(const nsAString *eventType, nsIDOMEvent **_retval);
    nsresult GetDefaultView(nsIDOMWindow **aDefaultView);
    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 GetReadyState(nsAString *aReadyState);
    nsresult GetLastModified(nsAString *aLastModified);
    nsresult GetReferrer(nsAString *aReferrer);
    nsresult HasFocus(bool *_retval);
    nsresult GetActiveElement(nsIDOMElement **aActiveElement);
    nsresult GetElementsByClassName(const nsAString *classes, nsIDOMNodeList **_retval);
    nsresult GetStyleSheets(nsIDOMStyleSheetList **aStyleSheets);
    nsresult GetPreferredStyleSheetSet(nsAString *aPreferredStyleSheetSet);
    nsresult GetSelectedStyleSheetSet(nsAString *aSelectedStyleSheetSet);
    nsresult SetSelectedStyleSheetSet(const nsAString *aSelectedStyleSheetSet);
    nsresult GetLastStyleSheetSet(nsAString *aLastStyleSheetSet);
    nsresult GetStyleSheetSets(nsIDOMDOMStringList **aStyleSheetSets);
    nsresult EnableStyleSheetsForSet(const nsAString *name);
    nsresult ElementFromPoint(float x, float y, nsIDOMElement **_retval);
    nsresult GetContentType(nsAString *aContentType);
    nsresult GetMozSyntheticDocument(bool *aMozSyntheticDocument);
    nsresult GetCurrentScript(nsIDOMElement **aCurrentScript);
    nsresult ReleaseCapture();
    nsresult MozSetImageElement(const nsAString *aImageElementId, nsIDOMElement *aImageElement);
    nsresult GetMozFullScreenElement(nsIDOMHTMLElement **aMozFullScreenElement);
    nsresult MozCancelFullScreen();
    nsresult GetMozFullScreen(bool *aMozFullScreen);
    nsresult GetMozFullScreenEnabled(bool *aMozFullScreenEnabled);
    nsresult GetOnreadystatechange(JSContext* cx, jsval aOnreadystatechange);
    nsresult SetOnreadystatechange(JSContext* cx, const jsval *aOnreadystatechange);
    nsresult GetOnmouseenter(JSContext* cx, jsval *aOnmouseenter);
    nsresult SetOnmouseenter(JSContext* cx, const jsval *aOnmouseenter);
    nsresult GetOnmouseleave(JSContext* cx, jsval *aOnmouseleave) = 0;
    nsresult SetOnmouseleave(JSContext* cx, const jsval *aOnmouseleave);
    nsresult GetMozHidden(bool *aMozHidden);
    nsresult GetMozVisibilityState(nsAString *aMozVisibilityState);
}

[
    object,
    uuid(cc1af020-6543-429c-82d7-840cda3be0b9),
    local
]
interface nsIDOMHTMLDocument : nsIDOMDocument
{
    nsresult GetURL(nsAString *aURL);
    nsresult GetDomain(nsAString *aDomain);
    nsresult SetDomain(const nsAString *aDomain);
    nsresult GetCookie(nsAString *aCookie);
    nsresult SetCookie(const nsAString *aCookie);
    nsresult GetCompatMode(nsAString *aCompatMode);
    nsresult GetHead(nsIDOMHTMLHeadElement **aHead);
    nsresult GetBody(nsIDOMHTMLElement **aBody);
    nsresult SetBody(nsIDOMHTMLElement *aBody);
    nsresult GetImages(nsIDOMHTMLCollection **aImages);
    nsresult GetEmbeds(nsIDOMHTMLCollection **aEmbeds);
    nsresult GetPlugins(nsIDOMHTMLCollection **aPlugins);
    nsresult GetLinks(nsIDOMHTMLCollection **aLinks);
    nsresult GetForms(nsIDOMHTMLCollection **aForms);
    nsresult GetScripts(nsIDOMHTMLCollection **aScripts);
    nsresult GetElementsByName(const nsAString *elementName, nsIDOMNodeList **_retval);
    nsresult Open(const nsAString *aContentTypeOrUrl, const nsAString *aReplaceOrName, const nsAString *aFeatures,
            JSContext *cx, PRUint8 _argc, nsISupports **_retval);
    nsresult Close();
    nsresult Write(const nsAString *text, JSContext *cx);
    nsresult Writeln(const nsAString *text, JSContext *cx);
    nsresult GetDesignMode(nsAString *aDesignMode);
    nsresult SetDesignMode(const nsAString *aDesignMode);
    nsresult ExecCommand(const nsAString *commandID, bool doShowUI, const nsAString *value, bool *_retval);
    nsresult ExecCommandShowHelp(const nsAString *commandID, bool *_retval);
    nsresult QueryCommandEnabled(const nsAString *commandID, bool *_retval);
    nsresult QueryCommandIndeterm(const nsAString *commandID, bool *_retval);
    nsresult QueryCommandState(const nsAString *commandID, bool *_retval);
    nsresult QueryCommandSupported(const nsAString *commandID, bool *_retval);
    nsresult QueryCommandText(const nsAString *commandID, nsAString *_retval);
    nsresult QueryCommandValue(const nsAString *commandID, nsAString *_retval);
    nsresult GetFgColor(nsAString *aFgColor);
    nsresult SetFgColor(const nsAString *aFgColor);
    nsresult GetBgColor(nsAString *aBgColor);
    nsresult SetBgColor(const nsAString *aBgColor);
    nsresult GetLinkColor(nsAString *aLinkColor);
    nsresult SetLinkColor(const nsAString *aLinkColor);
    nsresult GetVlinkColor(nsAString *aVlinkColor);
    nsresult SetVlinkColor(const nsAString *aVlinkColor);
    nsresult GetAlinkColor(nsAString *aAlinkColor);
    nsresult SetAlinkColor(const nsAString *aAlinkColor);
    nsresult GetAnchors(nsIDOMHTMLCollection **aAnchors);
    nsresult GetApplets(nsIDOMHTMLCollection **aApplets);
    nsresult Clear();
    nsresult GetSelection(nsISelection **_retval);
    nsresult CaptureEvents(PRInt32 eventFlags);
    nsresult ReleaseEvents(PRInt32 eventFlags);
    nsresult RouteEvent(nsIDOMEvent *evt);
}

[
    object,
    uuid(a6cf90ce-15b3-11d2-932e-00805f8add32),
    local
]
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(bool *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(bool 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(fed93d11-f24d-41d8-ae55-4197927999bb),
    local
]
interface nsIDOMNSRange : nsISupports
{
    nsresult CreateContextualFragment([in] const nsAString *fragment, [out] nsIDOMDocumentFragment **_retval);
    nsresult IsPointInRange([in] nsIDOMNode *parent, [in] PRInt32 offset, [out] bool *_retval);
    nsresult ComparePoint([in] nsIDOMNode *parent, [in] PRInt32 offset, [out] PRInt16 *_retval);
    nsresult GetClientRects(nsIDOMClientRectList **_retval);
    nsresult GetBoundingClientRect(nsIDOMClientRect **_retval);
}


[
    object,
    uuid(5ac0cd5d-3c08-4c4c-8e70-230c433f5d5c),
    local
]
interface nsISelection : nsISupports
{
    nsresult GetAnchorNode(nsIDOMNode **aAnchorNode);
    nsresult GetAnchorOffset(PRInt32 *aAnchorOffset);
    nsresult GetFocusNode(nsIDOMNode **aFocusNode);
    nsresult GetFocusOffset(PRInt32 *aFocusOffset);
    nsresult GetIsCollapsed(bool *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, bool entirelyContained, bool *_retval);
    nsresult SelectAllChildren(nsIDOMNode *parentNode);
    nsresult AddRange(nsIDOMRange *range);
    nsresult RemoveRange(nsIDOMRange *range);
    nsresult RemoveAllRanges();
    nsresult DeleteFromDocument();
    nsresult SelectionLanguageChange(bool langRTL);
    nsresult ToString(PRUnichar **_retval);
    nsresult Modify(const nsAString *alter, const nsAString *direction, const nsAString *granularity);
}

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

[
    object,
    uuid(f6e3b10d-d5f4-4fcd-aa4c-5f98626d428a),
    local
]
interface nsIDOMWindow : nsISupports
{
    nsresult GetWindow(nsIDOMWindow **aWindow);
    nsresult GetSelf(nsIDOMWindow **aSelf);
    nsresult GetDocument(nsIDOMDocument **aDocument);
    nsresult GetName(nsAString *aName);
    nsresult SetName(const nsAString *aName);
    nsresult GetLocation(nsIDOMLocation **aLocation);
    nsresult GetHistory(nsIDOMHistory **aHistory);
    nsresult GetLocationbar(nsIDOMBarProp **aLocationbar);
    nsresult GetMenubar(nsIDOMBarProp **aMenubar);
    nsresult GetPersonalbar(nsIDOMBarProp **aPersonalbar);
    nsresult GetScrollbars(nsIDOMBarProp **aScrollbars);
    nsresult GetStatusbar(nsIDOMBarProp **aStatusbar);
    nsresult GetToolbar(nsIDOMBarProp **aToolbar);
    nsresult GetStatus(nsAString *aStatus);
    nsresult SetStatus(const nsAString *aStatus);
    nsresult Close();
    nsresult Stop();
    nsresult Focus();
    nsresult Blur();
    nsresult GetLength(PRUint32 *aLength);
    nsresult GetTop(nsIDOMWindow **aTop);
    nsresult GetOpener(nsIDOMWindow **aOpener);
    nsresult SetOpener(nsIDOMWindow *aOpener);
    nsresult GetParent(nsIDOMWindow **aParent);
    nsresult GetFrameElement(nsIDOMElement **aFrameElement);
    nsresult GetNavigator(nsIDOMNavigator **aNavigator);
    nsresult GetApplicationCache(nsIDOMOfflineResourceList **aApplicationCache);
    nsresult Alert(const nsAString *text);
    nsresult Confirm(const nsAString *text, bool *_retval);
    nsresult Prompt(const nsAString *aMessage, const nsAString *aInitial, nsAString *_retval);
    nsresult Print();
    nsresult ShowModalDialog(const nsAString *aURI, nsIVariant *aArgs, const nsAString *aOptions, nsIVariant **_retval);
    nsresult PostMessageMoz(const long /*jsval*/ *message, const nsAString *targetOrigin, JSContext *cx);
    nsresult Atob(const nsAString *aAsciiString, nsAString *_retval);
    nsresult Btoa(const nsAString *aBase64Data, nsAString *_retval);
    nsresult GetSessionStorage(nsIDOMStorage **aSessionStorage);
    nsresult GetLocalStorage(nsIDOMStorage **aLocalStorage);
    nsresult GetSelection(nsISelection **_retval);
    nsresult MatchMedia(const nsAString *media_query_list, nsIDOMMediaQueryList **_retval);
    nsresult GetScreen(nsIDOMScreen **aScreen);
    nsresult GetInnerWidth(PRInt32 *aInnerWidth);
    nsresult SetInnerWidth(PRInt32 aInnerWidth);
    nsresult GetInnerHeight(PRInt32 *aInnerHeight);
    nsresult SetInnerHeight(PRInt32 aInnerHeight);
    nsresult GetScrollX(PRInt32 *aScrollX);
    nsresult GetPageXOffset(PRInt32 *aPageXOffset);
    nsresult GetScrollY(PRInt32 *aScrollY);
    nsresult GetPageYOffset(PRInt32 *aPageYOffset);
    nsresult Scroll(PRInt32 xScroll, PRInt32 yScroll);
    nsresult ScrollTo(PRInt32 xScroll, PRInt32 yScroll);
    nsresult ScrollBy(PRInt32 xScrollDif, PRInt32 yScrollDif);
    nsresult GetScreenX(PRInt32 *aScreenX);
    nsresult SetScreenX(PRInt32 aScreenX);
    nsresult GetScreenY(PRInt32 *aScreenY);
    nsresult SetScreenY(PRInt32 aScreenY);
    nsresult GetOuterWidth(PRInt32 *aOuterWidth);
    nsresult SetOuterWidth(PRInt32 aOuterWidth);
    nsresult GetOuterHeight(PRInt32 *aOuterHeight);
    nsresult SetOuterHeight(PRInt32 aOuterHeight);
    nsresult GetComputedStyle(nsIDOMElement *elt, const nsAString *pseudoElt, nsIDOMCSSStyleDeclaration **_retval);
    nsresult GetWindowRoot(nsIDOMEventTarget **aWindowRoot);
    nsresult GetFrames(nsIDOMWindowCollection **aFrames);
    nsresult GetTextZoom(float *aTextZoom);
    nsresult SetTextZoom(float aTextZoom);
    nsresult ScrollByLines(PRInt32 numLines);
    nsresult ScrollByPages(PRInt32 numPages);
    nsresult SizeToContent();
    nsresult GetContent(nsIDOMWindow **aContent);
    nsresult GetPrompter(nsIPrompt **aPrompter);
    nsresult GetClosed(bool *aClosed);
    nsresult GetCrypto(nsIDOMCrypto **aCrypto);
    nsresult GetPkcs11(nsIDOMPkcs11 **aPkcs11);
    nsresult GetControllers(nsIControllers **aControllers);
    nsresult GetDefaultStatus(nsAString *aDefaultStatus);
    nsresult SetDefaultStatus(const nsAString *aDefaultStatus);
    nsresult GetMozInnerScreenX(float *aMozInnerScreenX);
    nsresult GetMozInnerScreenY(float *aMozInnerScreenY);
    nsresult GetScrollMaxX(PRInt32 *aScrollMaxX);
    nsresult GetScrollMaxY(PRInt32 *aScrollMaxY);
    nsresult GetFullScreen(bool *aFullScreen);
    nsresult SetFullScreen(bool aFullScreen);
    nsresult Back();
    nsresult Forward();
    nsresult Home();
    nsresult MoveTo(PRInt32 xPos, PRInt32 yPos);
    nsresult MoveBy(PRInt32 xDif, PRInt32 yDif);
    nsresult ResizeTo(PRInt32 width, PRInt32 height);
    nsresult ResizeBy(PRInt32 widthDif, PRInt32 heightDif);
    nsresult Open(const nsAString *url, const nsAString *name, const nsAString *options, nsIDOMWindow **_retval);
    nsresult OpenDialog(const nsAString *url, const nsAString *name, const nsAString *options, nsISupports *aExtraArgument,
            nsIDOMWindow **_retval);
    nsresult UpdateCommands(const nsAString *action);
    nsresult Find(const nsAString *str, bool caseSensitive, bool backwards, bool wrapAround, bool wholeWord,
            bool searchInFrames, bool showDialog, bool *_retval);
    nsresult GetMozPaintCount(PRUint64 *aMozPaintCount);
    nsresult MozRequestAnimationFrame(nsIFrameRequestCallback *aCallback, PRInt32 *_retval);
    nsresult MozCancelAnimationFrame(PRInt32 aHandle);
    nsresult MozCancelRequestAnimationFrame(PRInt32 aHandle);
    nsresult GetMozAnimationStartTime(PRInt64 *aMozAnimationStartTime);
    nsresult GetURL(nsIDOMMozURLProperty **aURL);
    nsresult GetGlobalStorage(nsIDOMStorageList **aGlobalStorage);
    nsresult GetOnafterprint(JSContext *cx, jsval *aOnafterprint);
    nsresult SetOnafterprint(JSContext *cx, const jsval *aOnafterprint);
    nsresult GetOnbeforeprint(JSContext *cx, jsval *aOnbeforeprint);
    nsresult SetOnbeforeprint(JSContext *cx, const jsval *aOnbeforeprint);
    nsresult GetOnbeforeunload(JSContext *cx, jsval *aOnbeforeunload);
    nsresult SetOnbeforeunload(JSContext *cx, const jsval *aOnbeforeunload);
    nsresult GetOnhashchange(JSContext *cx, jsval *aOnhashchange);
    nsresult SetOnhashchange(JSContext *cx, const jsval *aOnhashchange);
    nsresult GetOnmessage(JSContext *cx, jsval *aOnmessage);
    nsresult SetOnmessage(JSContext *cx, const jsval *aOnmessage);
    nsresult GetOnoffline(JSContext *cx, jsval *aOnoffline);
    nsresult SetOnoffline(JSContext *cx, const jsval *aOnoffline);
    nsresult GetOnonline(JSContext *cx, jsval *aOnonline);
    nsresult SetOnonline(JSContext *cx, const jsval *aOnonline);
    nsresult GetOnpopstate(JSContext *cx, jsval *aOnpopstate);
    nsresult SetOnpopstate(JSContext *cx, const jsval *aOnpopstate);
    nsresult GetOnpagehide(JSContext *cx, jsval *aOnpagehide);
    nsresult SetOnpagehide(JSContext *cx, const jsval *aOnpagehide);
    nsresult GetOnpageshow(JSContext *cx, jsval *aOnpageshow);
    nsresult SetOnpageshow(JSContext *cx, const jsval *aOnpageshow);
    nsresult GetOnresize(JSContext *cx, jsval *aOnresize);
    nsresult SetOnresize(JSContext *cx, const jsval *aOnresize);
    nsresult GetOnunload(JSContext *cx, jsval *aOnunload);
    nsresult SetOnunload(JSContext *cx, const jsval *aOnunload);
    nsresult GetOndevicemotion(JSContext *cx, jsval *aOndevicemotion);
    nsresult SetOndevicemotion(JSContext *cx, const jsval *aOndevicemotion);
    nsresult GetOndeviceorientation(JSContext *cx, jsval *aOndeviceorientation);
    nsresult SetOndeviceorientation(JSContext *cx, const jsval *aOndeviceorientation);
    nsresult GetOnmouseenter(JSContext* cx, jsval *aOnmouseenter);
    nsresult SetOnmouseenter(JSContext* cx, const jsval *aOnmouseenter);
    nsresult GetOnmouseleave(JSContext* cx, jsval *aOnmouseleave) = 0;
    nsresult SetOnmouseleave(JSContext* cx, const jsval *aOnmouseleave);
}

[
    object,
    uuid(fbc08701-776e-47d8-8b14-12b27aadc180),
    local
]
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);
    nsresult GetOnafterprint(JSContext *cx, jsval *aOnafterprint);
    nsresult SetOnafterprint(JSContext *cx, const jsval *aOnafterprint);
    nsresult GetOnbeforeprint(JSContext *cx, jsval *aOnbeforeprint);
    nsresult SetOnbeforeprint(JSContext *cx, const jsval *aOnbeforeprint);
    nsresult GetOnbeforeunload(JSContext *cx, jsval *aOnbeforeunload);
    nsresult SetOnbeforeunload(JSContext *cx, const jsval *aOnbeforeunload);
    nsresult GetOnhashchange(JSContext *cx, jsval *aOnhashchange);
    nsresult SetOnhashchange(JSContext *cx, const jsval *aOnhashchange);
    nsresult GetOnmessage(JSContext *cx, jsval *aOnmessage);
    nsresult SetOnmessage(JSContext *cx, const jsval *aOnmessage);
    nsresult GetOnoffline(JSContext *cx, jsval *aOnoffline);
    nsresult SetOnoffline(JSContext *cx, const jsval *aOnoffline);
    nsresult GetOnonline(JSContext *cx, jsval *aOnonline);
    nsresult SetOnonline(JSContext *cx, const jsval *aOnonline);
    nsresult GetOnpagehide(JSContext *cx, jsval *aOnpagehide);
    nsresult SetOnpagehide(JSContext *cx, const jsval *aOnpagehide);
    nsresult GetOnpageshow(JSContext *cx, jsval *aOnpageshow);
    nsresult SetOnpageshow(JSContext *cx, const jsval *aOnpageshow);
    nsresult GetOnpopstate(JSContext *cx, jsval *aOnpopstate);
    nsresult SetOnpopstate(JSContext *cx, const jsval *aOnpopstate);
    nsresult GetOnresize(JSContext *cx, jsval *aOnresize);
    nsresult SetOnresize(JSContext *cx, const jsval *aOnresize);
    nsresult GetOnunload(JSContext *cx, jsval *aOnunload);
    nsresult SetOnunload(JSContext *cx, const jsval *aOnunload);
}

[
    object,
    uuid(b0fa651a-134c-4b20-ba4d-35b956a4fc50),
    local
]
interface nsIDOMHTMLFormElement : nsIDOMHTMLElement
{
    nsresult GetAcceptCharset(nsAString *aAcceptCharset);
    nsresult SetAcceptCharset(const nsAString *aAcceptCharset);
    nsresult GetAction(nsAString *aAction);
    nsresult SetAction(const nsAString *aAction);
    nsresult GetAutocomplete(nsAString *aAutocomplete);
    nsresult SetAutocomplete(const nsAString *aAutocomplete);
    nsresult GetEnctype(nsAString *aEnctype);
    nsresult SetEnctype(const nsAString *aEnctype);
    nsresult GetEncoding(nsAString *aEncoding);
    nsresult SetEncoding(const nsAString *aEncoding);
    nsresult GetMethod(nsAString *aMethod);
    nsresult SetMethod(const nsAString *aMethod);
    nsresult GetName(nsAString *aName);
    nsresult SetName(const nsAString *aName);
    nsresult GetNoValidate(bool *aNoValidate);
    nsresult SetNoValidate(bool aNoValidate);
    nsresult GetTarget(nsAString *aTarget);
    nsresult SetTarget(const nsAString *aTarget);
    nsresult GetElements(nsIDOMHTMLCollection **aElements);
    nsresult GetLength(PRInt32 *aLength);
    nsresult Submit();
    nsresult Reset();
    nsresult CheckValidity(bool *_retval);
}

[
    object,
    uuid(6b1175a5-70dd-4c26-be99-9e780c32550d),
    local
]
interface nsIDOMHTMLInputElement : nsIDOMHTMLElement
{
    nsresult GetAccept(nsAString *aAccept);
    nsresult SetAccept(const nsAString *aAccept);
    nsresult GetAlt(nsAString *aAlt);
    nsresult SetAlt(const nsAString *aAlt);
    nsresult GetAutocomplete(nsAString *aAutocomplete);
    nsresult SetAutocomplete(const nsAString *aAutocomplete);
    nsresult GetAutofocus(bool *aAutofocus);
    nsresult SetAutofocus(bool aAutofocus);
    nsresult GetDefaultChecked(bool *aDefaultChecked);
    nsresult SetDefaultChecked(bool aDefaultChecked);
    nsresult GetChecked(bool *aChecked);
    nsresult SetChecked(bool aChecked);
    nsresult GetDisabled(bool *aDisabled);
    nsresult SetDisabled(bool aDisabled);
    nsresult GetForm(nsIDOMHTMLFormElement **aForm);
    nsresult GetFormAction(nsAString *aFormAction);
    nsresult SetFormAction(const nsAString *aFormAction);
    nsresult GetFormEnctype(nsAString *aFormEnctype);
    nsresult SetFormEnctype(const nsAString *aFormEnctype);
    nsresult GetFormMethod(nsAString *aFormMethod);
    nsresult SetFormMethod(const nsAString *aFormMethod);
    nsresult GetFormNoValidate(bool *aFormNoValidate);
    nsresult SetFormNoValidate(bool aFormNoValidate);
    nsresult GetFormTarget(nsAString *aFormTarget);
    nsresult SetFormTarget(const nsAString *aFormTarget);
    nsresult GetFiles(nsIDOMFileList **aFiles);
    nsresult GetIndeterminate(bool *aIndeterminate);
    nsresult SetIndeterminate(bool aIndeterminate);
    nsresult GetList(nsIDOMHTMLElement **aList);
    nsresult GetMaxLength(PRInt32 *aMaxLength);
    nsresult SetMaxLength(PRInt32 aMaxLength);
    nsresult GetMultiple(bool *aMultiple);
    nsresult SetMultiple(bool aMultiple);
    nsresult GetName(nsAString *aName);
    nsresult SetName(const nsAString *aName);
    nsresult GetPattern(nsAString *aPattern);
    nsresult SetPattern(const nsAString *aPattern);
    nsresult GetPlaceholder(nsAString *aPlaceholder);
    nsresult SetPlaceholder(const nsAString *aPlaceholder);
    nsresult GetReadOnly(bool *aReadOnly);
    nsresult SetReadOnly(bool aReadOnly);
    nsresult GetRequired(bool *aRequired);
    nsresult SetRequired(bool aRequired);
    nsresult GetAlign(nsAString *aAlign);
    nsresult SetAlign(const nsAString *aAlign);
    nsresult GetSize(PRUint32 *aSize);
    nsresult SetSize(PRUint32 aSize);
    nsresult GetSrc(nsAString *aSrc);
    nsresult SetSrc(const nsAString *aSrc);
    nsresult GetType(nsAString *aType);
    nsresult SetType(const nsAString *aType);
    nsresult GetDefaultValue(nsAString *aDefaultValue);
    nsresult SetDefaultValue(const nsAString *aDefaultValue);
    nsresult GetValue(nsAString *aValue);
    nsresult SetValue(const nsAString *aValue);
    nsresult GetWillValidate(bool *aWillValidate);
    nsresult GetValidity(nsIDOMValidityState **aValidity);
    nsresult GetValidationMessage(nsAString *aValidationMessage);
    nsresult CheckValidity(bool *_retval);
    nsresult SetCustomValidity(const nsAString *error);
    nsresult Select();
    nsresult GetSelectionStart(PRInt32 *aSelectionStart);
    nsresult SetSelectionStart(PRInt32 aSelectionStart);
    nsresult GetSelectionEnd(PRInt32 *aSelectionEnd);
    nsresult SetSelectionEnd(PRInt32 aSelectionEnd);
    nsresult SetSelectionRange(PRInt32 selectionStart, PRInt32 selectionEnd, const nsAString *direction);
    nsresult GetSelectionDirection(nsAString *aSelectionDirection);
    nsresult SetSelectionDirection(const nsAString *aSelectionDirection);
    nsresult GetUseMap(nsAString *aUseMap);
    nsresult SetUseMap(const nsAString *aUseMap);
    nsresult GetControllers(nsIControllers **aControllers);
    nsresult GetTextLength(PRInt32 *aTextLength);
    nsresult MozGetFileNameArray(PRUint32 *aLength, PRUnichar ***aFileNames);
    nsresult MozSetFileNameArray(const PRUnichar **aFileNames, PRUint32 aLength);
    nsresult MozIsTextField(bool aExcludePassword, bool *_retval);
}

[
    object,
    uuid(ec3cfb59-a945-4821-8ea6-2448970e7639),
    local
]
interface nsIDOMHTMLOptionElement : nsIDOMHTMLElement
{
    nsresult GetDisabled(bool *aDisabled);
    nsresult SetDisabled(bool aDisabled);
    nsresult GetForm(nsIDOMHTMLFormElement **aForm);
    nsresult GetLabel(nsAString *aLabel);
    nsresult SetLabel(const nsAString *aLabel);
    nsresult GetDefaultSelected(bool *aDefaultSelected);
    nsresult SetDefaultSelected(bool aDefaultSelected);
    nsresult GetSelected(bool *aSelected);
    nsresult SetSelected(bool aSelected);
    nsresult GetValue(nsAString *aValue);
    nsresult SetValue(const nsAString *aValue);
    nsresult GetText(nsAString *aText);
    nsresult SetText(const nsAString *aText);
    nsresult GetIndex(PRInt32 *aIndex);
}

[
    object,
    uuid(429b041b-06df-486c-9a3a-a1d901cc76a2),
    local
]
interface nsIDOMHTMLOptionsCollection : nsISupports
{
    typedef int nsWrapperCache;

    nsresult GetLength(PRUint32 *aLength);
    nsresult SetLength(PRUint32 aLength);
    nsresult Item(PRUint32 index, nsIDOMNode **_retval);
    nsresult NamedItem(const nsAString *name, nsIDOMNode **_retval);
    nsISupports* __cdecl GetNamedItem(const nsAString *name, nsWrapperCache **cache);
    nsresult GetSelectedIndex(PRInt32 *aSelectedIndex);
    nsresult SetSelectedIndex(PRInt32 aSelectedIndex);
    nsresult SetOption(PRUint32 index, nsIDOMHTMLOptionElement *option);
    nsresult GetSelect(nsIDOMHTMLSelectElement **aSelect);
    nsresult Add(nsIDOMHTMLOptionElement *option, nsIVariant *before);
    nsresult Remove(PRInt32 index);
}

[
    object,
    uuid(6f0a4fee-3aea-4bb7-85cb-d4881a55ca43),
    local
]
interface nsIDOMHTMLSelectElement : nsIDOMHTMLElement
{
    nsresult GetAutofocus(bool *aAutofocus);
    nsresult SetAutofocus(bool aAutofocus);
    nsresult GetDisabled(bool *aDisabled);
    nsresult SetDisabled(bool aDisabled);
    nsresult GetForm(nsIDOMHTMLFormElement **aForm);
    nsresult GetMultiple(bool *aMultiple);
    nsresult SetMultiple(bool aMultiple);
    nsresult GetName(nsAString *aName);
    nsresult SetName(const nsAString *aName);
    nsresult GetSize(PRInt32 *aSize);
    nsresult SetSize(PRInt32 aSize);
    nsresult GetType(nsAString *aType);
    nsresult GetOptions(nsIDOMHTMLOptionsCollection **aOptions);
    nsresult GetLength(PRUint32 *aLength);
    nsresult SetLength(PRUint32 aLength);
    nsresult Item(PRUint32 index, nsIDOMNode **_retval);
    nsresult NamedItem(const nsAString *name, nsIDOMNode **_retval);
    nsresult Add(nsIDOMHTMLElement *element, nsIVariant *before);
    nsresult Remove(PRInt32 index);
    nsresult GetSelectedIndex(PRInt32 *aSelectedIndex);
    nsresult SetSelectedIndex(PRInt32 aSelectedIndex);
    nsresult GetValue(nsAString *aValue);
    nsresult SetValue(const nsAString *aValue);
    nsresult GetWillValidate(bool *aWillValidate);
    nsresult GetValidity(nsIDOMValidityState **aValidity);
    nsresult GetValidationMessage(nsAString *aValidationMessage);
    nsresult CheckValidity(bool *_retval);
    nsresult SetCustomValidity(const nsAString *error);
    nsresult GetRequired(bool *aRequired);
    nsresult SetRequired(bool aRequired);
}

[
    object,
    uuid(0ad0571c-f8ba-44e2-b5aa-5e1c93fae7c0),
    local
]
interface nsIDOMHTMLTextAreaElement : nsIDOMHTMLElement
{
    nsresult GetAutofocus(bool *aAutofocus);
    nsresult SetAutofocus(bool aAutofocus);
    nsresult GetCols(PRUint32 *aCols);
    nsresult SetCols(PRUint32 aCols);
    nsresult GetDisabled(bool *aDisabled);
    nsresult SetDisabled(bool aDisabled);
    nsresult GetForm(nsIDOMHTMLFormElement **aForm);
    nsresult GetMaxLength(PRInt32 *aMaxLength);
    nsresult SetMaxLength(PRInt32 aMaxLength);
    nsresult GetName(nsAString *aName);
    nsresult SetName(const nsAString *aName);
    nsresult GetPlaceholder(nsAString *aPlaceholder);
    nsresult SetPlaceholder(const nsAString *aPlaceholder);
    nsresult GetReadOnly(bool *aReadOnly);
    nsresult SetReadOnly(bool aReadOnly);
    nsresult GetRequired(bool *aRequired);
    nsresult SetRequired(bool aRequired);
    nsresult GetRows(PRUint32 *aRows);
    nsresult SetRows(PRUint32 aRows);
    nsresult GetWrap(nsAString *aWrap);
    nsresult SetWrap(const nsAString *aWrap);
    nsresult GetType(nsAString *aType);
    nsresult GetDefaultValue(nsAString *aDefaultValue);
    nsresult SetDefaultValue(const nsAString *aDefaultValue);
    nsresult GetValue(nsAString *aValue);
    nsresult SetValue(const nsAString *aValue);
    nsresult GetTextLength(PRInt32 *aTextLength);
    nsresult GetWillValidate(bool *aWillValidate);
    nsresult GetValidity(nsIDOMValidityState **aValidity);
    nsresult GetValidationMessage(nsAString *aValidationMessage);
    nsresult CheckValidity(bool *_retval);
    nsresult SetCustomValidity(const nsAString *error);
    nsresult Select();
    nsresult GetSelectionStart(PRInt32 *aSelectionStart);
    nsresult SetSelectionStart(PRInt32 aSelectionStart);
    nsresult GetSelectionEnd(PRInt32 *aSelectionEnd);
    nsresult SetSelectionEnd(PRInt32 aSelectionEnd);
    nsresult SetSelectionRange(PRInt32 selectionStart, PRInt32 selectionEnd, const nsAString *direction);
    nsresult GetSelectionDirection(nsAString *aSelectionDirection);
    nsresult SetSelectionDirection(const nsAString *aSelectionDirection);
    nsresult GetControllers(nsIControllers **aControllers);
}

[
    object,
    uuid(8b79bf24-d127-4b63-a798-f44bee76204d),
    local
]
interface nsIDOMHTMLScriptElement : nsIDOMHTMLElement
{
    nsresult GetSrc(nsAString *aSrc);
    nsresult SetSrc(const nsAString *aSrc);
    nsresult GetAsync(bool *aAsync);
    nsresult SetAsync(bool aAsync);
    nsresult GetDefer(bool *aDefer);
    nsresult SetDefer(bool aDefer);
    nsresult GetType(nsAString *aType);
    nsresult SetType(const nsAString *aType);
    nsresult GetCharset(nsAString *aCharset);
    nsresult SetCharset(const nsAString *aCharset);
    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);
}

[
    object,
    uuid(3ed7023f-24be-4cd6-984c-c182a6b67bf9),
    local
]
interface nsIDOMHTMLImageElement : nsIDOMHTMLElement
{
    nsresult GetAlt(nsAString *aAlt);
    nsresult SetAlt(const nsAString *aAlt);
    nsresult GetSrc(nsAString *aSrc);
    nsresult SetSrc(const nsAString *aSrc);
    nsresult GetCrossOrigin(nsAString *aCrossOrigin);
    nsresult SetCrossOrigin(const nsAString *aCrossOrigin);
    nsresult GetUseMap(nsAString *aUseMap);
    nsresult SetUseMap(const nsAString *aUseMap);
    nsresult GetIsMap(bool *aIsMap);
    nsresult SetIsMap(bool aIsMap);
    nsresult GetWidth(PRUint32 *aWidth);
    nsresult SetWidth(PRUint32 aWidth);
    nsresult GetHeight(PRUint32 *aHeight);
    nsresult SetHeight(PRUint32 aHeight);
    nsresult GetNaturalWidth(PRUint32 *aNaturalWidth);
    nsresult GetNaturalHeight(PRUint32 *aNaturalHeight);
    nsresult GetComplete(bool *aComplete);
    nsresult GetName(nsAString *aName);
    nsresult SetName(const nsAString *aName);
    nsresult GetAlign(nsAString *aAlign);
    nsresult SetAlign(const nsAString *aAlign);
    nsresult GetBorder(nsAString *aBorder);
    nsresult SetBorder(const nsAString *aBorder);
    nsresult GetHspace(PRInt32 *aHspace);
    nsresult SetHspace(PRInt32 aHspace);
    nsresult GetLongDesc(nsAString *aLongDesc);
    nsresult SetLongDesc(const nsAString *aLongDesc);
    nsresult GetVspace(PRInt32 *aVspace);
    nsresult SetVspace(PRInt32 aVspace);
    nsresult GetLowsrc(nsAString *aLowsrc);
    nsresult SetLowsrc(const nsAString *aLowsrc);
}

[
    object,
    uuid(44a9c8e1-2c95-41e4-86f1-96033a452a4d),
    local
]
interface nsIDOMHTMLAnchorElement : nsIDOMHTMLElement
{
    nsresult GetHref(nsAString *aHref);
    nsresult SetHref(const nsAString *aHref);
    nsresult GetTarget(nsAString *aTarget);
    nsresult SetTarget(const nsAString *aTarget);
    nsresult GetPing(nsAString *aPing);
    nsresult SetPing(const nsAString *aPing);
    nsresult GetRel(nsAString *aRel);
    nsresult SetRel(const nsAString *aRel);
    nsresult GetHreflang(nsAString *aHreflang);
    nsresult SetHreflang(const nsAString *aHreflang);
    nsresult GetType(nsAString *aType);
    nsresult SetType(const nsAString *aType);
    nsresult GetText(nsAString *aText);
    nsresult SetText(const nsAString *aText);
    nsresult GetProtocol(nsAString *aProtocol);
    nsresult SetProtocol(const nsAString *aProtocol);
    nsresult GetHost(nsAString *aHost);
    nsresult SetHost(const nsAString *aHost);
    nsresult GetHostname(nsAString *aHostname);
    nsresult SetHostname(const nsAString *aHostname);
    nsresult GetPort(nsAString *aPort);
    nsresult SetPort(const nsAString *aPort);
    nsresult GetPathname(nsAString *aPathname);
    nsresult SetPathname(const nsAString *aPathname);
    nsresult GetSearch(nsAString *aSearch);
    nsresult SetSearch(const nsAString *aSearch);
    nsresult GetHash(nsAString *aHash);
    nsresult SetHash(const nsAString *aHash);
    nsresult GetCharset(nsAString *aCharset);
    nsresult SetCharset(const nsAString *aCharset);
    nsresult GetCoords(nsAString *aCoords);
    nsresult SetCoords(const nsAString *aCoords);
    nsresult GetName(nsAString *aName);
    nsresult SetName(const nsAString *aName);
    nsresult GetRev(nsAString *aRev);
    nsresult SetRev(const nsAString *aRev);
    nsresult GetShape(nsAString *aShape);
    nsresult SetShape(const nsAString *aShape);
    nsresult ToString(nsAString *_retval);
}

[
    object,
    uuid(7b9d43a6-7e9e-4618-970b-29eb3547d506),
    local
]
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(f76a1d42-25b9-41b9-a58e-7d934e1be0a2),
    local
]
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(d4e870bd-452c-4860-b93c-f4ee00ba33f6),
    local
]
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);
    nsresult GetContentWindow(nsIDOMWindow **aContentWindow);
    nsresult GetMozAllowFullScreen(bool *aMozAllowFullScreen);
    nsresult SetMozAllowFullScreen(bool aMozAllowFullScreen);
}

[
    object,
    uuid(4b529afd-ada8-4a2c-a70b-a4e2ead2329d),
    local
]
interface nsIDOMHTMLFrameElement : nsIDOMHTMLElement
{
    nsresult GetFrameBorder(nsAString *aFrameBorder);
    nsresult SetFrameBorder(const nsAString *aFrameBorder);
    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 GetNoResize(bool *aNoResize);
    nsresult SetNoResize(bool aNoResize);
    nsresult GetScrolling(nsAString *aScrolling);
    nsresult SetScrolling(const nsAString *aScrolling);
    nsresult GetSrc(nsAString *aSrc);
    nsresult SetSrc(const nsAString *aSrc);
    nsresult GetContentDocument(nsIDOMDocument **aContentDocument);
    nsresult GetContentWindow(nsIDOMWindow **aContentWindow);
}

[
    object,
    uuid(dbb14d7b-05ce-4abd-a980-9aedede612af),
    local
]
interface nsIDOMHTMLObjectElement : nsIDOMHTMLElement
{
    nsresult GetForm(nsIDOMHTMLFormElement **aForm);
    nsresult GetCode(nsAString *aCode);
    nsresult SetCode(const nsAString *aCode);
    nsresult GetAlign(nsAString *aAlign);
    nsresult SetAlign(const nsAString *aAlign);
    nsresult GetArchive(nsAString *aArchive);
    nsresult SetArchive(const nsAString *aArchive);
    nsresult GetBorder(nsAString *aBorder);
    nsresult SetBorder(const nsAString *aBorder);
    nsresult GetCodeBase(nsAString *aCodeBase);
    nsresult SetCodeBase(const nsAString *aCodeBase);
    nsresult GetCodeType(nsAString *aCodeType);
    nsresult SetCodeType(const nsAString *aCodeType);
    nsresult GetData(nsAString *aData);
    nsresult SetData(const nsAString *aData);
    nsresult GetDeclare(bool *aDeclare);
    nsresult SetDeclare(bool aDeclare);
    nsresult GetHeight(nsAString *aHeight);
    nsresult SetHeight(const nsAString *aHeight);
    nsresult GetHspace(PRInt32 *aHspace);
    nsresult SetHspace(PRInt32 aHspace);
    nsresult GetName(nsAString *aName);
    nsresult SetName(const nsAString *aName);
    nsresult GetStandby(nsAString *aStandby);
    nsresult SetStandby(const nsAString *aStandby);
    nsresult GetType(nsAString *aType);
    nsresult SetType(const nsAString *aType);
    nsresult GetUseMap(nsAString *aUseMap);
    nsresult SetUseMap(const nsAString *aUseMap);
    nsresult GetVspace(PRInt32 *aVspace);
    nsresult SetVspace(PRInt32 aVspace);
    nsresult GetWidth(nsAString *aWidth);
    nsresult SetWidth(const nsAString *aWidth);
    nsresult GetContentDocument(nsIDOMDocument **aContentDocument);
    nsresult GetWillValidate(bool *aWillValidate);
    nsresult GetValidity(nsIDOMValidityState **aValidity);
    nsresult GetValidationMessage(nsAString *aValidationMessage);
    nsresult CheckValidity(bool *_retval);
    nsresult SetCustomValidity(const nsAString *error);
}

[
    object,
    uuid(1f0685fb-bf49-4c39-b08d-7d75b1e5e493),
    local
]
interface nsIDOMHTMLParamElement : nsIDOMHTMLElement
{
    nsresult GetName(nsAString *aName);
    nsresult SetName(const nsAString *aName);
    nsresult GetType(nsAString *aType);
    nsresult SetType(const nsAString *aType);
    nsresult GetValue(nsAString *aValue);
    nsresult SetValue(const nsAString *aValue);
    nsresult GetValueType(nsAString *aValueType);
    nsresult SetValueType(const nsAString *aValueType);
}

[
    object,
    uuid(04c29aaa-2239-42a9-ade0-0ba3134c1a8e),
    local
]
interface nsIDOMHTMLStyleElement : nsIDOMHTMLElement
{
    nsresult GetDisabled(bool *aDisabled);
    nsresult SetDisabled(bool aDisabled);
    nsresult GetMedia(nsAString *aMedia);
    nsresult SetMedia(const nsAString *aMedia);
    nsresult GetType(nsAString *aType);
    nsresult SetType(const nsAString *aType);
}

[
    object,
    uuid(94928ab3-8b63-11d3-989d-001083010e9b),
    local
]
interface nsIURIContentListener : nsISupports
{
    nsresult OnStartURIOpen(nsIURI *aURI, bool *_retval);
    nsresult DoContent(const char *aContentType, bool aIsContentPreferred, nsIRequest *aRequest,
        nsIStreamListener **aContentHandler, bool *_retval);
    nsresult IsPreferred(const char *aContentType, char **aDesiredContentType, bool *_retval);
    nsresult CanHandleContent(const char *aContentType, bool aIsContentPreferred,
        char **aDesiredContentType, bool *_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
]
interface nsITooltipListener : nsISupports
{
    nsresult OnShowTooltip(PRInt32 aXCoords, PRInt32 aYCoords, const PRUnichar *aTipText);
    nsresult OnHideTooltip();
}

[
    object,
    uuid(33e9d001-caab-4ba9-8961-54902f197202),
    local
]
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);
    nsresult GetIsActive(bool *aIsActive);
    nsresult SetIsActive(bool aIsActive);
}

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

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

typedef void* nativeWindow;

[
    object,
    uuid(7144ac8b-6702-4a4b-a73d-d1d4e9717e46),
    local
]
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, bool fRepaint);
    nsresult GetSize(PRInt32 *cx, PRInt32 *cy);
    nsresult SetPositionAndSize(PRInt32 x, PRInt32 y, PRInt32 cx, PRInt32 cy, bool fRepaint);
    nsresult GetPositionAndSize(PRInt32 *x, PRInt32 *y, PRInt32 *cx, PRInt32 *cy);
    nsresult Repaint(bool force);
    nsresult GetParentWidget(nsIWidget **aParentWidget);
    nsresult SetParentWidget(nsIWidget *aParentWidget);
    nsresult GetParentNativeWindow(nativeWindow *aParentNativeWindow);
    nsresult SetParentNativeWindow(nativeWindow aParentNativeWindow);
    nsresult GetVisibility(bool *aVisibility);
    nsresult SetVisibility(bool aVisibility);
    nsresult GetEnabled(bool *aEnabled);
    nsresult SetEnabled(bool aEnabled);
    nsresult GetMainWidget(nsIWidget **aMainWidget);
    nsresult SetFocus();
    nsresult GetTitle(PRUnichar **aTitle);
    nsresult SetTitle(const PRUnichar *aTitle);
}

cpp_quote("#define LOAD_FLAGS_NONE           0x00000000")
cpp_quote("#define LOAD_REPLACE              0x00040000")
cpp_quote("#define LOAD_INITIAL_DOCUMENT_URI 0x00080000")

[
    object,
    uuid(f5d9e7b0-d930-11d3-b057-00a024ffc08c),
    local
]
interface nsIWebNavigation : nsISupports
{
    nsresult GetCanGoBack(bool *aCanGoBack);
    nsresult GetCanGoForward(bool *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(570f39d0-efd0-11d3-b093-00a024ffc08c),
    local
]
interface nsIWebProgress : nsISupports
{
    nsresult AddProgressListener(nsIWebProgressListener *aListener, PRUint32 aNotifyMask);
    nsresult RemoveProgressListener(nsIWebProgressListener *aListener);
    nsresult GetDOMWindow(nsIDOMWindow **aDOMWindow);
    nsresult GetIsLoadingDocument(bool *aIsLoadingDocument);
}

[
    object,
    uuid(4404c94b-0506-4255-9e3c-4582dba6cfbb),
    local
]
interface nsIPrintSettings : nsISupports
{
    typedef struct { char dummy; } nsIntMargin;

    nsresult SetPrintOptions(PRInt32 aType, bool aTurnOnOff);
    nsresult GetPrintOptions(PRInt32 aType, bool *_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(bool *aPrintBGColors);
    nsresult SetPrintBGColors(bool aPrintBGColors);
    nsresult GetPrintBGImages(bool *aPrintBGImages);
    nsresult SetPrintBGImages(bool 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(bool *aIsCancelled);
    nsresult SetIsCancelled(bool aIsCancelled);
    nsresult GetPrintFrameTypeUsage(PRInt16 *aPrintFrameTypeUsage);
    nsresult SetPrintFrameTypeUsage(PRInt16 aPrintFrameTypeUsage);
    nsresult GetPrintFrameType(PRInt16 *aPrintFrameType);
    nsresult SetPrintFrameType(PRInt16 aPrintFrameType);
    nsresult GetPrintSilent(bool *aPrintSilent);
    nsresult SetPrintSilent(bool aPrintSilent);
    nsresult GetShrinkToFit(bool *aShrinkToFit);
    nsresult SetShrinkToFit(bool aShrinkToFit);
    nsresult GetShowPrintProgress(bool *aShowPrintProgress);
    nsresult SetShowPrintProgress(bool 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(bool *aDownloadFonts);
    nsresult SetDownloadFonts(bool aDownloadFonts);
    nsresult GetPrintReversed(bool *aPrintReversed);
    nsresult SetPrintReversed(bool aPrintReversed);
    nsresult GetPrintInColor(bool *aPrintInColor);
    nsresult SetPrintInColor(bool 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(bool *aPrintToFile);
    nsresult SetPrintToFile(bool 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(bool *aIsInitializedFromPrinter);
    nsresult SetIsInitializedFromPrinter(bool aIsInitializedFromPrinter);
    nsresult GetIsInitializedFromPrefs(bool *aIsInitializedFromPrefs);
    nsresult SetIsInitializedFromPrefs(bool aIsInitializedFromPrefs);
    nsresult SetMarginInTwips(nsIntMargin *aMargin);
    nsresult SetEdgeInTwips(nsIntMargin *aEdge);
    nsresult GetMarginInTwips(nsIntMargin *aMargin);
    nsresult GetEdgeInTwips(nsIntMargin *aEdge);
    nsresult SetupSilentPrinting();
    nsresult SetUnwriteableMarginInTwips(nsIntMargin *aEdge);
    nsresult GetUnwriteableMarginInTwips(nsIntMargin *aEdge);
    nsresult GetPageRanges(void * /*nsTArray<PRInt32>&*/ aPages);
}

[
    object,
    uuid(9a7ca4b0-fbba-11d4-a869-00105a183419),
    local
]
interface nsIWebBrowserPrint : nsISupports
{
    nsresult GetGlobalPrintSettings(nsIPrintSettings **aGlobalPrintSettings);
    nsresult GetCurrentPrintSettings(nsIPrintSettings **aCurrentPrintSettings);
    nsresult GetCurrentChildDOMWindow(nsIDOMWindow **aCurrentChildDOMWindow);
    nsresult GetDoingPrint(bool *aDoingPrint);
    nsresult GetDoingPrintPreview(bool *aDoingPrintPreview);
    nsresult GetIsFramesetDocument(bool *aIsFramesetDocument);
    nsresult GetIsFramesetFrameSelected(bool *aIsFramesetFrameSelected);
    nsresult GetIsIFrameSelected(bool *aIsIFrameSelected);
    nsresult GetIsRangeSelection(bool *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
]
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(bool *verticalVisible, bool *horizontalVisible);
}

[
    object,
    uuid(c8c0a080-0868-11d3-915f-d9d889d48e3c),
    local
]
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(bool 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 GetLastModifiedTimeOfLink(PRInt64 *aLastModifiedTimeOfLink);
    nsresult SetLastModifiedTimeOfLink(PRInt64 aLastModifiedTimeOfLink);
    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(bool *_retval);
    nsresult IsWritable(bool *_retval);
    nsresult IsReadable(bool *_retval);
    nsresult IsExecutable(bool *_retval);
    nsresult IsHidden(bool *_retval);
    nsresult IsDirectory(bool *_retval);
    nsresult IsFile(bool *_retval);
    nsresult IsSymlink(bool *_retval);
    nsresult IsSpecial(bool *_retval);
    nsresult CreateUnique(PRUint32 type, PRUint32 permission);
    nsresult Clone(nsIFile **_retval);
    nsresult Equals(nsIFile *inFile, bool *_retval);
    nsresult Contains(nsIFile *inFile, bool recir, bool *_retval);
    nsresult GetParent(nsIFile **aParent);
    nsresult GetDirectoryEntries(nsISimpleEnumerator **aDirectoryEntries);
}

[
    object,
    uuid(e162bfa0-01bd-4e9f-9843-8fb2efcd6d1f),
    local
]
interface nsIPrefBranch : nsISupports
{
    nsresult GetRoot(char **aRoot);
    nsresult GetPrefType(const char *aPrefName, PRInt32 *_retval);
    nsresult GetBoolPref(const char *aPrefName, bool *_retval);
    nsresult SetBoolPref(const char *aPrefName, bool 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, bool *_retval);
    nsresult PrefIsLocked(const char *aPrefName, bool *_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(bbf8cab0-d43a-11d3-8cc2-00609792278c),
    local
]
interface nsIDirectoryServiceProvider : nsISupports
{
    nsresult GetFile(const char *prop, bool *persistent, nsIFile **_retval);
}

[
    object,
    uuid(15fd6940-8ea7-11d3-93ad-00104ba0fd40),
    local
]
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, bool *_retval);
}

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

[
    object,
    uuid(bddeda3f-9020-4d12-8c70-984ee9f7935e),
    local
]
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(bool *aOffline);
    nsresult SetOffline(bool aOffline);
    nsresult AllowPort(PRInt32 aPort, const char *aScheme, bool *_retval);
    nsresult ExtractScheme(const nsACString *urlString, nsACString *_retval);
}

[
    object,
    uuid(ca68c485-9db3-4c12-82a6-4fab7948e2d5),
    local,
]
interface nsINetUtil : nsISupports
{
    nsresult ParseContentType(const nsACString *aTypeHeader, nsACString *aCharset,
            bool *aHadCharset, nsACString *_retval);
    nsresult ProtocolHasFlags(nsIURI *aURI, PRUint32 aFlag, bool *_retval);
    nsresult URIChainHasFlags(nsIURI *aURI, PRUint32 aFlags, bool *_retval);
    nsresult ToImmutableURI(nsIURI *aURI, nsIURI **_retval);
    nsresult NewSimpleNestedURI(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, bool *_retval);
}

[
    object,
    uuid(9c5d3c58-1dd1-11b2-a1c9-f3699284657a),
    local
]
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
]
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(bool *_retval);
    nsresult ExitModalEventLoop(nsresult aStatus);
}

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

[
    object,
    uuid(8e375931-298d-4d0a-9cb4-5668f0cdc5a8),
    local
]
interface nsIDOMEventTarget : nsISupports
{
    nsresult AddEventListener(const nsAString *type, nsIDOMEventListener *listener, bool useCapture, bool wantsUntrusted, PRUint8 _argc);
    nsresult AddSystemEventListener(const nsAString *type, nsIDOMEventListener *listener, bool aUseCapture, bool aWantsUntrusted, PRUint8 _argc);
    nsresult RemoveEventListener(const nsAString *type, nsIDOMEventListener *listener, bool useCapture);
    nsresult RemoveSystemEventListener(const nsAString *type, nsIDOMEventListener *listener, bool aUseCapture);
    nsresult DispatchEvent(nsIDOMEvent *evt, bool *_retval);

    /* Followed by methods we should try to avoid using */
}

[
    object,
    uuid(e85cff74-951f-45c1-be0c-89442ea2f500),
    local
]
interface nsIDOMEvent : nsISupports
{
    nsresult GetType(nsAString *aType);
    nsresult GetTarget(nsIDOMEventTarget **aTarget);
    nsresult GetCurrentTarget(nsIDOMEventTarget **aCurrentTarget);
    nsresult GetEventPhase(PRUint16 *aEventPhase);
    nsresult GetBubbles(bool *aBubbles);
    nsresult GetCancelable(bool *aCancelable);
    nsresult GetTimeStamp(DOMTimeStamp *aTimeStamp);
    nsresult StopPropagation();
    nsresult PreventDefault();
    nsresult InitEvent(const nsAString *eventTypeArg, bool canBubbleArg, bool cancelableArg);
    nsresult GetDefaultPrevented(bool *aDefaultPrevented);
    nsresult StopImmediatePropagation();
}

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
]
interface nsIContextMenuListener : nsISupports
{
    nsresult OnShowContextMenu(PRUint32 aContextFlags, nsIDOMEvent *aEvent, nsIDOMNode *aNode);
}

[
    object,
    uuid(af3f130e-0c22-4613-a150-780a46c22e3a),
    local
]
interface nsIDOMUIEvent : nsIDOMEvent
{
    nsresult GetView(nsIDOMWindow **aView);
    nsresult GetDetail(PRInt32 *aDetail);
    nsresult InitUIEvent(const nsAString *typeArg, bool canBubbleArg, bool cancelableArg,
            nsIDOMWindow *viewArg, PRInt32 detailArg);
    nsresult GetLayerX(PRInt32 *aLayerX);
    nsresult GetLayerY(PRInt32 *aLayerY);
    nsresult GetPageX(PRInt32 *aPageX);
    nsresult GetPageY(PRInt32 *aPageY);
    nsresult GetWhich(PRUint32 *aWhich);
    nsresult GetRangeParent(nsIDOMNode * *aRangeParent);
    nsresult GetRangeOffset(PRInt32 *aRangeOffset);
    nsresult GetCancelBubble(bool *aCancelBubble);
    nsresult SetCancelBubble(bool aCancelBubble);
    nsresult GetIsChar(bool *aIsChar);
}

[
    object,
    uuid(7f57aa45-6792-4d8b-ba5b-201533cf0b2f),
    local
]
interface nsIDOMMouseEvent : nsIDOMUIEvent
{
    nsresult GetScreenX(PRInt32 *aScreenX);
    nsresult GetScreenY(PRInt32 *aScreenY);
    nsresult GetClientX(PRInt32 *aClientX);
    nsresult GetClientY(PRInt32 *aClientY);
    nsresult GetCtrlKey(bool *aCtrlKey);
    nsresult GetShiftKey(bool *aShiftKey);
    nsresult GetAltKey(bool *aAltKey);
    nsresult GetMetaKey(bool *aMetaKey);
    nsresult GetButton(PRUint16 *aButton);
    nsresult GetRelatedTarget(nsIDOMEventTarget **aRelatedTarget);
    nsresult InitMouseEvent(const nsAString *typeArg, bool canBubbleArg, bool cancelableArg,
            nsIDOMWindow *viewArg, PRInt32 detailArg, PRInt32 screenXArg, PRInt32 screenYArg,
            PRInt32 clientXArg, PRInt32 clientYArg, bool ctrlKeyArg, bool altKeyArg,
            bool shiftKeyArg, bool metaKeyArg, PRUint16 buttonArg,
            nsIDOMEventTarget *relatedTargetArg);
    nsresult GetMozPressure(float *aMozPressure);
    nsresult GetMozInputSource(PRUint16 *aMozInputSource);
    nsresult InitNSMouseEvent(const nsAString *typeArg, bool canBubbleArg, bool cancelableArg,
            nsIDOMWindow *viewArg, PRInt32 detailArg, PRInt32 screenXArg, PRInt32 screenYArg,
            PRInt32 clientXArg, PRInt32 clientYArg, bool ctrlKeyArg, bool altKeyArg, bool shiftKeyArg,
            bool metaKeyArg, PRUint16 buttonArg, nsIDOMEventTarget *relatedTargetArg, float pressure,
            PRUint16 inputSourceArg);
}

[
    object,
    uuid(def974c3-b491-481b-bc67-29174af4b26a),
    local
]
interface nsIDOMKeyEvent : nsIDOMUIEvent
{
    nsresult GetCharCode(PRUint32 *aCharCode);
    nsresult GetKeyCode(PRUint32 *aKeyCode);
    nsresult GetAltKey(bool *aAltKey);
    nsresult GetCtrlKey(bool *aCtrlKey);
    nsresult GetShiftKey(bool *aShiftKey);
    nsresult GetMetaKey(bool *aMetaKey);
    nsresult InitKeyEvent(const nsAString *typeArg, bool canBubbleArg,
            bool cancelableArg, nsIDOMWindow *viewArg, bool ctrlKeyArg,
            bool altKeyArg, bool shiftKeyArg, bool metaKeyArg, PRUint32 keyCodeArg,
            PRUint32 charCodeArg);
}

[
    object,
    uuid(3e5432cd-9568-4bd1-8cbe-d50aba110743),
    local
]
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(bool *aVisibility);
    nsresult SetVisibility(bool aVisibility);
    nsresult GetTitle(PRUnichar **aTitle);
    nsresult SetTitle(const PRUnichar *aTitle);
    nsresult GetSiteWindow(void **aSiteWindow);
}

[
    object,
    uuid(2417cbfe-65ad-48a6-b4b6-eb84db174392),
    local
]
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, bool *_retval);
    nsresult IsContractIDRegistered(const char *aContractID, bool *_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
]
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, bool *aCheckState);
    nsresult Confirm(nsIDOMWindow *aParent, const PRUnichar *aDialogTitle,
            const PRUnichar *aText, bool *_retval);
    nsresult ConfirmCheck(nsIDOMWindow *aParent, const PRUnichar *aDialogTitle,
            const PRUnichar *aText, const PRUnichar *aCheckMsg, bool *aCheckState,
            bool *_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, bool *aCheckState, PRInt32 *_retval);
    nsresult Prompt(nsIDOMWindow *aParent, const PRUnichar *aDialogTitle,
            const PRUnichar *aText, PRUnichar **aValue, const PRUnichar *aCheckMsg,
            bool *aCheckState, bool *_retval);
    nsresult PromptUsernameAndPassword(nsIDOMWindow *aParent, const PRUnichar *aDialogTitle,
            const PRUnichar *aText, PRUnichar **aUsername, PRUnichar **aPassword,
            const PRUnichar *aCheckMsg, bool *aCheckState, bool *_retval);
    nsresult PromptPassword(nsIDOMWindow *aParent, const PRUnichar *aDialogTitle,
            const PRUnichar *aText, PRUnichar **aPassword, const PRUnichar *aCheckMsg,
            bool *aCheckState, bool *_retval);
    nsresult Select(nsIDOMWindow *aParent, const PRUnichar *aDialogTitle,
            const PRUnichar *aText, PRUint32 aCount, const PRUnichar **aSelectList,
            PRInt32 *aOutSelection, bool *_retval);
}

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

[
    object,
    uuid(02b0625a-e7f3-11d2-9f5a-006008a6efe9),
    local
]
interface nsIProfile : nsISupports
{
    nsresult GetProfileCount(PRInt32 *aProfileCount);
    nsresult GetProfileList(PRUint32 *length, PRUnichar ***profileNames);
    nsresult ProfileExists(const PRUnichar *profileName, bool *_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,
            bool useExistingDir);
    nsresult RenameProfile(const PRUnichar *oldName, const PRUnichar *newName);
    nsresult DeleteProfile(const PRUnichar *name, bool canDeleteFiles);
    nsresult CloneProfile(const PRUnichar *profileName);
}

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

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

[
    object,
    uuid(002286a8-494b-43b3-8ddd-49e3fc50622b),
    local
]
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(24f3f4da-18a4-448d-876d-7360fefac029),
    local
]
interface nsIEditingSession : nsISupports
{
    nsresult GetEditorStatus(PRUint32 *aEditorStatus);
    nsresult MakeWindowEditable(nsIDOMWindow *window, const char *aEditorType,
            bool doAfterUriLoad, bool aMakeWholeDocumentEditable, bool aInteractive);
    nsresult WindowIsEditable(nsIDOMWindow *window, bool *_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);
    nsresult GetJsAndPluginsDisabled(bool *aJsAndPluginsDisabled);
}

[
    object,
    uuid(83f892cf-7ed3-490e-967a-62640f3158e1),
    local
]
interface nsICommandParams : nsISupports
{
    nsresult GetValueType(const char *name, PRInt16 *_retval);
    nsresult GetBooleanValue(const char *name, bool *_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, bool 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(bool *_retval);
    nsresult First();
    nsresult GetNext(char **_retval);
}

[
    object,
    uuid(080d2001-f91e-11d4-a73c-f9242928207c),
    local
]
interface nsICommandManager : nsISupports
{
    nsresult AddCommandObserver(nsIObserver *aCommandObserver, const char *aCommandToObserve);
    nsresult RemoveCommandObserver(nsIObserver *aCommandObserver, const char *aCommandObserved);
    nsresult IsCommandSupported(const char *aCommandName, nsIDOMWindow *aTargetWindow, bool *_retval);
    nsresult IsCommandEnabled(const char *aCommandName, nsIDOMWindow *aTargetWindow, bool *_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
]
interface nsIControllerContext : nsISupports
{
    nsresult Init(nsIControllerCommandTable *aCommandTable);
    nsresult SetCommandContext(nsISupports *aCommandContext);
}

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

[
    object,
    uuid(dc68f070-226d-11e1-bfc2-0800200c9a66),
    local
]
interface nsIContent : nsISupports
{
    /* This is not a real interface declaration. It's too internal for us. */
}

[
    object,
    uuid(283ec27d-5b23-49b2-94d9-09b5db453073),
    local
]
interface nsIDocument : nsISupports
{
    /* This is not a real interface declaration. It's too internal for us. */
}

[
    object,
    uuid(b1ee32f2-b8c4-49b9-93df-b6fab5d54688),
    local
]
interface nsIContentSerializer : nsISupports
{
    nsresult Init(PRUint32 flags, PRUint32 aWrapColumn, const char *aCharSet, bool aIsCopying,
            bool aIsWholeDocument);
    nsresult AppendText(nsIContent *aText, PRInt32 aStartOffset, PRInt32 aEndOffset, nsAString *aStr);
    nsresult AppendCDATASection(nsIContent *aCDATASection, PRInt32 aStartOffset,
            PRInt32 aEndOffset, nsAString *aStr);
    nsresult AppendProcessingInstruction(nsIContent *aPI, PRInt32 aStartOffset,
            PRInt32 aEndOffset, nsAString *aStr);
    nsresult AppendComment(nsIContent *aComment, PRInt32 aStartOffset, PRInt32 aEndOffset,
            nsAString *aStr);
    nsresult AppendDoctype(nsIContent *aDoctype, nsAString *aStr);
    nsresult AppendElementStart(nsIContent *aElement, nsIContent *aOriginalElement,
                                nsAString *aStr);
    nsresult AppendElementEnd(nsIContent *aElement, nsAString *aStr);
    nsresult Flush(nsAString *aStr);
    nsresult AppendDocumentStart(nsIDocument *aDocument, nsAString *aStr);
}

[
    object,
    uuid(20ee0b70-c528-11e0-9572-0800200c9a66),
    local
]
interface nsIEditor  : nsISupports
{
    typedef void *nsIContentPtr;

    nsresult GetSelection([out] nsISelection *_retval);
    nsresult Init([in] nsIDOMDocument *doc, [in] nsIContentPtr aRoot, [in] nsISelectionController *aSelCon, [in] PRUint32 aFlags);
    nsresult SetAttributeOrEquivalent([in] nsIDOMElement *element, [in] const nsAString *sourceAttrName, [in] const nsAString *sourceAttrValue, [in] bool aSuppressTransaction);
    nsresult RemoveAttributeOrEquivalent([in] nsIDOMElement *element, [in] const nsAString *sourceAttrName, [in] bool 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] bool *_retval);
    nsresult GetIsSelectionEditable(bool *aIsSelectionEditable);
    nsresult GetDocument([out] nsIDOMDocument **_retval);
    nsresult GetRootElement([out] nsIDOMElement **_retval);
    nsresult GetSelectionController([out] nsISelectionController **_retval);
    nsresult DeleteSelection([in] PRInt16 action);
    nsresult GetDocumentIsEmpty([out] bool *_retval);
    nsresult GetDocumentModified([out] bool *_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] bool enable);
    nsresult Undo([in] PRUint32 count);
    nsresult CanUndo([out] bool *isEnabled, [out] bool *canUndo);
    nsresult Redo([in] PRUint32 count);
    nsresult CanRedo([out] bool *isEnabled, [out] bool *canRedo);
    nsresult BeginTransaction();
    nsresult EndTransaction();
    nsresult BeginPlaceHolderTransaction([in] nsIAtom *name);
    nsresult EndPlaceHolderTransaction();
    nsresult ShouldTxnSetSelection([out] bool *_retval);
    nsresult SetShouldTxnSetSelection([in] bool should);
    nsresult GetInlineSpellChecker([out] nsIInlineSpellChecker **_retval);
    nsresult SyncRealTimeSpell();
    nsresult SetSpellcheckUserOverride(bool enable);
    nsresult Cut();
    nsresult CanCut([out] bool *_retval);
    nsresult Copy();
    nsresult CanCopy([out] bool *_retval);
    nsresult Paste([in] PRInt32 aSelectionType);
    nsresult PasteTransferable(nsITransferable *aTransferable);
    nsresult CanPaste([in] PRInt32 aSelectionType, [out] bool *_retval);
    nsresult CanPasteTransferable(nsITransferable *aTransferable, bool *_retval);
    nsresult SelectAll();
    nsresult BeginningOfDocument();
    nsresult EndOfDocument();
    nsresult CanDrag([in] nsIDOMEvent *aEvent, [out] bool *_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, bool *_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);
    bool IsModifiableNode(nsIDOMNode *aNode);
    nsresult GetLastKeypressEventTrusted(bool *aLastKeypressEventTrusted);
}

[
    object,
    uuid(d58f35a7-c269-4292-b9aa-a79e200a7c99),
    local
]
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] bool *aFirst, [out] bool *aAny, [out] bool *aAll);
    nsresult GetInlinePropertyWithAttrValue([in] nsIAtom *aProperty, [in] nsAString *aAttribute, [in] nsAString *aValue, [out] bool *aFirst, [out] bool *aAny, [out] bool *aAll, [out] nsAString *_retval);
    nsresult RemoveAllInlineProperties();
    nsresult RemoveInlineProperty([in] nsIAtom *aProperty, [in] nsAString *aAttribute);
    nsresult IncreaseFontSize();
    nsresult DecreaseFontSize();
    nsresult CanDrag([in] nsIDOMEvent *aEvent, [out] bool *_retval);
    nsresult DoDrag([in] nsIDOMEvent *aEvent);
    nsresult InsertFromDrop([in] nsIDOMEvent *aEvent);
    nsresult NodeIsBlock([in] nsIDOMNode *node, bool *_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] bool aDeleteSelection);
    nsresult InsertElementAtSelection([in] nsIDOMElement *aElement, [in] bool 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] bool *aMixed, [out] nsAString *_retval);
    nsresult GetFontFaceState([out] bool *aMixed, [out] nsAString *_retval);
    nsresult GetFontColorState([out] bool *aMixed, [out] nsAString *_retval);
    nsresult GetBackgroundColorState([out] bool *aMixed, [out] nsAString *_retval);
    nsresult GetHighlightColorState([out] bool *aMixed, [out] nsAString *_retval);
    nsresult GetListState([out] bool *aMixed, [out] bool *aOL, [out] bool *aUL, [out] bool *aDL);
    nsresult GetListItemState([out] bool *aMixed, [out] bool *aLI, [out] bool *aDT, [out] bool *aDD);
    nsresult GetAlignment([out] bool *aMixed, [out] PRInt16 *aAlign);
    nsresult GetIndentState([out] bool *aCanIndent, [out] bool *aCanOutdent);
    nsresult MakeOrChangeList([in] nsAString *aListType, [in] bool 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] bool aIgnoreSpuriousDragEvent);
    nsresult GetLinkedObjects([out] nsISupportsArray **_retval);
    nsresult GetIsCSSEnabled([out] bool *_retval);
    nsresult SetIsCSSEnabled([in] bool prb);
    nsresult AddInsertionListener([in] nsIContentFilter *inFilter);
    nsresult RemoveInsertionListener([in] nsIContentFilter *inFilter);
    nsresult CreateAnonymousElement([in] nsAString *aTag, [in] nsIDOMNode *aParentNode, [in] nsAString *aAnonClass, [in] bool aIsCreatedHidden, [out] nsIDOMElement **_retval);
    nsresult GetSelectionContainer([out] nsIDOMElement **_retval);
    nsresult CheckSelectionStateForAnonymousButtons([in] nsISelection *aSelection);
    nsresult IsAnonymousElement([in] nsIDOMElement *aElement, [out] bool *_retval);
    nsresult GetReturnInParagraphCreatesNewParagraph([out] bool *_retval);
    nsresult SetReturnInParagraphCreatesNewParagraph([in] bool prb);
    nsresult BreakIsVisible(nsIDOMNode *aNode, bool *_retval);
    nsIContent *GetActiveEditingHost();
}

[
    object,
    uuid(0666adf8-8738-4ca7-a917-0348f47d2f40),
    local
]
interface nsIDocShell : nsISupports
{
    nsresult LoadURI(nsIURI *uri, nsIDocShellLoadInfo *loadInfo, PRUint32 aLoadFlags, bool firstParty);
    nsresult LoadStream(nsIInputStream *aStream, nsIURI *aURI, const nsACString *aContentType,
            const nsACString *aContentCharset, nsIDocShellLoadInfo *aLoadInfo);
    nsresult InternalLoad(nsIURI *aURI, nsIURI *aReferrer, nsISupports *aOwner, PRUint32 aFlags, const PRUnichar *aWindowTarget,
            const char *aTypeHint, nsIInputStream *aPostDataStream, nsIInputStream *aHeadersStream, PRUint32 aLoadFlags,
            nsISHEntry *aSHEntry, bool firstParty, nsIDocShell **aDocShell, nsIRequest **aRequest);
    nsresult AddState(nsIVariant *aData, const nsAString *aTitle, const nsAString *aURL, bool aReplace, JSContext *cx);
    nsresult CreateLoadInfo(nsIDocShellLoadInfo **loadInfo);
    nsresult PrepareForNewContentModel();
    nsresult SetCurrentURI(nsIURI *aURI);
    nsresult FirePageHideNotification(bool isUnload);
    nsresult GetPresContext(void /*nsPresContext*/ **aPresContext);
    nsresult GetPresShell(nsIPresShell **aPresShell);
    nsresult GetEldestPresShell(nsIPresShell **aEldestPresShell);
    nsresult GetContentViewer(nsIContentViewer **aContentViewer);
    nsresult GetChromeEventHandler(nsIDOMEventTarget **aChromeEventHandler);
    nsresult SetChromeEventHandler(nsIDOMEventTarget *aChromeEventHandler);
    nsresult GetDocumentCharsetInfo(nsIDocumentCharsetInfo **aDocumentCharsetInfo);
    nsresult SetDocumentCharsetInfo(nsIDocumentCharsetInfo *aDocumentCharsetInfo);
    nsresult GetAllowPlugins(bool *aAllowPlugins);
    nsresult SetAllowPlugins(bool aAllowPlugins);
    nsresult GetAllowJavascript(bool *aAllowJavascript);
    nsresult SetAllowJavascript(bool aAllowJavascript);
    nsresult GetAllowMetaRedirects(bool *aAllowMetaRedirects);
    nsresult SetAllowMetaRedirects(bool aAllowMetaRedirects);
    nsresult GetAllowSubframes(bool *aAllowSubframes);
    nsresult SetAllowSubframes(bool aAllowSubframes);
    nsresult GetAllowImages(bool *aAllowImages);
    nsresult SetAllowImages(bool aAllowImages);
    nsresult GetAllowDNSPrefetch(bool *aAllowDNSPrefetch);
    nsresult SetAllowDNSPrefetch(bool aAllowDNSPrefetch);
    nsresult GetAllowWindowControl(bool *aAllowWindowControl);
    nsresult SetAllowWindowControl(bool aAllowWindowControl);
    nsresult GetDocShellEnumerator(PRInt32 aItemType, PRInt32 aDirection, nsISimpleEnumerator **_retval);
    nsresult GetAppType(PRUint32 *aAppType);
    nsresult SetAppType(PRUint32 aAppType);
    nsresult GetAllowAuth(bool *aAllowAuth);
    nsresult SetAllowAuth(bool aAllowAuth);
    nsresult GetZoom(float *aZoom);
    nsresult SetZoom(float aZoom);
    nsresult GetMarginWidth(PRInt32 *aMarginWidth);
    nsresult SetMarginWidth(PRInt32 aMarginWidth);
    nsresult GetMarginHeight(PRInt32 *aMarginHeight);
    nsresult SetMarginHeight(PRInt32 aMarginHeight);
    nsresult TabToTreeOwner(bool forward, bool *tookFocus);
    nsresult GetBusyFlags(PRUint32 *aBusyFlags);
    nsresult GetLoadType(PRUint32 *aLoadType);
    nsresult SetLoadType(PRUint32 aLoadType);
    nsresult IsBeingDestroyed(bool *_retval);
    nsresult GetIsExecutingOnLoadHandler(bool *aIsExecutingOnLoadHandler);
    nsresult GetLayoutHistoryState(nsILayoutHistoryState **aLayoutHistoryState);
    nsresult SetLayoutHistoryState(nsILayoutHistoryState *aLayoutHistoryState);
    nsresult GetShouldSaveLayoutState(bool *aShouldSaveLayoutState);
    nsresult GetSecurityUI(nsISecureBrowserUI **aSecurityUI);
    nsresult SetSecurityUI(nsISecureBrowserUI *aSecurityUI);
    nsresult SuspendRefreshURIs();
    nsresult ResumeRefreshURIs();
    nsresult BeginRestore(nsIContentViewer *viewer, bool top);
    nsresult FinishRestore();
    nsresult GetRestoringDocument(bool *aRestoringDocument);
    nsresult GetUseErrorPages(bool *aUseErrorPages);
    nsresult SetUseErrorPages(bool aUseErrorPages);
    nsresult GetPreviousTransIndex(PRInt32 *aPreviousTransIndex);
    nsresult GetLoadedTransIndex(PRInt32 *aLoadedTransIndex);
    nsresult HistoryPurged(PRInt32 numEntries);
    nsresult GetSessionStorageForURI(nsIURI *uri, const nsAString *documentURI, nsIDOMStorage **_retval);
    nsresult GetSessionStorageForPrincipal(nsIPrincipal *principal, const nsAString *documentURI,
            bool create, nsIDOMStorage **_retval);
    nsresult AddSessionStorage(nsIPrincipal *principal, nsIDOMStorage *storage);
    nsresult GetCurrentDocumentChannel(nsIChannel **aCurrentDocumentChannel);
    nsresult SetChildOffset(PRUint32 offset);
    nsresult GetIsInUnload(bool *aIsInUnload);
    nsresult GetChannelIsUnsafe(bool *aChannelIsUnsafe);
    void DetachEditorFromWindow();
    nsresult GetIsOffScreenBrowser(bool *aIsOffScreenBrowser);
    nsresult SetIsOffScreenBrowser(bool aIsOffScreenBrowser);
    nsresult GetPrintPreview(nsIWebBrowserPrint **aPrintPreview);
    nsresult GetCanExecuteScripts(bool *aCanExecuteScripts);
    nsresult GetIsActive(bool *aIsActive);
    nsresult SetIsActive(bool aIsActive);
    nsresult GetHistoryID(PRUint64 *aHistoryID);
    nsresult GetIsAppTab(bool *aIsAppTab);
    nsresult SetIsAppTab(bool aIsAppTab);
    nsresult CreateAboutBlankContentViewer(nsIPrincipal *aPrincipal);
}

[
    object,
    uuid(85eea794-ed8e-4e1b-a128-d09300ae51aa),
    local
]
interface nsIMutationObserver : nsISupports
{
    void CharacterDataWillChange(nsIDocument *aDocument, nsIContent *aContent,
                                 void /*CharacterDataChangeInfo*/ *aInfo);
    void CharacterDataChanged(nsIDocument *aDocument, nsIContent *aContent,
                              void /*CharacterDataChangeInfo*/ *aInfo);
    void AttributeWillChange(nsIDocument *aDocument, nsIContent *aContent, PRInt32 aNameSpaceID,
                             nsIAtom *aAttribute, PRInt32 aModType);
    void AttributeChanged(nsIDocument *aDocument, nsIContent *aContent, PRInt32 aNameSpaceID,
                          nsIAtom *aAttribute, PRInt32 aModType);
    void ContentAppended(nsIDocument *aDocument, nsIContent *aContainer, nsIContent *aFirstNewContent,
                         PRInt32 aNewIndexInContainer);
    void ContentInserted(nsIDocument *aDocument, nsIContent *aContainer, nsIContent *aChild,
                         PRInt32 aIndexInContainer);
    void ContentRemoved(nsIDocument *aDocument, nsIContent *aContainer, nsIContent *aChild,
                        PRInt32 aIndexInContainer, nsIContent *aPreviousSibling);
    void NodeWillBeDestroyed(const nsINode *aNode);
    void ParentChainChanged(nsIContent *aContent);
}

[
    object,
    uuid(c9169398-897a-481d-a95f-d6606ef83756),
    local
]
interface nsIParser : nsISupports
{
    typedef int nsDTDMode;
    typedef int eParserCommands;

    void SetContentSink(nsIContentSink *aSink);
    nsIContentSink *GetContentSink();
    void GetCommand(nsACString *aCommand);
    void SetCommand2(const char *aCommand);
    void SetCommand(eParserCommands aParserCommand);
    void SetDocumentCharset(const nsACString *aCharset, PRInt32 aSource);
    void GetDocumentCharset(nsACString *oCharset, PRInt32 *oSource);
    void SetParserFilter(nsIParserFilter *aFilter);
    nsresult GetChannel(nsIChannel **aChannel);
    nsresult GetDTD(nsIDTD **aDTD);
    nsIStreamListener *GetStreamListener();
    nsresult ContinueInterruptedParsing();
    void BlockParser();
    void UnblockParser();
    bool IsParserEnabled();
    bool IsComplete();
    nsresult Parse(nsIURI *aURL, nsIRequestObserver *aListener, void *aKey, nsDTDMode aMode);
    nsresult Parse2(const nsAString *aSourceBuffer, void *aKey, const nsACString *aMimeType, bool aLastCall, nsDTDMode aMode);
    void *GetRootContextKey();
    nsresult Terminate();
    nsresult ParseFragment(const nsAString *aSourceBuffer, void /*nsTArray<nsString>*/ *aTagStack);
    nsresult BuildModel();
    nsresult CancelParsingEvents();
    void Reset();
    bool CanInterrupt();
    bool IsInsertionPointDefined();
    void BeginEvaluatingParserInsertedScript();
    void EndEvaluatingParserInsertedScript();
    void MarkAsNotScriptCreated(const char *aCommand);
    bool IsScriptCreated();
}

[
    object,
    uuid(900bc4bc-8b6c-4cba-82fa-568a80fffd3e),
    local
]
interface nsIDocumentObserver : nsIMutationObserver
{
    typedef PRUint32 nsUpdateType;

    typedef struct {
        PRUint64 mStates;
    } nsEventStates;

    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 *aContent, nsEventStates *aStateMask);
    void DocumentStatesChanged(nsIDocument *aDocument, nsEventStates *aStateMask);
    void StyleSheetAdded(nsIDocument *aDocument, nsIStyleSheet *aStyleSheet, bool aDocumentSheet);
    void StyleSheetRemoved(nsIDocument *aDocument, nsIStyleSheet *aStyleSheet, bool aDocumentSheet);
    void StyleSheetApplicableStateChanged(nsIDocument *aDocument, nsIStyleSheet *aStyleSheet,
                                          bool 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 AttemptToExecuteScript(nsIContent *aContent, nsIParser *aParser, bool *aBlock);
}

[
    object,
    uuid(3682dd99-8560-44f4-9b8f-ccce9d7b96fb),
    local
]
interface nsIContentUtils : nsISupports
{
    bool IsSafeToRunScript();
    nsresult AddDocumentObserver(nsIDocument *aDocument, nsIDocumentObserver *aObserver);
    nsresult RemoveDocumentObserver(nsIDocument *aDocument, nsIDocumentObserver *aObserver);
    nsresult AddMutationObserver(nsINode *aNode, nsIMutationObserver *aObserver);
    nsresult RemoveMutationObserver(nsINode *aNode, nsIMutationObserver *aObserver);
    nsresult AddScriptRunner(nsIRunnable *aRunnable);
}

[
    object,
    uuid(8f672000-bab9-4c60-aaaf-2673c4e2a4c6),
    local
]
interface nsIPluginInstance : nsISupports
{
    nsresult GetDOMElement(nsIDOMElement **aDOMElement);
}
