#import <HTML/HTMLElement.idl>
#import <HTML/HTMLFormElement.idl>
#import <HTML/PopoverInvokerElement.idl>
#import <HTML/ValidityState.idl>

[MissingValueDefault=submit, InvalidValueDefault=submit]
enum ButtonTypeState {
    "submit",
    "reset",
    "button"
};

// https://html.spec.whatwg.org/multipage/semantics.html#htmlbuttonelement
[Exposed=Window]
interface HTMLButtonElement : HTMLElement {
    [HTMLConstructor] constructor();

    [CEReactions] attribute DOMString command;
    [CEReactions, Reflect=commandfor] attribute Element? commandForElement;
    [CEReactions, Reflect] attribute boolean disabled;
    readonly attribute HTMLFormElement? form;
    [CEReactions] attribute USVString formAction;
    [CEReactions, Reflect=formenctype, Enumerated=FormEnctypeAttribute] attribute DOMString formEnctype;
    [CEReactions, Reflect=formmethod, Enumerated=FormMethodAttribute] attribute DOMString formMethod;
    [CEReactions, Reflect=formnovalidate] attribute boolean formNoValidate;
    [CEReactions, Reflect=formtarget] attribute DOMString formTarget;
    [CEReactions, Reflect] attribute DOMString name;
    [CEReactions, ImplementedAs=type_for_bindings, Enumerated=ButtonTypeState] attribute DOMString type;
    [CEReactions, Reflect] attribute DOMString value;

    readonly attribute boolean willValidate;
    readonly attribute ValidityState validity;
    [FIXME] readonly attribute DOMString validationMessage;
    [FIXME] boolean checkValidity();
    [FIXME] boolean reportValidity();
    undefined setCustomValidity(DOMString error);

    readonly attribute NodeList labels;
};
HTMLButtonElement includes PopoverInvokerElement;