tor-browser

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

browser_popup_blocker_iframes.js (4994B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 "use strict";
      6 
      7 requestLongerTimeout(5);
      8 
      9 const testURL = getRootDirectory(gTestPath).replace(
     10  "chrome://mochitests/content",
     11  // eslint-disable-next-line @microsoft/sdl/no-insecure-url
     12  "http://example.org"
     13 );
     14 
     15 const examplecomURL = getRootDirectory(gTestPath).replace(
     16  "chrome://mochitests/content",
     17  // eslint-disable-next-line @microsoft/sdl/no-insecure-url
     18  "http://example.com"
     19 );
     20 
     21 const w3cURL = getRootDirectory(gTestPath).replace(
     22  "chrome://mochitests/content",
     23  // eslint-disable-next-line @microsoft/sdl/no-insecure-url
     24  "http://w3c-test.org"
     25 );
     26 
     27 const examplenetURL = getRootDirectory(gTestPath).replace(
     28  "chrome://mochitests/content",
     29  // eslint-disable-next-line @microsoft/sdl/no-insecure-url
     30  "http://example.net"
     31 );
     32 
     33 const prefixexamplecomURL = getRootDirectory(gTestPath).replace(
     34  "chrome://mochitests/content",
     35  // eslint-disable-next-line @microsoft/sdl/no-insecure-url
     36  "http://prefixexample.com"
     37 );
     38 
     39 class TestCleanup {
     40  constructor() {
     41    this.tabs = [];
     42  }
     43 
     44  count() {
     45    return this.tabs.length;
     46  }
     47 
     48  static setup() {
     49    let cleaner = new TestCleanup();
     50    this.onTabOpen = event => {
     51      cleaner.tabs.push(event.target);
     52    };
     53    gBrowser.tabContainer.addEventListener("TabOpen", this.onTabOpen);
     54    return cleaner;
     55  }
     56 
     57  clean() {
     58    gBrowser.tabContainer.removeEventListener("TabOpen", this.onTabOpen);
     59    for (let tab of this.tabs) {
     60      gBrowser.removeTab(tab);
     61    }
     62  }
     63 }
     64 
     65 async function runTest(count, urls, permissions, delayedAllow) {
     66  let cleaner = TestCleanup.setup();
     67 
     68  // Enable the popup blocker.
     69  await SpecialPowers.pushPrefEnv({
     70    set: [["dom.disable_open_during_load", true]],
     71  });
     72 
     73  await SpecialPowers.pushPermissions(permissions);
     74 
     75  // Open the test page.
     76  let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, testURL);
     77 
     78  let contexts = await SpecialPowers.spawn(
     79    tab.linkedBrowser,
     80    [...urls, !!delayedAllow],
     81    async (url1, url2, url3, url4, delay) => {
     82      let iframe1 = content.document.createElement("iframe");
     83      let iframe2 = content.document.createElement("iframe");
     84      iframe1.id = "iframe1";
     85      iframe2.id = "iframe2";
     86      iframe1.src = new URL(
     87        `popup_blocker_frame.html?delayed=${delay}&base=${url3}`,
     88        url1
     89      );
     90      iframe2.src = new URL(
     91        `popup_blocker_frame.html?delayed=${delay}&base=${url4}`,
     92        url2
     93      );
     94 
     95      let promises = [
     96        new Promise(resolve => (iframe1.onload = resolve)),
     97        new Promise(resolve => (iframe2.onload = resolve)),
     98      ];
     99 
    100      content.document.body.appendChild(iframe1);
    101      content.document.body.appendChild(iframe2);
    102 
    103      await Promise.all(promises);
    104      return [iframe1.browsingContext, iframe2.browsingContext];
    105    }
    106  );
    107 
    108  if (delayedAllow) {
    109    await delayedAllow();
    110    await SpecialPowers.spawn(
    111      tab.linkedBrowser,
    112      contexts,
    113      async function (bc1, bc2) {
    114        bc1.window.postMessage("allow", "*");
    115        bc2.window.postMessage("allow", "*");
    116      }
    117    );
    118  }
    119 
    120  await TestUtils.waitForCondition(
    121    () => cleaner.count() == count,
    122    `waiting for ${count} tabs, got ${cleaner.count()}`
    123  );
    124 
    125  Assert.equal(cleaner.count(), count, `should have ${count} tabs`);
    126 
    127  await SpecialPowers.popPermissions();
    128  cleaner.clean();
    129 }
    130 
    131 add_task(async function () {
    132  let permission = {
    133    type: "popup",
    134    allow: true,
    135    context: "",
    136  };
    137 
    138  let expected = [];
    139 
    140  let tests = [
    141    [examplecomURL, w3cURL, prefixexamplecomURL, examplenetURL],
    142    [examplecomURL, examplecomURL, prefixexamplecomURL, examplenetURL],
    143    [examplecomURL, examplecomURL, prefixexamplecomURL, prefixexamplecomURL],
    144    [examplecomURL, w3cURL, prefixexamplecomURL, prefixexamplecomURL],
    145  ];
    146 
    147  permission.context = testURL;
    148  expected = [5, 5, 3, 3];
    149  for (let test in tests) {
    150    await runTest(expected[test], tests[test], [permission]);
    151  }
    152 
    153  permission.context = examplecomURL;
    154  expected = [3, 5, 3, 3];
    155  for (let test in tests) {
    156    await runTest(expected[test], tests[test], [permission]);
    157  }
    158 
    159  permission.context = prefixexamplecomURL;
    160  expected = [3, 3, 3, 3];
    161  for (let test in tests) {
    162    await runTest(expected[test], tests[test], [permission]);
    163  }
    164 
    165  async function allowPopup() {
    166    await SpecialPowers.pushPermissions([permission]);
    167  }
    168 
    169  permission.context = testURL;
    170  expected = [5, 5, 3, 3];
    171  for (let test in tests) {
    172    await runTest(expected[test], tests[test], [], allowPopup);
    173  }
    174 
    175  permission.context = examplecomURL;
    176  expected = [3, 5, 3, 3];
    177  for (let test in tests) {
    178    await runTest(expected[test], tests[test], [], allowPopup);
    179  }
    180 
    181  permission.context = prefixexamplecomURL;
    182  expected = [3, 3, 3, 3];
    183  for (let test in tests) {
    184    await runTest(expected[test], tests[test], [], allowPopup);
    185  }
    186 });