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

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

import "oaidl.idl";
import "ocidl.idl";
import "IWebScriptObject.idl";

interface IWebScriptObject;
interface IDOMNodeList;
interface IDOMNamedNodeMap;
interface IDOMDocumentType;
interface IDOMElement;
interface IDOMDocumentFragment;
interface IDOMText;
interface IDOMComment;
interface IDOMCDATASection;
interface IDOMProcessingInstruction;
interface IDOMAttr;
interface IDOMEntityReference;
interface IDOMDocument;
interface IDOMCSSStyleDeclaration;
/*
    @interface DOMObject : WebScriptObject <NSCopying>
*/
[
    object,
    oleautomation,
    uuid(A27FA225-F34E-425d-88EB-A35BD105A527),
    pointer_default(unique)
]
interface IDOMObject : IWebScriptObject
{
}

/*
    @interface DOMImplementation : DOMObject
*/
[
    object,
    oleautomation,
    uuid(6E48C25D-E542-4d1a-BC73-ACDC21E39C56),
    pointer_default(unique)
]
interface IDOMImplementation : IDOMObject
{
    /*
        - (BOOL)hasFeature:(NSString *)feature :(NSString *)version;
    */
    HRESULT hasFeature([in] BSTR feature, [in] BSTR version, [out, retval] BOOL* result);

    /*
        - (DOMDocumentType *)createDocumentType:(NSString *)qualifiedName :(NSString *)publicId :(NSString *)systemId;
    */
    HRESULT createDocumentType([in] BSTR qualifiedName, [in] BSTR publicId, [in] BSTR systemId, [out, retval] IDOMDocumentType** result);

    /*
        - (DOMDocument *)createDocument:(NSString *)namespaceURI :(NSString *)qualifiedName :(DOMDocumentType *)doctype;
    */
    HRESULT createDocument([in] BSTR namespaceURI, [in] BSTR qualifiedName, [in] IDOMDocumentType* doctype, [out, retval] IDOMDocument** result);
}

/*
    @interface DOMNode : DOMObject <DOMEventTarget>
*/
[
    object,
    oleautomation,
    uuid(3EEA3E20-72DA-4be7-954F-79B5A14AD726),
    pointer_default(unique)
]
interface IDOMNode : IDOMObject
{
    /*
        - (NSString *)nodeName;
    */
    HRESULT nodeName([out, retval] BSTR* result);

    /*
        - (NSString *)nodeValue;
    */
    HRESULT nodeValue([out, retval] BSTR* result);

    /*
        - (void)setNodeValue:(NSString *)string;
    */
    HRESULT setNodeValue([in] BSTR value);

    /*
        - (unsigned short)nodeType;
    */
    HRESULT nodeType([out, retval] unsigned short* result);

    /*
        - (DOMNode *)parentNode;
    */
    HRESULT parentNode([out, retval] IDOMNode** result);

    /*
        - (DOMNodeList *)childNodes;
    */
    HRESULT childNodes([out, retval] IDOMNodeList** result);

    /*
        - (DOMNode *)firstChild;
    */
    HRESULT firstChild([out, retval] IDOMNode** result);

    /*
        - (DOMNode *)lastChild;
    */
    HRESULT lastChild([out, retval] IDOMNode** result);

    /*
        - (DOMNode *)previousSibling;
    */
    HRESULT previousSibling([out, retval] IDOMNode** result);

    /*
        - (DOMNode *)nextSibling;
    */
    HRESULT nextSibling([out, retval] IDOMNode** result);

    /*
        - (DOMNamedNodeMap *)attributes;
    */
    HRESULT attributes([out, retval] IDOMNamedNodeMap** result);

    /*
        - (DOMDocument *)ownerDocument;
    */
    HRESULT ownerDocument([out, retval] IDOMDocument** result);

    /*
        - (DOMNode *)insertBefore:(DOMNode *)newChild :(DOMNode *)refChild;
    */
    HRESULT insertBefore([in] IDOMNode* newChild, [in] IDOMNode* refChild, [out, retval] IDOMNode** result);

    /*
        - (DOMNode *)replaceChild:(DOMNode *)newChild :(DOMNode *)oldChild;
    */
    HRESULT replaceChild([in] IDOMNode* newChild, [in] IDOMNode* oldChild, [out, retval] IDOMNode** result);

    /*
        - (DOMNode *)removeChild:(DOMNode *)oldChild;
    */
    HRESULT removeChild([in] IDOMNode* oldChild, [out, retval] IDOMNode** result);

