summaryrefslogtreecommitdiffstats
path: root/dom/tests/browser/browser_hasActivePeerConnections.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/tests/browser/browser_hasActivePeerConnections.js')
-rw-r--r--dom/tests/browser/browser_hasActivePeerConnections.js134
1 files changed, 134 insertions, 0 deletions
diff --git a/dom/tests/browser/browser_hasActivePeerConnections.js b/dom/tests/browser/browser_hasActivePeerConnections.js
new file mode 100644
index 0000000000..91d51efbfc
--- /dev/null
+++ b/dom/tests/browser/browser_hasActivePeerConnections.js
@@ -0,0 +1,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"
+ );
+ });
+});