From c9dfa5844978387b5105a9dbe9700e7983a03f8c Mon Sep 17 00:00:00 2001 From: Mohamed Cherif Bouchelaghem Date: Mon, 20 Apr 2020 20:10:22 +0100 Subject: [PATCH] Add key event property (#181) * Add key event property * check without test * Fails on firefox * Remove the commented tests * Fix adding key property with KeyboarEvent * Use the correct key value for KeyboardEvent * set key once --- .jshintrc | 4 +- src/key.js | 20 +++++++-- src/keyboard-event-keys.js | 54 ++++++++++++++++++++++ src/syn.js | 1 + src/synthetic.js | 1 - test/key_test.js | 92 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 166 insertions(+), 6 deletions(-) create mode 100644 src/keyboard-event-keys.js diff --git a/.jshintrc b/.jshintrc index 36c2ede6..ca1763ad 100644 --- a/.jshintrc +++ b/.jshintrc @@ -24,7 +24,9 @@ "start": true, "stop": true, - "formElExp": true + "formElExp": true, + "KeyboardEvent": true + }, diff --git a/src/key.js b/src/key.js index 59ca48cf..460ad555 100644 --- a/src/key.js +++ b/src/key.js @@ -385,7 +385,9 @@ h.extend(syn.key, { var charCode = keyData[event][0], keyCode = keyData[event][1], - result = {}; + result = { + key: key + }; if (keyCode === 'key') { result.keyCode = syn.keycodes[key]; @@ -407,7 +409,7 @@ h.extend(syn.key, { } else { result.which = result.charCode; } - + return result; }, //types of event keys @@ -738,8 +740,18 @@ h.extend(syn.create, { var doc = h.getWindow(element) .document || document, event; - if (doc.createEvent) { - try { + if (typeof KeyboardEvent !== 'undefined') { + var keyboardEventKeys = syn.key.keyboardEventKeys; + + if (options.key && keyboardEventKeys[options.key]) { + options.key = keyboardEventKeys[options.key]; + } + + event = new KeyboardEvent(type, options); + event.synthetic = true; + return event; + } else if (doc.createEvent) { + try { event = doc.createEvent("KeyEvents"); event.initKeyEvent(type, true, true, window, options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.keyCode, options.charCode); } catch (e) { diff --git a/src/keyboard-event-keys.js b/src/keyboard-event-keys.js new file mode 100644 index 00000000..e4e11991 --- /dev/null +++ b/src/keyboard-event-keys.js @@ -0,0 +1,54 @@ +var syn = require('./synthetic'); + +// For more details please refer to: +// https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values + +syn.key.keyboardEventKeys = { + //backspace + '\b': 'Backspace', + + //tab + '\t': 'Tab', + + //enter + '\r': 'Enter', + + //modifier keys + 'shift': 'Shift', + 'ctrl': 'Control', + 'alt': 'Alt', + 'meta': 'Meta', + + //weird + 'pause-break': 'Pause', + 'caps': 'CapsLock', + 'escape': 'Escape', + 'num-lock': 'NumLock', + 'scroll-lock': 'ScrollLock', + 'print': 'Print', + + //navigation + 'page-up': 'PageUp', + 'page-down': 'PageDown', + 'end': 'End', + 'home': 'Home', + 'left': 'ArrowLeft', + 'up': 'ArrowUp', + 'right': 'ArrowRight', + 'down': 'ArrowDown', + 'insert': 'Insert', + 'delete': 'Delete', + + 'f1': 'F1', + 'f2': 'F2', + 'f3': 'F3', + 'f4': 'F4', + 'f5': 'F5', + 'f6': 'F6', + 'f7': 'F7', + 'f8': 'F8', + 'f9': 'F9', + 'f10': 'F10', + 'f11': 'F11', + 'f12': 'F12' +}; \ No newline at end of file diff --git a/src/syn.js b/src/syn.js index 9323a9f2..5e052306 100644 --- a/src/syn.js +++ b/src/syn.js @@ -1,4 +1,5 @@ var syn = require('./synthetic'); +require('./keyboard-event-keys'); require('./mouse.support'); require('./browsers'); require('./key.support'); diff --git a/src/synthetic.js b/src/synthetic.js index 36da4c28..8f0e505c 100644 --- a/src/synthetic.js +++ b/src/synthetic.js @@ -486,7 +486,6 @@ extend(syn, { * @param {Object} autoPrevent */ dispatch: function (event, element, type, autoPrevent) { - // dispatchEvent doesn't always work in IE (mostly in a popup) if (element.dispatchEvent && event) { var preventDefault = event.preventDefault, diff --git a/test/key_test.js b/test/key_test.js index 57d2bfa7..2ed4ab15 100644 --- a/test/key_test.js +++ b/test/key_test.js @@ -721,3 +721,95 @@ QUnit.test("typing in an input type=number works", function() { start(); }); }); + + +QUnit.test("Key property, a typed", function () { + stop(); + + var a = false; + st.binder('key', 'keypress', function (ev) { + a = ev.key; + equal('a', ev.key); + }); + syn.type('key', "a", function () { + ok(a, "a key typed"); + start(); + }); +}); + +QUnit.test("Control key", function () { + stop(); + + var keyIsDown = false; + st.binder("key", "keydown", function (ev) { + keyIsDown = ev.ctrlKey; + ok(ev.key === 'Control', "key is normalized"); + }); + + var keyIsUp = true; + st.binder("key", "keyup", function (ev) { + keyIsUp = ev.ctrlKey; + ok(ev.key === 'Control', "key is normalized"); + }); + + syn.type('key', "[ctrl]", function () { + ok(keyIsDown, "Control modifier key pressed successfully"); + + syn.type('key', "[ctrl-up]", function () { + ok(!keyIsUp, "Control modifier key released successfully"); + start(); + }); + }); +}); + + +QUnit.test("alt keycodes", function () { + stop(); + + var keyIsDown = false; + st.binder("key", "keydown", function (ev) { + keyIsDown = ev.altKey; + ok(ev.key === 'Alt', "key is normalized"); + }); + + var keyIsUp = true; + st.binder("key", "keyup", function (ev) { + keyIsUp = ev.altKey; + ok(ev.key === 'Alt', "key is normalized"); + }); + + syn.type('key', "[alt]", function () { + ok(keyIsDown, "Alt modifier key pressed successfully"); + + syn.type('key', "[alt-up]", function () { + ok(!keyIsUp, "Alt modifier key released successfully"); + start(); + }); + }); +}); + +QUnit.test("meta keycodes", function () { + stop(); + + var keyIsDown = false; + st.binder("key", "keydown", function (ev) { + keyIsDown = ev.metaKey; + ok(ev.key === 'Meta', "key is normalized"); + }); + + var keyIsUp = true; + st.binder("key", "keyup", function (ev) { + keyIsUp = ev.metaKey; + ok(ev.key === 'Meta', "key is normalized"); + }); + + syn.type('key', "[meta]", function () { + ok(keyIsDown, "meta modifier key pressed successfully"); + + syn.type('key', "[meta-up]", function () { + ok(!keyIsUp, "meta modifier key released successfully"); + start(); + }); + }); +}); +