tor-browser

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

RTCEncodedVideoFrame-clone.https.html (2350B)


      1 <!DOCTYPE html>
      2 <meta charset="utf-8">
      3 <title>RTCEncodedVideoFrame can be cloned and distributed</title>
      4 <script src="/resources/testharness.js"></script>
      5 <script src="/resources/testharnessreport.js"></script>
      6 <script src=/resources/testdriver.js></script>
      7 <script src=/resources/testdriver-vendor.js></script>
      8 <script src='../../mediacapture-streams/permission-helper.js'></script>
      9 <script src="../../webrtc/RTCPeerConnection-helper.js"></script>
     10 <script src="../../service-workers/service-worker/resources/test-helpers.sub.js"></script>
     11 
     12 <script>
     13 "use strict";
     14 promise_test(async t => {
     15  const caller = new RTCPeerConnection({encodedInsertableStreams:true});
     16  t.add_cleanup(() => caller.close());
     17  const callee = new RTCPeerConnection({encodedInsertableStreams:true});
     18  t.add_cleanup(() => callee.close());
     19 
     20  await setMediaPermission("granted", ["camera"]);
     21  const stream = await navigator.mediaDevices.getUserMedia({video:true});
     22  const videoTrack = stream.getVideoTracks()[0];
     23  t.add_cleanup(() => videoTrack.stop());
     24 
     25  const videoSender = caller.addTrack(videoTrack)
     26  const senderStreams = videoSender.createEncodedStreams();
     27  const senderReader = senderStreams.readable.getReader();
     28  const senderWriter = senderStreams.writable.getWriter();
     29 
     30  exchangeIceCandidates(caller, callee);
     31 
     32  // Send 10 frames and stop
     33  const numFramesToSend = 10;
     34 
     35  const framesReceivedCorrectly = new Promise((resolve, reject) => {
     36    callee.ontrack = async e => {
     37      const receiverStreams = e.receiver.createEncodedStreams();
     38      const receiverReader = receiverStreams.readable.getReader();
     39      const receiverWriter = receiverStreams.writable.getWriter();
     40 
     41      // This should all be able to happen in 5 seconds.
     42      // For fast failures, uncomment this line.
     43      // t.step_timeout(reject, 5000);
     44      for (let i = 0; i < numFramesToSend; i++) {
     45        const result = await receiverReader.read();
     46        // Write upstream, purely to avoid "no frame received" error messages
     47        receiverWriter.write(result.value);
     48      }
     49      resolve();
     50    }
     51  });
     52 
     53  await exchangeOfferAnswer(caller, callee);
     54 
     55  for (let i = 0; i < numFramesToSend; i++) {
     56    const result = await senderReader.read();
     57    senderWriter.write(structuredClone(result.value));
     58  }
     59  return framesReceivedCorrectly;
     60 }, "Cloning before sending works");
     61 </script>