<!DOCTYPE html>
<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<html>
    <head>
        <title>MediaSource.readyState equals "closed" 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>
          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_equals(mediaSource.sourceBuffers.length, 0, "sourceBuffers is empty");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "activeSourceBuffers is empty");
              assert_equals(mediaSource.readyState, "closed", "readyState is 'closed'");
              assert_true(isNaN(mediaSource.duration), "duration is NaN");
          }, "Test attribute values on a closed MediaSource object.");

          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_throws("InvalidStateError",
                  function() { mediaSource.addSourceBuffer(MediaSourceUtil.VIDEO_ONLY_TYPE); },
                  "addSourceBuffer() throws an exception when closed.");
          }, "Test addSourceBuffer() while closed.");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);

              // Setup a handler to run when the MediaSource closes.
              mediaSource.addEventListener('sourceclose', test.step_func(function (event)
              {
                  assert_equals(mediaSource.sourceBuffers.length, 0, "sourceBuffers is empty");
                  assert_equals(mediaSource.activeSourceBuffers.length, 0, "activeSourceBuffers is empty");
                  assert_equals(mediaSource.readyState, "closed", "readyState is 'closed'");
                  assert_throws("NotFoundError",
                      function() { mediaSource.removeSourceBuffer(sourceBuffer); },
                      "removeSourceBuffer() throws an exception when closed.");
                  test.done();
              }));

              // Trigger the MediaSource to close.
              mediaElement.src = "";
          }, "Test removeSourceBuffer() while closed.");

          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_throws("InvalidStateError",
                  function() { mediaSource.endOfStream(); },
                  "endOfStream() throws an exception when closed.");
          }, "Test endOfStream() while closed.");

          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_throws("InvalidStateError",
                  function() { mediaSource.endOfStream("decode"); },
                  "endOfStream(decode) throws an exception when closed.");
          }, "Test endOfStream(decode) while closed.");

          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_throws("InvalidStateError",
                  function() { mediaSource.endOfStream("network"); },
                  "endOfStream(network) throws an exception when closed.");
          }, "Test endOfStream(network) while closed.");

          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_throws("InvalidStateError",
                  function() { mediaSource.duration = 10; },
                  "Setting duration throws an exception when closed.");
          }, "Test setting duration while closed.");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);

              assert_equals(mediaSource.readyState, "open", "readyState is 'open'");
              // Setup a handler to run when the MediaSource closes.
              mediaSource.addEventListener("sourceclose", test.step_func(function (event)
              {
                  assert_equals(mediaSource.readyState, "closed", "readyState is 'closed'");
                  assert_throws("InvalidStateError",
                      function() { mediaSource.duration = 10; },
                      "Setting duration when closed throws an exception");
                  test.done();
              }));

              // Trigger the MediaSource to close.
              mediaElement.src = "";
          }, "Test setting duration while open->closed.");

           mediasource_test(function(test, mediaElement, mediaSource)
          {
              var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);

              assert_equals(mediaSource.readyState, "open", "readyState is 'open'");
              // Setup a handler to run when the MediaSource closes.
              mediaSource.addEventListener("sourceclose", test.step_func(function (event)
              {
                  assert_equals(mediaSource.readyState, "closed", "readyState is 'closed'");
                  assert_true(isNaN(mediaSource.duration), "duration is NaN");
                  test.done();
              }));

              // Trigger the MediaSource to close.
              mediaElement.src = "";
          }, "Test getting duration while open->closed.");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);

              assert_equals(mediaSource.readyState, "open", "readyState is open");

              // Setup a handler to run when the MediaSource closes.
              mediaSource.addEventListener("sourceclose", test.step_func(function (event)
              {
                  assert_equals(mediaSource.readyState, "closed", "readyState is closed");
                  assert_throws("InvalidStateError",
                    function() { sourceBuffer.abort(); },
                    "sourceBuffer.abort() throws INVALID_STATE_ERROR");
                  test.done();
              }));

              // Trigger the MediaSource to close.
              mediaElement.src = "";
          }, "Test sourcebuffer.abort when closed.");

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