blob: d4dd00a0025c71167eb0cc70248c44039b9cf33e [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf8">
<meta name="viewport" content="width=device-width">
<script src="../../../resources/js-test.js"></script>
<script src="../../../resources/ui-helper.js"></script>
</head>
<body>
<script>
window.jsTestIsAsync = true;
description("This tests that DOM keypress events are dispatched to a non-editable &lt;body&gt; on iOS when pressing special keys on a hardware keyboard. This test can only be run in DumpRenderTree/WebKitTestRunner.");
class TestKeyPressDispatchedFor {
constructor(key) {
this.key = key;
this.shouldDispatchKeyPress = true;
}
}
class TestKeyPressNotDispatchedFor {
constructor(key) {
this.key = key;
this.shouldDispatchKeyPress = false;
}
}
var lastKeyPressEvent = null;
var currentTestIndex = -1;
// Non-special keys: KeyPress should be dispatched.
var tests = "abcdefghijklmnopqrstuvwxyz0123456789-=[]\\;',./".split("").map((key) => new TestKeyPressDispatchedFor(key));
if (UIHelper.isWebKit2())
tests.push(new TestKeyPressNotDispatchedFor(" ")); // Spacebar scrolls the page.
else
tests.push(new TestKeyPressDispatchedFor(" "));
// Special keys: KeyPress should be dispatched.
tests.push(new TestKeyPressDispatchedFor("delete"));
tests.push(new TestKeyPressDispatchedFor("enter"));
tests.push(new TestKeyPressDispatchedFor("escape"));
tests.push(new TestKeyPressDispatchedFor("return"));
// Special keys: KeyPress should not be dispatched.
tests.push(new TestKeyPressNotDispatchedFor("forwardDelete"));
tests.push(new TestKeyPressNotDispatchedFor("upArrow"));
tests.push(new TestKeyPressNotDispatchedFor("downArrow"));
tests.push(new TestKeyPressNotDispatchedFor("leftArrow"));
tests.push(new TestKeyPressNotDispatchedFor("rightArrow"));
tests.push(new TestKeyPressNotDispatchedFor("clear"));
tests.push(new TestKeyPressNotDispatchedFor("end"));
tests.push(new TestKeyPressNotDispatchedFor("home"));
// FIXME: Test that keypress is not dispatched for "insert" once <rdar://problem/47128940> is fixed.
tests.push(new TestKeyPressNotDispatchedFor("leftAlt"));
tests.push(new TestKeyPressNotDispatchedFor("leftCommand"));
tests.push(new TestKeyPressNotDispatchedFor("leftControl"));
tests.push(new TestKeyPressNotDispatchedFor("leftShift"));
tests.push(new TestKeyPressNotDispatchedFor("pageDown"));
tests.push(new TestKeyPressNotDispatchedFor("pageUp"));
tests.push(new TestKeyPressNotDispatchedFor("rightAlt"));
tests.push(new TestKeyPressNotDispatchedFor("rightCommand"));
tests.push(new TestKeyPressNotDispatchedFor("rightControl"));
tests.push(new TestKeyPressNotDispatchedFor("rightShift"));
// FIXME: Check function keys up to F24 once <rdar://problem/47128940> is fixed.
for (let i = 1; i <= 16; ++i)
tests.push(new TestKeyPressNotDispatchedFor("F" + i));
function nextKeyPress()
{
function actualNextKeyPress() {
++currentTestIndex;
if (currentTestIndex >= tests.length) {
finishJSTest();
return;
}
let nextTest = tests[currentTestIndex];
UIHelper.typeCharacter(nextTest.key);
}
// In WebKit Legacy typing a key performs a synchronous DOM dispatch. Schedule the key press
// on the next turn of the event loop to avoid blowing out the stack given that we call this
// function from an onkeyup handler.
window.setTimeout(actualNextKeyPress, 0);
}
function handleKeyPress(event)
{
lastKeyPressEvent = event;
}
function checkResult(event)
{
let currentTest = tests[currentTestIndex];
if (lastKeyPressEvent && currentTest.shouldDispatchKeyPress)
testPassed(`${currentTest.key} did dispatch a keypress event.`);
else if (lastKeyPressEvent)
testFailed(`${currentTest.key} should not have dispatched a keypress event. It did dispatch one.`);
else if (currentTest.shouldDispatchKeyPress)
testFailed(`${currentTest.key} should have dispatched a keypress event. It did not dispatch one.`);
else
testPassed(`${currentTest.key} did not dispatch a keypress event.`);
lastKeyPressEvent = null;
nextKeyPress();
}
function runTest()
{
if (!window.testRunner){
testFailed("Must be run in DumpRenderTree/WebKitTestRunner");
finishJSTest();
return;
}
document.body.onkeypress = handleKeyPress;
document.body.onkeyup = checkResult;
nextKeyPress();
}
runTest();
</script>
</body>
</html>