tor-browser

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

browser_contextmenu_badiframe.js (5024B)


      1 /* Tests for proper behaviour of "Show this frame" context menu options with a valid frame and
      2   a frame with an invalid url.
      3 */
      4 
      5 // Two frames, one with text content, the other an error page
      6 var invalidPage = "http://127.0.0.1:55555/";
      7 // eslint-disable-next-line @microsoft/sdl/no-insecure-url
      8 var validPage = "http://example.com/";
      9 var testPage =
     10  'data:text/html,<frameset cols="400,400"><frame src="' +
     11  validPage +
     12  '"><frame src="' +
     13  invalidPage +
     14  '"></frameset>';
     15 
     16 async function openTestPage() {
     17  let tab = await BrowserTestUtils.openNewForegroundTab(
     18    gBrowser,
     19    "about:blank",
     20    true,
     21    true
     22  );
     23  let browser = tab.linkedBrowser;
     24 
     25  // The test page has a top-level document and two subframes. One of
     26  // those subframes is an error page, which doesn't fire a load event.
     27  // We'll use BrowserTestUtils.browserLoaded and have it wait for all
     28  // 3 loads before resolving.
     29  let expectedLoads = 3;
     30  let pageAndIframesLoaded = BrowserTestUtils.browserLoaded(
     31    browser,
     32    true /* includeSubFrames */,
     33    () => {
     34      expectedLoads--;
     35      return !expectedLoads;
     36    },
     37    true /* maybeErrorPage */
     38  );
     39  BrowserTestUtils.startLoadingURIString(browser, testPage);
     40  await pageAndIframesLoaded;
     41 
     42  // Make sure both the top-level document and the iframe documents have
     43  // had a chance to present. We need this so that the context menu event
     44  // gets dispatched properly.
     45  for (let bc of [
     46    ...browser.browsingContext.children,
     47    browser.browsingContext,
     48  ]) {
     49    await SpecialPowers.spawn(bc, [], async function () {
     50      await new Promise(resolve => {
     51        content.requestAnimationFrame(resolve);
     52      });
     53    });
     54  }
     55 }
     56 
     57 async function selectFromFrameMenu(frameNumber, menuId) {
     58  const contextMenu = document.getElementById("contentAreaContextMenu");
     59 
     60  let popupShownPromise = BrowserTestUtils.waitForEvent(
     61    contextMenu,
     62    "popupshown"
     63  );
     64 
     65  await BrowserTestUtils.synthesizeMouseAtPoint(
     66    40,
     67    40,
     68    {
     69      type: "contextmenu",
     70      button: 2,
     71    },
     72    gBrowser.selectedBrowser.browsingContext.children[frameNumber]
     73  );
     74 
     75  await popupShownPromise;
     76 
     77  let frameItem = document.getElementById("frame");
     78  let framePopup = frameItem.menupopup;
     79  let subPopupShownPromise = BrowserTestUtils.waitForEvent(
     80    framePopup,
     81    "popupshown"
     82  );
     83 
     84  frameItem.openMenu(true);
     85  await subPopupShownPromise;
     86 
     87  let subPopupHiddenPromise = BrowserTestUtils.waitForEvent(
     88    framePopup,
     89    "popuphidden"
     90  );
     91  let contextMenuHiddenPromise = BrowserTestUtils.waitForEvent(
     92    contextMenu,
     93    "popuphidden"
     94  );
     95  contextMenu.activateItem(document.getElementById(menuId));
     96  await subPopupHiddenPromise;
     97  await contextMenuHiddenPromise;
     98 }
     99 
    100 add_task(async function testOpenFrame() {
    101  for (let frameNumber = 0; frameNumber < 2; frameNumber++) {
    102    await openTestPage();
    103 
    104    let expectedResultURI = [validPage, invalidPage][frameNumber];
    105 
    106    info("show only this frame for " + expectedResultURI);
    107 
    108    let browserLoadedPromise = BrowserTestUtils.browserLoaded(
    109      gBrowser.selectedBrowser,
    110      false,
    111      expectedResultURI,
    112      frameNumber == 1
    113    );
    114 
    115    await selectFromFrameMenu(frameNumber, "context-showonlythisframe");
    116    await browserLoadedPromise;
    117 
    118    is(
    119      gBrowser.selectedBrowser.currentURI.spec,
    120      expectedResultURI,
    121      "Should navigate to page url, not about:neterror"
    122    );
    123 
    124    gBrowser.removeCurrentTab();
    125  }
    126 });
    127 
    128 add_task(async function testOpenFrameInTab() {
    129  for (let frameNumber = 0; frameNumber < 2; frameNumber++) {
    130    await openTestPage();
    131 
    132    let expectedResultURI = [validPage, invalidPage][frameNumber];
    133 
    134    info("open frame in tab for " + expectedResultURI);
    135 
    136    let newTabPromise = BrowserTestUtils.waitForNewTab(
    137      gBrowser,
    138      expectedResultURI,
    139      false
    140    );
    141    await selectFromFrameMenu(frameNumber, "context-openframeintab");
    142    let newTab = await newTabPromise;
    143 
    144    await BrowserTestUtils.switchTab(gBrowser, newTab);
    145 
    146    // We should now have the error page in a new, active tab.
    147    is(
    148      gBrowser.selectedBrowser.currentURI.spec,
    149      expectedResultURI,
    150      "New tab should have page url, not about:neterror"
    151    );
    152 
    153    gBrowser.removeCurrentTab();
    154    gBrowser.removeCurrentTab();
    155  }
    156 });
    157 
    158 add_task(async function testOpenFrameInWindow() {
    159  for (let frameNumber = 0; frameNumber < 2; frameNumber++) {
    160    await openTestPage();
    161 
    162    let expectedResultURI = [validPage, invalidPage][frameNumber];
    163 
    164    info("open frame in window for " + expectedResultURI);
    165 
    166    let newWindowPromise = BrowserTestUtils.waitForNewWindow({
    167      url: frameNumber == 1 ? invalidPage : validPage,
    168      maybeErrorPage: frameNumber == 1,
    169    });
    170    await selectFromFrameMenu(frameNumber, "context-openframe");
    171    let newWindow = await newWindowPromise;
    172 
    173    is(
    174      newWindow.gBrowser.selectedBrowser.currentURI.spec,
    175      expectedResultURI,
    176      "New window should have page url, not about:neterror"
    177    );
    178 
    179    newWindow.close();
    180    gBrowser.removeCurrentTab();
    181  }
    182 });