tor-browser

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

browser_dynamic_frames.js (3681B)


      1 /* Any copyright is dedicated to the Public Domain.
      2 * http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 "use strict";
      5 
      6 /**
      7 * Ensure that static frames of framesets are serialized but dynamically
      8 * inserted iframes are ignored.
      9 */
     10 add_task(async function () {
     11  // allow top level data: URI navigations, otherwise clicking a data: link fails
     12  await SpecialPowers.pushPrefEnv({
     13    set: [["security.data_uri.block_toplevel_data_uri_navigations", false]],
     14  });
     15  // This URL has the following frames:
     16  //  + data:text/html,A (static)
     17  //  + data:text/html,B (static)
     18  //  + data:text/html,C (dynamic iframe)
     19  const URL =
     20    "data:text/html;charset=utf-8," +
     21    "<frameset cols=50%25,50%25><frame src='data:text/html,A'>" +
     22    "<frame src='data:text/html,B'></frameset>" +
     23    "<script>var i=document.createElement('iframe');" +
     24    "i.setAttribute('src', 'data:text/html,C');" +
     25    "document.body.appendChild(i);</script>";
     26 
     27  // Add a new tab with two "static" and one "dynamic" frame.
     28  let tab = BrowserTestUtils.addTab(gBrowser, URL);
     29  let browser = tab.linkedBrowser;
     30  await promiseBrowserLoaded(browser);
     31 
     32  await TabStateFlusher.flush(browser);
     33  let { entries } = JSON.parse(ss.getTabState(tab));
     34 
     35  // Check URLs.
     36  ok(entries[0].url.startsWith("data:text/html"), "correct root url");
     37  is(
     38    entries[0].children[0].url,
     39    "data:text/html,A",
     40    "correct url for 1st frame"
     41  );
     42  is(
     43    entries[0].children[1].url,
     44    "data:text/html,B",
     45    "correct url for 2nd frame"
     46  );
     47 
     48  // Check the number of children.
     49  is(entries.length, 1, "there is one root entry ...");
     50  is(entries[0].children.length, 2, "... with two child entries");
     51 
     52  // Cleanup.
     53  gBrowser.removeTab(tab);
     54 });
     55 
     56 /**
     57 * Ensure that iframes created by the network parser are serialized but
     58 * dynamically inserted iframes are ignored. Navigating a subframe should
     59 * create a second root entry that doesn't contain any dynamic children either.
     60 */
     61 add_task(async function () {
     62  // allow top level data: URI navigations, otherwise clicking a data: link fails
     63  await SpecialPowers.pushPrefEnv({
     64    set: [["security.data_uri.block_toplevel_data_uri_navigations", false]],
     65  });
     66  // This URL has the following frames:
     67  //  + data:text/html,A (static)
     68  //  + data:text/html,C (dynamic iframe)
     69  const URL =
     70    "data:text/html;charset=utf-8," +
     71    "<iframe name=t src='data:text/html,A'></iframe>" +
     72    "<a id=lnk href='data:text/html,B' target=t>clickme</a>" +
     73    "<script>var i=document.createElement('iframe');" +
     74    "i.setAttribute('src', 'data:text/html,C');" +
     75    "document.body.appendChild(i);</script>";
     76 
     77  // Add a new tab with one "static" and one "dynamic" frame.
     78  let tab = BrowserTestUtils.addTab(gBrowser, URL);
     79  let browser = tab.linkedBrowser;
     80  await promiseBrowserLoaded(browser);
     81 
     82  await TabStateFlusher.flush(browser);
     83  let { entries } = JSON.parse(ss.getTabState(tab));
     84 
     85  // Check URLs.
     86  ok(entries[0].url.startsWith("data:text/html"), "correct root url");
     87  ok(!entries[0].children, "no children collected");
     88 
     89  // Navigate the subframe.
     90  await BrowserTestUtils.synthesizeMouseAtCenter("#lnk", {}, browser);
     91  await promiseBrowserLoaded(browser, false /* don't ignore subframes */);
     92 
     93  await TabStateFlusher.flush(browser);
     94  ({ entries } = JSON.parse(ss.getTabState(tab)));
     95 
     96  // Check URLs.
     97  ok(entries[0].url.startsWith("data:text/html"), "correct 1st root url");
     98  ok(entries[1].url.startsWith("data:text/html"), "correct 2nd root url");
     99  ok(!entries.children, "no children collected");
    100  ok(!entries[0].children, "no children collected");
    101  ok(!entries[1].children, "no children collected");
    102 
    103  // Cleanup.
    104  gBrowser.removeTab(tab);
    105 });