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

    [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);
};
