/*
 * Copyright (C) 2006-2016 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.
 */

[
    CustomIsReachable,
    CustomPushEventHandlerScope,
    CustomToJSObject,
    DOMJIT,
    ExportMacro=WEBCORE_EXPORT,
    JSCustomHeader,
    JSCustomMarkFunction,
    Exposed=Window
] interface Node : EventTarget {
    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; // Historical.
    const unsigned short ENTITY_NODE = 6; // Historical.
    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; // Historical.
    [DOMJIT=Getter, CustomGetter] readonly attribute unsigned short nodeType;
    readonly attribute DOMString nodeName;

    readonly attribute USVString baseURI;

    readonly attribute boolean isConnected;
    [DOMJIT=Getter] readonly attribute Document? ownerDocument;
    Node getRootNode(optional GetRootNodeOptions options);
    [DOMJIT=Getter] readonly attribute Node? parentNode;
    readonly attribute Element? parentElement;
    boolean hasChildNodes();
    [SameObject] readonly attribute NodeList childNodes;
    [DOMJIT=Getter] readonly attribute Node? firstChild;
    [DOMJIT=Getter] readonly attribute Node? lastChild;
    [DOMJIT=Getter] readonly attribute Node? previousSibling;
    [DOMJIT=Getter] readonly attribute Node? nextSibling;

    [CEReactions] attribute DOMString? nodeValue;
    [CEReactions] attribute DOMString? textContent;
    [CEReactions] undefined normalize();

    [CEReactions, ImplementedAs=cloneNodeForBindings, NewObject] Node cloneNode(optional boolean deep = false);
    boolean isEqualNode(Node? other);
    boolean isSameNode(Node? other); // Historical alias of ===.

    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(Node other);
    boolean contains(Node? other);

    DOMString? lookupPrefix([AtomString] DOMString? namespaceURI);
    DOMString? lookupNamespaceURI([AtomString] DOMString? prefix);
    boolean isDefaultNamespace([AtomString] DOMString? namespaceURI);

    [CEReactions] Node insertBefore([ReturnValue] Node node, Node? child);
    [CEReactions] Node appendChild([ReturnValue] Node node);
    [CEReactions] Node replaceChild(Node node, [ReturnValue] Node child);
    [CEReactions] Node removeChild([ReturnValue] Node child);
};

dictionary GetRootNodeOptions {
    boolean composed = false;
};