    /*
        - (DOMNode *)appendChild:(DOMNode *)newChild;
    */
    HRESULT appendChild([in] IDOMNode* oldChild, [out, retval] IDOMNode** result);

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

    /*
        - (DOMNode *)cloneNode:(BOOL)deep;
    */
    HRESULT cloneNode([in] BOOL deep, [out, retval] IDOMNode** result);

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

    /*
        - (BOOL)isSupported:(NSString *)feature :(NSString *)version;
    */
    HRESULT isSupported([in] BSTR feature, [in] BSTR version, [out, retval] BOOL* result);

    /*
        - (NSString *)namespaceURI;
    */
    HRESULT namespaceURI([out, retval] BSTR* result);

    /*
        - (NSString *)prefix;
    */
    HRESULT prefix([out, retval] BSTR* result);

    /*
        - (void)setPrefix:(NSString *)prefix;
    */
    HRESULT setPrefix([in] BSTR prefix);

    /*
        - (NSString *)localName;
    */
    HRESULT localName([out, retval] BSTR* result);

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

    /*
        - (BOOL)isSameNode:(DOMNode *)other;
    */
    HRESULT isSameNode([in] IDOMNode* other, [out, retval] BOOL* result);

    /*
        - (BOOL)isEqualNode:(DOMNode *)other;
    */
    HRESULT isEqualNode([in] IDOMNode* other, [out, retval] BOOL* result); 

    /*
        - (NSString *)textContent;
    */
    HRESULT textContent([out, retval] BSTR* result);

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

/*
    @interface DOMNodeList : DOMObject
*/
[
    object,
    oleautomation,
    uuid(10A05A96-CBD9-4493-83AD-FAFB952615CE),
    pointer_default(unique)
]
interface IDOMNodeList : IDOMObject
{
    /*
        - (DOMNode *)item:(unsigned)index;
    */
    HRESULT item([in] UINT index, [out, retval] IDOMNode** result);

    /*
        - (unsigned)length;
    */
    HRESULT length([out, retval] UINT* result);
}

/*
    @interface DOMNamedNodeMap : DOMObject
*/
[
    object,
    oleautomation,
    uuid(E6CBF396-C9F9-431b-A8D6-BCB525067E9F),
    pointer_default(unique)
]
interface IDOMNamedNodeMap : IDOMObject
{
    /*
        - (DOMNode *)getNamedItem:(NSString *)name;
    */
    HRESULT getNamedItem([in] BSTR name, [out, retval] IDOMNode** result);

    /*
        - (DOMNode *)setNamedItem:(DOMNode *)arg;
    */
    HRESULT setNamedItem([in] IDOMNode* arg, [out, retval] IDOMNode** result);

    /*
        - (DOMNode *)removeNamedItem:(NSString *)name;
    */
    HRESULT removeNamedItem([in] BSTR name, [out, retval] IDOMNode** result);

    /*
        - (DOMNode *)item:(unsigned)index;
    */
    HRESULT item([in] UINT index, [out, retval] IDOMNode** result);

    /*
        - (unsigned)length;
    */
    HRESULT length([out, retval] UINT* result);

    /*
        - (DOMNode *)getNamedItemNS:(NSString *)namespaceURI :(NSString *)localName;
    */
    HRESULT getNamedItemNS([in] BSTR namespaceURI, [in] BSTR localName, [out, retval] IDOMNode** result);

    /*
        - (DOMNode *)setNamedItemNS:(DOMNode *)arg;
    */
    HRESULT setNamedItemNS([in] IDOMNode* arg, [out, retval] IDOMNode** result);

    /*
        - (DOMNode *)removeNamedItemNS:(NSString *)namespaceURI :(NSString *)localName;
    */
    HRESULT removeNamedItemNS([in] BSTR namespaceURI, [in] BSTR localName, [out, retval] IDOMNode** result);
}

/*
    @interface DOMDocument : IDOMNode
*/
[
    object,
    oleautomation,
    uuid(A83C2C44-0BAC-45c7-8E17-6A49975D5CCA),
    pointer_default(unique)
]
interface IDOMDocument : IDOMNode
{
    /*
        - (DOMDocumentType *)doctype;
    */
    HRESULT doctype([out, retval] IDOMDocumentType** result);

    /*
        - (DOMImplementation *)implementation;
    */
    HRESULT implementation([out, retval] IDOMImplementation** result);

    /*
        - (DOMElement *)documentElement;
    */
    HRESULT documentElement([out, retval] IDOMElement** result);

    /*
        - (DOMElement *)createElement:(NSString *)tagName;
    */
    HRESULT createElement([in] BSTR tagName, [out, retval] IDOMElement** result);

