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 });