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

[
    CustomConstructor(),
    CustomPushEventHandlerScope,
    ExportMacro=WEBCORE_EXPORT,
    JSGenerateToNativeObject,
] interface HTMLElement : Element {
    // Metadata attributes.
    [CEReactions, Reflect] attribute DOMString title;
    [CEReactions, Reflect] attribute DOMString lang;
    [CEReactions] attribute boolean translate;
    [CEReactions] attribute DOMString dir;
    readonly attribute DOMStringMap dataset; // FIXME: Should be [SameObject].

    // User interaction.
    [CEReactions, Reflect] attribute boolean hidden;
    void click();
    [CEReactions] attribute long tabIndex;
    void focus();
    void blur();
    [CEReactions, Reflect] attribute DOMString accessKey;
    // readonly attribute DOMString accessKeyLabel; // FIXME: Not supported.
    [CEReactions] attribute boolean draggable;
    // [CEReactions] attribute HTMLMenuElement? contextMenu; // FIXME: Not supported.
    [CEReactions] attribute boolean spellcheck;
    // void forceSpellCheck(); // FIXME: Not supported.

    [CEReactions] attribute [TreatNullAs=EmptyString] DOMString innerText;

    // FIXME: Should be in a separate ElementContentEditable interface.
    // https://html.spec.whatwg.org/#elementcontenteditable
    [CEReactions] attribute DOMString contentEditable;
    readonly attribute boolean isContentEditable;

    // Extensions from CSSOM-view specification (https://drafts.csswg.org/cssom-view/#extensions-to-the-htmlelement-interface).
    [ImplementedAs=bindingsOffsetParent] readonly attribute Element? offsetParent;
    readonly attribute double offsetTop; // FIXME: Should be of type long.
    readonly attribute double offsetLeft; // FIXME: Should be of type long.
    readonly attribute double offsetWidth; // FIXME: Should be of type long.
    readonly attribute double offsetHeight; // FIXME: Should be of type long.

    // Non Standard but may get added to the specification (https://github.com/whatwg/html/issues/668).
    [CEReactions] attribute [TreatNullAs=EmptyString] DOMString outerText;

    // iOS autocorrect / autocapitalization extensions.
    [Conditional=IOS_AUTOCORRECT_AND_AUTOCAPITALIZE] attribute boolean autocorrect;
    [Conditional=IOS_AUTOCORRECT_AND_AUTOCAPITALIZE] attribute [TreatNullAs=EmptyString] DOMString autocapitalize;

    // FIXME: We are the only browser to support this now that Blink dropped it (http://crbug.com/688943).
    [CEReactions, Reflect] attribute DOMString webkitdropzone;
};

HTMLElement implements ElementCSSInlineStyle;
HTMLElement implements GlobalEventHandlers;
