2017-05-03 15:35:00 +02:00
|
|
|
/**
|
|
|
|
* Copyright 2013-present, Facebook, Inc.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* This source code is licensed under the BSD-style license found in the
|
|
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
var getEventCharCode = require('./getEventCharCode');
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Normalization of deprecated HTML5 `key` values
|
|
|
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
|
|
|
|
*/
|
|
|
|
var normalizeKey = {
|
2017-08-14 05:01:11 +02:00
|
|
|
Esc: 'Escape',
|
|
|
|
Spacebar: ' ',
|
|
|
|
Left: 'ArrowLeft',
|
|
|
|
Up: 'ArrowUp',
|
|
|
|
Right: 'ArrowRight',
|
|
|
|
Down: 'ArrowDown',
|
|
|
|
Del: 'Delete',
|
|
|
|
Win: 'OS',
|
|
|
|
Menu: 'ContextMenu',
|
|
|
|
Apps: 'ContextMenu',
|
|
|
|
Scroll: 'ScrollLock',
|
|
|
|
MozPrintableKey: 'Unidentified'
|
2017-05-03 15:35:00 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Translation from legacy `keyCode` to HTML5 `key`
|
|
|
|
* Only special keys supported, all others depend on keyboard layout or browser
|
|
|
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
|
|
|
|
*/
|
|
|
|
var translateToKey = {
|
|
|
|
8: 'Backspace',
|
|
|
|
9: 'Tab',
|
|
|
|
12: 'Clear',
|
|
|
|
13: 'Enter',
|
|
|
|
16: 'Shift',
|
|
|
|
17: 'Control',
|
|
|
|
18: 'Alt',
|
|
|
|
19: 'Pause',
|
|
|
|
20: 'CapsLock',
|
|
|
|
27: 'Escape',
|
|
|
|
32: ' ',
|
|
|
|
33: 'PageUp',
|
|
|
|
34: 'PageDown',
|
|
|
|
35: 'End',
|
|
|
|
36: 'Home',
|
|
|
|
37: 'ArrowLeft',
|
|
|
|
38: 'ArrowUp',
|
|
|
|
39: 'ArrowRight',
|
|
|
|
40: 'ArrowDown',
|
|
|
|
45: 'Insert',
|
|
|
|
46: 'Delete',
|
2017-08-14 05:01:11 +02:00
|
|
|
112: 'F1',
|
|
|
|
113: 'F2',
|
|
|
|
114: 'F3',
|
|
|
|
115: 'F4',
|
|
|
|
116: 'F5',
|
|
|
|
117: 'F6',
|
|
|
|
118: 'F7',
|
|
|
|
119: 'F8',
|
|
|
|
120: 'F9',
|
|
|
|
121: 'F10',
|
|
|
|
122: 'F11',
|
|
|
|
123: 'F12',
|
2017-05-03 15:35:00 +02:00
|
|
|
144: 'NumLock',
|
|
|
|
145: 'ScrollLock',
|
|
|
|
224: 'Meta'
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {object} nativeEvent Native browser event.
|
|
|
|
* @return {string} Normalized `key` property.
|
|
|
|
*/
|
|
|
|
function getEventKey(nativeEvent) {
|
|
|
|
if (nativeEvent.key) {
|
|
|
|
// Normalize inconsistent values reported by browsers due to
|
|
|
|
// implementations of a working draft specification.
|
|
|
|
|
|
|
|
// FireFox implements `key` but returns `MozPrintableKey` for all
|
|
|
|
// printable characters (normalized to `Unidentified`), ignore it.
|
|
|
|
var key = normalizeKey[nativeEvent.key] || nativeEvent.key;
|
|
|
|
if (key !== 'Unidentified') {
|
|
|
|
return key;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Browser does not implement `key`, polyfill as much of it as we can.
|
|
|
|
if (nativeEvent.type === 'keypress') {
|
|
|
|
var charCode = getEventCharCode(nativeEvent);
|
|
|
|
|
|
|
|
// The enter-key is technically both printable and non-printable and can
|
|
|
|
// thus be captured by `keypress`, no other non-printable key should.
|
|
|
|
return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);
|
|
|
|
}
|
|
|
|
if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {
|
|
|
|
// While user keyboard layout determines the actual meaning of each
|
|
|
|
// `keyCode` value, almost all function keys have a universal value.
|
|
|
|
return translateToKey[nativeEvent.keyCode] || 'Unidentified';
|
|
|
|
}
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = getEventKey;
|