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

[
    Custom=Wrap,
] interface HTMLElement : Element {
    [Reflect] attribute DOMString title;
    [Reflect] attribute DOMString lang;
    attribute boolean translate;
    [Reflect] attribute DOMString dir;

    [CustomElementCallbacks] attribute long              tabIndex;
    [CustomElementCallbacks] attribute boolean           draggable;
    [Reflect, TreatNullAs=NullString] attribute DOMString webkitdropzone;
    [Reflect] attribute boolean hidden;
    [Reflect] attribute DOMString accessKey;

    // Extensions
    [TreatNullAs=NullString, CustomElementCallbacks, RaisesException=Setter, MeasureAs=HTMLElementInnerText] attribute DOMString innerText;
    [TreatNullAs=NullString, CustomElementCallbacks, RaisesException=Setter, MeasureAs=HTMLElementOuterText] attribute DOMString outerText;

    [RaisesException, CustomElementCallbacks, MeasureAs=InsertAdjacentElement] Element insertAdjacentElement([Default=Undefined] optional DOMString where,
                                  [Default=Undefined] optional Element element);
    [RaisesException, MeasureAs=InsertAdjacentText] void insertAdjacentText([Default=Undefined] optional DOMString where,
                            [Default=Undefined] optional DOMString text);

    [RuntimeEnabled=IMEAPI] readonly attribute InputMethodContext inputMethodContext;

    [CustomElementCallbacks, RaisesException=Setter] attribute DOMString contentEditable;
    readonly attribute boolean isContentEditable;

             attribute boolean spellcheck;

    void click();
};

HTMLElement implements GlobalEventHandlers;
