KeyEvent constructor

KeyEvent(
  1. String type, {
  2. Window? view,
  3. bool canBubble = true,
  4. bool cancelable = true,
  5. int keyCode = 0,
  6. int charCode = 0,
  7. int location = 1,
  8. bool ctrlKey = false,
  9. bool altKey = false,
  10. bool shiftKey = false,
  11. bool metaKey = false,
  12. EventTarget? currentTarget,
})

Programmatically create a new KeyEvent (and KeyboardEvent).

Implementation

factory KeyEvent(
  String type, {
  Window? view,
  bool canBubble = true,
  bool cancelable = true,
  int keyCode = 0,
  int charCode = 0,
  int location = 1,
  bool ctrlKey = false,
  bool altKey = false,
  bool shiftKey = false,
  bool metaKey = false,
  EventTarget? currentTarget,
}) {
  if (view == null) {
    view = window;
  }

  KeyboardEvent eventObj;

  // Currently this works on everything but Safari. Safari throws an
  // "Attempting to change access mechanism for an unconfigurable property"
  // TypeError when trying to do the Object.defineProperty hack, so we avoid
  // this branch if possible.
  // Also, if we want this branch to work in FF, we also need to modify
  // _initKeyboardEvent to also take charCode and keyCode values to
  // initialize initKeyEvent.

  eventObj =
      new Event.eventType(
            'KeyboardEvent',
            type,
            canBubble: canBubble,
            cancelable: cancelable,
          )
          as KeyboardEvent;

  // Chromium Hack
  JS(
    'void',
    "Object.defineProperty(#, 'keyCode', {"
        "  get : function() { return this.keyCodeVal; } })",
    eventObj,
  );
  JS(
    'void',
    "Object.defineProperty(#, 'which', {"
        "  get : function() { return this.keyCodeVal; } })",
    eventObj,
  );
  JS(
    'void',
    "Object.defineProperty(#, 'charCode', {"
        "  get : function() { return this.charCodeVal; } })",
    eventObj,
  );

  var keyIdentifier = _convertToHexString(charCode, keyCode);
  eventObj._initKeyboardEvent(
    type,
    canBubble,
    cancelable,
    view,
    keyIdentifier,
    location,
    ctrlKey,
    altKey,
    shiftKey,
    metaKey,
  );
  JS('void', '#.keyCodeVal = #', eventObj, keyCode);
  JS('void', '#.charCodeVal = #', eventObj, charCode);

  // Tell dart2js that it smells like a KeyboardEvent!
  setDispatchProperty(eventObj, _keyboardEventDispatchRecord);

  var keyEvent = new KeyEvent.wrap(eventObj);
  if (keyEvent._currentTarget == null) {
    keyEvent._currentTarget = currentTarget == null ? window : currentTarget;
  }
  return keyEvent;
}