338 lines
10 KiB
JavaScript
338 lines
10 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
const KEY_DATA = {
|
|
" ": { code: "Space" },
|
|
"!": { code: "Digit1", shifted: true },
|
|
"#": { code: "Digit3", shifted: true },
|
|
$: { code: "Digit4", shifted: true },
|
|
"%": { code: "Digit5", shifted: true },
|
|
"&": { code: "Digit7", shifted: true },
|
|
"'": { code: "Quote" },
|
|
"(": { code: "Digit9", shifted: true },
|
|
")": { code: "Digit0", shifted: true },
|
|
"*": { code: "Digit8", shifted: true },
|
|
"+": { code: "Equal", shifted: true },
|
|
",": { code: "Comma" },
|
|
"-": { code: "Minus" },
|
|
".": { code: "Period" },
|
|
"/": { code: "Slash" },
|
|
0: { code: "Digit0" },
|
|
1: { code: "Digit1" },
|
|
2: { code: "Digit2" },
|
|
3: { code: "Digit3" },
|
|
4: { code: "Digit4" },
|
|
5: { code: "Digit5" },
|
|
6: { code: "Digit6" },
|
|
7: { code: "Digit7" },
|
|
8: { code: "Digit8" },
|
|
9: { code: "Digit9" },
|
|
":": { code: "Semicolon", shifted: true },
|
|
";": { code: "Semicolon" },
|
|
"<": { code: "Comma", shifted: true },
|
|
"=": { code: "Equal" },
|
|
">": { code: "Period", shifted: true },
|
|
"?": { code: "Slash", shifted: true },
|
|
"@": { code: "Digit2", shifted: true },
|
|
A: { code: "KeyA", shifted: true },
|
|
B: { code: "KeyB", shifted: true },
|
|
C: { code: "KeyC", shifted: true },
|
|
D: { code: "KeyD", shifted: true },
|
|
E: { code: "KeyE", shifted: true },
|
|
F: { code: "KeyF", shifted: true },
|
|
G: { code: "KeyG", shifted: true },
|
|
H: { code: "KeyH", shifted: true },
|
|
I: { code: "KeyI", shifted: true },
|
|
J: { code: "KeyJ", shifted: true },
|
|
K: { code: "KeyK", shifted: true },
|
|
L: { code: "KeyL", shifted: true },
|
|
M: { code: "KeyM", shifted: true },
|
|
N: { code: "KeyN", shifted: true },
|
|
O: { code: "KeyO", shifted: true },
|
|
P: { code: "KeyP", shifted: true },
|
|
Q: { code: "KeyQ", shifted: true },
|
|
R: { code: "KeyR", shifted: true },
|
|
S: { code: "KeyS", shifted: true },
|
|
T: { code: "KeyT", shifted: true },
|
|
U: { code: "KeyU", shifted: true },
|
|
V: { code: "KeyV", shifted: true },
|
|
W: { code: "KeyW", shifted: true },
|
|
X: { code: "KeyX", shifted: true },
|
|
Y: { code: "KeyY", shifted: true },
|
|
Z: { code: "KeyZ", shifted: true },
|
|
"[": { code: "BracketLeft" },
|
|
'"': { code: "Quote", shifted: true },
|
|
"\\": { code: "Backslash" },
|
|
"]": { code: "BracketRight" },
|
|
"^": { code: "Digit6", shifted: true },
|
|
_: { code: "Minus", shifted: true },
|
|
"`": { code: "Backquote" },
|
|
a: { code: "KeyA" },
|
|
b: { code: "KeyB" },
|
|
c: { code: "KeyC" },
|
|
d: { code: "KeyD" },
|
|
e: { code: "KeyE" },
|
|
f: { code: "KeyF" },
|
|
g: { code: "KeyG" },
|
|
h: { code: "KeyH" },
|
|
i: { code: "KeyI" },
|
|
j: { code: "KeyJ" },
|
|
k: { code: "KeyK" },
|
|
l: { code: "KeyL" },
|
|
m: { code: "KeyM" },
|
|
n: { code: "KeyN" },
|
|
o: { code: "KeyO" },
|
|
p: { code: "KeyP" },
|
|
q: { code: "KeyQ" },
|
|
r: { code: "KeyR" },
|
|
s: { code: "KeyS" },
|
|
t: { code: "KeyT" },
|
|
u: { code: "KeyU" },
|
|
v: { code: "KeyV" },
|
|
w: { code: "KeyW" },
|
|
x: { code: "KeyX" },
|
|
y: { code: "KeyY" },
|
|
z: { code: "KeyZ" },
|
|
"{": { code: "BracketLeft", shifted: true },
|
|
"|": { code: "Backslash", shifted: true },
|
|
"}": { code: "BracketRight", shifted: true },
|
|
"~": { code: "Backquote", shifted: true },
|
|
"\uE000": { key: "Unidentified", printable: false },
|
|
"\uE001": { key: "Cancel", printable: false },
|
|
"\uE002": { code: "Help", key: "Help", printable: false },
|
|
"\uE003": { code: "Backspace", key: "Backspace", printable: false },
|
|
"\uE004": { code: "Tab", key: "Tab", printable: false },
|
|
"\uE005": { code: "", key: "Clear", printable: false },
|
|
"\uE006": { code: "Enter", key: "Enter", printable: false },
|
|
"\uE007": {
|
|
code: "NumpadEnter",
|
|
key: "Enter",
|
|
location: 1,
|
|
printable: false,
|
|
},
|
|
"\uE008": {
|
|
code: "ShiftLeft",
|
|
key: "Shift",
|
|
location: 1,
|
|
modifier: "shiftKey",
|
|
printable: false,
|
|
},
|
|
"\uE009": {
|
|
code: "ControlLeft",
|
|
key: "Control",
|
|
location: 1,
|
|
modifier: "ctrlKey",
|
|
printable: false,
|
|
},
|
|
"\uE00A": {
|
|
code: "AltLeft",
|
|
key: "Alt",
|
|
location: 1,
|
|
modifier: "altKey",
|
|
printable: false,
|
|
},
|
|
"\uE00B": { code: "Pause", key: "Pause", printable: false },
|
|
"\uE00C": { code: "Escape", key: "Escape", printable: false },
|
|
"\uE00D": { code: "Space", key: " ", shifted: true },
|
|
"\uE00E": { code: "PageUp", key: "PageUp", printable: false },
|
|
"\uE00F": { code: "PageDown", key: "PageDown", printable: false },
|
|
"\uE010": { code: "End", key: "End", printable: false },
|
|
"\uE011": { code: "Home", key: "Home", printable: false },
|
|
"\uE012": { code: "ArrowLeft", key: "ArrowLeft", printable: false },
|
|
"\uE013": { code: "ArrowUp", key: "ArrowUp", printable: false },
|
|
"\uE014": { code: "ArrowRight", key: "ArrowRight", printable: false },
|
|
"\uE015": { code: "ArrowDown", key: "ArrowDown", printable: false },
|
|
"\uE016": { code: "Insert", key: "Insert", printable: false },
|
|
"\uE017": { code: "Delete", key: "Delete", printable: false },
|
|
"\uE018": { code: "", key: ";" },
|
|
"\uE019": { code: "NumpadEqual", key: "=", location: 3 },
|
|
"\uE01A": { code: "Numpad0", key: "0", location: 3 },
|
|
"\uE01B": { code: "Numpad1", key: "1", location: 3 },
|
|
"\uE01C": { code: "Numpad2", key: "2", location: 3 },
|
|
"\uE01D": { code: "Numpad3", key: "3", location: 3 },
|
|
"\uE01E": { code: "Numpad4", key: "4", location: 3 },
|
|
"\uE01F": { code: "Numpad5", key: "5", location: 3 },
|
|
"\uE020": { code: "Numpad6", key: "6", location: 3 },
|
|
"\uE021": { code: "Numpad7", key: "7", location: 3 },
|
|
"\uE022": { code: "Numpad8", key: "8", location: 3 },
|
|
"\uE023": { code: "Numpad9", key: "9", location: 3 },
|
|
"\uE024": { code: "NumpadMultiply", key: "*", location: 3 },
|
|
"\uE025": { code: "NumpadAdd", key: "+", location: 3 },
|
|
"\uE026": { code: "NumpadComma", key: ",", location: 3 },
|
|
"\uE027": { code: "NumpadSubtract", key: "-", location: 3 },
|
|
"\uE028": { code: "NumpadDecimal", key: ".", location: 3 },
|
|
"\uE029": { code: "NumpadDivide", key: "/", location: 3 },
|
|
"\uE031": { code: "F1", key: "F1", printable: false },
|
|
"\uE032": { code: "F2", key: "F2", printable: false },
|
|
"\uE033": { code: "F3", key: "F3", printable: false },
|
|
"\uE034": { code: "F4", key: "F4", printable: false },
|
|
"\uE035": { code: "F5", key: "F5", printable: false },
|
|
"\uE036": { code: "F6", key: "F6", printable: false },
|
|
"\uE037": { code: "F7", key: "F7", printable: false },
|
|
"\uE038": { code: "F8", key: "F8", printable: false },
|
|
"\uE039": { code: "F9", key: "F9", printable: false },
|
|
"\uE03A": { code: "F10", key: "F10", printable: false },
|
|
"\uE03B": { code: "F11", key: "F11", printable: false },
|
|
"\uE03C": { code: "F12", key: "F12", printable: false },
|
|
"\uE03D": {
|
|
code: "MetaLeft",
|
|
key: "Meta",
|
|
location: 1,
|
|
modifier: "metaKey",
|
|
printable: false,
|
|
},
|
|
"\uE040": { code: "", key: "ZenkakuHankaku", printable: false },
|
|
"\uE050": {
|
|
code: "ShiftRight",
|
|
key: "Shift",
|
|
location: 2,
|
|
modifier: "shiftKey",
|
|
printable: false,
|
|
},
|
|
"\uE051": {
|
|
code: "ControlRight",
|
|
key: "Control",
|
|
location: 2,
|
|
modifier: "ctrlKey",
|
|
printable: false,
|
|
},
|
|
"\uE052": {
|
|
code: "AltRight",
|
|
key: "Alt",
|
|
location: 2,
|
|
modifier: "altKey",
|
|
printable: false,
|
|
},
|
|
"\uE053": {
|
|
code: "MetaRight",
|
|
key: "Meta",
|
|
location: 2,
|
|
modifier: "metaKey",
|
|
printable: false,
|
|
},
|
|
"\uE054": {
|
|
code: "Numpad9",
|
|
key: "PageUp",
|
|
location: 3,
|
|
printable: false,
|
|
shifted: true,
|
|
},
|
|
"\uE055": {
|
|
code: "Numpad3",
|
|
key: "PageDown",
|
|
location: 3,
|
|
printable: false,
|
|
shifted: true,
|
|
},
|
|
"\uE056": {
|
|
code: "Numpad1",
|
|
key: "End",
|
|
location: 3,
|
|
printable: false,
|
|
shifted: true,
|
|
},
|
|
"\uE057": {
|
|
code: "Numpad7",
|
|
key: "Home",
|
|
location: 3,
|
|
printable: false,
|
|
shifted: true,
|
|
},
|
|
"\uE058": {
|
|
code: "Numpad4",
|
|
key: "ArrowLeft",
|
|
location: 3,
|
|
printable: false,
|
|
shifted: true,
|
|
},
|
|
"\uE059": {
|
|
code: "Numpad8",
|
|
key: "ArrowUp",
|
|
location: 3,
|
|
printable: false,
|
|
shifted: true,
|
|
},
|
|
"\uE05A": {
|
|
code: "Numpad6",
|
|
key: "ArrowRight",
|
|
location: 3,
|
|
printable: false,
|
|
shifted: true,
|
|
},
|
|
"\uE05B": {
|
|
code: "Numpad2",
|
|
key: "ArrowDown",
|
|
location: 3,
|
|
printable: false,
|
|
shifted: true,
|
|
},
|
|
"\uE05C": {
|
|
code: "Numpad0",
|
|
key: "Insert",
|
|
location: 3,
|
|
printable: false,
|
|
shifted: true,
|
|
},
|
|
"\uE05D": {
|
|
code: "NumpadDecimal",
|
|
key: "Delete",
|
|
location: 3,
|
|
printable: false,
|
|
shifted: true,
|
|
},
|
|
};
|
|
|
|
const lazy = {};
|
|
|
|
ChromeUtils.defineLazyGetter(lazy, "SHIFT_DATA", () => {
|
|
// Initalize the shift mapping
|
|
const shiftData = new Map();
|
|
const byCode = new Map();
|
|
for (let [key, props] of Object.entries(KEY_DATA)) {
|
|
if (props.code) {
|
|
if (!byCode.has(props.code)) {
|
|
byCode.set(props.code, [null, null]);
|
|
}
|
|
byCode.get(props.code)[props.shifted ? 1 : 0] = key;
|
|
}
|
|
}
|
|
for (let [unshifted, shifted] of byCode.values()) {
|
|
if (unshifted !== null && shifted !== null) {
|
|
shiftData.set(unshifted, shifted);
|
|
}
|
|
}
|
|
return shiftData;
|
|
});
|
|
|
|
export const keyData = {
|
|
/**
|
|
* Get key event data for a given key character.
|
|
*
|
|
* @param {string} rawKey
|
|
* Key for which to get data. This can either be the key codepoint
|
|
* itself or one of the codepoints in the range U+E000-U+E05D that
|
|
* WebDriver uses to represent keys not corresponding directly to
|
|
* a codepoint.
|
|
* @returns {object} Key event data object.
|
|
*/
|
|
getData(rawKey) {
|
|
let keyData = { key: rawKey, location: 0, printable: true, shifted: false };
|
|
if (KEY_DATA.hasOwnProperty(rawKey)) {
|
|
keyData = { ...keyData, ...KEY_DATA[rawKey] };
|
|
}
|
|
return keyData;
|
|
},
|
|
|
|
/**
|
|
* Get shifted key character for a given key character.
|
|
*
|
|
* For characters unaffected by the shift key, this returns the input.
|
|
*
|
|
* @param {string} rawKey Key for which to get shifted key.
|
|
* @returns {string} Key string to use when the shift modifier is set.
|
|
*/
|
|
getShiftedKey(rawKey) {
|
|
return lazy.SHIFT_DATA.get(rawKey) ?? rawKey;
|
|
},
|
|
};
|