diff --git a/keymaster.js b/keymaster.js
index 23c44e5..ee85d32 100644
--- a/keymaster.js
+++ b/keymaster.js
@@ -43,6 +43,16 @@
return -1;
}
+ var modifierMap = {
+ 16:'shiftKey',
+ 18:'altKey',
+ 17:'ctrlKey',
+ 91:'metaKey'
+ };
+ function updateModifierKey(event) {
+ for(k in _mods) _mods[k] = event[modifierMap[k]];
+ };
+
// handle keydown event
function dispatch(event, scope){
var key, handler, k, i, modifiersMatch;
@@ -60,6 +70,7 @@
for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = true;
return;
}
+ updateModifierKey(event);
// see if we need to ignore the keypress (filter() can can be overridden)
// by default ignore key presses if a select, textarea, or input is focused
diff --git a/test/keymaster.html b/test/keymaster.html
index a22c70e..40d4483 100644
--- a/test/keymaster.html
+++ b/test/keymaster.html
@@ -21,14 +21,23 @@
Keymaster unit tests
return document.getElementById(id);
}
+ var modifierMap = {
+ 16:'shiftKey',
+ 18:'altKey',
+ 17:'ctrlKey',
+ 91:'metaKey'
+ };
+
// because the DOM is retarded,
// and browsers don't really care about the DOM API anyway
// (IE, Firefox, WebKit are all using different event generators),
// we'll just simulate events roughly
- function keydown(code, el){
+ function keydown(code, modifiers, el){
var event = document.createEvent('Event');
event.initEvent('keydown', true, true);
event.keyCode = code;
+ if (modifiers && modifiers.length > 0)
+ for(i in modifiers) event[modifierMap[modifiers[i]]] = true;
(el||document).dispatchEvent(event);
}
@@ -73,14 +82,14 @@ Keymaster unit tests
t.assertEqual(0, cntCommandCtrlShiftA);
t.assertEqual(0, cntCommandCtrlAltShiftA);
- keydown(KEYS.shift); keydown(65); keyup(65); keyup(KEYS.shift);
+ keydown(KEYS.shift); keydown(65, [16]); keyup(65); keyup(KEYS.shift);
t.assertEqual(1, cntA);
t.assertEqual(1, cntShiftA);
t.assertEqual(0, cntCtrlShiftA);
t.assertEqual(0, cntCommandCtrlShiftA);
t.assertEqual(0, cntCommandCtrlAltShiftA);
- keydown(KEYS.shift); keydown(KEYS.ctrl); keydown(65); keyup(65); keyup(KEYS.shift); keyup(KEYS.ctrl);
+ keydown(KEYS.shift); keydown(KEYS.ctrl); keydown(65, [16, 17]); keyup(65); keyup(KEYS.shift); keyup(KEYS.ctrl);
t.assertEqual(1, cntA);
t.assertEqual(1, cntShiftA);
t.assertEqual(1, cntCtrlShiftA);
@@ -88,7 +97,7 @@ Keymaster unit tests
t.assertEqual(0, cntCommandCtrlAltShiftA);
keydown(KEYS.command); keydown(KEYS.shift); keydown(KEYS.ctrl);
- keydown(65); keyup(65);
+ keydown(65, [91, 16, 17]); keyup(65);
keyup(KEYS.shift); keyup(KEYS.ctrl); keyup(KEYS.command);
t.assertEqual(1, cntA);
t.assertEqual(1, cntShiftA);
@@ -97,7 +106,7 @@ Keymaster unit tests
t.assertEqual(0, cntCommandCtrlAltShiftA);
keydown(KEYS.alt); keydown(KEYS.command); keydown(KEYS.shift); keydown(KEYS.ctrl);
- keydown(65); keyup(65);
+ keydown(65, [18, 91, 16, 17]); keyup(65);
keyup(KEYS.shift); keyup(KEYS.ctrl); keyup(KEYS.command); keyup(KEYS.alt);
t.assertEqual(1, cntA);
t.assertEqual(1, cntShiftA);
@@ -113,10 +122,10 @@ Keymaster unit tests
key('⇧+c', function(){ sequence += 'c' });
key('⌘+d', function(){ sequence += 'd' });
- keydown(KEYS.ctrl); keydown(65); keyup(65); keyup(KEYS.ctrl);
- keydown(KEYS.option); keydown(66); keyup(66); keyup(KEYS.option);
- keydown(KEYS.shift); keydown(67); keyup(67); keyup(KEYS.shift);
- keydown(KEYS.command); keydown(68); keyup(68); keyup(KEYS.command);
+ keydown(KEYS.ctrl); keydown(65, [17]); keyup(65); keyup(KEYS.ctrl);
+ keydown(KEYS.option); keydown(66, [18]); keyup(66); keyup(KEYS.option);
+ keydown(KEYS.shift); keydown(67, [16]); keyup(67); keyup(KEYS.shift);
+ keydown(KEYS.command); keydown(68, [91]); keyup(68); keyup(KEYS.command);
t.assertEqual('abcd', sequence);
},