/*
 * 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, DoNotTestNewObject, 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);
};
