mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-11 16:32:59 +00:00
2df3e475b4
https://github.com/w3c/uievents/issues/112 This is supported by all other UAs. In the past we had compatibility problems when trying to add support, but it seems these might be fixed if we make all arguments optional beyond the first. The interface chosen for the method is from the spec, which has been updated to match Chrome. This is also very similar to WebKit, but the final four arguments are different from IE. MozReview-Commit-ID: 36AeX1JwJTt --HG-- extra : rebase_source : 28b298d370f0f9a5ab4090a71a2aae91f1d90025
360 lines
15 KiB
HTML
360 lines
15 KiB
HTML
<!DOCTYPE HTML>
|
|
<html>
|
|
<head>
|
|
<title>Test for DOM KeyboardEvent</title>
|
|
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
|
<script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
|
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
|
</head>
|
|
<body>
|
|
<p id="display"></p>
|
|
<div id="content" style="display: none">
|
|
|
|
</div>
|
|
<pre id="test">
|
|
<script type="application/javascript">
|
|
|
|
SimpleTest.waitForExplicitFinish();
|
|
SimpleTest.waitForFocus(runTests, window);
|
|
|
|
function testInitializingUntrustedEvent()
|
|
{
|
|
const kTests = [
|
|
// initKeyEvent
|
|
{ createEventArg: "KeyboardEvent", useInitKeyboardEvent: false,
|
|
type: "keydown", bubbles: true, cancelable: true, view: null,
|
|
ctrlKey: false, altKey: false, shiftKey: false, metaKey: false,
|
|
keyCode: 0x00, charCode: 0x00, detail: 0, key: "", location: 0,
|
|
}, // 0
|
|
|
|
{ createEventArg: "keyboardevent", useInitKeyboardEvent: false,
|
|
type: "keyup", bubbles: false, cancelable: true, view: window,
|
|
ctrlKey: true, altKey: false, shiftKey: false, metaKey: false,
|
|
keyCode: 0x10, charCode: 0x00, detail: 0, key: "", location: 0,
|
|
}, // 1
|
|
|
|
{ createEventArg: "Keyboardevent", useInitKeyboardEvent: false,
|
|
type: "keypess", bubbles: true, cancelable: false, view: null,
|
|
ctrlKey: false, altKey: true, shiftKey: false, metaKey: false,
|
|
keyCode: 0x11, charCode: 0x30, detail: 0, key: "", location: 0,
|
|
}, // 2
|
|
|
|
{ createEventArg: "keyboardEvent", useInitKeyboardEvent: false,
|
|
type: "boo", bubbles: false, cancelable: false, view: window,
|
|
ctrlKey: false, altKey: false, shiftKey: true, metaKey: false,
|
|
keyCode: 0x30, charCode: 0x40, detail: 0, key: "", location: 0,
|
|
}, // 3
|
|
|
|
{ createEventArg: "KeyBoardEvent", useInitKeyboardEvent: false,
|
|
type: "foo", bubbles: true, cancelable: true, view: null,
|
|
ctrlKey: false, altKey: false, shiftKey: false, metaKey: true,
|
|
keyCode: 0x00, charCode: 0x50, detail: 0, key: "", location: 0,
|
|
}, // 4
|
|
|
|
{ createEventArg: "keyboardevEnt", useInitKeyboardEvent: false,
|
|
type: "bar", bubbles: false, cancelable: true, view: window,
|
|
ctrlKey: true, altKey: true, shiftKey: false, metaKey: false,
|
|
keyCode: 0x00, charCode: 0x60, detail: 0, key: "", location: 0,
|
|
}, // 5
|
|
|
|
{ createEventArg: "KeyboaRdevent", useInitKeyboardEvent: false,
|
|
type: "keydown", bubbles: true, cancelable: false, view: null,
|
|
ctrlKey: false, altKey: true, shiftKey: false, metaKey: true,
|
|
keyCode: 0x30, charCode: 0x00, detail: 0, key: "", location: 0,
|
|
}, // 6
|
|
|
|
{ createEventArg: "KEYBOARDEVENT", useInitKeyboardEvent: false,
|
|
type: "keyup", bubbles: false, cancelable: false, view: window,
|
|
ctrlKey: true, altKey: false, shiftKey: true, metaKey: false,
|
|
keyCode: 0x10, charCode: 0x80, detail: 0, key: "", location: 0,
|
|
}, // 7
|
|
|
|
{ createEventArg: "KeyboardEvent", useInitKeyboardEvent: false,
|
|
type: "keypress", bubbles: false, cancelable: false, view: window,
|
|
ctrlKey: true, altKey: false, shiftKey: true, metaKey: true,
|
|
keyCode: 0x10, charCode: 0x80, detail: 0, key: "", location: 0,
|
|
}, // 8
|
|
|
|
{ createEventArg: "KeyboardEvent", useInitKeyboardEvent: false,
|
|
type: "foo", bubbles: false, cancelable: false, view: window,
|
|
ctrlKey: true, altKey: true, shiftKey: true, metaKey: true,
|
|
keyCode: 0x10, charCode: 0x80, detail: 0, key: "", location: 0,
|
|
}, // 9
|
|
|
|
// initKeyboardEvent
|
|
{ createEventArg: "KeyboardEvent", useInitKeyboardEvent: true,
|
|
type: "keydown", bubbles: true, cancelable: true, view: null,
|
|
ctrlKey: false, altKey: false, shiftKey: false, metaKey: false,
|
|
keyCode: 0x00, charCode: 0x00, key: "", location: 0,
|
|
}, // 10
|
|
|
|
{ createEventArg: "keyboardevent", useInitKeyboardEvent: true,
|
|
type: "keyup", bubbles: false, cancelable: true, view: window,
|
|
ctrlKey: true, altKey: false, shiftKey: false, metaKey: false,
|
|
keyCode: 0x00, charCode: 0x00, key: "Unidentified", location: 1,
|
|
}, // 11
|
|
|
|
{ createEventArg: "Keyboardevent", useInitKeyboardEvent: true,
|
|
type: "keypess", bubbles: true, cancelable: false, view: null,
|
|
ctrlKey: false, altKey: true, shiftKey: false, metaKey: false,
|
|
keyCode: 0x00, charCode: 0x00, key: "FooBar", location: 2,
|
|
}, // 12
|
|
|
|
{ createEventArg: "keyboardevent", useInitKeyboardEvent: true,
|
|
type: "foo", bubbles: true, cancelable: true, view: null,
|
|
ctrlKey: false, altKey: false, shiftKey: false, metaKey: true,
|
|
keyCode: 0x00, charCode: 0x00, key: "a", location: 0,
|
|
}, // 13
|
|
|
|
{ createEventArg: "KeyBoardEvent", useInitKeyboardEvent: true,
|
|
type: "", bubbles: false, cancelable: false, view: null,
|
|
ctrlKey: true, altKey: true, shiftKey: true, metaKey: true,
|
|
keyCode: 0x00, charCode: 0x00, key: "3", location: 0,
|
|
}, // 14
|
|
|
|
{ createEventArg: "keyboardevEnt", useInitKeyboardEvent: true,
|
|
type: "", bubbles: false, cancelable: false, view: null,
|
|
ctrlKey: false, altKey: false, shiftKey: true, metaKey: false,
|
|
keyCode: 0x00, charCode: 0x00, key: "3", location: 6,
|
|
}, // 15
|
|
|
|
{ createEventArg: "KeyboaRdevent", useInitKeyboardEvent: true,
|
|
type: "", bubbles: false, cancelable: false, view: null,
|
|
ctrlKey: false, altKey: true, shiftKey: false, metaKey: false,
|
|
keyCode: 0x00, charCode: 0x00, key: "", location: 4,
|
|
}, // 16
|
|
];
|
|
|
|
const kOtherModifierName = [
|
|
"CapsLock", "NumLock", "ScrollLock", "Symbol", "SymbolLock", "Fn", "FnLock", "OS", "AltGraph"
|
|
];
|
|
|
|
const kInvalidModifierName = [
|
|
"shift", "control", "alt", "meta", "capslock", "numlock", "scrolllock",
|
|
"symbollock", "fn", "os", "altgraph", "Invalid", "Shift Control",
|
|
"Win", "Scroll"
|
|
];
|
|
|
|
for (var i = 0; i < kTests.length; i++) {
|
|
var description = "testInitializingUntrustedEvent, Index: " + i + ", ";
|
|
const kTest = kTests[i];
|
|
var e = document.createEvent(kTest.createEventArg);
|
|
if (kTest.useInitKeyboardEvent) {
|
|
e.initKeyboardEvent(kTest.type, kTest.bubbles, kTest.cancelable,
|
|
kTest.view, kTest.key, kTest.location,
|
|
kTest.ctrlKey, kTest.altKey, kTest.shiftKey,
|
|
kTest.metaKey);
|
|
} else {
|
|
e.initKeyEvent(kTest.type, kTest.bubbles, kTest.cancelable, kTest.view,
|
|
kTest.ctrlKey, kTest.altKey, kTest.shiftKey, kTest.metaKey,
|
|
kTest.keyCode, kTest.charCode);
|
|
}
|
|
is(e.toString(), "[object KeyboardEvent]",
|
|
description + 'class string should be "KeyboardEvent"');
|
|
|
|
for (var attr in kTest) {
|
|
if (attr == "createEventArg" || attr == "useInitKeyboardEvent" || attr == "modifiersList") {
|
|
continue;
|
|
}
|
|
if (!kTest.useInitKeyboardEvent && attr == "keyCode") {
|
|
// If this is keydown, keyup of keypress event, keycod must be correct.
|
|
if (kTest.type == "keydown" || kTest.type == "keyup" || kTest.type == "keypress") {
|
|
is(e[attr], kTest[attr], description + attr + " returns wrong value");
|
|
// Otherwise, should be always zero (why?)
|
|
} else {
|
|
is(e[attr], 0, description + attr + " returns non-zero for invalid event");
|
|
}
|
|
} else if (!kTest.useInitKeyboardEvent && attr == "charCode") {
|
|
// If this is keydown or keyup event, charCode always 0.
|
|
if (kTest.type == "keydown" || kTest.type == "keyup") {
|
|
is(e[attr], 0, description + attr + " returns non-zero for keydown or keyup event");
|
|
// If this is keypress event, charCode must be correct.
|
|
} else if (kTest.type == "keypress") {
|
|
is(e[attr], kTest[attr], description + attr + " returns wrong value");
|
|
// Otherwise, we have a bug.
|
|
} else {
|
|
if (e[attr] != kTest[attr]) { // avoid random unexpected pass.
|
|
todo_is(e[attr], kTest[attr], description + attr + " returns wrong value");
|
|
}
|
|
}
|
|
} else {
|
|
is(e[attr], kTest[attr], description + attr + " returns wrong value");
|
|
}
|
|
}
|
|
is(e.isTrusted, false, description + "isTrusted returns wrong value");
|
|
|
|
// getModifierState() tests
|
|
is(e.getModifierState("Shift"), kTest.shiftKey,
|
|
description + "getModifierState(\"Shift\") returns wrong value");
|
|
is(e.getModifierState("Control"), kTest.ctrlKey,
|
|
description + "getModifierState(\"Control\") returns wrong value");
|
|
is(e.getModifierState("Alt"), kTest.altKey,
|
|
description + "getModifierState(\"Alt\") returns wrong value");
|
|
is(e.getModifierState("Meta"), kTest.metaKey,
|
|
description + "getModifierState(\"Meta\") returns wrong value");
|
|
|
|
for (var j = 0; j < kOtherModifierName.length; j++) {
|
|
ok(!e.getModifierState(kOtherModifierName[j]),
|
|
description + "getModifierState(\"" + kOtherModifierName[j] + "\") returns wrong value");
|
|
}
|
|
for (var k = 0; k < kInvalidModifierName.length; k++) {
|
|
ok(!e.getModifierState(kInvalidModifierName[k]),
|
|
description + "getModifierState(\"" + kInvalidModifierName[k] + "\") returns wrong value");
|
|
}
|
|
}
|
|
}
|
|
|
|
function testSynthesizedKeyLocation()
|
|
{
|
|
const kTests = [
|
|
{ key: "a", isModifier: false,
|
|
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD },
|
|
},
|
|
{ key: "VK_SHIFT", isModifier: true,
|
|
event: { shiftKey: true, ctrlKey: false, altKey: false, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_LEFT },
|
|
},
|
|
{ key: "VK_SHIFT", isModifier: true,
|
|
event: { shiftKey: true, ctrlKey: false, altKey: false, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_RIGHT },
|
|
},
|
|
{ key: "VK_CONTROL", isModifier: true,
|
|
event: { shiftKey: false, ctrlKey: true, altKey: false, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_LEFT },
|
|
},
|
|
{ key: "VK_CONTROL", isModifier: true,
|
|
event: { shiftKey: false, ctrlKey: true, altKey: false, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_RIGHT },
|
|
},
|
|
/* XXX Alt key activates menubar even if we consume the key events.
|
|
{ key: "VK_ALT", isModifier: true,
|
|
event: { shiftKey: false, ctrlKey: false, altKey: true, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_LEFT },
|
|
},
|
|
{ key: "VK_ALT", isModifier: true,
|
|
event: { shiftKey: false, ctrlKey: false, altKey: true, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_RIGHT },
|
|
},
|
|
*/
|
|
{ key: "VK_META", isModifier: true,
|
|
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: true,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_LEFT },
|
|
},
|
|
{ key: "VK_META", isModifier: true,
|
|
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: true,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_RIGHT },
|
|
},
|
|
{ key: "VK_DOWN", isModifier: false,
|
|
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD },
|
|
},
|
|
{ key: "VK_DOWN", isModifier: false,
|
|
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_NUMPAD },
|
|
},
|
|
{ key: "5", isModifier: false,
|
|
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD },
|
|
},
|
|
{ key: "VK_NUMPAD5", isModifier: false,
|
|
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_NUMPAD },
|
|
},
|
|
{ key: "+", isModifier: false,
|
|
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD },
|
|
},
|
|
{ key: "VK_ADD", isModifier: false,
|
|
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_NUMPAD },
|
|
},
|
|
{ key: "VK_RETURN", isModifier: false,
|
|
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD },
|
|
},
|
|
{ key: "VK_RETURN", isModifier: false,
|
|
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_NUMPAD },
|
|
},
|
|
{ key: "VK_NUM_LOCK", isModifier: true,
|
|
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD },
|
|
},
|
|
{ key: "VK_INSERT", isModifier: false,
|
|
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD },
|
|
},
|
|
{ key: "VK_INSERT", isModifier: false,
|
|
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false,
|
|
location: KeyboardEvent.DOM_KEY_LOCATION_NUMPAD },
|
|
},
|
|
];
|
|
|
|
function getLocationName(aLocation)
|
|
{
|
|
switch (aLocation) {
|
|
case KeyboardEvent.DOM_KEY_LOCATION_STANDARD:
|
|
return "DOM_KEY_LOCATION_STANDARD";
|
|
case KeyboardEvent.DOM_KEY_LOCATION_LEFT:
|
|
return "DOM_KEY_LOCATION_LEFT";
|
|
case KeyboardEvent.DOM_KEY_LOCATION_RIGHT:
|
|
return "DOM_KEY_LOCATION_RIGHT";
|
|
case KeyboardEvent.DOM_KEY_LOCATION_NUMPAD:
|
|
return "DOM_KEY_LOCATION_NUMPAD";
|
|
default:
|
|
return "Invalid value (" + aLocation + ")";
|
|
}
|
|
}
|
|
|
|
var currentTest, description;
|
|
var events = { keydown: false, keypress: false, keyup: false };
|
|
|
|
function handler(aEvent)
|
|
{
|
|
is(aEvent.location, currentTest.event.location,
|
|
description + "location of " + aEvent.type + " was invalid");
|
|
events[aEvent.type] = true;
|
|
if (aEvent.type != "keydown" ||
|
|
(currentTest.event.isModifier && aEvent.type == "keydown")) {
|
|
aEvent.preventDefault();
|
|
}
|
|
}
|
|
|
|
window.addEventListener("keydown", handler, true);
|
|
window.addEventListener("keypress", handler, true);
|
|
window.addEventListener("keyup", handler, true);
|
|
|
|
for (var i = 0; i < kTests.length; i++) {
|
|
currentTest = kTests[i];
|
|
events = { keydown: false, keypress: false, keyup: false };
|
|
description = "testSynthesizedKeyLocation, " + i + ", key: " +
|
|
currentTest.key + ", location: " +
|
|
getLocationName(currentTest.event.location) + ": ";
|
|
synthesizeKey(currentTest.key, currentTest.event);
|
|
ok(events.keydown, description + "keydown event wasn't fired");
|
|
if (currentTest.isModifier) {
|
|
todo(events.keypress, description + "keypress event was fired for modifier key");
|
|
} else {
|
|
ok(events.keypress, description + "keypress event wasn't fired");
|
|
}
|
|
ok(events.keyup, description + "keyup event wasn't fired");
|
|
}
|
|
|
|
window.removeEventListener("keydown", handler, true);
|
|
window.removeEventListener("keypress", handler, true);
|
|
window.removeEventListener("keyup", handler, true);
|
|
}
|
|
|
|
function runTests()
|
|
{
|
|
testInitializingUntrustedEvent();
|
|
testSynthesizedKeyLocation();
|
|
SimpleTest.finish();
|
|
}
|
|
|
|
</script>
|
|
</pre>
|
|
</body>
|
|
</html>
|