Source code
Revision control
Copy as Markdown
Other Tools
/* Any copyright is dedicated to the Public Domain.
"use strict";
const BASE = getRootDirectory(gTestPath).replace(
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
);
const TEST_URL = BASE + "empty.html";
async function synthesizeKeyAndTest(aBrowser, aKey, aEvent, aIsActive) {
let promise = SpecialPowers.spawn(
aBrowser,
[aKey, aEvent, aIsActive],
async (key, event, isActive) => {
return new Promise(aResolve => {
content.document.clearUserGestureActivation();
content.document.addEventListener(
"keydown",
function (e) {
e.preventDefault();
is(
content.document.hasBeenUserGestureActivated,
isActive,
`check has-been-user-activated for ${key} with ${JSON.stringify(event)}`
);
is(
content.document.hasValidTransientUserGestureActivation,
isActive,
`check has-valid-transient-user-activation for ${key} with ${JSON.stringify(event)}`
);
aResolve();
},
{ once: true }
);
});
}
);
// Ensure the event listener has registered on the remote.
await SpecialPowers.spawn(aBrowser, [], () => {
return new Promise(resolve => {
SpecialPowers.executeSoon(resolve);
});
});
EventUtils.synthesizeKey(aKey, aEvent);
return promise;
}
let browser;
add_setup(async function setup() {
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL);
browser = tab.linkedBrowser;
registerCleanupFunction(async () => {
BrowserTestUtils.removeTab(tab);
});
});
add_task(async function TestPrintableKey() {
let tests = ["a", "b", "c", "A", "B", "1", "2", "3"];
for (let key of tests) {
await synthesizeKeyAndTest(browser, key, {}, true);
}
});
add_task(async function TestNonPrintableKey() {
let tests = [
["KEY_Backspace", false],
["KEY_Control", false],
["KEY_Shift", false],
["KEY_Escape", false],
// Treat as user input
["KEY_Tab", true],
["KEY_Enter", true],
[" ", true],
];
for (let [key, expectedResult] of tests) {
await synthesizeKeyAndTest(browser, key, {}, expectedResult);
}
});
add_task(async function TestModifier() {
let tests = [
["a", { accelKey: true }, false],
["z", { accelKey: true }, false],
["a", { metaKey: true }, !navigator.platform.includes("Mac")],
// Treat as user input
["a", { altGraphKey: true }, true],
["a", { fnKey: true }, true],
["a", { altKey: true }, true],
["a", { shiftKey: true }, true],
["c", { altKey: true }, true],
["c", { accelKey: true }, true],
["v", { altKey: true }, true],
["v", { accelKey: true }, true],
["x", { altKey: true }, true],
["x", { accelKey: true }, true],
];
for (let [key, event, expectedResult] of tests) {
await synthesizeKeyAndTest(browser, key, event, expectedResult);
}
});