tor-browser

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

browser_fullscreen_context_menu.js (4088B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 "use strict";
      5 
      6 async function openContextMenu(itemElement, win = window) {
      7  let popupShownPromise = BrowserTestUtils.waitForEvent(
      8    itemElement.ownerDocument,
      9    "popupshown"
     10  );
     11  EventUtils.synthesizeMouseAtCenter(
     12    itemElement,
     13    {
     14      type: "contextmenu",
     15      button: 2,
     16    },
     17    win
     18  );
     19  let { target } = await popupShownPromise;
     20  return target;
     21 }
     22 
     23 async function testContextMenu() {
     24  await BrowserTestUtils.withNewTab("about:blank", async () => {
     25    let panelUIMenuButton = document.getElementById("PanelUI-menu-button");
     26    let contextMenu = await openContextMenu(panelUIMenuButton);
     27    let array1 = !Services.appinfo.nativeMenubar
     28      ? [
     29          "#toggle_toolbar-menubar",
     30          "#toggle_PersonalToolbar",
     31          "#viewToolbarsMenuSeparator",
     32          ".viewCustomizeToolbar",
     33        ]
     34      : [
     35          "#toggle_PersonalToolbar",
     36          "#viewToolbarsMenuSeparator",
     37          ".viewCustomizeToolbar",
     38        ];
     39    let result1 = verifyContextMenu(contextMenu, array1);
     40    ok(!result1, "Expected no errors verifying context menu items");
     41    contextMenu.hidePopup();
     42    let onFullscreen = Promise.all([
     43      BrowserTestUtils.waitForEvent(window, "fullscreen"),
     44      BrowserTestUtils.waitForEvent(
     45        window,
     46        "sizemodechange",
     47        false,
     48        () => window.fullScreen
     49      ),
     50      BrowserTestUtils.waitForPopupEvent(contextMenu, "hidden"),
     51    ]);
     52    document.getElementById("View:FullScreen").doCommand();
     53    contextMenu.hidePopup();
     54    info("waiting for fullscreen");
     55    await onFullscreen;
     56    // make sure the toolbox is visible if it's autohidden
     57    FullScreen.showNavToolbox();
     58 
     59    info("trigger the context menu");
     60    let contextMenu2 = await openContextMenu(panelUIMenuButton);
     61    info("context menu should be open, verify its menu items");
     62    let array2 = !Services.appinfo.nativeMenubar
     63      ? [
     64          "#toggle_toolbar-menubar",
     65          "#toggle_PersonalToolbar",
     66          "#viewToolbarsMenuSeparator",
     67          ".viewCustomizeToolbar",
     68          `menuseparator[contexttype="fullscreen"]`,
     69          `.fullscreen-context-autohide`,
     70          `menuitem[contexttype="fullscreen"]`,
     71        ]
     72      : [
     73          "#toggle_PersonalToolbar",
     74          "#viewToolbarsMenuSeparator",
     75          ".viewCustomizeToolbar",
     76          `menuseparator[contexttype="fullscreen"]`,
     77          `.fullscreen-context-autohide`,
     78          `menuitem[contexttype="fullscreen"]`,
     79        ];
     80    let result2 = verifyContextMenu(contextMenu2, array2);
     81    ok(!result2, "Expected no errors verifying context menu items");
     82    let onExitFullscreen = Promise.all([
     83      BrowserTestUtils.waitForEvent(window, "fullscreen"),
     84      BrowserTestUtils.waitForEvent(
     85        window,
     86        "sizemodechange",
     87        false,
     88        () => !window.fullScreen
     89      ),
     90      BrowserTestUtils.waitForPopupEvent(contextMenu2, "hidden"),
     91    ]);
     92    document.getElementById("View:FullScreen").doCommand();
     93    contextMenu2.hidePopup();
     94    await onExitFullscreen;
     95  });
     96 }
     97 
     98 function verifyContextMenu(contextMenu, itemSelectors) {
     99  // Ignore hidden nodes
    100  let items = Array.from(contextMenu.children).filter(n =>
    101    BrowserTestUtils.isVisible(n)
    102  );
    103  let menuAsText = items
    104    .map(n => {
    105      return n.nodeName == "menuseparator"
    106        ? "---"
    107        : `${n.label} (${n.command})`;
    108    })
    109    .join("\n");
    110  info("Got actual context menu items: \n" + menuAsText);
    111 
    112  try {
    113    is(
    114      items.length,
    115      itemSelectors.length,
    116      "Context menu has the expected number of items"
    117    );
    118    for (let i = 0; i < items.length; i++) {
    119      let selector = itemSelectors[i];
    120      ok(
    121        items[i].matches(selector),
    122        `Item at ${i} matches expected selector: ${selector}`
    123      );
    124    }
    125  } catch (ex) {
    126    return ex;
    127  }
    128  return null;
    129 }
    130 
    131 add_setup(async function () {
    132  await SpecialPowers.pushPrefEnv({
    133    set: [["test.wait300msAfterTabSwitch", true]],
    134  });
    135 });
    136 
    137 add_task(testContextMenu);