    /*
        - (DOMDocumentFragment *)createDocumentFragment;
    */
    HRESULT createDocumentFragment([out, retval] IDOMDocumentFragment** result);

    /*
        - (DOMText *)createTextNode:(NSString *)data;
    */
    HRESULT createTextNode([in] BSTR data, [out, retval] IDOMText** result);

    /*
        - (DOMComment *)createComment:(NSString *)data;
    */
    HRESULT createComment([in] BSTR data, [out, retval] IDOMComment** result);

    /*
        - (DOMCDATASection *)createCDATASection:(NSString *)data;
    */
    HRESULT createCDATASection([in] BSTR data, [out, retval] IDOMCDATASection** result);

    /*
        - (DOMProcessingInstruction *)createProcessingInstruction:(NSString *)target :(NSString *)data;
    */
    HRESULT createProcessingInstruction([in] BSTR target, [in] BSTR data, [out, retval] IDOMProcessingInstruction** result);

    /*
        - (DOMAttr *)createAttribute:(NSString *)name;
    */
    HRESULT createAttribute([in] BSTR name, [out, retval] IDOMAttr** result);

    /*
        - (DOMEntityReference *)createEntityReference:(NSString *)name;
    */
    HRESULT createEntityReference([in] BSTR name, [out, retval] IDOMEntityReference** result);

    /*
        - (DOMNodeList *)getElementsByTagName:(NSString *)tagname;
    */
    HRESULT getElementsByTagName([in] BSTR tagName, [out, retval] IDOMNodeList** result);

    /*
        - (DOMNode *)importNode:(DOMNode *)importedNode :(BOOL)deep;
    */
    HRESULT importNode([in] IDOMNode* importedNode, [in] BOOL deep, [out, retval] IDOMNode** result);

    /*
        - (DOMElement *)createElementNS:(NSString *)namespaceURI :(NSString *)qualifiedName;
    */
    HRESULT createElementNS([in] BSTR namespaceURI, [in] BSTR qualifiedName, [out, retval] IDOMElement** result);

    /*
        - (DOMAttr *)createAttributeNS:(NSString *)namespaceURI :(NSString *)qualifiedName;
    */
    HRESULT createAttributeNS([in] BSTR namespaceURI, [in] BSTR qualifiedName, [out, retval] IDOMAttr** result);

    /*
        - (DOMNodeList *)getElementsByTagNameNS:(NSString *)namespaceURI :(NSString *)localName;
    */
    HRESULT getElementsByTagNameNS([in] BSTR namespaceURI, [in] BSTR localName, [out, retval] IDOMNodeList** result);

    /*
        - (DOMElement *)getElementById:(NSString *)elementId;
    */
    HRESULT getElementById([in] BSTR elementId, [out, retval] IDOMElement** result);
}

/*
    @interface DOMCharacterData : IDOMNode
*/
[
    object,
    oleautomation,
    uuid(F4DED047-FE61-461a-BDBD-BB87F79DB713),
    pointer_default(unique)
]
interface IDOMCharacterData : IDOMNode
{
    /*
        - (NSString *)data;
    */
    HRESULT data([out, retval] BSTR* result);

    /*
        - (void)setData:(NSString *)data;
    */
    HRESULT setData([in] BSTR data);

    /*
        - (unsigned)length;
    */
    HRESULT length([out, retval] UINT* result);

    /*
        - (NSString *)substringData:(unsigned)offset :(unsigned)count;
    */
    HRESULT substringData([in] UINT offset, [in] UINT count, [out, retval] BSTR* result);

    /*
        - (void)appendData:(NSString *)arg;
    */
    HRESULT appendData([in] BSTR arg);

    /*
        - (void)insertData:(unsigned)offset :(NSString *)arg;
    */
    HRESULT insertData([in] UINT offset, [in] BSTR arg);

    /*
        - (void)deleteData:(unsigned)offset :(unsigned) count;
    */
    HRESULT deleteData([in] UINT offset, [in] UINT count);

    /*
        - (void)replaceData:(unsigned)offset :(unsigned)count :(NSString *)arg;
    */
    HRESULT replaceData([in] UINT offset, [in] UINT count, [in] BSTR arg);
}

/*
    @interface DOMAttr : IDOMNode
*/
[
    object,
    oleautomation,
    uuid(B587E098-8206-4b5a-A7DB-422F218571A0),
    pointer_default(unique)
]
interface IDOMAttr : IDOMNode
{
    /*
        - (NSString *)name;
    */
    HRESULT name([out, retval] BSTR* result);

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

