/*
 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
 * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 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
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

[
    CustomToV8,
    DependentLifetime
] interface Node : EventTarget {
    // NodeType
    const unsigned short      ELEMENT_NODE                   = 1;
    const unsigned short      ATTRIBUTE_NODE                 = 2;
    const unsigned short      TEXT_NODE                      = 3;
    const unsigned short      CDATA_SECTION_NODE             = 4;
    const unsigned short      ENTITY_REFERENCE_NODE          = 5; // EntityReference nodes are impossible to create in WebKit.
    const unsigned short      ENTITY_NODE                    = 6;
    const unsigned short      PROCESSING_INSTRUCTION_NODE    = 7;
    const unsigned short      COMMENT_NODE                   = 8;
    const unsigned short      DOCUMENT_NODE                  = 9;
    const unsigned short      DOCUMENT_TYPE_NODE             = 10;
    const unsigned short      DOCUMENT_FRAGMENT_NODE         = 11;
    const unsigned short      NOTATION_NODE                  = 12;

    [TreatReturnedNullStringAs=Null, PerWorldBindings] readonly attribute DOMString        nodeName;

             // FIXME: the spec says this can also raise on retrieval.
             [TreatReturnedNullStringAs=Null, TreatNullAs=NullString, PerWorldBindings] attribute DOMString        nodeValue;

    [PerWorldBindings] readonly attribute unsigned short   nodeType;
    [PerWorldBindings] readonly attribute Node             parentNode;
    [PerWorldBindings] readonly attribute NodeList         childNodes;
    [PerWorldBindings] readonly attribute Node             firstChild;
    [PerWorldBindings] readonly attribute Node             lastChild;
    [PerWorldBindings] readonly attribute Node             previousSibling;
    [PerWorldBindings] readonly attribute Node             nextSibling;
    [PerWorldBindings] readonly attribute Document         ownerDocument;

    [Custom, PerWorldBindings, ActivityLog=AccessForIsolatedWorlds, RaisesException] Node insertBefore(Node newChild, Node refChild);
    [Custom, PerWorldBindings, ActivityLog=AccessForIsolatedWorlds, RaisesException] Node replaceChild(Node newChild, Node oldChild);
    [Custom, PerWorldBindings, RaisesException] Node removeChild(Node oldChild);
    [Custom, PerWorldBindings, ActivityLog=AccessForIsolatedWorlds, RaisesException] Node appendChild(Node newChild);

    boolean            hasChildNodes();
    [DeliverCustomElementCallbacks, PerWorldBindings]
    Node               cloneNode(optional boolean deep);
    void               normalize();

    // Introduced in DOM Level 2:
     boolean isSupported([Default=Undefined] optional DOMString feature, 
                                       [TreatNullAs=NullString,Default=Undefined] optional DOMString version);

    [TreatReturnedNullStringAs=Null, PerWorldBindings] readonly attribute DOMString        namespaceURI;
             [TreatReturnedNullStringAs=Null, TreatNullAs=NullString, PerWorldBindings, SetterRaisesException] attribute DOMString        prefix;
    [TreatReturnedNullStringAs=Null, PerWorldBindings] readonly attribute DOMString        localName;

    // Introduced in DOM Level 3:
    [TreatReturnedNullStringAs=Null, PerWorldBindings] readonly attribute DOMString       baseURI;

             // FIXME: the spec says this can also raise on retrieval.
             [TreatReturnedNullStringAs=Null, TreatNullAs=NullString, PerWorldBindings, SetterRaisesException, DeliverCustomElementCallbacks] attribute DOMString       textContent;

    boolean            isSameNode([Default=Undefined] optional Node other);
    boolean            isEqualNode([Default=Undefined] optional Node other);
    [TreatReturnedNullStringAs=Null] DOMString          lookupPrefix([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI);
    boolean            isDefaultNamespace([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI);
    [TreatReturnedNullStringAs=Null] DOMString          lookupNamespaceURI([TreatNullAs=NullString,Default=Undefined] optional DOMString prefix);

    // DocumentPosition
    const unsigned short      DOCUMENT_POSITION_DISCONNECTED = 0x01;
    const unsigned short      DOCUMENT_POSITION_PRECEDING    = 0x02;
    const unsigned short      DOCUMENT_POSITION_FOLLOWING    = 0x04;
    const unsigned short      DOCUMENT_POSITION_CONTAINS     = 0x08;
    const unsigned short      DOCUMENT_POSITION_CONTAINED_BY = 0x10;
    const unsigned short      DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;

    unsigned short     compareDocumentPosition([Default=Undefined] optional Node other);

    // Introduced in DOM4
    boolean contains([Default=Undefined] optional Node other);

    // IE extensions
    [PerWorldBindings] readonly attribute Element          parentElement;
};
