Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!DOCTYPE HTML>
<html>
<head>
<title>Test for DOM KeyboardEvent</title>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<script src="/tests/SimpleTest/EventUtils.js"></script>
<link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<p id="display"></p>
<p><input type="text" id="input"></p>
<p><input type="text" id="input_readonly" readonly></p>
<p><textarea id="textarea"></textarea></p>
<div id="content" style="display: none">
</div>
<pre id="test">
<script>
SimpleTest.waitForExplicitFinish();
SimpleTest.waitForFocus(runTests, window);
function testInitializingUntrustedEvent() {
const kTests = [
[
"KeyboardEvent",
{
type: "keydown",
bubbles: true,
cancelable: true,
view: null,
key: "",
location: 0,
ctrlKey: false,
altKey: false,
shiftKey: false,
metaKey: false,
},
],
[
"keyboardevent",
{
type: "keyup",
bubbles: false,
cancelable: true,
view: window,
key: "Unidentified",
location: 1,
ctrlKey: true,
altKey: false,
shiftKey: false,
metaKey: false,
},
],
[
"Keyboardevent",
{
type: "keypress",
bubbles: true,
cancelable: false,
view: null,
key: "FooBar",
location: 2,
ctrlKey: false,
altKey: true,
shiftKey: false,
metaKey: false,
},
],
[
"keyboardevent",
{
type: "foo",
bubbles: true,
cancelable: true,
view: null,
key: "a",
location: 0,
ctrlKey: false,
altKey: false,
shiftKey: false,
metaKey: true,
},
],
[
"KeyBoardEvent",
{
type: "",
bubbles: false,
cancelable: false,
view: null,
key: "3",
location: 0,
ctrlKey: true,
altKey: true,
shiftKey: true,
metaKey: true,
},
],
[
"keyboardevEnt",
{
type: "",
bubbles: false,
cancelable: false,
view: null,
key: "3",
location: 6,
ctrlKey: false,
altKey: false,
shiftKey: true,
metaKey: false,
},
],
[
"KeyboaRdevent",
{
type: "",
bubbles: false,
cancelable: false,
view: null,
key: "",
location: 4,
ctrlKey: false,
altKey: true,
shiftKey: false,
metaKey: false,
},
],
];
const kOtherModifierName = [
"CapsLock", "NumLock", "ScrollLock", "Symbol", "SymbolLock", "Fn", "FnLock", "AltGraph"
];
const kInvalidModifierName = [
"shift", "control", "alt", "meta", "capslock", "numlock", "scrolllock",
"symbollock", "fn", "OS", "altgraph", "Invalid", "Shift Control",
"Win", "Scroll"
];
kTests.forEach(([createEventArg, kTest], i) => {
var description = "testInitializingUntrustedEvent, Index: " + i + ", ";
var e = document.createEvent(createEventArg);
e.initKeyboardEvent(
kTest.type,
kTest.bubbles,
kTest.cancelable,
kTest.view,
kTest.key,
kTest.location,
kTest.ctrlKey,
kTest.altKey,
kTest.shiftKey,
kTest.metaKey
);
is(
e.toString(),
"[object KeyboardEvent]",
description + 'class string should be "KeyboardEvent"'
);
for (var attr in kTest) {
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, isPrintable: true,
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_A,
location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD },
},
{ key: "KEY_Shift", isModifier: true, isPrintable: false,
event: { shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_SHIFT,
location: KeyboardEvent.DOM_KEY_LOCATION_LEFT },
},
{ key: "KEY_Shift", isModifier: true, isPrintable: false,
event: { shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_SHIFT,
location: KeyboardEvent.DOM_KEY_LOCATION_RIGHT },
},
{ key: "KEY_Control", isModifier: true, isPrintable: false,
event: { shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_CONTROL,
location: KeyboardEvent.DOM_KEY_LOCATION_LEFT },
},
{ key: "KEY_Control", isModifier: true, isPrintable: false,
event: { shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_CONTROL,
location: KeyboardEvent.DOM_KEY_LOCATION_RIGHT },
},
/* XXX Alt key activates menubar even if we consume the key events.
{ key: "KEY_Alt", isModifier: true, isPrintable: false,
event: { shiftKey: false, ctrlKey: false, altKey: true, metaKey: false, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_ALT,
location: KeyboardEvent.DOM_KEY_LOCATION_LEFT },
},
{ key: "KEY_Alt", isModifier: true, isPrintable: false,
event: { shiftKey: false, ctrlKey: false, altKey: true, metaKey: false, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_ALT,
location: KeyboardEvent.DOM_KEY_LOCATION_RIGHT },
},
*/
{ key: "KEY_Meta", isModifier: true, isPrintable: false,
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: true, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_META,
location: KeyboardEvent.DOM_KEY_LOCATION_LEFT },
},
{ key: "KEY_Meta", isModifier: true, isPrintable: false,
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: true, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_META,
location: KeyboardEvent.DOM_KEY_LOCATION_RIGHT },
},
{ key: "KEY_ArrowDown", isModifier: false, isPrintable: false,
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_DOWN,
location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD },
},
{ key: "KEY_ArrowDown", isModifier: false, isPrintable: false,
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_DOWN,
location: KeyboardEvent.DOM_KEY_LOCATION_NUMPAD },
},
{ key: "5", isModifier: false, isPrintable: true,
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_5,
location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD },
},
{ key: "5", isModifier: false, isPrintable: true,
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, numLockKey: true,
keyCode: KeyboardEvent.DOM_VK_NUMPAD5,
location: KeyboardEvent.DOM_KEY_LOCATION_NUMPAD },
},
{ key: "+", isModifier: false, isPrintable: true,
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_EQUALS,
location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD },
},
{ key: "+", isModifier: false, isPrintable: true,
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, numLockKey: true,
keyCode: KeyboardEvent.DOM_VK_ADD,
location: KeyboardEvent.DOM_KEY_LOCATION_NUMPAD },
},
{ key: "KEY_Enter", isModifier: false, isPrintable: true,
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_RETURN,
location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD },
},
{ key: "KEY_Enter", isModifier: false, isPrintable: true,
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_RETURN,
location: KeyboardEvent.DOM_KEY_LOCATION_NUMPAD },
},
{ key: "KEY_NumLock", isModifier: true, isPrintable: false,
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_NUM_LOCK,
location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD },
},
{ key: "KEY_Insert", isModifier: false, isPrintable: false,
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_INSERT,
location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD },
},
{ key: "KEY_Insert", isModifier: false, isPrintable: false,
event: { shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, numLockKey: false,
keyCode: KeyboardEvent.DOM_VK_INSERT,
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.isPrintable) {
ok(events.keypress, description + "keypress event wasn't fired for printable key");
} else {
ok(!events.keypress, description + "keypress event was fired for non-printable key");
}
ok(events.keyup, description + "keyup event wasn't fired");
}
window.removeEventListener("keydown", handler, true);
window.removeEventListener("keypress", handler, true);
window.removeEventListener("keyup", handler, true);
}
// We're using TextEventDispatcher to decide if we should keypress event
// on content in the default event group. So, we can test if keypress
// event is NOT fired unexpectedly with synthesizeKey().
function testEnterKeyPressEvent()
{
let keydownFired, keypressFired, beforeinputFired;
function onEvent(aEvent) {
switch (aEvent.type) {
case "keydown":
keydownFired = true;
break;
case "keypress":
keypressFired = true;
break;
case "beforeinput":
beforeinputFired = true;
break;
}
}
for (let targetId of ["input", "textarea", "input_readonly"]) {
let target = document.getElementById(targetId);
function reset() {
keydownFired = keypressFired = beforeinputFired = false;
target.value = "";
}
target.addEventListener("keydown", onEvent);
target.addEventListener("keypress", onEvent);
target.addEventListener("beforeinput", onEvent);
const kDescription = "<" + targetId.replace("_", " ") + ">: ";
let isEditable = !kDescription.includes("readonly");
let isTextarea = kDescription.includes("textarea");
target.focus();
reset();
synthesizeKey("KEY_Enter");
is(keydownFired, true,
kDescription + "keydown event should be fired when Enter key is pressed");
is(keypressFired, true,
kDescription + "keypress event should be fired when Enter key is pressed");
if (isEditable) {
ok(beforeinputFired,
kDescription + "beforeinput event should be fired (if it's enabled) when Enter key is pressed");
} else {
is(beforeinputFired, false,
kDescription + "beforeinput event shouldn't be fired when Enter key is pressed");
}
if (isTextarea) {
is(target.value, "\n",
kDescription + "Enter key should cause inputting a line break in <textarea>");
} else {
is(target.value, "",
kDescription + "Enter key should not cause inputting a line break");
}
reset();
synthesizeKey("KEY_Enter", {shiftKey: true});
is(keydownFired, true,
kDescription + "keydown event should be fired when Shift + Enter key is pressed");
is(keypressFired, true,
kDescription + "keypress event should be fired when Shift + Enter key is pressed");
if (isEditable) {
ok(beforeinputFired,
kDescription + "beforeinput event should be fired (if it's enabled) when Shift + Enter key is pressed");
} else {
is(beforeinputFired, false,
kDescription + "beforeinput event shouldn't be fired when Shift + Enter key is pressed");
}
if (isTextarea) {
is(target.value, "\n",
kDescription + "Shift + Enter key should cause inputting a line break in <textarea>");
} else {
is(target.value, "",
kDescription + "Shift + Enter key should not cause inputting a line break");
}
reset();
synthesizeKey("KEY_Enter", {ctrlKey: true});
is(keydownFired, true,
kDescription + "keydown event should be fired when Ctrl + Enter key is pressed");
is(keypressFired, true,
kDescription + "keypress event should be fired when Ctrl + Enter key is pressed");
is(beforeinputFired, false,
kDescription + "beforeinput event shouldn't be fired when Ctrl + Enter key is pressed");
is(target.value, "",
kDescription + "Ctrl + Enter key should not cause inputting a line break");
reset();
synthesizeKey("KEY_Enter", {altKey: true});
is(keydownFired, true,
kDescription + "keydown event should be fired when Alt + Enter key is pressed");
ok(!keypressFired,
kDescription + "keypress event shouldn't be fired when Alt + Enter key is pressed in strict keypress dispatching mode");
is(beforeinputFired, false,
kDescription + "beforeinput event shouldn't be fired when Alt + Enter key is pressed");
is(target.value, "",
kDescription + "Alt + Enter key should not cause inputting a line break");
reset();
synthesizeKey("KEY_Enter", {metaKey: true});
is(keydownFired, true,
kDescription + "keydown event should be fired when Meta + Enter key is pressed");
ok(!keypressFired,
kDescription + "keypress event shouldn't be fired when Meta + Enter key is pressed in strict keypress dispatching mode");
is(beforeinputFired, false,
kDescription + "beforeinput event shouldn't be fired when Meta + Enter key is pressed");
is(target.value, "",
kDescription + "Meta + Enter key should not cause inputting a line break");
reset();
synthesizeKey("KEY_Enter", {shiftKey: true, ctrlKey: true});
is(keydownFired, true,
kDescription + "keydown event should be fired when Ctrl + Shift + Enter key is pressed");
ok(!keypressFired,
kDescription + "keypress event shouldn't be fired when Ctrl + Shift + Enter key is pressed in strict keypress dispatching mode");
is(beforeinputFired, false,
kDescription + "beforeinput event shouldn't be fired when Ctrl + Shift + Enter key is pressed");
is(target.value, "",
kDescription + "Ctrl + Shift + Enter key should not cause inputting a line break");
reset();
synthesizeKey("KEY_Enter", {shiftKey: true, altKey: true});
is(keydownFired, true,
kDescription + "keydown event should be fired when Alt + Shift + Enter key is pressed");
ok(!keypressFired,
kDescription + "keypress event shouldn't be fired when Alt + Shift + Enter key is pressed in strict keypress dispatching mode");
is(beforeinputFired, false,
kDescription + "beforeinput event shouldn't be fired when Alt + Shift + Enter key is pressed");
is(target.value, "",
kDescription + "Alt + Shift + Enter key should not cause inputting a line break");
reset();
synthesizeKey("KEY_Enter", {shiftKey: true, metaKey: true});
is(keydownFired, true,
kDescription + "keydown event should be fired when Meta + Shift + Enter key is pressed");
ok(!keypressFired,
kDescription + "keypress event shouldn't be fired when Meta + Shift + Enter key is pressed in strict keypress dispatching mode");
is(beforeinputFired, false,
kDescription + "beforeinput event shouldn't be fired when Meta + Shift + Enter key is pressed");
is(target.value, "",
kDescription + "Meta + Shift + Enter key should not cause inputting a line break");
target.removeEventListener("keydown", onEvent);
target.removeEventListener("keypress", onEvent);
target.removeEventListener("beforeinput", onEvent);
}
}
function runTests()
{
testInitializingUntrustedEvent();
testSynthesizedKeyLocation();
testEnterKeyPressEvent();
SimpleTest.finish();
}
</script>
</pre>
</body>
</html>