    /*
        - (NSString *)value;
    */
    HRESULT value([out, retval] BSTR* value);

    /*
        - (void)setValue:(NSString *)value;
    */
    HRESULT setValue([in] BSTR value);

    /*
        - (DOMElement *)ownerElement;
    */
    HRESULT ownerElement([out, retval] IDOMElement** result);
}

/*
    @interface DOMElement : IDOMNode
*/
[
    object,
    oleautomation,
    uuid(E053A35B-7775-4859-80EA-C35D02D145A2),
    pointer_default(unique)
]
interface IDOMElement : IDOMNode
{
    /*
        - (NSString *)tagName;
    */
    HRESULT tagName([out, retval] BSTR* result);

    /*
        - (NSString *)getAttribute:(NSString *)name;
    */
    HRESULT getAttribute([in] BSTR name, [out, retval] BSTR* result);

    /*
        - (void)setAttribute:(NSString *)name :(NSString *)value;
    */
    HRESULT setAttribute([in] BSTR name, [in] BSTR value);

    /*
        - (void)removeAttribute:(NSString *)name;
    */
    HRESULT removeAttribute([in] BSTR name);

    /*
        - (DOMAttr *)getAttributeNode:(NSString *)name;
    */
    HRESULT getAttributeNode([in] BSTR name, [out, retval] IDOMAttr** result);

    /*
        - (DOMAttr *)setAttributeNode:(DOMAttr *)newAttr;
    */
    HRESULT setAttributeNode([in] IDOMAttr* newAttr, [out, retval] IDOMAttr** result);

    /*
        - (DOMAttr *)removeAttributeNode:(DOMAttr *)oldAttr;
    */
    HRESULT removeAttributeNode([in] IDOMAttr* oldAttr, [out, retval] IDOMAttr** result);

    /*
        - (DOMNodeList *)getElementsByTagName:(NSString *)name;
    */
    HRESULT getElementsByTagName([in] BSTR name, [out, retval] IDOMNodeList** result);

    /*
        - (NSString *)getAttributeNS:(NSString *)namespaceURI :(NSString *)localName;
    */
    HRESULT getAttributeNS([in] BSTR namespaceURI, [in] BSTR localName, [out, retval] BSTR* result);

    /*
        - (void)setAttributeNS:(NSString *)namespaceURI :(NSString *)qualifiedName :(NSString *)value;
    */
    HRESULT setAttributeNS([in] BSTR namespaceURI, [in] BSTR qualifiedName, [in] BSTR value);

    /*
        - (void)removeAttributeNS:(NSString *)namespaceURI :(NSString *)localName;
    */
    HRESULT removeAttributeNS([in] BSTR namespaceURI, [in] BSTR localName);

    /*
        - (DOMAttr *)getAttributeNodeNS:(NSString *)namespaceURI :(NSString *)localName;
    */
    HRESULT getAttributeNodeNS([in] BSTR namespaceURI, [in] BSTR localName, [out, retval] IDOMAttr** result);

    /*
        - (DOMAttr *)setAttributeNodeNS:(DOMAttr *)newAttr;
    */
    HRESULT setAttributeNodeNS([in] IDOMAttr* newAttr, [out, retval] IDOMAttr** result);

    /*
        - (DOMNodeList *)getElementsByTagNameNS:(NSString *)namespaceURI :(NSString *)localName;
    */
    HRESULT getElementsByTagNameNS([in] BSTR namespaceURI, [in] BSTR localName, [out, retval] IDOMNodeList** result);

    /*
        - (BOOL)hasAttribute:(NSString *)name;
    */
    HRESULT hasAttribute([in] BSTR name, [out, retval] BOOL* result);

    /*
        - (BOOL)hasAttributeNS:(NSString *)namespaceURI :(NSString *)localName;
    */
    HRESULT hasAttributeNS([in] BSTR namespaceURI, [in] BSTR localName, [out, retval] BOOL* result);

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

    /*
        - (void)blur;
    */
    HRESULT blur();
}

/*
    @interface DOMElement (DOMElementExtensions)
*/
[
    object,
    oleautomation,
    uuid(98E481F5-4405-4c2a-BF77-1CE95FE5F992),
    pointer_default(unique)
]
interface IDOMElementExtensions : IUnknown
{
    /*
        - (int)offsetLeft;
    */
    HRESULT offsetLeft([out, retval] int* result);

    /*
        - (int)offsetTop;
    */
    HRESULT offsetTop([out, retval] int* result);

    /*
        - (int)offsetWidth;
    */
    HRESULT offsetWidth([out, retval] int* result);

