tor-browser

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

test_getUserMedia_trackEnded.html (2530B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4  <script type="application/javascript" src="mediaStreamPlayback.js"></script>
      5 </head>
      6 <body>
      7 <pre id="test">
      8 <iframe id="iframe" onload="iframeLoaded()" srcdoc="
      9  <script type='application/javascript'>
     10  document.gUM = (constraints, success, failure) =>
     11    navigator.mediaDevices.getUserMedia(constraints).then(success, failure);
     12  </script>">
     13 </iframe>
     14 <script type="application/javascript">
     15  "use strict";
     16  let iframeLoadedPromise = {};
     17  iframeLoadedPromise.promise = new Promise(r => {
     18    iframeLoadedPromise.resolve = r;
     19  });;
     20  function iframeLoaded() {
     21    iframeLoadedPromise.resolve();
     22  }
     23 
     24  createHTML({
     25    title: "getUserMedia MediaStreamTrack 'ended' event on navigating",
     26    bug: "1208373",
     27  });
     28 
     29  runTest(async () => {
     30    await iframeLoadedPromise.promise;
     31    let iframe = document.getElementById("iframe");
     32    let stream;
     33    // We're passing callbacks into a method in the iframe here, because
     34    // a Promise created in the iframe is unusable after the iframe has
     35    // navigated away (see bug 1269400 for details).
     36    return new Promise((resolve, reject) =>
     37        iframe.contentDocument.gUM({audio: true, video: true}, resolve, reject))
     38      .then(s => {
     39        // We're cloning a stream containing identical tracks (an original
     40        // and its clone) to test that ended works both for originals
     41        // clones when they're both owned by the same MediaStream.
     42        // (Bug 1274221)
     43        stream = new MediaStream([].concat(s.getTracks(), s.getTracks())
     44                                   .map(t => t.clone())).clone();
     45        var allTracksEnded = Promise.all(stream.getTracks().map(t => {
     46          info("Set up ended handler for track " + t.id);
     47          return haveEvent(t, "ended", wait(50000))
     48            .then(event => {
     49              info("ended handler invoked for track " + t.id);
     50              is(event.target, t, "Target should be correct");
     51            }, e => e ? Promise.reject(e)
     52                      : ok(false, "ended event never raised for track " + t.id));
     53        }));
     54        stream.getTracks().forEach(t =>
     55          is(t.readyState, "live",
     56             "Non-ended track should have readyState 'live'"));
     57        iframe.srcdoc = "";
     58        info("iframe has been reset. Waiting for tracks to end.");
     59        return allTracksEnded;
     60      })
     61      .then(() => stream.getTracks().forEach(t =>
     62        is(t.readyState, "ended",
     63           "Ended track should have readyState 'ended'")));
     64  });
     65 </script>
     66 </pre>
     67 </body>
     68 </html>