tor-browser

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

test_streams_element_capture_mediatrack.html (3148B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4  <title>Test that a media element captureStream works when disabling MediaTracks</title>
      5  <script src="/tests/SimpleTest/SimpleTest.js"></script>
      6  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
      7  <script type="text/javascript" src="manifest.js"></script>
      8 </head>
      9 <body>
     10 <pre id="test">
     11 <script class="testbody" type="text/javascript">
     12 const manager = new MediaTestManager();
     13 
     14 async function startTest(test, token) {
     15  manager.started(token);
     16  const v = document.createElement('video');
     17 
     18  document.body.appendChild(v);
     19  v.token = token;
     20  v.id = "MediaDecoder";
     21 
     22  // Log events for debugging.
     23  const events = ["suspend", "play", "canplay", "canplaythrough", "loadstart", "loadedmetadata",
     24                "loadeddata", "playing", "ended", "error", "stalled", "emptied", "abort",
     25                "waiting", "pause"];
     26  function logEvent(e) {
     27    Log(token, `${token}: ${e.target.id} got ${e.type}`);
     28  }
     29  for (const e of events) {
     30    v.addEventListener(e, logEvent);
     31  };
     32 
     33  v.src = test.name;
     34  v.preload = 'metadata';
     35  await new Promise(r => v.onloadedmetadata = r);
     36 
     37  const stream = v.mozCaptureStream();
     38 
     39  is(stream.getAudioTracks().length, Math.min(1, v.audioTracks.length),
     40    `${token}: Expected number of audio tracks`);
     41  is(stream.getVideoTracks().length, Math.min(1, v.videoTracks.length),
     42    `${token}: Expected number of video tracks`);
     43 
     44  if (v.audioTracks.length) {
     45    v.audioTracks[0].enabled = false;
     46    const track = stream.getAudioTracks()[0];
     47    await new Promise(r => track.onended = r);
     48    is(track.readyState, "ended", `${token}: Audio track has ended on removal`);
     49    await new Promise(r => stream.onremovetrack = r);
     50    is(stream.getAudioTracks().length, 0,
     51      `${token}: Audio track was removed on removetrack`);
     52  }
     53 
     54  if (v.videoTracks.length) {
     55    v.videoTracks[0].selected = false;
     56    const track = stream.getVideoTracks()[0];
     57    await new Promise(r => track.onended = r);
     58    is(track.readyState, "ended", `${token}: Video track has ended on removal`);
     59    await new Promise(r => stream.onremovetrack = r);
     60    is(stream.getVideoTracks().length, 0,
     61      `${token}: Video track was removed on removetrack`);
     62  }
     63 
     64  stream.onaddtrack = () => ok(false, "Unexpected addtrack event");
     65 
     66  v.play();
     67 
     68  await Promise.race([
     69    new Promise(r => v.ontimeupdate = r),
     70    new Promise((res, rej) => v.onerror = () => rej(new Error(v.error.message))),
     71  ]);
     72 
     73  is(stream.getTracks().length, 0, `${token}: no tracks appeared during playback`);
     74  removeNodeAndSource(v);
     75 }
     76 
     77 (async () => {
     78  SimpleTest.requestCompleteLog();
     79  SimpleTest.waitForExplicitFinish();
     80  await SpecialPowers.pushPrefEnv(
     81    { "set": [
     82      ["media.track.enabled", true],
     83    ]});
     84  let tests = gPlayTests;
     85  // Filter out bug1377278.webm due to bug 1541401.
     86  tests = tests.filter(t => !t.name.includes("1377278"));
     87 
     88  manager.runTests(tests, async (test, token) => {
     89    try {
     90      await startTest(test, token);
     91    } catch(e) {
     92      ok(false, `Caught exception for ${token}: ${e}`);
     93    }
     94    manager.finished(token);
     95  });
     96 })();
     97 </script>
     98 </pre>
     99 </body>
    100 </html>