Skip to content

Commit c9dfa58

Browse files
authored
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
1 parent cb614a6 commit c9dfa58

File tree

6 files changed

+166
-6
lines changed

6 files changed

+166
-6
lines changed

.jshintrc

+3-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
"start": true,
2525
"stop": true,
2626

27-
"formElExp": true
27+
"formElExp": true,
28+
"KeyboardEvent": true
29+
2830
},
2931

3032

src/key.js

+16-4
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,9 @@ h.extend(syn.key, {
385385

386386
var charCode = keyData[event][0],
387387
keyCode = keyData[event][1],
388-
result = {};
388+
result = {
389+
key: key
390+
};
389391

390392
if (keyCode === 'key') {
391393
result.keyCode = syn.keycodes[key];
@@ -407,7 +409,7 @@ h.extend(syn.key, {
407409
} else {
408410
result.which = result.charCode;
409411
}
410-
412+
411413
return result;
412414
},
413415
//types of event keys
@@ -738,8 +740,18 @@ h.extend(syn.create, {
738740
var doc = h.getWindow(element)
739741
.document || document,
740742
event;
741-
if (doc.createEvent) {
742-
try {
743+
if (typeof KeyboardEvent !== 'undefined') {
744+
var keyboardEventKeys = syn.key.keyboardEventKeys;
745+
746+
if (options.key && keyboardEventKeys[options.key]) {
747+
options.key = keyboardEventKeys[options.key];
748+
}
749+
750+
event = new KeyboardEvent(type, options);
751+
event.synthetic = true;
752+
return event;
753+
} else if (doc.createEvent) {
754+
try {
743755
event = doc.createEvent("KeyEvents");
744756
event.initKeyEvent(type, true, true, window, options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.keyCode, options.charCode);
745757
} catch (e) {

src/keyboard-event-keys.js

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
var syn = require('./synthetic');
2+
3+
// For more details please refer to:
4+
// https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values
5+
6+
syn.key.keyboardEventKeys = {
7+
//backspace
8+
'\b': 'Backspace',
9+
10+
//tab
11+
'\t': 'Tab',
12+
13+
//enter
14+
'\r': 'Enter',
15+
16+
//modifier keys
17+
'shift': 'Shift',
18+
'ctrl': 'Control',
19+
'alt': 'Alt',
20+
'meta': 'Meta',
21+
22+
//weird
23+
'pause-break': 'Pause',
24+
'caps': 'CapsLock',
25+
'escape': 'Escape',
26+
'num-lock': 'NumLock',
27+
'scroll-lock': 'ScrollLock',
28+
'print': 'Print',
29+
30+
//navigation
31+
'page-up': 'PageUp',
32+
'page-down': 'PageDown',
33+
'end': 'End',
34+
'home': 'Home',
35+
'left': 'ArrowLeft',
36+
'up': 'ArrowUp',
37+
'right': 'ArrowRight',
38+
'down': 'ArrowDown',
39+
'insert': 'Insert',
40+
'delete': 'Delete',
41+
42+
'f1': 'F1',
43+
'f2': 'F2',
44+
'f3': 'F3',
45+
'f4': 'F4',
46+
'f5': 'F5',
47+
'f6': 'F6',
48+
'f7': 'F7',
49+
'f8': 'F8',
50+
'f9': 'F9',
51+
'f10': 'F10',
52+
'f11': 'F11',
53+
'f12': 'F12'
54+
};

src/syn.js

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var syn = require('./synthetic');
2+
require('./keyboard-event-keys');
23
require('./mouse.support');
34
require('./browsers');
45
require('./key.support');

src/synthetic.js

-1
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,6 @@ extend(syn, {
486486
* @param {Object} autoPrevent
487487
*/
488488
dispatch: function (event, element, type, autoPrevent) {
489-
490489
// dispatchEvent doesn't always work in IE (mostly in a popup)
491490
if (element.dispatchEvent && event) {
492491
var preventDefault = event.preventDefault,

test/key_test.js

+92
Original file line numberDiff line numberDiff line change
@@ -721,3 +721,95 @@ QUnit.test("typing in an input type=number works", function() {
721721
start();
722722
});
723723
});
724+
725+
726+
QUnit.test("Key property, a typed", function () {
727+
stop();
728+
729+
var a = false;
730+
st.binder('key', 'keypress', function (ev) {
731+
a = ev.key;
732+
equal('a', ev.key);
733+
});
734+
syn.type('key', "a", function () {
735+
ok(a, "a key typed");
736+
start();
737+
});
738+
});
739+
740+
QUnit.test("Control key", function () {
741+
stop();
742+
743+
var keyIsDown = false;
744+
st.binder("key", "keydown", function (ev) {
745+
keyIsDown = ev.ctrlKey;
746+
ok(ev.key === 'Control', "key is normalized");
747+
});
748+
749+
var keyIsUp = true;
750+
st.binder("key", "keyup", function (ev) {
751+
keyIsUp = ev.ctrlKey;
752+
ok(ev.key === 'Control', "key is normalized");
753+
});
754+
755+
syn.type('key', "[ctrl]", function () {
756+
ok(keyIsDown, "Control modifier key pressed successfully");
757+
758+
syn.type('key', "[ctrl-up]", function () {
759+
ok(!keyIsUp, "Control modifier key released successfully");
760+
start();
761+
});
762+
});
763+
});
764+
765+
766+
QUnit.test("alt keycodes", function () {
767+
stop();
768+
769+
var keyIsDown = false;
770+
st.binder("key", "keydown", function (ev) {
771+
keyIsDown = ev.altKey;
772+
ok(ev.key === 'Alt', "key is normalized");
773+
});
774+
775+
var keyIsUp = true;
776+
st.binder("key", "keyup", function (ev) {
777+
keyIsUp = ev.altKey;
778+
ok(ev.key === 'Alt', "key is normalized");
779+
});
780+
781+
syn.type('key', "[alt]", function () {
782+
ok(keyIsDown, "Alt modifier key pressed successfully");
783+
784+
syn.type('key', "[alt-up]", function () {
785+
ok(!keyIsUp, "Alt modifier key released successfully");
786+
start();
787+
});
788+
});
789+
});
790+
791+
QUnit.test("meta keycodes", function () {
792+
stop();
793+
794+
var keyIsDown = false;
795+
st.binder("key", "keydown", function (ev) {
796+
keyIsDown = ev.metaKey;
797+
ok(ev.key === 'Meta', "key is normalized");
798+
});
799+
800+
var keyIsUp = true;
801+
st.binder("key", "keyup", function (ev) {
802+
keyIsUp = ev.metaKey;
803+
ok(ev.key === 'Meta', "key is normalized");
804+
});
805+
806+
syn.type('key', "[meta]", function () {
807+
ok(keyIsDown, "meta modifier key pressed successfully");
808+
809+
syn.type('key', "[meta-up]", function () {
810+
ok(!keyIsUp, "meta modifier key released successfully");
811+
start();
812+
});
813+
});
814+
});
815+

0 commit comments

Comments
 (0)