tor-browser

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

browser_hasActivePeerConnections.js (4431B)


      1 const TEST_URI1 =
      2  "http://mochi.test:8888/browser/dom/tests/browser/" +
      3  "create_webrtc_peer_connection.html";
      4 
      5 const TEST_URI2 =
      6  "https://example.com/browser/dom/tests/browser/" +
      7  "create_webrtc_peer_connection.html";
      8 
      9 add_task(async () => {
     10  await BrowserTestUtils.withNewTab(TEST_URI1, async browser => {
     11    const windowGlobal = browser.browsingContext.currentWindowGlobal;
     12    Assert.ok(windowGlobal);
     13 
     14    Assert.strictEqual(
     15      windowGlobal.hasActivePeerConnections(),
     16      false,
     17      "No active connections at the beginning"
     18    );
     19 
     20    await SpecialPowers.spawn(browser, [], async () => {
     21      content.postMessage("push-peer-connection", "*");
     22      return new Promise(resolve =>
     23        content.addEventListener("message", function onMessage(event) {
     24          if (event.data == "ack") {
     25            content.removeEventListener(event.type, onMessage);
     26            resolve();
     27          }
     28        })
     29      );
     30    });
     31 
     32    Assert.strictEqual(
     33      windowGlobal.hasActivePeerConnections(),
     34      true,
     35      "One connection in the top window"
     36    );
     37 
     38    await SpecialPowers.spawn(browser, [], async () => {
     39      content.postMessage("pop-peer-connection", "*");
     40      return new Promise(resolve =>
     41        content.addEventListener("message", function onMessage(event) {
     42          if (event.data == "ack") {
     43            content.removeEventListener(event.type, onMessage);
     44            resolve();
     45          }
     46        })
     47      );
     48    });
     49 
     50    Assert.strictEqual(
     51      windowGlobal.hasActivePeerConnections(),
     52      false,
     53      "All connections have been closed"
     54    );
     55 
     56    await SpecialPowers.spawn(
     57      browser,
     58      [TEST_URI1, TEST_URI2],
     59      async (TEST_URI1, TEST_URI2) => {
     60        // Create a promise that is fulfilled when the "ack" message is received
     61        // |targetCount| times.
     62        const createWaitForAckPromise = (eventTarget, targetCount) => {
     63          let counter = 0;
     64          return new Promise(resolve => {
     65            eventTarget.addEventListener("message", function onMsg(event) {
     66              if (event.data == "ack") {
     67                ++counter;
     68                if (counter == targetCount) {
     69                  eventTarget.removeEventListener(event.type, onMsg);
     70                  resolve();
     71                }
     72              }
     73            });
     74          });
     75        };
     76 
     77        const addFrame = (id, url) => {
     78          const iframe = content.document.createElement("iframe");
     79          iframe.id = id;
     80          iframe.src = url;
     81          content.document.body.appendChild(iframe);
     82          return iframe;
     83        };
     84 
     85        // Create two iframes hosting a same-origin page and a cross-origin page
     86        const iframe1 = addFrame("iframe-same-origin", TEST_URI1);
     87        const iframe2 = addFrame("iframe-cross-origin", TEST_URI2);
     88        await ContentTaskUtils.waitForEvent(iframe1, "load");
     89        await ContentTaskUtils.waitForEvent(iframe2, "load");
     90 
     91        // Make sure the counter is not messed up after successive push/pop
     92        // messages
     93        const kLoopCount = 100;
     94        for (let i = 0; i < kLoopCount; ++i) {
     95          content.postMessage("push-peer-connection", "*");
     96          iframe1.contentWindow.postMessage("push-peer-connection", "*");
     97          iframe2.contentWindow.postMessage("push-peer-connection", "*");
     98          iframe1.contentWindow.postMessage("pop-peer-connection", "*");
     99          iframe2.contentWindow.postMessage("pop-peer-connection", "*");
    100          content.postMessage("pop-peer-connection", "*");
    101        }
    102        iframe2.contentWindow.postMessage("push-peer-connection", "*");
    103 
    104        return createWaitForAckPromise(content, kLoopCount * 6 + 1);
    105      }
    106    );
    107 
    108    Assert.strictEqual(
    109      windowGlobal.hasActivePeerConnections(),
    110      true,
    111      "#iframe-cross-origin still has an active connection"
    112    );
    113 
    114    await SpecialPowers.spawn(browser, [], async () => {
    115      content.document
    116        .getElementById("iframe-cross-origin")
    117        .contentWindow.postMessage("pop-peer-connection", "*");
    118      return new Promise(resolve =>
    119        content.addEventListener("message", function onMessage(event) {
    120          if (event.data == "ack") {
    121            content.removeEventListener(event.type, onMessage);
    122            resolve();
    123          }
    124        })
    125      );
    126    });
    127 
    128    Assert.strictEqual(
    129      windowGlobal.hasActivePeerConnections(),
    130      false,
    131      "All connections have been closed"
    132    );
    133  });
    134 });