tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>