/*
 * 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.
 */

// https://dom.spec.whatwg.org/#interface-node

[
    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
    [Affects=Nothing, ImplementedAs=getNodeType] readonly attribute unsigned short nodeType;
    [Affects=Nothing, RuntimeCallStatsCounter=NodeName] readonly attribute DOMString nodeName;

    readonly attribute USVString baseURI;

    // Scroll Customization API. See crbug.com/410974 for details.
    [RuntimeEnabled=ScrollCustomization] void setApplyScroll(ScrollStateCallback scrollStateCallback, NativeScrollBehavior nativeScrollBehavior);
    [RuntimeEnabled=ScrollCustomization] void setDistributeScroll(ScrollStateCallback scrollStateCallback, NativeScrollBehavior nativeScrollBehavior);

    [Affects=Nothing, Measure] readonly attribute boolean isConnected;
    [Affects=Nothing, PerWorldBindings] readonly attribute Document? ownerDocument;
    [Affects=Nothing, PerWorldBindings] readonly attribute Node? parentNode;
    [Affects=Nothing, PerWorldBindings] readonly attribute Element? parentElement;
    [Affects=Nothing, ImplementedAs=hasChildren] boolean hasChildNodes();
    [Affects=Nothing, SameObject, PerWorldBindings] readonly attribute NodeList childNodes;
    [Affects=Nothing, PerWorldBindings] readonly attribute Node? firstChild;
    [Affects=Nothing, PerWorldBindings] readonly attribute Node? lastChild;
    [Affects=Nothing, PerWorldBindings] readonly attribute Node? previousSibling;
    [Affects=Nothing, PerWorldBindings] readonly attribute Node? nextSibling;
    [MeasureAs=NodeGetRootNode] Node getRootNode(optional GetRootNodeOptions options = {});

    [Affects=Nothing, CEReactions] attribute DOMString? nodeValue;

    [Affects=Nothing, CEReactions, RaisesException=Setter] attribute (DOMString or TrustedScript)? textContent;
    [CEReactions] void normalize();

    [NewObject, DoNotTestNewObject, CEReactions, RaisesException] Node cloneNode(optional boolean deep = false);
    boolean isEqualNode(Node? otherNode);
    boolean isSameNode(Node? otherNode); // 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);
    [Affects=Nothing] boolean contains(Node? other);

    DOMString? lookupPrefix(DOMString? namespaceURI);
    DOMString? lookupNamespaceURI(DOMString? prefix);
    boolean isDefaultNamespace(DOMString? namespaceURI);

    [CEReactions, PerWorldBindings, RaisesException] Node insertBefore(Node node, Node? child);
    [CEReactions, PerWorldBindings, RaisesException, RuntimeCallStatsCounter=NodeAppendChild] Node appendChild(Node node);
    [CEReactions, PerWorldBindings, RaisesException] Node replaceChild(Node node, Node child);
    [CEReactions, RaisesException, RuntimeCallStatsCounter=NodeRemoveChild] Node removeChild(Node child);
};
