#import <UIEvents/EventModifier.idl>

// https://www.w3.org/TR/uievents/#idl-keyboardevent
[Exposed=Window]
interface KeyboardEvent : UIEvent {

    constructor(DOMString type, optional KeyboardEventInit eventInitDict = {});

    // KeyLocationCode
    const unsigned long DOM_KEY_LOCATION_STANDARD = 0x00;
    const unsigned long DOM_KEY_LOCATION_LEFT = 0x01;
    const unsigned long DOM_KEY_LOCATION_RIGHT = 0x02;
    const unsigned long DOM_KEY_LOCATION_NUMPAD = 0x03;

    readonly attribute DOMString key;
    readonly attribute DOMString code;
    readonly attribute unsigned long location;

    readonly attribute boolean ctrlKey;
    readonly attribute boolean shiftKey;
    readonly attribute boolean altKey;
    readonly attribute boolean metaKey;

    readonly attribute boolean repeat;
    readonly attribute boolean isComposing;

    readonly attribute unsigned long charCode;
    readonly attribute unsigned long keyCode;

    boolean getModifierState(DOMString keyArg);

    // https://w3c.github.io/uievents/#dom-keyboardevent-initkeyboardevent
    undefined initKeyboardEvent(DOMString typeArg, optional boolean bubblesArg = false, optional boolean cancelableArg = false, optional Window? viewArg = null, optional DOMString keyArg = "", optional unsigned long locationArg = 0, optional boolean ctrlKey = false, optional boolean altKey = false, optional boolean shiftKey = false, optional boolean metaKey = false);

};

// https://www.w3.org/TR/uievents/#dictdef-keyboardeventinit
dictionary KeyboardEventInit : EventModifierInit {
    DOMString key = "";
    DOMString code = "";
    unsigned long location = 0;
    boolean repeat = false;
    boolean isComposing = false;
    unsigned long charCode = 0;
    unsigned long keyCode = 0;
};
