summaryrefslogtreecommitdiffstats
path: root/dom/tests/browser/browser_hasActivePeerConnections.js
blob: 91d51efbfc389e1502cbdd3b54e807cf450498e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
const TEST_URI1 =
  "http://mochi.test:8888/browser/dom/tests/browser/" +
  "create_webrtc_peer_connection.html";

const TEST_URI2 =
  "https://example.com/browser/dom/tests/browser/" +
  "create_webrtc_peer_connection.html";

add_task(async () => {
  await BrowserTestUtils.withNewTab(TEST_URI1, async browser => {
    const windowGlobal = browser.browsingContext.currentWindowGlobal;
    Assert.ok(windowGlobal);

    Assert.strictEqual(
      windowGlobal.hasActivePeerConnections(),
      false,
      "No active connections at the beginning"
    );

    await SpecialPowers.spawn(browser, [], async () => {
      content.postMessage("push-peer-connection", "*");
      return new Promise(resolve =>
        content.addEventListener("message", function onMessage(event) {
          if (event.data == "ack") {
            content.removeEventListener(event.type, onMessage);
            resolve();
          }
        })
      );
    });

    Assert.strictEqual(
      windowGlobal.hasActivePeerConnections(),
      true,
      "One connection in the top window"
    );

    await SpecialPowers.spawn(browser, [], async () => {
      content.postMessage("pop-peer-connection", "*");
      return new Promise(resolve =>
        content.addEventListener("message", function onMessage(event) {
          if (event.data == "ack") {
            content.removeEventListener(event.type, onMessage);
            resolve();
          }
        })
      );
    });

    Assert.strictEqual(
      windowGlobal.hasActivePeerConnections(),
      false,
      "All connections have been closed"
    );

    await SpecialPowers.spawn(
      browser,
      [TEST_URI1, TEST_URI2],
      async (TEST_URI1, TEST_URI2) => {
        // Create a promise that is fulfilled when the "ack" message is received
        // |targetCount| times.
        const createWaitForAckPromise = (eventTarget, targetCount) => {
          let counter = 0;
          return new Promise(resolve => {
            eventTarget.addEventListener("message", function onMsg(event) {
              if (event.data == "ack") {
                ++counter;
                if (counter == targetCount) {
                  eventTarget.removeEventListener(event.type, onMsg);
                  resolve();
                }
              }
            });
          });
        };

        const addFrame = (id, url) => {
          const iframe = content.document.createElement("iframe");
          iframe.id = id;
          iframe.src = url;
          content.document.body.appendChild(iframe);
          return iframe;
        };

        // Create two iframes hosting a same-origin page and a cross-origin page
        const iframe1 = addFrame("iframe-same-origin", TEST_URI1);
        const iframe2 = addFrame("iframe-cross-origin", TEST_URI2);
        await ContentTaskUtils.waitForEvent(iframe1, "load");
        await ContentTaskUtils.waitForEvent(iframe2, "load");

        // Make sure the counter is not messed up after successive push/pop
        // messages
        const kLoopCount = 100;
        for (let i = 0; i < kLoopCount; ++i) {
          content.postMessage("push-peer-connection", "*");
          iframe1.contentWindow.postMessage("push-peer-connection", "*");
          iframe2.contentWindow.postMessage("push-peer-connection", "*");
          iframe1.contentWindow.postMessage("pop-peer-connection", "*");
          iframe2.contentWindow.postMessage("pop-peer-connection", "*");
          content.postMessage("pop-peer-connection", "*");
        }
        iframe2.contentWindow.postMessage("push-peer-connection", "*");

        return createWaitForAckPromise(content, kLoopCount * 6 + 1);
      }
    );

    Assert.strictEqual(
      windowGlobal.hasActivePeerConnections(),
      true,
      "#iframe-cross-origin still has an active connection"
    );

    await SpecialPowers.spawn(browser, [], async () => {
      content.document
        .getElementById("iframe-cross-origin")
        .contentWindow.postMessage("pop-peer-connection", "*");
      return new Promise(resolve =>
        content.addEventListener("message", function onMessage(event) {
          if (event.data == "ack") {
            content.removeEventListener(event.type, onMessage);
            resolve();
          }
        })
      );
    });

    Assert.strictEqual(
      windowGlobal.hasActivePeerConnections(),
      false,
      "All connections have been closed"
    );
  });
});