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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
add_task(async function test() {
const kTestURI =
"data:text/html," +
'<script type="text/javascript">' +
" function onMouseDown(aEvent) {" +
" document.getElementById('willBeFocused').focus();" +
" aEvent.preventDefault();" +
" }" +
"</script>" +
'<body id="body">' +
'<button onmousedown="onMouseDown(event);" style="width: 100px; height: 100px;">click here</button>' +
'<input id="willBeFocused"></body>';
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, kTestURI);
let fm = Services.focus;
for (var button = 0; button < 3; button++) {
// Set focus to a chrome element before synthesizing a mouse down event.
gURLBar.focus();
is(
fm.focusedElement,
gURLBar.inputField,
"Failed to move focus to search bar: button=" + button
);
// Synthesize mouse down event on browser object over the button, such that
// the event propagates through both processes.
EventUtils.synthesizeMouse(tab.linkedBrowser, 20, 20, { button });
isnot(
fm.focusedElement,
gURLBar.inputField,
"Failed to move focus away from search bar: button=" + button
);
await SpecialPowers.spawn(tab.linkedBrowser, [button], async function(
button
) {
let fm = Services.focus;
let attempts = 10;
await new Promise(resolve => {
function check() {
if (
attempts > 0 &&
content.document.activeElement.id != "willBeFocused"
) {
attempts--;
content.window.setTimeout(check, 100);
return;
}
Assert.equal(
content.document.activeElement.id,
"willBeFocused",
"The input element isn't active element: button=" + button
);
Assert.equal(
fm.focusedElement,
content.document.activeElement,
"The active element isn't focused element in App level: button=" +
button
);
resolve();
}
check();
});
});
}
gBrowser.removeTab(tab);
});
|