/*
 * 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,
] 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;

    [EnabledAtRuntime=ShadowDOM] readonly attribute boolean isConnected;
    [DOMJIT=Getter] readonly attribute Document? ownerDocument;
    [EnabledAtRuntime=ShadowDOM] Node getRootNode(optional GetRootNodeOptions options);
    [DOMJIT=Getter] readonly attribute Node? parentNode;
    readonly attribute Element? parentElement;
    boolean hasChildNodes();
    readonly attribute NodeList childNodes; // FIXME: Should be [SameObject].
    [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] void normalize();

    [CEReactions, ImplementedAs=cloneNodeForBindings, MayThrowException, 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(DOMString? namespaceURI);
    DOMString? lookupNamespaceURI(DOMString? prefix);
    boolean isDefaultNamespace(DOMString? namespaceURI);

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

dictionary GetRootNodeOptions {
    boolean composed = false;
};
