<!DOCTYPE html>
<html>
    <head>
        <title>MediaSource.addSourceBuffer() 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)
          {
              mediaSource.endOfStream();
              assert_throws("InvalidStateError",
                          function() { mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE); },
                          "addSourceBuffer() threw an exception when in 'ended' state.");
              test.done();
          }, "Test addSourceBuffer() in 'ended' state.");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              assert_throws("InvalidAccessError",
                          function() { mediaSource.addSourceBuffer(""); },
                          "addSourceBuffer() threw an exception when passed an empty string.");
              test.done();
          }, "Test addSourceBuffer() with empty type");

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

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              assert_throws("NotSupportedError",
                          function() { mediaSource.addSourceBuffer("invalidType"); },
                          "addSourceBuffer() threw an exception for an unsupported type.");
              test.done();
          }, "Test addSourceBuffer() with unsupported type");


          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var mimetype = 'video/webm;codecs="vp8,vorbis"';

              assert_true(MediaSource.isTypeSupported(mimetype), mimetype + " is supported");

              var sourceBuffer = mediaSource.addSourceBuffer(mimetype);
              assert_true(sourceBuffer != null, "New SourceBuffer returned");
              assert_equals(mediaSource.sourceBuffers[0], sourceBuffer, "SourceBuffer is in mediaSource.sourceBuffers");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "SourceBuffer is not in mediaSource.activeSourceBuffers");
              test.done();
          }, "Test addSourceBuffer() with Vorbis and VP8");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var videoMimetype = 'video/webm;codecs="vp8"';
              var audioMimetype = 'audio/webm;codecs="vorbis"';

              assert_true(MediaSource.isTypeSupported(videoMimetype), videoMimetype + " is supported");
              assert_true(MediaSource.isTypeSupported(audioMimetype), audioMimetype + " is supported");

              var sourceBufferA = mediaSource.addSourceBuffer(videoMimetype);
              var sourceBufferB = mediaSource.addSourceBuffer(audioMimetype);
              assert_equals(mediaSource.sourceBuffers[0], sourceBufferA, "sourceBufferA is in mediaSource.sourceBuffers");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "SourceBufferA is not in mediaSource.activeSourceBuffers");
              assert_equals(mediaSource.sourceBuffers[1], sourceBufferB, "sourceBufferB is in mediaSource.sourceBuffers");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "SourceBufferB is not in mediaSource.activeSourceBuffers");
              test.done();
          }, "Test addSourceBuffer() with Vorbis and VP8 in separate SourceBuffers");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var mimetype = MediaSourceUtil.VIDEO_ONLY_TYPE;

              assert_true(MediaSource.isTypeSupported(mimetype), mimetype + " is supported");

              var sourceBuffer = mediaSource.addSourceBuffer(mimetype);
              assert_true(sourceBuffer != null, "New SourceBuffer returned");
              assert_equals(mediaSource.sourceBuffers[0], sourceBuffer, "SourceBuffer is in mediaSource.sourceBuffers");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "SourceBuffer is in mediaSource.activeSourceBuffers");
              test.done();
          }, "Test addSourceBuffer() video only");

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

              assert_true(MediaSource.isTypeSupported(mimetype), mimetype + " is supported");

              var sourceBuffer = mediaSource.addSourceBuffer(mimetype);
              assert_true(sourceBuffer != null, "New SourceBuffer returned");
              assert_equals(mediaSource.sourceBuffers[0], sourceBuffer, "SourceBuffer is in mediaSource.sourceBuffers");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "SourceBuffer is in mediaSource.activeSourceBuffers");
              test.done();
          }, "Test addSourceBuffer() audio only");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var mimetype = 'video/mp4;codecs="avc1.4D4001,mp4a.40.2"';

              assert_true(MediaSource.isTypeSupported(mimetype), mimetype + " is supported");

              var sourceBuffer = mediaSource.addSourceBuffer(mimetype);
              assert_true(sourceBuffer != null, "New SourceBuffer returned");
              assert_equals(mediaSource.sourceBuffers[0], sourceBuffer, "SourceBuffer is in mediaSource.sourceBuffers");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "SourceBuffer is not in mediaSource.activeSourceBuffers");
              test.done();
          }, "Test addSourceBuffer() with AAC and H.264");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var videoMimetype = 'video/mp4;codecs="avc1.4D4001"';
              var audioMimetype = 'audio/mp4;codecs="mp4a.40.2"';

              assert_true(MediaSource.isTypeSupported(videoMimetype), videoMimetype + " is supported");
              assert_true(MediaSource.isTypeSupported(audioMimetype), audioMimetype + " is supported");

              var sourceBufferA = mediaSource.addSourceBuffer(videoMimetype);
              var sourceBufferB = mediaSource.addSourceBuffer(audioMimetype);
              assert_equals(mediaSource.sourceBuffers[0], sourceBufferA, "sourceBufferA is in mediaSource.sourceBuffers");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "SourceBufferA is not in mediaSource.activeSourceBuffers");
              assert_equals(mediaSource.sourceBuffers[1], sourceBufferB, "sourceBufferB is in mediaSource.sourceBuffers");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "SourceBufferB is not in mediaSource.activeSourceBuffers");
              test.done();
          }, "Test addSourceBuffer() with AAC and H.264 in separate SourceBuffers");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var reachedLimit = false;

             // The 20 here is an arbitrary upper limit to make sure the test terminates. This test
             // assumes that implementations won't support more than 20 SourceBuffers simultaneously.
             for (var i = 0; i < 20; ++i) {
                 try {
                     mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE);
                 } catch(e) {
                     assert_equals(e.name, "QuotaExceededError");
                     reachedLimit = true;
                     break;
                 }
             }
             assert_true(reachedLimit, "Reached SourceBuffer limit.");
             test.done();
          }, "Test addSourceBuffer() QuotaExceededError.");

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