tor-browser

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

RTCEncodedAudioFrame-receive-cloned.https.html (2328B)


      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 receiverWriter = receiverStreams.writable.getWriter();
     37      const result = await receiverReader.read();
     38      const originalAudioFrame = result.value;
     39      let clonedAudioFrame = structuredClone(originalAudioFrame);
     40      assert_equals(originalAudioFrame.timestamp, clonedAudioFrame.timestamp);
     41      assert_array_equals(Array.from(originalAudioFrame.data), Array.from(clonedAudioFrame.data));
     42      await writer2.write(clonedAudioFrame);
     43      await receiverWriter.write(structuredClone(originalAudioFrame));
     44      resolve();
     45    }
     46  });
     47 
     48  await exchangeOfferAnswer(caller1, callee1);
     49 
     50  return framesReceivedCorrectly;
     51 }, "Cloning before sending works");
     52 </script>