function runTests()
{ var doPreventDefault = false;
function onKeydown(aEvent)
{
if (doPreventDefault) {
aEvent.preventDefault();
}
}
var keyPressEventFired = false;
function onKeypress(aEvent)
{
keyPressEventFired = true;
}
var keyDownEventConsumedByJS = false; var keyDownEventConsumed = false;
function onkeydownInSystemEventGroup(aEvent)
{
keyDownEventConsumedByJS = aEvent.defaultPrevented;
// If defaultPrevented is true via SpecialPowers, that means default was
// prevented, possibly in a non-content-visible way (e.g. by a system
// group handler).
keyDownEventConsumed = SpecialPowers.wrap(aEvent).defaultPrevented;
}
function check(aExpectingKeydownConsumed, aIsPrintableKey, aDescription)
{
if (doPreventDefault) {
ok(!keyPressEventFired, "keypress event shouldn't be fired for " + aDescription + " if preventDefault() of keydown event was called");
ok(keyDownEventConsumedByJS, "keydown event of " + aDescription + " should be consumed in content level if preventDefault() of keydown event is called");
ok(keyDownEventConsumed, "keydown event of " + aDescription + " should be consumed in system level if preventDefault() of keydown event is called");
} else if (aExpectingKeydownConsumed) {
ok(!keyPressEventFired, "keypress event shouldn't be fired for " + aDescription);
ok(!keyDownEventConsumedByJS, "keydown event of " + aDescription + " shouldn't be consumed in content level");
ok(keyDownEventConsumed, "keydown event of " + aDescription + " should be consumed in system level");
} else {
if (aIsPrintableKey) {
ok(keyPressEventFired, "keypress event should be fired for printable key, " + aDescription);
} else {
ok(!keyPressEventFired, "keypress event shouldn't be fired for non-printable key, " + aDescription);
}
ok(!keyDownEventConsumedByJS, "keydown event of " + aDescription + " shouldn't be consumed in content level");
ok(!keyDownEventConsumed, "keydown event of " + aDescription + " should be consumed in system level");
}
}
[ false, true ].forEach(function (consume) {
doPreventDefault = consume;
if (!kIsMac) {
for (var i = 0; i < combobox.options.length + 1; i++) {
reset()
synthesizeKey("KEY_ArrowDown");
check(true, false, "'ArrowDown' key on combobox #" + i);
}
for (var i = 0; i < combobox.options.length + 1; i++) {
reset()
synthesizeKey("KEY_ArrowUp");
check(true, false, "'ArrowUp' key on combobox #" + i);
}
} else {
todo(false, "Make this test work on OSX");
}
for (var i = 0; i < combobox.options.length + 1; i++) {
reset()
synthesizeKey("KEY_ArrowRight");
check(true, false, "'ArrowRight' key on combobox #" + i);
}
for (var i = 0; i < combobox.options.length + 1; i++) {
reset()
synthesizeKey("KEY_ArrowLeft");
check(true, false, "'ArrowLeft' key on combobox #" + i);
}
for (var i = 0; i < 4; i++) {
reset()
synthesizeKey("KEY_PageDown");
check(true, false, "'PageDown' key on combobox #" + i);
}
for (var i = 0; i < 4; i++) {
reset()
synthesizeKey("KEY_PageUp");
check(true, false, "'PageUp' key on combobox #" + i);
}
for (var i = 0; i < 2; i++) {
reset()
synthesizeKey("KEY_End");
check(true, false, "'End' key on combobox #" + i);
}
for (var i = 0; i < 2; i++) {
reset()
synthesizeKey("KEY_Home");
check(true, false, "'Home' key on combobox #" + i);
}
reset()
synthesizeKey("KEY_Enter");
check(false, true, "'Enter' key on combobox");
reset()
synthesizeKey("KEY_Escape");
check(false, false, "'Escape' key on combobox");
if (!kIsWin) {
reset()
synthesizeKey("KEY_F4");
check(false, false, "'F4' key on combobox");
}
reset()
sendString("a");
check(false, true, "'A' key on combobox");
});
// Mac uses native popup for dropdown. Let's skip the tests for popup
// since it's not handled in nsListControlFrame.
// Similarly, Android doesn't use popup for dropdown.
if (kIsMac || kIsAndroid) {
finish();
return;
}
function testDropDown(aCallback)
{
testOpenDropDown(function () {
reset()
synthesizeKey("KEY_ArrowDown", {altKey: true});
}, function () {
check(true, false, "Alt + DownArrow key on combobox at opening dropdown");
for (var i = 0; i < combobox.options.length + 1; i++) {
reset()
synthesizeKey("KEY_ArrowDown");
check(true, false, "'ArrowDown' key on combobox during dropdown open #" + i);
}
for (var i = 0; i < combobox.options.length + 1; i++) {
reset()
synthesizeKey("KEY_ArrowUp");
check(true, false, "'ArrowUp' key on combobox during dropdown open #" + i);
}
for (var i = 0; i < combobox.options.length + 1; i++) {
reset()
synthesizeKey("KEY_ArrowRight");
check(true, false, "'ArrowRight' key on combobox during dropdown open #" + i);
}
for (var i = 0; i < combobox.options.length + 1; i++) {
reset()
synthesizeKey("KEY_ArrowLeft");
check(true, false, "'ArrowLeft' key on combobox during dropdown open #" + i);
}
for (var i = 0; i < 4; i++) {
reset()
synthesizeKey("KEY_PageDown");
check(true, false, "'PageDown' key on combobox during dropdown open #" + i);
}
for (var i = 0; i < 4; i++) {
reset()
synthesizeKey("KEY_PageUp");
check(true, false, "'PageUp' key on combobox during dropdown open #" + i);
}
for (var i = 0; i < 2; i++) {
reset()
synthesizeKey("KEY_End");
check(true, false, "'End' key on combobox during dropdown open #" + i);
}
for (var i = 0; i < 2; i++) {
reset()
synthesizeKey("KEY_Home");
check(true, false, "'Home' key on combobox during dropdown open #" + i);
}
testCloseDropDown(function () {
reset()
synthesizeKey("KEY_Enter");
}, function () {
testOpenDropDown(function () {
check(true, true, "'Enter' key on combobox at closing dropdown");
synthesizeKey("KEY_ArrowUp", {altKey: true});
}, function () {
check(true, false, "'Alt' + 'ArrowUp' key on combobox at opening dropdown");
testCloseDropDown(function () {
reset()
synthesizeKey("KEY_Escape");
}, function () {
check(true, false, "'Escape' key on combobox at closing dropdown");
// F4 key opens/closes dropdown only on Windows. So, other platforms
// don't need to do anymore.
if (!kIsWin) {
aCallback();
return;
}
testOpenDropDown(function () {
reset()
synthesizeKey("KEY_F4");
}, function () {
check(true, false, "'F4' key on combobox at opening dropdown on Windows");
testCloseDropDown(function () {
reset()
synthesizeKey("KEY_F4");
}, function () {
check(true, false, "'F4' key on combobox at closing dropdown on Windows");
aCallback();
return;
});
});
});
});
});
});
}
doPreventDefault = false;
testDropDown(function () {
// Even if keydown event is consumed by JS, opening/closing dropdown
// should work for a11y and security (e.g., cannot close dropdown causes
// staying top-most window on the screen). If it's blocked by JS, this
// test would cause permanent timeout.
doPreventDefault = true;
testDropDown(finish);
});
}
function testOpenDropDown(aTest, aOnOpenDropDown)
{
document.addEventListener("popupshowing", function (aEvent) {
document.removeEventListener(aEvent.type, arguments.callee);
setTimeout(aOnOpenDropDown, 0);
});
aTest();
}
function testCloseDropDown(aTest, aOnCloseDropDown)
{
document.addEventListener("popuphiding", function (aEvent) {
document.removeEventListener(aEvent.type, arguments.callee);
setTimeout(aOnCloseDropDown, 0)
});
aTest();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.