<!DOCTYPE html>
<html>
    <head>
        <title>MediaSource.removeSourceBuffer() test cases.</title>
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="mediasource-util.js"></script>
    </head>
    <body>
        <div id="log"></div>
        <script>
          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE);
              assert_true(sourceBuffer != null, "New SourceBuffer returned");

              mediaSource.removeSourceBuffer(sourceBuffer);

              var sourceBuffer2 = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE);
              assert_true(sourceBuffer2 != null, "New SourceBuffer returned");
              assert_true(sourceBuffer != sourceBuffer2, "SourceBuffers are different instances.");
              assert_equals(mediaSource.sourceBuffers.length, 1, "sourceBuffers.length == 1");

              test.done();
          }, "Test addSourceBuffer(), removeSourceBuffer(), addSourceBuffer() sequence.");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              assert_throws(new TypeError(),
                          function() { mediaSource.removeSourceBuffer(null); },
                          "removeSourceBuffer() threw an exception when passed null.");
              test.done();
          }, "Test removeSourceBuffer() with null");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE);
              assert_true(sourceBuffer != null, "New SourceBuffer returned");

              mediaSource.removeSourceBuffer(sourceBuffer);

              assert_throws("NotFoundError",
                  function() { mediaSource.removeSourceBuffer(sourceBuffer); },
                  "removeSourceBuffer() threw an exception when a SourceBuffer that was already removed.");

              test.done();
          }, "Test calling removeSourceBuffer() twice with the same object.");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE);
              assert_true(sourceBuffer != null, "New SourceBuffer returned");

              mediaSource.endOfStream();
              assert_true(mediaSource.readyState == "ended", "MediaSource in ended state");
              mediaSource.removeSourceBuffer(sourceBuffer);

              assert_true(mediaSource.sourceBuffers.length == 0, "MediaSource.sourceBuffers is empty");
              assert_true(mediaSource.activeSourceBuffers.length == 0, "MediaSource.activesourceBuffers is empty");

              test.done();
          }, "Test calling removeSourceBuffer() in ended state.");

          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);

              test.expectEvent(sourceBuffer, "updateend", "initSegment append ended.");
              test.expectEvent(mediaElement, "loadedmetadata", "loadedmetadata done.");
              sourceBuffer.appendBuffer(initSegment);

              test.waitForExpectedEvents(function()
              {
                  assert_true(mediaSource.sourceBuffers.length == 1, "MediaSource.sourceBuffers is not empty");
                  assert_true(mediaSource.activeSourceBuffers.length == 1, "MediaSource.activesourceBuffers is not empty");
                  assert_equals(mediaElement.readyState, mediaElement.HAVE_METADATA);
                  assert_equals(mediaSource.duration, segmentInfo.duration);
                  test.expectEvent(mediaSource.activeSourceBuffers, "removesourcebuffer", "SourceBuffer removed from activeSourceBuffers.");
                  test.expectEvent(mediaSource.sourceBuffers, "removesourcebuffer", "SourceBuffer removed.");
                  mediaSource.removeSourceBuffer(sourceBuffer);
              });

              test.waitForExpectedEvents(function()
              {
                  assert_true(mediaSource.sourceBuffers.length == 0, "MediaSource.sourceBuffers is empty");
                  assert_true(mediaSource.activeSourceBuffers.length == 0, "MediaSource.activesourceBuffers is empty");
                  test.done();
              });
          }, "Test removesourcebuffer event on activeSourceBuffers.");
        </script>
    </body>
</html>
