test_mediatrack_consuming_mediastream.html (4083B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <title>Test track interfaces when consuming a MediaStream from gUM</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 <script type="text/javascript" src="gUM_support.js"></script> 9 </head> 10 <body> 11 <pre id="test"> 12 <script class="testbody" type="text/javascript"> 13 async function startTest() { 14 let steps = 0; 15 let audioOnchange = 0; 16 let audioOnaddtrack = 0; 17 let videoOnchange = 0; 18 let videoOnaddtrack = 0; 19 let isPlaying = false; 20 let element = document.createElement("video"); 21 let stream; 22 try { 23 await setupGetUserMediaTestPrefs(); 24 stream = await navigator.mediaDevices.getUserMedia({audio: true, video: true}); 25 } catch (err) { 26 ok(false, 'Unexpected error fired with: ' + err); 27 SimpleTest.finish(); 28 return; 29 } 30 31 element.audioTracks.onaddtrack = function() { 32 audioOnaddtrack++; 33 }; 34 35 element.audioTracks.onchange = function() { 36 audioOnchange++; 37 }; 38 39 element.videoTracks.onaddtrack = function() { 40 videoOnaddtrack++; 41 }; 42 43 element.videoTracks.onchange = function() { 44 videoOnchange++; 45 }; 46 47 function checkTrackRemoved() { 48 if (isPlaying) { 49 is(element.audioTracks.length, 0, 'The length of audioTracks should be 0.'); 50 is(element.videoTracks.length, 0, 'The length of videoTracks should be 0.'); 51 } 52 } 53 54 element.onended = function() { 55 ok(true, 'Event ended is expected to be fired on element.'); 56 checkTrackRemoved(); 57 element.onended = null; 58 element.onplaying = null; 59 element.onpause = null; 60 SimpleTest.finish(); 61 } 62 63 function checkTrackAdded() { 64 isPlaying = true; 65 is(audioOnaddtrack, 1, 'Calls of onaddtrack on audioTracks should be 1.'); 66 is(element.audioTracks.length, 1, 'The length of audioTracks should be 1.'); 67 ok(element.audioTracks[0].enabled, 'Audio track should be enabled as default.'); 68 is(videoOnaddtrack, 1, 'Calls of onaddtrack on videoTracks should be 1.'); 69 is(element.videoTracks.length, 1, 'The length of videoTracks should be 1.'); 70 is(element.videoTracks.selectedIndex, 0, 71 'The first video track is set selected as default.'); 72 } 73 74 function setTrackEnabled(enabled) { 75 element.audioTracks[0].enabled = enabled; 76 element.videoTracks[0].selected = enabled; 77 } 78 79 function checkTrackChanged(calls, enabled) { 80 is(audioOnchange, calls, 'Calls of onchange on audioTracks should be '+calls); 81 is(element.audioTracks[0].enabled, enabled, 82 'Enabled value of the audio track should be ' +enabled); 83 is(videoOnchange, calls, 'Calls of onchange on videoTracks should be '+calls); 84 is(element.videoTracks[0].selected, enabled, 85 'Selected value of the video track should be ' +enabled); 86 var index = enabled ? 0 : -1; 87 is(element.videoTracks.selectedIndex, index, 88 'SelectedIndex of video tracks should be ' +index); 89 } 90 91 function onpause() { 92 element.onpause = null; 93 if (element.ended) { 94 return; 95 } 96 if (steps == 1) { 97 setTrackEnabled(false); 98 element.onplaying = onplaying; 99 element.play(); 100 steps++; 101 } else if (steps == 2) { 102 setTrackEnabled(true); 103 element.onplaying = onplaying; 104 element.play(); 105 steps++; 106 } 107 } 108 109 function onplaying() { 110 element.onplaying = null; 111 if (element.ended) { 112 return; 113 } 114 if (steps == 1) { 115 element.onpause = onpause; 116 element.pause(); 117 checkTrackAdded(); 118 } else if (steps == 2) { 119 element.onpause = onpause; 120 element.pause(); 121 checkTrackChanged(1, false); 122 } else if (steps == 3) { 123 checkTrackChanged(2, true); 124 stream.getTracks().forEach(t => t.stop()); 125 } 126 } 127 128 element.onplaying = onplaying; 129 element.srcObject = stream; 130 131 steps++; 132 await element.play(); 133 } 134 135 SimpleTest.waitForExplicitFinish(); 136 SpecialPowers.pushPrefEnv( 137 { 138 "set": [ 139 ["media.track.enabled", true] 140 ] 141 }, startTest); 142 143 </script> 144 </pre> 145 </body> 146 </html>