tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>