transfer-datachannel-service-worker.https.html (2714B)
1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <script src="/resources/testharness.js"></script> 6 <script src="/resources/testharnessreport.js"></script> 7 </head> 8 <body> 9 <script src="../service-workers/service-worker/resources/test-helpers.sub.js"></script> 10 <script> 11 async function createConnections(test, firstConnectionCallback, secondConnectionCallback) 12 { 13 const pc1 = new RTCPeerConnection(); 14 const pc2 = new RTCPeerConnection(); 15 16 test.add_cleanup(() => pc1.close()); 17 test.add_cleanup(() => pc2.close()); 18 19 pc1.onicecandidate = (e) => pc2.addIceCandidate(e.candidate); 20 pc2.onicecandidate = (e) => pc1.addIceCandidate(e.candidate); 21 22 firstConnectionCallback(pc1); 23 24 const offer = await pc1.createOffer(); 25 await pc1.setLocalDescription(offer); 26 await pc2.setRemoteDescription(offer); 27 28 secondConnectionCallback(pc2); 29 30 const answer = await pc2.createAnswer(); 31 await pc2.setLocalDescription(answer); 32 await pc1.setRemoteDescription(answer); 33 } 34 35 async function waitForMessage(receiver, data) 36 { 37 while (true) { 38 const received = await new Promise(resolve => receiver.onmessage = (event) => resolve(event.data)); 39 if (data === received) 40 return; 41 } 42 } 43 44 promise_test(async (test) => { 45 let frame; 46 const scope = 'resources/'; 47 const script = 'transfer-datachannel-service-worker.js'; 48 49 await service_worker_unregister(test, scope); 50 const registration = await navigator.serviceWorker.register(script, {scope}); 51 test.add_cleanup(async () => { 52 return service_worker_unregister(test, scope); 53 }); 54 const worker = registration.installing; 55 56 const messageChannel = new MessageChannel(); 57 58 let localChannel; 59 let remoteChannel; 60 61 await new Promise((resolve, reject) => { 62 createConnections(test, (firstConnection) => { 63 localChannel = firstConnection.createDataChannel('sendDataChannel'); 64 worker.postMessage({channel: localChannel, port: messageChannel.port2}, [localChannel, messageChannel.port2]); 65 }, (secondConnection) => { 66 secondConnection.ondatachannel = (event) => { 67 remoteChannel = event.channel; 68 remoteChannel.onopen = resolve; 69 }; 70 }); 71 }); 72 73 const promise = waitForMessage(messageChannel.port1, "OK"); 74 remoteChannel.send("OK"); 75 await promise; 76 77 const data = new Promise(resolve => remoteChannel.onmessage = (event) => resolve(event.data)); 78 messageChannel.port1.postMessage({message: "OK2"}); 79 assert_equals(await data, "OK2"); 80 }, "offerer data channel in service worker"); 81 </script> 82 </body> 83 </html>