test_getUserMedia_addtrack_removetrack_events.html (2712B)
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 <script type="application/javascript"> 9 "use strict"; 10 11 createHTML({ 12 title: "MediaStream's 'addtrack' and 'removetrack' events shouldn't fire on manual operations", 13 bug: "1208328" 14 }); 15 16 var spinEventLoop = () => new Promise(r => setTimeout(r, 0)); 17 18 var stream; 19 var clone; 20 var newStream; 21 var tracks = []; 22 23 var addTrack = track => { 24 info("Adding track " + track.id); 25 stream.addTrack(track); 26 }; 27 var removeTrack = track => { 28 info("Removing track " + track.id); 29 stream.removeTrack(track); 30 }; 31 var stopTrack = track => { 32 if (track.readyState == "live") { 33 info("Stopping track " + track.id); 34 } 35 track.stop(); 36 }; 37 38 runTest(() => getUserMedia({audio: true, video: true}) 39 .then(s => { 40 stream = s; 41 clone = s.clone(); 42 stream.addEventListener("addtrack", function onAddtrack(event) { 43 ok(false, "addtrack fired unexpectedly for track " + event.track.id); 44 }); 45 stream.addEventListener("removetrack", function onRemovetrack(event) { 46 ok(false, "removetrack fired unexpectedly for track " + event.track.id); 47 }); 48 49 return getUserMedia({audio: true, video: true}); 50 }) 51 .then(s => { 52 newStream = s; 53 info("Stopping an original track"); 54 stopTrack(stream.getTracks()[0]); 55 56 return spinEventLoop(); 57 }) 58 .then(() => { 59 info("Removing original tracks"); 60 stream.getTracks().forEach(t => { 61 stream.removeTrack(t); 62 return tracks.push(t); 63 }); 64 65 return spinEventLoop(); 66 }) 67 .then(() => { 68 info("Adding other gUM tracks"); 69 newStream.getTracks().forEach(t => addTrack(t)) 70 71 return spinEventLoop(); 72 }) 73 .then(() => { 74 info("Adding cloned tracks"); 75 let clone = stream.clone(); 76 clone.getTracks().forEach(t => addTrack(t)); 77 78 return spinEventLoop(); 79 }) 80 .then(() => { 81 info("Removing a clone"); 82 removeTrack(clone.getTracks()[0]); 83 84 return spinEventLoop(); 85 }) 86 .then(() => { 87 info("Stopping clones"); 88 clone.getTracks().forEach(t => stopTrack(t)); 89 90 return spinEventLoop(); 91 }) 92 .then(() => { 93 info("Stopping originals"); 94 stream.getTracks().forEach(t => stopTrack(t)); 95 tracks.forEach(t => stopTrack(t)); 96 97 return spinEventLoop(); 98 }) 99 .then(() => { 100 info("Removing remaining tracks"); 101 stream.getTracks().forEach(t => removeTrack(t)); 102 103 return spinEventLoop(); 104 }) 105 .then(() => { 106 // Test MediaStreamTrackEvent required args here. 107 mustThrowWith("MediaStreamTrackEvent without required args", 108 "TypeError", () => new MediaStreamTrackEvent("addtrack", {})); 109 })); 110 </script> 111 </pre> 112 </body> 113 </html>