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

// https://html.spec.whatwg.org/C/#htmlelement
[
    Exposed=Window,
    HTMLConstructor
] interface HTMLElement : Element {
    // metadata attributes
    [CEReactions, Reflect] attribute DOMString title;
    [CEReactions, Reflect] attribute DOMString lang;
    [CEReactions] attribute boolean translate;
    [CEReactions] attribute DOMString dir;

    // user interaction
    [Affects=Nothing, CEReactions, Reflect] attribute boolean hidden;
    [RuntimeCallStatsCounter=HTMLElementClick] void click();
    [CEReactions, RuntimeEnabled=InertAttribute, Reflect] attribute boolean inert;
    [CEReactions, Reflect] attribute DOMString accessKey;
    [CEReactions] attribute boolean draggable;
    [CEReactions] attribute boolean spellcheck;
    [Measure] attribute DOMString autocapitalize;

    [RaisesException] ElementInternals attachInternals();

    // HTMLElement includes ElementContentEditable
    // https://html.spec.whatwg.org/C/#contenteditable
    [CEReactions, RaisesException=Setter] attribute DOMString contentEditable;
    [RuntimeEnabled=EnterKeyHintAttribute, CEReactions, Reflect, ReflectOnly=("enter","done","go","next","previous","search","send")] attribute DOMString enterKeyHint;
    [ImplementedAs=isContentEditableForBinding] readonly attribute boolean isContentEditable;
    [CEReactions, Reflect, ReflectOnly=("none","text","tel","url","email","numeric","decimal","search")] attribute DOMString inputMode;

    // Explainers:
    // https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/master/VirtualKeyboardPolicy/explainer.md
    // https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/master/VirtualKeyboardAPI/explainer.md
    [RuntimeEnabled=VirtualKeyboard, CEReactions, Reflect, ReflectOnly=("auto","manual")] attribute DOMString virtualKeyboardPolicy;

    // CSSOM View Module
    // https://drafts.csswg.org/cssom-view/#extensions-to-the-htmlelement-interface
    [Affects=Nothing, PerWorldBindings, ImplementedAs=unclosedOffsetParent] readonly attribute Element? offsetParent;
    [Affects=Nothing, ImplementedAs=offsetTopForBinding] readonly attribute long offsetTop;
    [Affects=Nothing, ImplementedAs=offsetLeftForBinding] readonly attribute long offsetLeft;
    [Affects=Nothing, ImplementedAs=offsetWidthForBinding] readonly attribute long offsetWidth;
    [Affects=Nothing, ImplementedAs=offsetHeightForBinding] readonly attribute long offsetHeight;

    // CSS Object Model (CSSOM)
    // https://drafts.csswg.org/cssom/#the-elementcssinlinestyle-interface
    [Affects=Nothing, SameObject, PerWorldBindings, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;

    // Non-standard APIs
    [Affects=Nothing, CEReactions, RaisesException=Setter, MeasureAs=HTMLElementInnerText] attribute ([TreatNullAs=EmptyString] DOMString or TrustedScript) innerText;
    [Affects=Nothing, CEReactions, RaisesException=Setter, MeasureAs=HTMLElementOuterText] attribute [TreatNullAs=EmptyString] DOMString outerText;
};

HTMLElement includes GlobalEventHandlers;
HTMLElement includes DocumentAndElementEventHandlers;
HTMLElement includes HTMLOrForeignElement;
