test_mediatrack_replay_from_end.html (4277B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <title>Test media tracks if replay after playback has ended</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 // Scenario to test: 17 // 1. Audio tracks and video tracks should be added to the track list when 18 // metadata has loaded, and all tracks should remain even after we seek to 19 // the end. 20 // 2. No tracks should be added back to the list if we replay from the end, 21 // and no tracks should be removed from the list after we seek to the end. 22 // 3. After seek to the middle from end of playback, all tracks should remain 23 // in the list if we play from here, and no tracks should be removed from 24 // the list after we seek to the end. 25 // 4. Unsetting the media element's src attribute should remove all tracks. 26 27 const elemType = getMajorMimeType(test.type); 28 const element = document.createElement(elemType); 29 30 let audioOnaddtrack = 0; 31 let audioOnremovetrack = 0; 32 let videoOnaddtrack = 0; 33 let videoOnremovetrack = 0; 34 let isPlaying = false; 35 let steps = 0; 36 37 element.audioTracks.onaddtrack = function() { 38 audioOnaddtrack++; 39 } 40 41 element.audioTracks.onremovetrack = function() { 42 audioOnremovetrack++; 43 } 44 45 element.videoTracks.onaddtrack = function() { 46 videoOnaddtrack++; 47 } 48 49 element.videoTracks.onremovetrack = function() { 50 videoOnremovetrack++; 51 } 52 53 function testExpectedAddtrack(expectedCalls) { 54 if (test.hasAudio) { 55 is(audioOnaddtrack, expectedCalls, 56 'Calls of onaddtrack on audioTracks should be '+expectedCalls+' times.'); 57 } 58 if (test.hasVideo) { 59 is(videoOnaddtrack, expectedCalls, 60 'Calls of onaddtrack on videoTracks should be '+expectedCalls+' times.'); 61 } 62 } 63 64 function testExpectedRemovetrack(expectedCalls) { 65 if (test.hasAudio) { 66 is(audioOnremovetrack, expectedCalls, 67 'Calls of onremovetrack on audioTracks should be '+expectedCalls+' times.'); 68 } 69 if (test.hasVideo) { 70 is(videoOnremovetrack, expectedCalls, 71 'Calls of onremovetrack on videoTracks should be '+expectedCalls+' times.'); 72 } 73 } 74 75 function finishTesting() { 76 element.onpause = null; 77 element.onseeked = null; 78 element.onplaying = null; 79 element.onended = null; 80 manager.finished(element.token); 81 } 82 83 function onended() { 84 if (isPlaying) { 85 switch(steps) { 86 case 1: 87 testExpectedAddtrack(1); 88 testExpectedRemovetrack(0); 89 element.onplaying = onplaying; 90 element.play(); 91 steps++; 92 break; 93 case 2: 94 testExpectedAddtrack(1); 95 testExpectedRemovetrack(0); 96 element.currentTime = element.duration * 0.5; 97 element.onplaying = onplaying; 98 element.play(); 99 steps++; 100 break; 101 case 3: 102 testExpectedAddtrack(1); 103 testExpectedRemovetrack(0); 104 element.src = ""; 105 setTimeout(() => { 106 testExpectedAddtrack(1); 107 testExpectedRemovetrack(1); 108 finishTesting(); 109 }, 0); 110 break; 111 } 112 } else { 113 ok(true, 'Finish the test anyway if ended is fired before other events.'); 114 finishTesting(); 115 } 116 } 117 118 function seekToEnd() { 119 element.onpause = null; 120 element.currentTime = element.duration * 1.1; 121 } 122 123 function onseeked() { 124 element.onseeked = null; 125 element.onpause = seekToEnd; 126 element.pause(); 127 } 128 129 function onplaying() { 130 isPlaying = true; 131 element.onplaying = null; 132 element.onseeked = onseeked; 133 } 134 135 element.token = token; 136 manager.started(token); 137 138 element.src = test.name; 139 element.test = test; 140 element.onplaying = onplaying; 141 element.onended = onended; 142 element.play(); 143 steps++; 144 } 145 146 SimpleTest.waitForExplicitFinish(); 147 SpecialPowers.pushPrefEnv( 148 { 149 "set": [ 150 ["media.track.enabled", true] 151 ] 152 }, 153 function() { 154 manager.runTests(gTrackTests, startTest); 155 }); 156 157 </script> 158 </pre> 159 </body> 160 </html>