/*
 * Copyright (C) 2006, 2007, 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.
 */

[
    SpecialWrapFor=HTMLElement|SVGElement,
] interface Element : Node {

    // DOM Level 1 Core

    readonly attribute DOMString? tagName;

    DOMString? getAttribute(DOMString name);
    [RaisesException, CustomElementCallbacks] void setAttribute(DOMString name, DOMString value);
    [CustomElementCallbacks] void removeAttribute(DOMString name);
    [MeasureAs=ElementGetAttributeNode] Attr getAttributeNode([Default=Undefined] optional DOMString name); // Removed from DOM4.
    [RaisesException, CustomElementCallbacks, MeasureAs=ElementSetAttributeNode] Attr setAttributeNode([Default=Undefined] optional Attr newAttr); // Removed from DOM4.
    [RaisesException, CustomElementCallbacks, MeasureAs=ElementRemoveAttributeNode] Attr removeAttributeNode([Default=Undefined] optional Attr oldAttr); // Removed from DOM4.
    HTMLCollection getElementsByTagName(DOMString name);

    [PerWorldBindings, ImplementedAs=attributesForBindings] readonly attribute NamedNodeMap     attributes;
    [MeasureAs=HasAttributes] boolean hasAttributes();

    // DOM Level 2 Core

    DOMString? getAttributeNS(DOMString? namespaceURI, DOMString localName);
    [RaisesException, CustomElementCallbacks] void setAttributeNS(DOMString? namespaceURI, DOMString qualifiedName, DOMString value);
    [CustomElementCallbacks] void removeAttributeNS(DOMString? namespaceURI, DOMString localName);
    HTMLCollection getElementsByTagNameNS(DOMString? namespaceURI, DOMString localName);
    [MeasureAs=ElementGetAttributeNodeNS] Attr getAttributeNodeNS([Default=Undefined] optional DOMString? namespaceURI,
                                                                  [Default=Undefined] optional DOMString localName); // Removed from DOM4.
    [RaisesException, CustomElementCallbacks, DeprecateAs=ElementSetAttributeNodeNS] Attr setAttributeNodeNS([Default=Undefined] optional Attr newAttr); // Removed from DOM4.
    boolean hasAttribute(DOMString name);
    boolean hasAttributeNS(DOMString? namespaceURI, DOMString localName);

    [PerWorldBindings] readonly attribute CSSStyleDeclaration style;

    // DOM4
    [Reflect] attribute DOMString id;
    readonly attribute DOMString? namespaceURI;
    [RaisesException=Setter] attribute DOMString? prefix;
    readonly attribute DOMString? localName;

    [RaisesException] boolean matches(DOMString selectors);

    // Common extensions

    readonly attribute long offsetLeft;
    readonly attribute long offsetTop;
    readonly attribute long offsetWidth;
    readonly attribute long offsetHeight;
    [ImplementedAs=offsetParentForBindings, PerWorldBindings] readonly attribute Element offsetParent;
    readonly attribute long clientLeft;
    readonly attribute long clientTop;
    readonly attribute long clientWidth;
    readonly attribute long clientHeight;

    // FIXME: should be:
    // attribute (Dictionary or double) scrollLeft;
    // attribute (Dictionary or double) scrollTop;
    // http://crbug.com/240176
    [Custom=Setter] attribute long scrollLeft;
    [Custom=Setter] attribute long scrollTop;
    readonly attribute long scrollWidth;
    readonly attribute long scrollHeight;

    void focus();
    void blur();
    void scrollIntoView(optional boolean alignWithTop);

    // WebKit extensions

    [MeasureAs=ElementScrollIntoViewIfNeeded] void scrollIntoViewIfNeeded(optional boolean centerIfNeeded);

    // HTML 5
    HTMLCollection getElementsByClassName(DOMString classNames);
    [TreatNullAs=NullString, CustomElementCallbacks, RaisesException=Setter] attribute DOMString innerHTML;
    [TreatNullAs=NullString, CustomElementCallbacks, RaisesException=Setter] attribute DOMString outerHTML;

    [RaisesException, CustomElementCallbacks, MeasureAs=InsertAdjacentElement] Element insertAdjacentElement(DOMString where, Element element);
    [RaisesException, MeasureAs=InsertAdjacentText] void insertAdjacentText(DOMString where, DOMString text);
    [CustomElementCallbacks, RaisesException, MeasureAs=InsertAdjacentHTML] void insertAdjacentHTML(DOMString where, DOMString html);

    [Reflect=class] attribute DOMString className;
    [PerWorldBindings] readonly attribute DOMTokenList classList;

    [PerWorldBindings] readonly attribute DOMStringMap dataset;

    // WebKit extension
    [RaisesException, ImplementedAs=matches, MeasureAs=ElementPrefixedMatchesSelector] boolean webkitMatchesSelector(DOMString selectors);

    // Shadow DOM API
    [RaisesException, MeasureAs=ElementCreateShadowRoot] ShadowRoot createShadowRoot();
    [PerWorldBindings] readonly attribute ShadowRoot shadowRoot;
    NodeList getDestinationInsertionPoints();

    // CSSOM View Module API
    ClientRectList getClientRects();
    ClientRect getBoundingClientRect();

    [MeasureAs=ElementRequestPointerLock] void requestPointerLock();

    // Event handler attributes
    attribute EventHandler onbeforecopy;
    attribute EventHandler onbeforecut;
    attribute EventHandler onbeforepaste;
    attribute EventHandler oncopy;
    attribute EventHandler oncut;
    attribute EventHandler onpaste;
    attribute EventHandler onsearch;
    attribute EventHandler onselectstart;
    [RuntimeEnabled=Touch] attribute EventHandler ontouchcancel;
    [RuntimeEnabled=Touch] attribute EventHandler ontouchend;
    [RuntimeEnabled=Touch] attribute EventHandler ontouchmove;
    [RuntimeEnabled=Touch] attribute EventHandler ontouchstart;
    attribute EventHandler onwheel;
};

Element implements ParentNode;
Element implements ChildNode;
