gecko-dev/dom/events/test/test_dom_keyboard_event.html
Aryeh Gregor 2df3e475b4 Bug 1387828 - Reinstate support for initKeyboardEvent; r=smaug
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
2017-08-06 16:52:39 +03:00

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>