tor-browser

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

test_streams_element_capture_reset.html (4977B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4  <title>Test that reloading, pausing and seeking in a media element that's being captured behaves as expected</title>
      5  <script src="/tests/SimpleTest/SimpleTest.js"></script>
      6  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
      7  <script src="manifest.js"></script>
      8 </head>
      9 <body>
     10 <video id="v"></video>
     11 <video id="vout"></video>
     12 <video id="vout_untilended"></video>
     13 <pre id="test">
     14 <script>
     15 const v = document.getElementById('v');
     16 const vout = document.getElementById('vout');
     17 const vout_untilended = document.getElementById('vout_untilended');
     18 
     19 function dumpEvent(event) {
     20  const video = event.target;
     21  info(
     22    `${video.name}:${video.id} GOT EVENT ${event.type} ` +
     23    `currentTime=${video.currentTime} paused=${video.paused} ` +
     24    `ended=${video.ended} readyState=${video.readyState}`
     25  );
     26 }
     27 
     28 function unexpected(event) {
     29  ok(false, `${event.type} event received on ${event.target.id} unexpectedly`);
     30 };
     31 
     32 const events = ["timeupdate", "seeking", "seeked", "ended", "playing", "pause"];
     33 for (const e of events) {
     34  v.addEventListener(e, dumpEvent);
     35  vout.addEventListener(e, dumpEvent);
     36  vout_untilended.addEventListener(e, dumpEvent);
     37 }
     38 
     39 function isWithinEps(a, b, msg) {
     40  ok(Math.abs(a - b) < 0.01,
     41     "Got " + a + ", expected " + b + "; " + msg);
     42 }
     43 
     44 function isGreaterThanOrEqualEps(a, b, msg) {
     45  ok(a >= b - 0.01,
     46     "Got " + a + ", expected at least " + b + "; " + msg);
     47 }
     48 
     49 async function startTest(test) {
     50  const seekTime = test.duration/2;
     51  const contentDuration = test.contentDuration ?? test.duration;
     52 
     53  v.src = test.name;
     54  v.name = test.name;
     55  vout.name = test.name;
     56  vout_untilended.name = test.name;
     57  v.preload = "metadata";
     58  await new Promise(r => v.onloadedmetadata = r);
     59 
     60  vout.srcObject = v.mozCaptureStream();
     61  vout.play();
     62 
     63  vout_untilended.srcObject = v.mozCaptureStreamUntilEnded();
     64  vout_untilended.play();
     65 
     66  for (const track of [
     67      ...vout.srcObject.getTracks(),
     68      ...vout_untilended.srcObject.getTracks(),
     69    ]) {
     70    ok(track.muted, `${track.kind} track ${track.id} should be muted`);
     71  }
     72 
     73  v.play();
     74 
     75  await Promise.all([
     76    ...vout.srcObject.getTracks(),
     77    ...vout_untilended.srcObject.getTracks()
     78  ].map(t => new Promise(r => t.onunmute = r)));
     79 
     80  await new Promise(r => v.onended = r);
     81  isGreaterThanOrEqualEps(v.currentTime, test.duration,
     82    "checking v.currentTime at first 'ended' event");
     83 
     84  await Promise.all([
     85    new Promise(r => vout.onended = r),
     86    new Promise(r => vout_untilended.onended = r),
     87  ]);
     88 
     89  isGreaterThanOrEqualEps(vout.currentTime, contentDuration,
     90    "checking vout.currentTime at first 'ended' event");
     91  ok(vout.ended, "checking vout has actually ended");
     92  ok(vout_untilended.ended, "checking vout_untilended has actually ended");
     93 
     94  vout_untilended.srcObject.onaddtrack = unexpected;
     95  vout_untilended.onplaying = unexpected;
     96  vout_untilended.onended = unexpected;
     97 
     98  const voutPreSeekCurrentTime = vout.currentTime;
     99  v.currentTime = seekTime;
    100  await new Promise(r => v.onseeked = r);
    101 
    102  is(v.currentTime, seekTime, "Finished seeking");
    103  is(vout.currentTime, voutPreSeekCurrentTime,
    104    "checking vout.currentTime has not changed after seeking");
    105 
    106  v.play();
    107  vout.play();
    108 
    109  await new Promise(r => v.onended = r);
    110  isGreaterThanOrEqualEps(v.currentTime, test.duration,
    111    "checking v.currentTime at second 'ended' event");
    112 
    113  await new Promise(r => vout.onended = r);
    114  isGreaterThanOrEqualEps(vout.currentTime,
    115    (test.duration - seekTime) + contentDuration,
    116    "checking vout.currentTime after seeking and playing through again");
    117 
    118  v.src = test.name + "?1";
    119  vout.play();
    120  await v.play();
    121 
    122  isnot(vout.srcObject.getTracks().length, 0, "There are some output tracks");
    123 
    124  vout.onended = unexpected;
    125  vout.srcObject.onremovetrack = unexpected;
    126 
    127  v.pause();
    128  await Promise.all(
    129    vout.srcObject.getTracks().map(t => new Promise(r => t.onmute = r))
    130  );
    131 
    132  for (const track of vout.srcObject.getTracks()) {
    133    track.onunmute = unexpected;
    134  }
    135 
    136  v.currentTime = 0;
    137  await new Promise(r => v.onseeked = r);
    138 
    139  v.play();
    140  await Promise.all(
    141    vout.srcObject.getTracks().map(t => new Promise(r => t.onunmute = r))
    142  );
    143 
    144  vout.srcObject.onremovetrack = null;
    145 
    146  await new Promise(r => v.onended = r);
    147  isGreaterThanOrEqualEps(v.currentTime, test.duration,
    148    "checking v.currentTime at third 'ended' event");
    149 
    150  await new Promise(r => vout.onended = r);
    151  isGreaterThanOrEqualEps(vout.currentTime,
    152    (test.duration - seekTime) + contentDuration*2,
    153    "checking vout.currentTime after seeking, playing through and reloading");
    154 }
    155 
    156 (async () => {
    157  SimpleTest.waitForExplicitFinish();
    158  try {
    159    const testVideo = getPlayableVideo(gSmallTests);
    160    if (testVideo) {
    161      await startTest(testVideo);
    162    } else {
    163      todo(false, "No playable video");
    164    }
    165  } catch(e) {
    166    ok(false, `Error: ${e}`);
    167  } finally {
    168    SimpleTest.finish();
    169  }
    170 })();
    171 </script>
    172 </pre>
    173 </body>
    174 </html>