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>