tor-browser

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

test_chromeOuterWindowID.xhtml (5393B)


      1 <?xml version="1.0"?>
      2 <?xml-stylesheet type="text/css" href="chrome://global/skin"?>
      3 <?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
      4 <!--
      5 https://bugzilla.mozilla.org/show_bug.cgi?id=1474662
      6 Test that the chromeOuterWindowID on the MessageManager interface
      7 works, and that it properly updates when swapping frameloaders between
      8 windows.
      9 -->
     10 <window title="Mozilla Bug 1474662"
     11        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
     12  <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
     13 
     14  <!-- test results are displayed in the html:body -->
     15  <body xmlns="http://www.w3.org/1999/xhtml">
     16  <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1474662"
     17     target="_blank">Mozilla Bug 1474662</a>
     18  </body>
     19 
     20  <!-- test code goes here -->
     21  <script type="application/javascript"><![CDATA[
     22  SimpleTest.waitForExplicitFinish();
     23  const {BrowserTestUtils} = ChromeUtils.importESModule(
     24    "resource://testing-common/BrowserTestUtils.sys.mjs"
     25  );
     26 
     27  const BROWSER_DOC = "window_chromeOuterWindowID.xhtml";
     28  const TEST_PAGE = "http://example.com";
     29  const TEST_PAGE_2 = "http://example.com/browser";
     30 
     31  function getOuterWindowID(win) {
     32    return win.docShell.outerWindowID;
     33  }
     34 
     35  /**
     36   * Takes two <xul:browser>'s that should be in the same document, and
     37   * ensures that their frame script environments know the correct value
     38   * of the host window's outerWindowID.
     39   */
     40  async function ensureExpectedChromeOuterWindowIDs(browser1, browser2) {
     41    is(browser1.ownerDocument, browser2.ownerDocument,
     42       "Both browsers should belong to the same document.");
     43    let winID = getOuterWindowID(browser1.ownerGlobal);
     44 
     45    let getChildRootOuterId = () => { 
     46      try {
     47        return docShell.browserChild?.chromeOuterWindowID;
     48      } catch(ex) { }
     49 
     50      // Not a remote tab
     51      return content.top.windowRoot.ownerGlobal.docShell.outerWindowID;
     52    };
     53 
     54    let browser1ID = await SpecialPowers.spawn(browser1, [], getChildRootOuterId);
     55    let browser2ID = await SpecialPowers.spawn(browser2, [], getChildRootOuterId);
     56 
     57    is(browser1ID, winID,
     58       "Browser 1 frame script environment should have the correct chromeOuterWindowID");
     59    is(browser2ID, winID,
     60       "Browser 1 frame script environment should have the correct chromeOuterWindowID");
     61  }
     62 
     63  /**
     64   * Opens up a BROWSER_DOC test window, and points each browser to a particular
     65   * page.
     66   *
     67   * @param num (Number)
     68   *        An identifier number for this window. Mainly used as a suffix for the
     69   *        returned values.
     70   * @param page (String)
     71   *        A URL to load in each <xul:browser>
     72   * @returns Promise
     73   *        The Promise resolves with an object with the following properties:
     74   *
     75   *        win<num>: a reference to the opened window
     76   *        remote<num>: a reference to the remote browser in the window
     77   *        nonRemote<num>: a reference to the non-remote browser in the window
     78   */
     79  async function prepareWindow(num, page) {
     80    let win = window.browsingContext.topChromeWindow.open(BROWSER_DOC, "bug1474662-" + num, "chrome,width=200,height=200");
     81    await BrowserTestUtils.waitForEvent(win, "load");
     82    let remote = win.document.getElementById("remote");
     83    let nonRemote = win.document.getElementById("non-remote");
     84 
     85    ok(remote && remote.isRemoteBrowser,
     86       "Should have found a remote browser in test window " + num);
     87    ok(nonRemote && !nonRemote.isRemoteBrowser,
     88       "Should have found a non-remote browser in test window " + num);
     89 
     90    BrowserTestUtils.startLoadingURIString(remote, page);
     91    await BrowserTestUtils.browserLoaded(remote);
     92    BrowserTestUtils.startLoadingURIString(nonRemote, page);
     93    await BrowserTestUtils.browserLoaded(nonRemote);
     94 
     95    let result = {};
     96    result["win" + num] = win;
     97    result["remote" + num] = remote;
     98    result["nonRemote" + num] = nonRemote;
     99    return result;
    100  }
    101 
    102  add_task(async () => {
    103    let { win1, remote1, nonRemote1 } = await prepareWindow(1, TEST_PAGE);
    104    let { win2, remote2, nonRemote2 } = await prepareWindow(2, TEST_PAGE_2);
    105 
    106    let win1ID = getOuterWindowID(win1);
    107    let win2ID = getOuterWindowID(win2);
    108 
    109    // Quick sanity-test here - if something has gone horribly wrong
    110    // and the windows have the same IDs, then the rest of this test
    111    // is meaningless.
    112    isnot(win1ID, win2ID,
    113          "The windows should definitely have different IDs.");
    114 
    115    await ensureExpectedChromeOuterWindowIDs(remote1, nonRemote1);
    116    await ensureExpectedChromeOuterWindowIDs(remote2, nonRemote2);
    117 
    118    // Swap the frameloaders! This doesn't swap the <browser> elements though,
    119    // so what's expected is that the IDs should remain the same within
    120    // the browsers despite the underlying content changing.
    121    remote1.swapFrameLoaders(remote2);
    122    nonRemote1.swapFrameLoaders(nonRemote2);
    123 
    124    await ensureExpectedChromeOuterWindowIDs(remote1, nonRemote1);
    125    await ensureExpectedChromeOuterWindowIDs(remote2, nonRemote2);
    126 
    127    // Now swap them back.
    128    remote1.swapFrameLoaders(remote2);
    129    nonRemote1.swapFrameLoaders(nonRemote2);
    130 
    131    await ensureExpectedChromeOuterWindowIDs(remote1, nonRemote1);
    132    await ensureExpectedChromeOuterWindowIDs(remote2, nonRemote2);
    133 
    134    await BrowserTestUtils.closeWindow(win1);
    135    await BrowserTestUtils.closeWindow(win2);
    136  });
    137  ]]></script>
    138 </window>