-
Notifications
You must be signed in to change notification settings - Fork 29
/
Copy pathkey-event.js
130 lines (106 loc) · 3.08 KB
/
key-event.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* eslint-env node, browser */
var KeyEvent = function (data, type) {
'use strict'
this.keyCode = 'keyCode' in data ? data.keyCode : 0
this.charCode = 'charCode' in data ? data.charCode : 0
var modifiers = 'modifiers' in data ? data.modifiers : []
this.ctrlKey = false
this.metaKey = false
this.altKey = false
this.shiftKey = false
for (var i = 0; i < modifiers.length; i++) {
this[modifiers[i] + 'Key'] = true
}
this.type = type || 'keypress'
}
KeyEvent.prototype.toNative = function () {
'use strict'
var event = document.createEvent ? document.createEvent('Event') : document.createEventObject()
if (event.initEvent) {
event.initEvent(this.type, true, true)
}
event.keyCode = this.keyCode
event.which = this.charCode || this.keyCode
event.shiftKey = this.shiftKey
event.metaKey = this.metaKey
event.altKey = this.altKey
event.ctrlKey = this.ctrlKey
return event
}
KeyEvent.prototype.fire = function (element) {
'use strict'
var event = this.toNative()
if (element.dispatchEvent) {
element.dispatchEvent(event)
return
}
element.fireEvent('on' + this.type, event)
}
// simulates complete key event as if the user pressed the key in the browser
// triggers a keydown, then a keypress, then a keyup
KeyEvent.simulate = function (charCode, keyCode, modifiers, element, repeat) {
'use strict'
modifiers = modifiers || []
if (element === undefined) {
element = document.documentElement
}
if (repeat === undefined) {
repeat = 1
}
var modifierToKeyCode = {
'shift': 16,
'ctrl': 17,
'alt': 18,
'meta': 91
}
// if the key is a modifier then take it out of the regular
// keypress/keydown
if (keyCode === 16 || keyCode === 17 || keyCode === 18 || keyCode === 91) {
repeat = 0
}
var modifiersToInclude = []
var keyEvents = []
// modifiers would go down first
for (var i = 0; i < modifiers.length; i++) {
modifiersToInclude.push(modifiers[i])
keyEvents.push(new KeyEvent({
charCode: 0,
keyCode: modifierToKeyCode[modifiers[i]],
modifiers: modifiersToInclude
}, 'keydown'))
}
// @todo factor in duration for these
while (repeat > 0) {
keyEvents.push(new KeyEvent({
charCode: 0,
keyCode: keyCode,
modifiers: modifiersToInclude
}, 'keydown'))
keyEvents.push(new KeyEvent({
charCode: charCode,
keyCode: charCode,
modifiers: modifiersToInclude
}, 'keypress'))
repeat--
}
keyEvents.push(new KeyEvent({
charCode: 0,
keyCode: keyCode,
modifiers: modifiersToInclude
}, 'keyup'))
// now lift up the modifier keys
for (i = 0; i < modifiersToInclude.length; i++) {
var modifierKeyCode = modifierToKeyCode[modifiersToInclude[i]]
modifiersToInclude.splice(i, 1)
keyEvents.push(new KeyEvent({
charCode: 0,
keyCode: modifierKeyCode,
modifiers: modifiersToInclude
}, 'keyup'))
}
for (i = 0; i < keyEvents.length; i++) {
// console.log("firing", keyEvents[i].type, keyEvents[i].keyCode, keyEvents[i].charCode)
keyEvents[i].fire(element)
}
}
module.exports = KeyEvent