summaryrefslogtreecommitdiffstats
path: root/dom/events/test/browser_mouse_enterleave_switch_tab.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/events/test/browser_mouse_enterleave_switch_tab.js')
-rw-r--r--dom/events/test/browser_mouse_enterleave_switch_tab.js158
1 files changed, 158 insertions, 0 deletions
diff --git a/dom/events/test/browser_mouse_enterleave_switch_tab.js b/dom/events/test/browser_mouse_enterleave_switch_tab.js
new file mode 100644
index 0000000000..9c24120101
--- /dev/null
+++ b/dom/events/test/browser_mouse_enterleave_switch_tab.js
@@ -0,0 +1,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);
+});