1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
/**
* Force focus to an element that isn't focusable.
* Toolbar buttons aren't focusable because if they were, clicking them would
* focus them, which is undesirable. Therefore, they're only made focusable
* when a user is navigating with the keyboard. This function forces focus as
* is done during toolbar keyboard navigation.
*/
function forceFocus(aElem) {
aElem.setAttribute("tabindex", "-1");
aElem.focus();
aElem.removeAttribute("tabindex");
}
async function expectFocusAfterKey(
aKey,
aFocus,
aAncestorOk = false,
aWindow = window
) {
let res = aKey.match(/^(Shift\+)?(?:(.)|(.+))$/);
let shift = Boolean(res[1]);
let key;
if (res[2]) {
key = res[2]; // Character.
} else {
key = "KEY_" + res[3]; // Tab, ArrowRight, etc.
}
let expected;
let friendlyExpected;
if (typeof aFocus == "string") {
expected = aWindow.document.getElementById(aFocus);
friendlyExpected = aFocus;
} else {
expected = aFocus;
if (aFocus == aWindow.gURLBar.inputField) {
friendlyExpected = "URL bar input";
} else if (aFocus == aWindow.gBrowser.selectedBrowser) {
friendlyExpected = "Web document";
}
}
info("Listening on item " + (expected.id || expected.className));
let focused = BrowserTestUtils.waitForEvent(expected, "focus", aAncestorOk);
EventUtils.synthesizeKey(key, { shiftKey: shift }, aWindow);
let receivedEvent = await focused;
info(
"Got focus on item: " +
(receivedEvent.target.id || receivedEvent.target.className)
);
ok(true, friendlyExpected + " focused after " + aKey + " pressed");
}
|