test_cloneElementVisually_mediastream_multitrack.html (2732B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Test cloneElementVisually</title> 6 <script src="/tests/SimpleTest/SimpleTest.js"></script> 7 <script type="application/javascript" src="https://example.com:443/tests/dom/media/test/cloneElementVisually_helpers.js"></script> 8 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"> 9 </head> 10 <body> 11 <div id="content"> 12 <h1>Originals</h1> 13 <div id="originalContainer"></div> 14 <canvas id="canvas"></canvas> 15 <h1>MediaStream</h1> 16 <div id="streamTargetContainer"></div> 17 <h1>Clone</h1> 18 </div> 19 <div id="results"> 20 <h1>Results</h1> 21 <canvas id="left"></canvas> 22 <canvas id="right"></canvas> 23 </div> 24 25 <script type="application/javascript"> 26 27 /* import-globals-from cloneElementVisually_helpers.js */ 28 29 /** 30 * Test that a clone of a video that is playing a MediaStream properly tracks 31 * the selected video track. 32 */ 33 add_task(async () => { 34 await SpecialPowers.pushPrefEnv({ 35 set: [ 36 ["media.track.enabled", true], 37 ], 38 }); 39 40 let originalVideo = document.createElement("video"); 41 originalVideo.id = "original"; 42 document.getElementById("originalContainer").appendChild(originalVideo); 43 44 let streamTarget = document.createElement("video"); 45 document.getElementById("streamTargetContainer").appendChild(streamTarget); 46 47 await setup(); 48 49 let [track1] = originalVideo.mozCaptureStream().getTracks(); 50 let playingPromise = waitForEventOnce(originalVideo, "playing"); 51 await originalVideo.play(); 52 await playingPromise; 53 54 let canvas = document.getElementById("canvas"); 55 canvas.width = originalVideo.videoWidth / 2; 56 canvas.height = originalVideo.videoHeight / 2; 57 let ctx = canvas.getContext("2d"); 58 let [track2] = canvas.captureStream().getTracks(); 59 ctx.fillStyle = "green"; 60 ctx.fillRect(0, 0, canvas.width, canvas.height); 61 62 streamTarget.srcObject = new MediaStream([track1, track2]); 63 playingPromise = waitForEventOnce(streamTarget, "playing"); 64 await streamTarget.play(); 65 await playingPromise; 66 67 await withNewClone(originalVideo, async clone => { 68 SpecialPowers.wrap(streamTarget).cloneElementVisually(clone); 69 70 let selectedTrackIdx = streamTarget.videoTracks.selectedIndex; 71 streamTarget.videoTracks[++selectedTrackIdx % 2].selected = true; 72 await waitForEventOnce(streamTarget, "resize"); 73 74 ok(await assertVideosMatch(streamTarget, clone), 75 "Should match MediaStream"); 76 }); 77 78 // Capturing a stream from a video "taints" it which prevents testing 79 // shutdown decoder behaviour. To avoid interfering with future tests, 80 // we replace the video. 81 let newVideo = originalVideo.cloneNode(); 82 originalVideo.parentNode.replaceChild(newVideo, originalVideo); 83 }); 84 85 </script> 86 87 </body> 88 </html>