test_getUserMedia_trackEnded.html (2530B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <script type="application/javascript" src="mediaStreamPlayback.js"></script> 5 </head> 6 <body> 7 <pre id="test"> 8 <iframe id="iframe" onload="iframeLoaded()" srcdoc=" 9 <script type='application/javascript'> 10 document.gUM = (constraints, success, failure) => 11 navigator.mediaDevices.getUserMedia(constraints).then(success, failure); 12 </script>"> 13 </iframe> 14 <script type="application/javascript"> 15 "use strict"; 16 let iframeLoadedPromise = {}; 17 iframeLoadedPromise.promise = new Promise(r => { 18 iframeLoadedPromise.resolve = r; 19 });; 20 function iframeLoaded() { 21 iframeLoadedPromise.resolve(); 22 } 23 24 createHTML({ 25 title: "getUserMedia MediaStreamTrack 'ended' event on navigating", 26 bug: "1208373", 27 }); 28 29 runTest(async () => { 30 await iframeLoadedPromise.promise; 31 let iframe = document.getElementById("iframe"); 32 let stream; 33 // We're passing callbacks into a method in the iframe here, because 34 // a Promise created in the iframe is unusable after the iframe has 35 // navigated away (see bug 1269400 for details). 36 return new Promise((resolve, reject) => 37 iframe.contentDocument.gUM({audio: true, video: true}, resolve, reject)) 38 .then(s => { 39 // We're cloning a stream containing identical tracks (an original 40 // and its clone) to test that ended works both for originals 41 // clones when they're both owned by the same MediaStream. 42 // (Bug 1274221) 43 stream = new MediaStream([].concat(s.getTracks(), s.getTracks()) 44 .map(t => t.clone())).clone(); 45 var allTracksEnded = Promise.all(stream.getTracks().map(t => { 46 info("Set up ended handler for track " + t.id); 47 return haveEvent(t, "ended", wait(50000)) 48 .then(event => { 49 info("ended handler invoked for track " + t.id); 50 is(event.target, t, "Target should be correct"); 51 }, e => e ? Promise.reject(e) 52 : ok(false, "ended event never raised for track " + t.id)); 53 })); 54 stream.getTracks().forEach(t => 55 is(t.readyState, "live", 56 "Non-ended track should have readyState 'live'")); 57 iframe.srcdoc = ""; 58 info("iframe has been reset. Waiting for tracks to end."); 59 return allTracksEnded; 60 }) 61 .then(() => stream.getTracks().forEach(t => 62 is(t.readyState, "ended", 63 "Ended track should have readyState 'ended'"))); 64 }); 65 </script> 66 </pre> 67 </body> 68 </html>