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>