tor-browser

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

test_peerConnection_recordReceiveTrack.html (3190B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4 <script src="pc.js"></script>
      5 </head>
      6 <body>
      7 <pre id="test">
      8 <script>
      9 createHTML({
     10  bug: "1212237",
     11  title: "Recording a fresh receive track should not throw",
     12  visible: true,
     13 });
     14 
     15 /**
     16 * Called when a fresh track is available, and tests that the track can be
     17 * recorded until it ends without any thrown errors or fired error events.
     18 */
     19 let generation = 0;
     20 async function testTrackAccessible(track) {
     21  const id = ++generation;
     22  info(`Testing accessibility for ${track.kind} track ${id}`);
     23  const recorder = new MediaRecorder(new MediaStream([track]));
     24  recorder.start();
     25  let haveError = new Promise((_, rej) => recorder.onerror = e => rej(e.error));
     26  await Promise.race([
     27    new Promise(r => recorder.onstart = r),
     28    haveError,
     29  ]);
     30  info(`Recording of ${track.kind} track ${id} started`);
     31 
     32  const {data} = await Promise.race([
     33    new Promise(r => recorder.ondataavailable = r),
     34    haveError,
     35  ]);
     36  info(`Recording of ${track.kind} track ${id} finished at size ${data.size}`);
     37 
     38  await Promise.race([
     39    new Promise(r => recorder.onstop = r),
     40    haveError,
     41  ]);
     42  info(`Recording of ${track.kind} track ${id} stopped`);
     43 
     44  const element = createMediaElement(track.kind, `recording_${track.id}`);
     45  const url = URL.createObjectURL(data);
     46  try {
     47    element.src = url;
     48    element.preload = "metadata";
     49    haveError = new Promise(
     50      (_, rej) => element.onerror = e => rej(element.error));
     51    await Promise.race([
     52      new Promise(r => element.onloadeddata = r),
     53      haveError,
     54    ]);
     55    info(`Playback of recording of ${track.kind} track ${id} loaded data`);
     56 
     57    element.play();
     58    await Promise.race([
     59      new Promise(r => element.onended = r),
     60      haveError,
     61    ]);
     62    info(`Playback of recording of ${track.kind} track ${id} ended`);
     63  } finally {
     64    URL.revokeObjectURL(data);
     65  }
     66 }
     67 
     68 runNetworkTest(async options => {
     69  // [TODO] re-enable HW decoder after bug 1526207 is fixed.
     70  if (navigator.userAgent.includes("Android")) {
     71    await pushPrefs(["media.navigator.mediadatadecoder_vpx_enabled", false],
     72                    ["media.webrtc.hw.h264.enabled", false]);
     73  }
     74  const test = new PeerConnectionTest(options);
     75  test.setMediaConstraints([{video: true}], [{audio: true}]);
     76  test.setOfferOptions({offerToReceiveAudio: true});
     77  const freshVideoTrackIsAccessible = new Promise(
     78      r => test.pcRemote._pc.addEventListener("track", r, {once: true})
     79    ).then(({track}) => testTrackAccessible(track));
     80  const freshAudioTrackIsAccessible = new Promise(
     81      r => test.pcLocal._pc.addEventListener("track", r, {once: true})
     82    ).then(({track}) => testTrackAccessible(track));
     83  test.chain.append([
     84    function PC_CLOSE_TO_END_TRACKS() {
     85      return test.close();
     86    },
     87    async function FRESH_VIDEO_TRACK_IS_ACCESSIBLE() {
     88      await freshVideoTrackIsAccessible;
     89      ok(true, "A freshly received video track is accessible by MediaRecorder");
     90    },
     91    async function FRESH_AUDIO_TRACK_IS_ACCESSIBLE() {
     92      await freshAudioTrackIsAccessible;
     93      ok(true, "A freshly received audio track is accessible by MediaRecorder");
     94    },
     95  ]);
     96  await test.run();
     97 });
     98 </script>
     99 </pre>
    100 </body>
    101 </html>