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

[
    DependentLifetime,
] interface Node : EventTarget {
    const unsigned short ELEMENT_NODE = 1;
    // FIXME: Attr should not inherit from Node. crbug.com/305105
    const unsigned short ATTRIBUTE_NODE = 2;
    const unsigned short TEXT_NODE = 3;
    // FIXME: CDATASection has been removed from the spec. crbug.com/437205
    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
    [ImplementedAs=getNodeType] readonly attribute unsigned short nodeType;
    readonly attribute DOMString nodeName;

    readonly attribute DOMString? baseURI;

    [ImplementedAs=inShadowIncludingDocument, Measure] readonly attribute boolean isConnected;
    [PerWorldBindings] readonly attribute Document? ownerDocument;
    [PerWorldBindings] readonly attribute Node? parentNode;
    [PerWorldBindings] readonly attribute Element? parentElement;
    [ImplementedAs=hasChildren] boolean hasChildNodes();
    [SameObject, 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;
    [RuntimeEnabled=ShadowDOMV1, MeasureAs=NodeRootNode, ImplementedAs=treeRoot] readonly attribute Node rootNode;

    [CEReactions, CustomElementCallbacks] attribute DOMString? nodeValue;

    // FIXME: textContent should not have [TreatUndefinedAs=NullString].
    [TreatUndefinedAs=NullString, CEReactions, CustomElementCallbacks] attribute DOMString? textContent;
    [CEReactions, CustomElementCallbacks] void normalize();

    [NewObject, CEReactions, CustomElementCallbacks] 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);
    boolean contains(Node? other);

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

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