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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
"use strict";
async function synthesizeMouseAndWait(aBrowser, aEvent) {
let promise = SpecialPowers.spawn(aBrowser, [aEvent], async event => {
await new Promise(resolve => {
content.document.documentElement.addEventListener(event, resolve, {
once: true,
});
});
});
// Ensure content has been added event listener.
await SpecialPowers.spawn(aBrowser, [], () => {});
EventUtils.synthesizeMouse(aBrowser, 10, 10, { type: aEvent });
return promise;
}
function AddMouseEventListener(aBrowser) {
return SpecialPowers.spawn(aBrowser, [], () => {
content.catchedEvents = [];
let listener = function(aEvent) {
content.catchedEvents.push(aEvent.type);
};
let target = content.document.querySelector("p");
target.onmouseenter = listener;
target.onmouseleave = listener;
});
}
function clearMouseEventListenerAndCheck(aBrowser, aExpectedEvents) {
return SpecialPowers.spawn(aBrowser, [aExpectedEvents], events => {
let target = content.document.querySelector("p");
target.onmouseenter = null;
target.onmouseleave = null;
Assert.deepEqual(content.catchedEvents, events);
});
}
add_task(async function testSwitchTabs() {
const tabFirst = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
"http://example.com/browser/browser/base/content/test/general/dummy_page.html",
true
);
info("Initial mouse move");
await EventUtils.synthesizeAndWaitNativeMouseMove(
tabFirst.linkedBrowser,
10,
10
);
info("Open and move to a new tab");
await AddMouseEventListener(tabFirst.linkedBrowser);
const tabSecond = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
"http://example.com/browser/browser/base/content/test/general/dummy_page.html"
);
// Synthesize a mousemove to generate corresponding mouseenter and mouseleave
// events.
await EventUtils.synthesizeAndWaitNativeMouseMove(
tabSecond.linkedBrowser,
10,
10
);
// Wait a bit to see if there is any unexpected mouse event.
await TestUtils.waitForTick();
await clearMouseEventListenerAndCheck(tabFirst.linkedBrowser, ["mouseleave"]);
info("switch back to the previous tab");
await AddMouseEventListener(tabFirst.linkedBrowser);
await AddMouseEventListener(tabSecond.linkedBrowser);
await BrowserTestUtils.switchTab(gBrowser, tabFirst);
// Synthesize a mousemove to generate corresponding mouseenter and mouseleave
// events.
await EventUtils.synthesizeAndWaitNativeMouseMove(
tabFirst.linkedBrowser,
10,
10
);
// Wait a bit to see if there is any unexpected mouse event.
await TestUtils.waitForTick();
await clearMouseEventListenerAndCheck(tabFirst.linkedBrowser, ["mouseenter"]);
await clearMouseEventListenerAndCheck(tabSecond.linkedBrowser, [
"mouseleave",
]);
info("Close tabs");
BrowserTestUtils.removeTab(tabFirst);
BrowserTestUtils.removeTab(tabSecond);
});
add_task(async function testSwitchTabsWithMouseDown() {
const tabFirst = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
"http://example.com/browser/browser/base/content/test/general/dummy_page.html",
true
);
info("Initial mouse move");
await EventUtils.synthesizeAndWaitNativeMouseMove(
tabFirst.linkedBrowser,
10,
10
);
info("mouse down");
await synthesizeMouseAndWait(tabFirst.linkedBrowser, "mousedown");
info("Open and move to a new tab");
await AddMouseEventListener(tabFirst.linkedBrowser);
const tabSecond = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
"http://example.com/browser/browser/base/content/test/general/dummy_page.html"
);
// Synthesize a mousemove to generate corresponding mouseenter and mouseleave
// events.
await EventUtils.synthesizeAndWaitNativeMouseMove(
tabSecond.linkedBrowser,
10,
10
);
info("mouse up");
await synthesizeMouseAndWait(tabSecond.linkedBrowser, "mouseup");
// Wait a bit to see if there is any unexpected mouse event.
await TestUtils.waitForTick();
await clearMouseEventListenerAndCheck(tabFirst.linkedBrowser, ["mouseleave"]);
info("mouse down");
await synthesizeMouseAndWait(tabSecond.linkedBrowser, "mousedown");
info("switch back to the previous tab");
await AddMouseEventListener(tabFirst.linkedBrowser);
await AddMouseEventListener(tabSecond.linkedBrowser);
await BrowserTestUtils.switchTab(gBrowser, tabFirst);
// Synthesize a mousemove to generate corresponding mouseenter and mouseleave
// events.
await EventUtils.synthesizeAndWaitNativeMouseMove(
tabFirst.linkedBrowser,
10,
10
);
info("mouse up");
await synthesizeMouseAndWait(tabFirst.linkedBrowser, "mouseup");
// Wait a bit to see if there is any unexpected mouse event.
await TestUtils.waitForTick();
await clearMouseEventListenerAndCheck(tabFirst.linkedBrowser, ["mouseenter"]);
await clearMouseEventListenerAndCheck(tabSecond.linkedBrowser, [
"mouseleave",
]);
info("Close tabs");
BrowserTestUtils.removeTab(tabFirst);
BrowserTestUtils.removeTab(tabSecond);
});
|