// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// https://www.w3.org/TR/2016/WD-uievents-20160804/#interface-keyboardevent
// https://www.w3.org/TR/2016/WD-uievents-20160804/#legacy-key-attributes
// https://www.w3.org/TR/2009/WD-DOM-Level-3-Events-20090908/#events-Events-KeyboardEvent-keylocation

[Constructor(DOMString type, optional KeyboardEventInit eventInitDict)]
interface KeyboardEvent : UIEvent {
  // enum 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;

  boolean getModifierState(DOMString text);

  // Legacy Key Attributes.
  readonly attribute unsigned long keyCode;
  readonly attribute unsigned long charCode;

  // Deprecated. These features have been removed from the latest Web standards.
  readonly attribute unsigned long keyLocation;
  readonly attribute DOMString keyIdentifier;

  void initKeyboardEvent(DOMString type,
                         optional boolean bubbles = false,
                         optional boolean cancelable = false,
                         optional Window? view = null,
                         optional DOMString key = "",
                         optional unsigned long location = 0,
                         optional DOMString modifiersList = "",
                         optional boolean repeat = false);
};
