test_mediatrack_consuming_mediaresource.html (5662B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <title>Test track interfaces when consuming media resources</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 13 const manager = new MediaTestManager; 14 15 function startTest(test, token) { 16 const elemType = getMajorMimeType(test.type); 17 const element = document.createElement(elemType); 18 19 let audioOnchange = 0; 20 let audioOnaddtrack = 0; 21 let audioOnremovetrack = 0; 22 let videoOnchange = 0; 23 let videoOnaddtrack = 0; 24 let videoOnremovetrack = 0; 25 let isPlaying = false; 26 27 isnot(element.audioTracks, undefined, 28 'HTMLMediaElement::AudioTracks() property should be available.'); 29 isnot(element.videoTracks, undefined, 30 'HTMLMediaElement::VideoTracks() property should be available.'); 31 32 element.audioTracks.onaddtrack = function() { 33 audioOnaddtrack++; 34 } 35 36 element.audioTracks.onremovetrack = function() { 37 audioOnremovetrack++; 38 } 39 40 element.audioTracks.onchange = function() { 41 audioOnchange++; 42 } 43 44 element.videoTracks.onaddtrack = function() { 45 videoOnaddtrack++; 46 } 47 48 element.videoTracks.onremovetrack = function() { 49 videoOnremovetrack++; 50 } 51 52 element.videoTracks.onchange = function() { 53 videoOnchange++; 54 } 55 56 function checkTrackNotRemoved() { 57 is(audioOnremovetrack, 0, 'Should have no calls of onremovetrack on audioTracks.'); 58 is(videoOnremovetrack, 0, 'Should have no calls of onremovetrack on videoTracks.'); 59 if (isPlaying) { 60 is(element.audioTracks.length, test.hasAudio ? 1 : 0, 61 'Expected length of audioTracks.'); 62 is(element.videoTracks.length, test.hasVideo ? 1 : 0, 63 'Expected length of videoTracks.'); 64 } 65 } 66 67 function checkTrackRemoved() { 68 is(element.audioTracks.length, 0, 'The length of audioTracks should be 0.'); 69 is(element.videoTracks.length, 0, 'The length of videoTracks should be 0.'); 70 if (isPlaying) { 71 is(audioOnremovetrack, test.hasAudio ? 1 : 0, 72 'Expected calls of onremovetrack on audioTracks.'); 73 is(videoOnremovetrack, test.hasVideo ? 1 : 0, 74 'Expected calls of onremovetrack on videoTracks.'); 75 } 76 } 77 78 function onended() { 79 ok(true, 'Event ended is expected to be fired on element.'); 80 checkTrackNotRemoved(); 81 element.onended = null; 82 element.onplaying = null; 83 element.onpause = null; 84 element.src = ""; 85 is(element.audioTracks.length, 0, 'audioTracks have been forgotten'); 86 is(element.videoTracks.length, 0, 'videoTracks have been forgotten'); 87 is(audioOnremovetrack, 0, 'No audio removetrack events yet'); 88 is(videoOnremovetrack, 0, 'No video removetrack events yet'); 89 setTimeout(() => { 90 checkTrackRemoved(); 91 manager.finished(element.token); 92 }, 100); 93 } 94 95 function checkTrackAdded() { 96 isPlaying = true; 97 if (test.hasAudio) { 98 is(audioOnaddtrack, 1, 'Calls of onaddtrack on audioTracks should be 1.'); 99 is(element.audioTracks.length, 1, 'The length of audioTracks should be 1.'); 100 ok(element.audioTracks[0].enabled, 'Audio track should be enabled as default.'); 101 } 102 if (test.hasVideo) { 103 is(videoOnaddtrack, 1, 'Calls of onaddtrack on videoTracks should be 1.'); 104 is(element.videoTracks.length, 1, 'The length of videoTracks should be 1.'); 105 is(element.videoTracks.selectedIndex, 0, 106 'The first video track is set selected as default.'); 107 } 108 } 109 110 function setTrackEnabled(enabled) { 111 if (test.hasAudio) { 112 element.audioTracks[0].enabled = enabled; 113 } 114 if (test.hasVideo) { 115 element.videoTracks[0].selected = enabled; 116 } 117 } 118 119 function checkTrackChanged(calls, enabled) { 120 if (test.hasAudio) { 121 is(audioOnchange, calls, 'Calls of onchange on audioTracks should be '+calls); 122 is(element.audioTracks[0].enabled, enabled, 123 'Enabled value of the audio track should be ' +enabled); 124 } 125 if (test.hasVideo) { 126 is(videoOnchange, calls, 'Calls of onchange on videoTracks should be '+calls); 127 is(element.videoTracks[0].selected, enabled, 128 'Selected value of the video track should be ' +enabled); 129 var index = enabled ? 0 : -1; 130 is(element.videoTracks.selectedIndex, index, 131 'SelectedIndex of video tracks should be ' +index); 132 } 133 } 134 135 function onpause() { 136 element.onpause = null; 137 if (element.ended) { 138 return; 139 } 140 if (steps == 1) { 141 setTrackEnabled(false); 142 element.onplaying = onplaying; 143 element.play(); 144 steps++; 145 } else if (steps == 2) { 146 setTrackEnabled(true); 147 element.onplaying = onplaying; 148 element.play(); 149 steps++; 150 } 151 } 152 153 function onplaying() { 154 element.onplaying = null; 155 if (element.ended) { 156 return; 157 } 158 if (steps == 1) { 159 element.onpause = onpause; 160 element.pause(); 161 checkTrackAdded(); 162 } else if (steps == 2) { 163 element.onpause = onpause; 164 element.pause(); 165 checkTrackChanged(1, false); 166 } else if (steps == 3) { 167 checkTrackChanged(2, true); 168 } 169 } 170 171 var steps = 0; 172 173 element.token = token; 174 manager.started(token); 175 176 element.src = test.name; 177 element.test = test; 178 element.onplaying = onplaying; 179 element.onended = onended; 180 element.play(); 181 steps++; 182 } 183 184 SimpleTest.waitForExplicitFinish(); 185 SpecialPowers.pushPrefEnv( 186 { 187 "set": [ 188 ["media.track.enabled", true] 189 ] 190 }, 191 function() { 192 manager.runTests(gTrackTests, startTest); 193 }); 194 195 </script> 196 </pre> 197 </body> 198 </html>