Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Errors

"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,
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,
);
// 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,
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,
);
// 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);
});