/*
 * 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,
    TypeChecking=Interface,
] 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
    readonly attribute unsigned short nodeType;
    readonly attribute DOMString nodeName;

    readonly attribute DOMString? baseURI;

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

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

    // FIXME: The deep argument should have a default value false.
    [NewObject, CustomElementCallbacks] Node cloneNode(optional boolean deep);
    boolean isEqualNode(Node? node);

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

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

    // FIXME: namespaceURI and localName have been moved to Element and Attr.
    [MeasureAs=NodeNamespaceURI] readonly attribute DOMString? namespaceURI;
    [MeasureAs=NodeLocalName] readonly attribute DOMString? localName;

    // FIXME: isSameNode has been removed from the spec:
    // https://www.w3.org/Bugs/Public/show_bug.cgi?id=27424
    [MeasureAs=NodeIsSameNode] boolean isSameNode(Node? other);
};
