browser_mouse_enterleave_switch_tab.js (5200B)
1 "use strict"; 2 3 async function synthesizeMouseAndWait(aBrowser, aEvent) { 4 let promise = SpecialPowers.spawn(aBrowser, [aEvent], async event => { 5 await new Promise(resolve => { 6 content.document.documentElement.addEventListener(event, resolve, { 7 once: true, 8 }); 9 }); 10 }); 11 // Ensure content has been added event listener. 12 await SpecialPowers.spawn(aBrowser, [], () => {}); 13 EventUtils.synthesizeMouse(aBrowser, 10, 10, { type: aEvent }); 14 return promise; 15 } 16 17 function AddMouseEventListener(aBrowser) { 18 return SpecialPowers.spawn(aBrowser, [], () => { 19 content.catchedEvents = []; 20 let listener = function (aEvent) { 21 content.catchedEvents.push(aEvent.type); 22 }; 23 24 let target = content.document.querySelector("p"); 25 target.onmouseenter = listener; 26 target.onmouseleave = listener; 27 }); 28 } 29 30 function clearMouseEventListenerAndCheck(aBrowser, aExpectedEvents) { 31 return SpecialPowers.spawn(aBrowser, [aExpectedEvents], events => { 32 let target = content.document.querySelector("p"); 33 target.onmouseenter = null; 34 target.onmouseleave = null; 35 36 Assert.deepEqual(content.catchedEvents, events); 37 }); 38 } 39 40 add_setup(async function () { 41 await SpecialPowers.pushPrefEnv({ 42 set: [["test.wait300msAfterTabSwitch", true]], 43 }); 44 }); 45 46 add_task(async function testSwitchTabs() { 47 const tabFirst = await BrowserTestUtils.openNewForegroundTab( 48 gBrowser, 49 "http://example.com/browser/browser/base/content/test/general/dummy_page.html", 50 true 51 ); 52 53 info("Initial mouse move"); 54 await EventUtils.synthesizeAndWaitNativeMouseMove( 55 tabFirst.linkedBrowser, 56 10, 57 10 58 ); 59 60 info("Open and move to a new tab"); 61 await AddMouseEventListener(tabFirst.linkedBrowser); 62 const tabSecond = await BrowserTestUtils.openNewForegroundTab( 63 gBrowser, 64 "http://example.com/browser/browser/base/content/test/general/dummy_page.html" 65 ); 66 // Synthesize a mousemove to generate corresponding mouseenter and mouseleave 67 // events. 68 await EventUtils.synthesizeAndWaitNativeMouseMove( 69 tabSecond.linkedBrowser, 70 10, 71 10 72 ); 73 // Wait a bit to see if there is any unexpected mouse event. 74 await TestUtils.waitForTick(); 75 await clearMouseEventListenerAndCheck(tabFirst.linkedBrowser, ["mouseleave"]); 76 77 info("switch back to the previous tab"); 78 await AddMouseEventListener(tabFirst.linkedBrowser); 79 await AddMouseEventListener(tabSecond.linkedBrowser); 80 await BrowserTestUtils.switchTab(gBrowser, tabFirst); 81 // Synthesize a mousemove to generate corresponding mouseenter and mouseleave 82 // events. 83 await EventUtils.synthesizeAndWaitNativeMouseMove( 84 tabFirst.linkedBrowser, 85 10, 86 10 87 ); 88 // Wait a bit to see if there is any unexpected mouse event. 89 await TestUtils.waitForTick(); 90 await clearMouseEventListenerAndCheck(tabFirst.linkedBrowser, ["mouseenter"]); 91 await clearMouseEventListenerAndCheck(tabSecond.linkedBrowser, [ 92 "mouseleave", 93 ]); 94 95 info("Close tabs"); 96 BrowserTestUtils.removeTab(tabFirst); 97 BrowserTestUtils.removeTab(tabSecond); 98 }); 99 100 add_task(async function testSwitchTabsWithMouseDown() { 101 const tabFirst = await BrowserTestUtils.openNewForegroundTab( 102 gBrowser, 103 "http://example.com/browser/browser/base/content/test/general/dummy_page.html", 104 true 105 ); 106 107 info("Initial mouse move"); 108 await EventUtils.synthesizeAndWaitNativeMouseMove( 109 tabFirst.linkedBrowser, 110 10, 111 10 112 ); 113 114 info("mouse down"); 115 await synthesizeMouseAndWait(tabFirst.linkedBrowser, "mousedown"); 116 117 info("Open and move to a new tab"); 118 await AddMouseEventListener(tabFirst.linkedBrowser); 119 const tabSecond = await BrowserTestUtils.openNewForegroundTab( 120 gBrowser, 121 "http://example.com/browser/browser/base/content/test/general/dummy_page.html" 122 ); 123 // Synthesize a mousemove to generate corresponding mouseenter and mouseleave 124 // events. 125 await EventUtils.synthesizeAndWaitNativeMouseMove( 126 tabSecond.linkedBrowser, 127 10, 128 10 129 ); 130 131 info("mouse up"); 132 await synthesizeMouseAndWait(tabSecond.linkedBrowser, "mouseup"); 133 // Wait a bit to see if there is any unexpected mouse event. 134 await TestUtils.waitForTick(); 135 await clearMouseEventListenerAndCheck(tabFirst.linkedBrowser, ["mouseleave"]); 136 137 info("mouse down"); 138 await synthesizeMouseAndWait(tabSecond.linkedBrowser, "mousedown"); 139 140 info("switch back to the previous tab"); 141 await AddMouseEventListener(tabFirst.linkedBrowser); 142 await AddMouseEventListener(tabSecond.linkedBrowser); 143 await BrowserTestUtils.switchTab(gBrowser, tabFirst); 144 // Synthesize a mousemove to generate corresponding mouseenter and mouseleave 145 // events. 146 await EventUtils.synthesizeAndWaitNativeMouseMove( 147 tabFirst.linkedBrowser, 148 10, 149 10 150 ); 151 152 info("mouse up"); 153 await synthesizeMouseAndWait(tabFirst.linkedBrowser, "mouseup"); 154 // Wait a bit to see if there is any unexpected mouse event. 155 await TestUtils.waitForTick(); 156 await clearMouseEventListenerAndCheck(tabFirst.linkedBrowser, ["mouseenter"]); 157 await clearMouseEventListenerAndCheck(tabSecond.linkedBrowser, [ 158 "mouseleave", 159 ]); 160 161 info("Close tabs"); 162 BrowserTestUtils.removeTab(tabFirst); 163 BrowserTestUtils.removeTab(tabSecond); 164 });