<!DOCTYPE HTML>
<html>
<head>
  <title>Test media tracks if replay after playback has ended</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
  <script type="text/javascript" src="manifest.js"></script>
</head>
<body>
<pre id="test">
<script class="testbody" type="text/javascript">

const manager = new MediaTestManager;

function startTest(test, token) {
  // Scenario to test:
  // 1. Audio tracks and video tracks should be added to the track list when
  //    metadata has loaded, and all tracks should remain even after we seek to
  //    the end.
  // 2. No tracks should be added back to the list if we replay from the end,
  //    and no tracks should be removed from the list after we seek to the end.
  // 3. After seek to the middle from end of playback, all tracks should remain
  //    in the list if we play from here, and no tracks should be removed from
  //    the list after we seek to the end.
  // 4. Unsetting the media element's src attribute should remove all tracks.

  const elemType = getMajorMimeType(test.type);
  const element = document.createElement(elemType);

  let audioOnaddtrack = 0;
  let audioOnremovetrack = 0;
  let videoOnaddtrack = 0;
  let videoOnremovetrack = 0;
  let isPlaying = false;
  let steps = 0;

  element.audioTracks.onaddtrack = function(e) {
    audioOnaddtrack++;
  }

  element.audioTracks.onremovetrack = function(e) {
    audioOnremovetrack++;
  }

  element.videoTracks.onaddtrack = function(e) {
    videoOnaddtrack++;
  }

  element.videoTracks.onremovetrack = function(e) {
    videoOnremovetrack++;
  }

  function testExpectedAddtrack(expectedCalls) {
    if (test.hasAudio) {
      is(audioOnaddtrack, expectedCalls,
         'Calls of onaddtrack on audioTracks should be '+expectedCalls+' times.');
    }
    if (test.hasVideo) {
      is(videoOnaddtrack, expectedCalls,
         'Calls of onaddtrack on videoTracks should be '+expectedCalls+' times.');
    }
  }

  function testExpectedRemovetrack(expectedCalls) {
    if (test.hasAudio) {
      is(audioOnremovetrack, expectedCalls,
         'Calls of onremovetrack on audioTracks should be '+expectedCalls+' times.');
    }
    if (test.hasVideo) {
      is(videoOnremovetrack, expectedCalls,
         'Calls of onremovetrack on videoTracks should be '+expectedCalls+' times.');
    }
  }

  function finishTesting() {
    element.onpause = null;
    element.onseeked = null;
    element.onplaying = null;
    element.onended = null;
    manager.finished(element.token);
  }

  function onended() {
    if (isPlaying) {
      switch(steps) {
        case 1:
          testExpectedAddtrack(1);
          testExpectedRemovetrack(0);
          element.onplaying = onplaying;
          element.play();
          steps++;
          break;
        case 2:
          testExpectedAddtrack(1);
          testExpectedRemovetrack(0);
          element.currentTime = element.duration * 0.5;
          element.onplaying = onplaying;
          element.play();
          steps++;
          break;
        case 3:
          testExpectedAddtrack(1);
          testExpectedRemovetrack(0);
          element.src = "";
          setTimeout(() => {
            testExpectedAddtrack(1);
            testExpectedRemovetrack(1);
            finishTesting();
          }, 0);
          break;
      }
    } else {
      ok(true, 'Finish the test anyway if ended is fired before other events.');
      finishTesting();
    }
  }

  function seekToEnd() {
    element.onpause = null;
    element.currentTime = element.duration * 1.1;
  }

  function onseeked() {
    element.onseeked = null;
    element.onpause = seekToEnd;
    element.pause();
  }

  function onplaying() {
    isPlaying = true;
    element.onplaying = null;
    element.onseeked = onseeked;
  }

  element.token = token;
  manager.started(token);

  element.src = test.name;
  element.test = test;
  element.onplaying = onplaying;
  element.onended = onended;
  element.play();
  steps++;
}

SimpleTest.waitForExplicitFinish();
SpecialPowers.pushPrefEnv(
  {
    "set": [
      ["media.track.enabled", true]
    ]
  },
  function() {
    manager.runTests(gTrackTests, startTest);
  });

</script>
</pre>
</body>
</html>