    /*
        - (int)offsetHeight;
    */
    HRESULT offsetHeight([out, retval] int* result);

    /*
        - (DOMElement *)offsetParent;
    */
    HRESULT offsetParent([out, retval] IDOMElement** result);

    /*
        - (int)clientWidth;
    */
    HRESULT clientWidth([out, retval] int* result);

    /*
        - (int)clientHeight;
    */
    HRESULT clientHeight([out, retval] int* result);

    /*
        - (int)scrollLeft;
    */
    HRESULT scrollLeft([out, retval] int* result);

    /*
        - (void)setScrollLeft:(int)newScrollLeft;
    */
    HRESULT setScrollLeft([in] int newScrollLeft);

    /*
        - (int)scrollTop;
    */
    HRESULT scrollTop([out, retval] int* result);

    /*
        - (void)setScrollTop:(int)newScrollTop;
    */
    HRESULT setScrollTop([in] int newScrollTop);

    /*
        - (int)scrollWidth;
    */
    HRESULT scrollWidth([out, retval] int* result);

    /*
        - (int)scrollHeight;
    */
    HRESULT scrollHeight([out, retval] int* result);

    /*
        - (void)scrollIntoView:(BOOL)alignWithTop;
    */
    HRESULT scrollIntoView([in] BOOL alignWithTop);

    /*
        - (void)scrollIntoViewIfNeeded:(BOOL)centerIfNeeded;
    */
    HRESULT scrollIntoViewIfNeeded([in] BOOL centerIfNeeded);
}

/*
    @interface DOMText : DOMCharacterData
*/
[
    object,
    oleautomation,
    uuid(74638F45-1AA0-4db5-958C-82066E00BD2B),
    pointer_default(unique)
]
interface IDOMText : IDOMCharacterData
{
    /*
        - (DOMText *)splitText:(unsigned)offset;
    */
    HRESULT splitText([in] UINT offset, [out, retval] IDOMText** result);
}

/*
    @interface DOMComment : DOMCharacterData
*/
[
    object,
    oleautomation,
    uuid(118002E8-847F-4b1a-968C-B25A6AC7B128),
    pointer_default(unique)
]
interface IDOMComment : IDOMCharacterData
{
}

/*
    @interface DOMCDATASection : DOMText
*/
[
    object,
    oleautomation,
    uuid(31B506C1-45A3-4d72-815A-311B0A897E58),
    pointer_default(unique)
]
interface IDOMCDATASection : IDOMText
{
}

/*
    @interface DOMDocumentType : IDOMNode
*/
[
    object,
    oleautomation,
    uuid(17FCE6EA-4164-4bd4-9DBF-0395FBF37FD3),
    pointer_default(unique)
]
interface IDOMDocumentType : IDOMNode
{
    /*
        - (NSString *)name;
    */
    HRESULT name([out, retval] BSTR* result);

    /*
        - (DOMNamedNodeMap *)entities;
    */
    HRESULT entities([out, retval] IDOMNamedNodeMap** result);

    /*
        - (DOMNamedNodeMap *)notations;
    */
    HRESULT notations([out, retval] IDOMNamedNodeMap** result);

    /*
        - (NSString *)publicId;
    */
    HRESULT publicId([out, retval] BSTR* result);

    /*
        - (NSString *)systemId;
    */
    HRESULT systemId([out, retval] BSTR* result);

    /*
        - (NSString *)internalSubset;
    */
    HRESULT internalSubset([out, retval] BSTR* result);
}

/*
    @interface DOMEntityReference : IDOMNode
*/
[
    object,
    oleautomation,
    uuid(0593CE45-15B2-44af-BBD0-5A1654F8240E),
    pointer_default(unique)
]
interface IDOMEntityReference : IDOMNode
{
}

/*
    @interface DOMProcessingInstruction : IDOMNode
*/
[
    object,
    oleautomation,
    uuid(D99D2F48-ABF3-426a-9339-54681E1AFCA9),
    pointer_default(unique)
]
interface IDOMProcessingInstruction : IDOMNode
{
    /*
        - (NSString *)target;
    */
    HRESULT target([out, retval] BSTR* result);

    /*
        - (NSString *)data;
    */
    HRESULT data([out, retval] BSTR* result);

    /*
        - (void)setData:(NSString *)data;
    */
    HRESULT setData([in] BSTR data);
}

/*
    @interface DOMDocumentFragment : IDOMNode
*/
[
    object,
    oleautomation,
    uuid(09D35665-8396-4868-949E-8AA2407A6E10),
    pointer_default(unique)
]
interface IDOMDocumentFragment : IDOMNode
{
}
