tor-browser

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

RTCEncodedAudioFrame-clone.https.html (2196B)


      1 <!DOCTYPE html>
      2 <meta charset="utf-8">
      3 <title>RTCEncodedAudioFrame 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 caller1 = new RTCPeerConnection();
     16  t.add_cleanup(() => caller1.close());
     17  const callee1 = new RTCPeerConnection({encodedInsertableStreams:true});
     18  t.add_cleanup(() => callee1.close());
     19  await setMediaPermission("granted", ["microphone"]);
     20  const inputStream = await navigator.mediaDevices.getUserMedia({audio:true});
     21  const inputTrack = inputStream.getAudioTracks()[0];
     22  t.add_cleanup(() => inputTrack.stop());
     23  caller1.addTrack(inputTrack)
     24  exchangeIceCandidates(caller1, callee1);
     25 
     26  const caller2 = new RTCPeerConnection({encodedInsertableStreams:true});
     27  t.add_cleanup(() => caller2.close());
     28  const sender2 = caller2.addTransceiver("audio").sender;
     29  const writer2 = sender2.createEncodedStreams().writable.getWriter();
     30  sender2.replaceTrack(new MediaStreamTrackGenerator({ kind: 'audio' }));
     31 
     32  const framesReceivedCorrectly = new Promise((resolve, reject) => {
     33    callee1.ontrack = async e => {
     34      const receiverStreams = e.receiver.createEncodedStreams();
     35      const receiverReader = receiverStreams.readable.getReader();
     36      const result = await receiverReader.read();
     37      const original = result.value;
     38      let clone = structuredClone(original);
     39      assert_equals(original.timestamp, clone.timestamp);
     40      assert_equals(original.getMetadata().captureTime, clone.getMetadata().captureTime);
     41      assert_array_equals(Array.from(original.data), Array.from(clone.data));
     42      await writer2.write(clone);
     43      resolve();
     44    }
     45  });
     46 
     47  await exchangeOfferAnswer(caller1, callee1);
     48 
     49  return framesReceivedCorrectly;
     50 }, "Cloning before sending works");
     51 </script>