RTCDataChannel-worker-GC.html (1863B)
1 <!doctype html> 2 <html> 3 <head> 4 <meta charset=utf-8> 5 <meta name="timeout" content="long"> 6 <script src="/resources/testharness.js"></script> 7 <script src="/resources/testharnessreport.js"></script> 8 <script src="/common/gc.js"></script> 9 <script src="RTCPeerConnection-helper.js"></script> 10 </head> 11 <body> 12 <script> 13 'use strict'; 14 15 // Check that a worker RTCDataChannel is not collected by GC while observing remote pc close 16 17 const worker = new Worker(`data:text/javascript,(${work.toString()})()`); 18 19 async function didRemotePcClose(t, closeRemotePc) { 20 let pc1 = new RTCPeerConnection(), pc2 = new RTCPeerConnection(); 21 t.add_cleanup(async () => await garbageCollect()); 22 pc1.onicecandidate = e => pc2?.addIceCandidate(e?.candidate); 23 pc2.onicecandidate = e => pc1?.addIceCandidate(e?.candidate); 24 let dc1 = pc1.createDataChannel(""); 25 worker.postMessage({channel: dc1}, [dc1]); 26 dc1 = null; 27 const closed = new Promise(r => { 28 worker.onmessage = ({data}) => { 29 if (data == "close") { 30 r(true); 31 } 32 } 33 }); 34 await pc1.setLocalDescription(); 35 await pc2.setRemoteDescription(pc1.localDescription); 36 await pc2.setLocalDescription(); 37 await pc1.setRemoteDescription(pc2.localDescription); 38 if (closeRemotePc) pc2.close(); 39 pc1 = pc2 = null; 40 await garbageCollect(); 41 return await Promise.race([closed, new Promise(r => t.step_timeout(r, 10000))]); 42 } 43 44 promise_test(async t => { 45 assert_true(await didRemotePcClose(t, true)); 46 }, "Control: detected remote PC being closed using a worker data channel"); 47 48 promise_test(async t => { 49 assert_false(await didRemotePcClose(t, false)); 50 }, "While remote PC remains open, its worker datachannel should not be collected"); 51 52 function work() { 53 onmessage = ({data: {channel}}) => { 54 if (channel) { 55 channel.onclose = () => self.postMessage("close"); 56 } 57 }; 58 } 59 </script> 60 </body> 61 </html>