tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 });