test_streams_element_capture_reset.html (4977B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <title>Test that reloading, pausing and seeking in a media element that's being captured behaves as expected</title> 5 <script src="/tests/SimpleTest/SimpleTest.js"></script> 6 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 7 <script src="manifest.js"></script> 8 </head> 9 <body> 10 <video id="v"></video> 11 <video id="vout"></video> 12 <video id="vout_untilended"></video> 13 <pre id="test"> 14 <script> 15 const v = document.getElementById('v'); 16 const vout = document.getElementById('vout'); 17 const vout_untilended = document.getElementById('vout_untilended'); 18 19 function dumpEvent(event) { 20 const video = event.target; 21 info( 22 `${video.name}:${video.id} GOT EVENT ${event.type} ` + 23 `currentTime=${video.currentTime} paused=${video.paused} ` + 24 `ended=${video.ended} readyState=${video.readyState}` 25 ); 26 } 27 28 function unexpected(event) { 29 ok(false, `${event.type} event received on ${event.target.id} unexpectedly`); 30 }; 31 32 const events = ["timeupdate", "seeking", "seeked", "ended", "playing", "pause"]; 33 for (const e of events) { 34 v.addEventListener(e, dumpEvent); 35 vout.addEventListener(e, dumpEvent); 36 vout_untilended.addEventListener(e, dumpEvent); 37 } 38 39 function isWithinEps(a, b, msg) { 40 ok(Math.abs(a - b) < 0.01, 41 "Got " + a + ", expected " + b + "; " + msg); 42 } 43 44 function isGreaterThanOrEqualEps(a, b, msg) { 45 ok(a >= b - 0.01, 46 "Got " + a + ", expected at least " + b + "; " + msg); 47 } 48 49 async function startTest(test) { 50 const seekTime = test.duration/2; 51 const contentDuration = test.contentDuration ?? test.duration; 52 53 v.src = test.name; 54 v.name = test.name; 55 vout.name = test.name; 56 vout_untilended.name = test.name; 57 v.preload = "metadata"; 58 await new Promise(r => v.onloadedmetadata = r); 59 60 vout.srcObject = v.mozCaptureStream(); 61 vout.play(); 62 63 vout_untilended.srcObject = v.mozCaptureStreamUntilEnded(); 64 vout_untilended.play(); 65 66 for (const track of [ 67 ...vout.srcObject.getTracks(), 68 ...vout_untilended.srcObject.getTracks(), 69 ]) { 70 ok(track.muted, `${track.kind} track ${track.id} should be muted`); 71 } 72 73 v.play(); 74 75 await Promise.all([ 76 ...vout.srcObject.getTracks(), 77 ...vout_untilended.srcObject.getTracks() 78 ].map(t => new Promise(r => t.onunmute = r))); 79 80 await new Promise(r => v.onended = r); 81 isGreaterThanOrEqualEps(v.currentTime, test.duration, 82 "checking v.currentTime at first 'ended' event"); 83 84 await Promise.all([ 85 new Promise(r => vout.onended = r), 86 new Promise(r => vout_untilended.onended = r), 87 ]); 88 89 isGreaterThanOrEqualEps(vout.currentTime, contentDuration, 90 "checking vout.currentTime at first 'ended' event"); 91 ok(vout.ended, "checking vout has actually ended"); 92 ok(vout_untilended.ended, "checking vout_untilended has actually ended"); 93 94 vout_untilended.srcObject.onaddtrack = unexpected; 95 vout_untilended.onplaying = unexpected; 96 vout_untilended.onended = unexpected; 97 98 const voutPreSeekCurrentTime = vout.currentTime; 99 v.currentTime = seekTime; 100 await new Promise(r => v.onseeked = r); 101 102 is(v.currentTime, seekTime, "Finished seeking"); 103 is(vout.currentTime, voutPreSeekCurrentTime, 104 "checking vout.currentTime has not changed after seeking"); 105 106 v.play(); 107 vout.play(); 108 109 await new Promise(r => v.onended = r); 110 isGreaterThanOrEqualEps(v.currentTime, test.duration, 111 "checking v.currentTime at second 'ended' event"); 112 113 await new Promise(r => vout.onended = r); 114 isGreaterThanOrEqualEps(vout.currentTime, 115 (test.duration - seekTime) + contentDuration, 116 "checking vout.currentTime after seeking and playing through again"); 117 118 v.src = test.name + "?1"; 119 vout.play(); 120 await v.play(); 121 122 isnot(vout.srcObject.getTracks().length, 0, "There are some output tracks"); 123 124 vout.onended = unexpected; 125 vout.srcObject.onremovetrack = unexpected; 126 127 v.pause(); 128 await Promise.all( 129 vout.srcObject.getTracks().map(t => new Promise(r => t.onmute = r)) 130 ); 131 132 for (const track of vout.srcObject.getTracks()) { 133 track.onunmute = unexpected; 134 } 135 136 v.currentTime = 0; 137 await new Promise(r => v.onseeked = r); 138 139 v.play(); 140 await Promise.all( 141 vout.srcObject.getTracks().map(t => new Promise(r => t.onunmute = r)) 142 ); 143 144 vout.srcObject.onremovetrack = null; 145 146 await new Promise(r => v.onended = r); 147 isGreaterThanOrEqualEps(v.currentTime, test.duration, 148 "checking v.currentTime at third 'ended' event"); 149 150 await new Promise(r => vout.onended = r); 151 isGreaterThanOrEqualEps(vout.currentTime, 152 (test.duration - seekTime) + contentDuration*2, 153 "checking vout.currentTime after seeking, playing through and reloading"); 154 } 155 156 (async () => { 157 SimpleTest.waitForExplicitFinish(); 158 try { 159 const testVideo = getPlayableVideo(gSmallTests); 160 if (testVideo) { 161 await startTest(testVideo); 162 } else { 163 todo(false, "No playable video"); 164 } 165 } catch(e) { 166 ok(false, `Error: ${e}`); 167 } finally { 168 SimpleTest.finish(); 169 } 170 })(); 171 </script> 172 </pre> 173 </body> 174 </html>