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

[
    CustomPushEventHandlerScope,
    CustomToJSObject,
    ExportMacro=WEBCORE_EXPORT,
    Exposed=Window,
    GenerateForEachEventHandlerContentAttribute,
    JSGenerateToNativeObject,
] interface HTMLElement : Element {
    [Custom] constructor();

    // metadata attributes
    [CEReactions, Reflect] attribute DOMString title;
    [CEReactions, Reflect] attribute DOMString lang;
    [CEReactions] attribute boolean translate;
    [CEReactions] attribute [AtomString] DOMString dir;

    // user interaction
    [CEReactions, Reflect] attribute boolean hidden;
    undefined click();
    [CEReactions, Reflect] attribute DOMString accessKey;
    readonly attribute DOMString accessKeyLabel;
    [CEReactions] attribute boolean draggable;
    [CEReactions] attribute boolean spellcheck;
    // FIXME: 'autocapitalize' should not be [LegacyNullToEmptyString].
    [Conditional=AUTOCAPITALIZE, CEReactions] attribute [LegacyNullToEmptyString, AtomString] DOMString autocapitalize;

    [CEReactions] attribute [LegacyNullToEmptyString] DOMString innerText;

    // FIXME: Implement 'attachInternals'.
    // ElementInternals attachInternals();

    // Experimental: https://github.com/WICG/inert/blob/master/README.md
    [CEReactions, Reflect, EnabledBySetting=InertAttributeEnabled] attribute boolean inert;

    // Non-standard: IE extension. May get added to the specification (https://github.com/whatwg/html/issues/668).
    [CEReactions] attribute [LegacyNullToEmptyString] DOMString outerText;

    // Non-standard: iOS extension.
    [Conditional=AUTOCORRECT, CEReactions] attribute boolean autocorrect;

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

HTMLElement includes GlobalEventHandlers;
HTMLElement includes DocumentAndElementEventHandlers;
HTMLElement includes ElementContentEditable;
HTMLElement includes HTMLOrForeignElement;
HTMLElement includes ElementCSSInlineStyle;
