/*
 * Copyright (C) 2006 Apple Computer, Inc.
 * 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://w3c.github.io/uievents/#interface-KeyboardEvent

[
    Constructor(DOMString type, optional KeyboardEventInit eventInitDict),
    ConstructorCallWith=ScriptState,
] interface KeyboardEvent : UIEvent {
    // 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;
    [RuntimeEnabled=KeyboardEventKey]  readonly attribute DOMString     key;
    [RuntimeEnabled=KeyboardEventCode] 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;
    // TODO(philipj): readonly attribute boolean isComposing;
    boolean getModifierState(DOMString keyArg);

    // https://w3c.github.io/uievents/#idl-interface-KeyboardEvent-initializers
    // FIXME: this does not match the version in the spec.
    [CallWith=ScriptState, Measure] void initKeyboardEvent([Default=Undefined] optional DOMString type,
                                                           [Default=Undefined] optional boolean bubbles,
                                                           [Default=Undefined] optional boolean cancelable,
                                                           [Default=Undefined] optional Window view,
                                                           [Default=Undefined] optional DOMString keyIdentifier,
                                                           [Default=Undefined] optional unsigned long location,
                                                           [Default=Undefined] optional boolean ctrlKey,
                                                           [Default=Undefined] optional boolean altKey,
                                                           [Default=Undefined] optional boolean shiftKey,
                                                           [Default=Undefined] optional boolean metaKey);

    // https://w3c.github.io/uievents/#KeyboardEvent-supplemental-interface
    readonly attribute long charCode;
    readonly attribute long keyCode;
    readonly attribute long which;

    // Non-standard APIs
    [Measure] readonly attribute DOMString keyIdentifier;
    [ImplementedAs=location, DeprecateAs=KeyboardEventKeyLocation] readonly attribute unsigned long keyLocation;
};
