tor-browser

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

test_getUserMedia_mediaElementCapture_video.html (3046B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4  <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script>
      5  <script type="application/javascript" src="mediaStreamPlayback.js"></script>
      6 </head>
      7 <body>
      8 <pre id="test">
      9 <script>
     10 
     11 createHTML({
     12  bug: "1259788",
     13  title: "Test CaptureStream video content on HTMLMediaElement playing a gUM MediaStream",
     14  visible: true
     15 });
     16 
     17 var gUMVideoElement;
     18 var captureStreamElement;
     19 
     20 const pausedTimeout = 1000;
     21 let h;
     22 
     23 runTest(async () => {
     24  try {
     25    await pushPrefs(
     26      // This test expects fake video devices, as it expects captured frames to
     27      // shift over time, which is not currently provided by loopback devices
     28      ['media.video_loopback_dev', ''],
     29      ['media.navigator.streams.fake', true]);
     30 
     31    let stream = await getUserMedia({video: true});
     32    h = new VideoStreamHelper();
     33    gUMVideoElement =
     34      createMediaElement("video", "gUMVideo");
     35    gUMVideoElement.srcObject = stream;
     36    gUMVideoElement.play();
     37 
     38    info("Capturing");
     39    captureStreamElement =
     40      createMediaElement("video", "captureStream");
     41    captureStreamElement.srcObject = gUMVideoElement.mozCaptureStream();
     42    captureStreamElement.play();
     43 
     44    await h.checkVideoPlaying(captureStreamElement);
     45 
     46    // Adding a dummy audio track to the stream will keep a consuming media
     47    // element from ending.
     48    // We could also solve it by repeatedly play()ing or autoplay, but then we
     49    // wouldn't be sure the media element stopped rendering video because it
     50    // went to the ended state or because there were no frames for the track.
     51    let osc = createOscillatorStream(new AudioContext(), 1000);
     52    captureStreamElement.srcObject.addTrack(osc.getTracks()[0]);
     53 
     54    info("Video flowing. Pausing.");
     55    gUMVideoElement.pause();
     56    await h.checkVideoPaused(captureStreamElement, { time: pausedTimeout });
     57 
     58    info("Video stopped flowing. Playing.");
     59    gUMVideoElement.play();
     60    await h.checkVideoPlaying(captureStreamElement);
     61 
     62    info("Video flowing. Removing source.");
     63    stream = gUMVideoElement.srcObject;
     64    gUMVideoElement.srcObject = null;
     65    await h.checkVideoPaused(captureStreamElement, { time: pausedTimeout });
     66 
     67    info("Video stopped flowing. Setting source.");
     68    gUMVideoElement.srcObject = stream;
     69    await h.checkVideoPlaying(captureStreamElement);
     70 
     71    info("Video flowing. Changing source by track manipulation. Remove first.");
     72    let track = gUMVideoElement.srcObject.getTracks()[0];
     73    gUMVideoElement.srcObject.removeTrack(track);
     74    await h.checkVideoPaused(captureStreamElement, { time: pausedTimeout });
     75 
     76    info("Video paused. Changing source by track manipulation. Add first.");
     77    gUMVideoElement.srcObject.addTrack(track);
     78    gUMVideoElement.play();
     79    await h.checkVideoPlaying(captureStreamElement);
     80 
     81    gUMVideoElement.srcObject.getTracks().forEach(t => t.stop());
     82    ok(true, "Test passed.");
     83  } catch (e) {
     84    ok(false, "Test failed: " + e + (e.stack ? "\n" + e.stack : ""));
     85  }
     86 });
     87 
     88 </script>
     89 </pre>
     90 </body>
     91 </html>