<!DOCTYPE html>
<html>
    <head>
        <title>SourceBuffer.appendBuffer() 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_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              mediaElement.addEventListener('error', test.unreached_func("Unexpected event 'error'"));

              test.expectEvent(sourceBuffer, "updatestart", "Append started.");
              test.expectEvent(sourceBuffer, "update", "Append success.");
              test.expectEvent(sourceBuffer, "updateend", "Append ended.");
              sourceBuffer.appendBuffer(mediaData);

              assert_true(sourceBuffer.updating, "updating attribute is true");

              test.waitForExpectedEvents(function()
              {
                 assert_false(sourceBuffer.updating, "updating attribute is false");
                 test.done();
              });
          }, "Test SourceBuffer.appendBuffer() event dispatching.");

          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              mediaElement.addEventListener('error', test.unreached_func("Unexpected event 'error'"));

              test.expectEvent(sourceBuffer, "updatestart", "Append started.");
              test.expectEvent(sourceBuffer, "update", "Append success.");
              test.expectEvent(sourceBuffer, "updateend", "Append ended.");
              sourceBuffer.appendBuffer(mediaData);

              assert_true(sourceBuffer.updating, "updating attribute is true");

              assert_throws("InvalidStateError",
                  function() { sourceBuffer.appendBuffer(mediaData); },
                  "appendBuffer() throws an exception there is a pending append.");

              assert_true(sourceBuffer.updating, "updating attribute is true");

              test.waitForExpectedEvents(function()
              {
                  assert_false(sourceBuffer.updating, "updating attribute is false");
                  test.done();
              });
          }, "Test SourceBuffer.appendBuffer() call during a pending appendBuffer().");

          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              mediaElement.addEventListener('error', test.unreached_func("Unexpected event 'error'"));

              test.expectEvent(sourceBuffer, "updatestart", "Append started.");
              test.expectEvent(sourceBuffer, "abort", "Append aborted.");
              test.expectEvent(sourceBuffer, "updateend", "Append ended.");
              sourceBuffer.appendBuffer(mediaData);

              assert_true(sourceBuffer.updating, "updating attribute is true");

              sourceBuffer.abort();

              assert_false(sourceBuffer.updating, "updating attribute is false");

              test.waitForExpectedEvents(function()
              {
                  assert_false(sourceBuffer.updating, "updating attribute is false");
                  test.done();
              });
          }, "Test SourceBuffer.abort() call during a pending appendBuffer().");

          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              mediaElement.addEventListener('error', test.unreached_func("Unexpected event 'error'"));

              test.expectEvent(sourceBuffer, "updatestart", "Append started.");
              test.expectEvent(sourceBuffer, "update", "Append success.");
              test.expectEvent(sourceBuffer, "updateend", "Append ended.");
              sourceBuffer.appendBuffer(mediaData);
              assert_true(sourceBuffer.updating, "updating attribute is true");

              test.waitForExpectedEvents(function()
              {
                  assert_false(sourceBuffer.updating, "updating attribute is false");

                  test.expectEvent(mediaSource, "sourceended", "MediaSource sourceended event");
                  mediaSource.endOfStream();
                  assert_equals(mediaSource.readyState, "ended", "MediaSource readyState is 'ended'");
              });

              test.waitForExpectedEvents(function()
              {
                  assert_equals(mediaSource.readyState, "ended", "MediaSource readyState is 'ended'");

                  test.expectEvent(mediaSource, "sourceopen", "MediaSource sourceopen event");
                  test.expectEvent(sourceBuffer, "updatestart", "Append started.");
                  test.expectEvent(sourceBuffer, "update", "Append success.");
                  test.expectEvent(sourceBuffer, "updateend", "Append ended.");
                  sourceBuffer.appendBuffer(mediaData);

                  assert_equals(mediaSource.readyState, "open", "MediaSource readyState is 'open'");
                  assert_true(sourceBuffer.updating, "updating attribute is true");
              });

              test.waitForExpectedEvents(function()
              {
                  assert_equals(mediaSource.readyState, "open", "MediaSource readyState is 'open'");
                  assert_false(sourceBuffer.updating, "updating attribute is false");
                  test.done();
              });
          }, "Test SourceBuffer.appendBuffer() triggering an 'ended' to 'open' transition.");

          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              test.expectEvent(sourceBuffer, "updatestart", "Append started.");
              test.expectEvent(sourceBuffer, "update", "Append success.");
              test.expectEvent(sourceBuffer, "updateend", "Append ended.");
              sourceBuffer.appendBuffer(mediaData);
              assert_true(sourceBuffer.updating, "updating attribute is true");

              test.waitForExpectedEvents(function()
              {
                  assert_false(sourceBuffer.updating, "updating attribute is false");

                  test.expectEvent(mediaSource, "sourceended", "MediaSource sourceended event");
                  mediaSource.endOfStream();
                  assert_equals(mediaSource.readyState, "ended", "MediaSource readyState is 'ended'");
              });

              test.waitForExpectedEvents(function()
              {
                  assert_equals(mediaSource.readyState, "ended", "MediaSource readyState is 'ended'");

                  test.expectEvent(mediaSource, "sourceopen", "MediaSource sourceopen event");
                  test.expectEvent(sourceBuffer, "updatestart", "Append started.");
                  test.expectEvent(sourceBuffer, "update", "Append success.");
                  test.expectEvent(sourceBuffer, "updateend", "Append ended.");
                  sourceBuffer.appendBuffer(new Uint8Array(0));

                  assert_equals(mediaSource.readyState, "open", "MediaSource readyState is 'open'");
                  assert_true(sourceBuffer.updating, "updating attribute is true");
              });

              test.waitForExpectedEvents(function()
              {
                  assert_equals(mediaSource.readyState, "open", "MediaSource readyState is 'open'");
                  assert_false(sourceBuffer.updating, "updating attribute is false");
                  test.done();
              });
          }, "Test zero byte SourceBuffer.appendBuffer() call triggering an 'ended' to 'open' transition.");

          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              mediaElement.addEventListener('error', test.unreached_func("Unexpected event 'error'"));

              test.expectEvent(sourceBuffer, "updatestart", "Append started.");
              test.expectEvent(sourceBuffer, "abort", "Append aborted.");
              test.expectEvent(sourceBuffer, "updateend", "Append ended.");
              sourceBuffer.appendBuffer(mediaData);

              assert_true(sourceBuffer.updating, "updating attribute is true");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "activeSourceBuffers.length");

              test.expectEvent(mediaSource.sourceBuffers, "removesourcebuffer", "sourceBuffers");
              mediaSource.removeSourceBuffer(sourceBuffer);

              assert_false(sourceBuffer.updating, "updating attribute is false");

              assert_throws("InvalidStateError",
                  function() { sourceBuffer.appendBuffer(mediaData); },
                  "appendBuffer() throws an exception because it isn't attached to the mediaSource anymore.");

              test.waitForExpectedEvents(function()
              {
                  assert_false(sourceBuffer.updating, "updating attribute is false");
                  test.done();
              });
          }, "Test MediaSource.removeSourceBuffer() call during a pending appendBuffer().");

          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              mediaElement.addEventListener('error', test.unreached_func("Unexpected event 'error'"));

              test.expectEvent(sourceBuffer, "updatestart", "Append started.");
              test.expectEvent(sourceBuffer, "updateend", "Append ended.");
              sourceBuffer.appendBuffer(mediaData);

              assert_true(sourceBuffer.updating, "updating attribute is true");

              assert_throws("InvalidStateError",
                  function() { mediaSource.duration = 1.0; },
                  "set duration throws an exception when updating attribute is true.");

              test.waitForExpectedEvents(function()
              {
                  assert_false(sourceBuffer.updating, "updating attribute is false");
                  test.done();
              });
          }, "Test set MediaSource.duration during a pending appendBuffer() for one of its SourceBuffers.");

          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
              mediaSource.addEventListener("sourceended", test.unreached_func("Unexpected event 'sourceended'"));

              test.expectEvent(sourceBuffer, "updatestart", "Append started.");
              test.expectEvent(sourceBuffer, "updateend", "Append ended.");
              sourceBuffer.appendBuffer(mediaData);

              assert_true(sourceBuffer.updating, "updating attribute is true");

              assert_throws("InvalidStateError",
                  function() { mediaSource.endOfStream(); },
                  "endOfStream() throws an exception when updating attribute is true.");

              assert_equals(mediaSource.readyState, "open");

              test.waitForExpectedEvents(function()
              {
                  assert_false(sourceBuffer.updating, "updating attribute is false");
                  assert_equals(mediaSource.readyState, "open");
                  test.done();
              });
          }, "Test MediaSource.endOfStream() during a pending appendBuffer() for one of its SourceBuffers.");

          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              mediaElement.addEventListener('error', test.unreached_func("Unexpected event 'error'"));

              test.expectEvent(sourceBuffer, "updatestart", "Append started.");
              test.expectEvent(sourceBuffer, "updateend", "Append ended.");
              sourceBuffer.appendBuffer(mediaData);

              assert_true(sourceBuffer.updating, "updating attribute is true");

              assert_throws("InvalidStateError",
                  function() { sourceBuffer.timestampOffset = 10.0; },
                  "set timestampOffset throws an exception when updating attribute is true.");

              test.waitForExpectedEvents(function()
              {
                  assert_false(sourceBuffer.updating, "updating attribute is false");
                  test.done();
              });
          }, "Test set SourceBuffer.timestampOffset during a pending appendBuffer().");

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

              test.expectEvent(sourceBuffer, "updatestart", "Append started.");
              test.expectEvent(sourceBuffer, "update", "Append success.");
              test.expectEvent(sourceBuffer, "updateend", "Append ended.");
              sourceBuffer.appendBuffer(new Uint8Array(0));

              assert_true(sourceBuffer.updating, "updating attribute is true");

              test.waitForExpectedEvents(function()
              {
                  assert_false(sourceBuffer.updating, "updating attribute is false");
                  test.done();
              });
          }, "Test appending an empty ArrayBufferView.");

          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              test.expectEvent(sourceBuffer, "updatestart", "Append started.");
              test.expectEvent(sourceBuffer, "update", "Append success.");
              test.expectEvent(sourceBuffer, "updateend", "Append ended.");

              var arrayBufferView = new Uint8Array(mediaData);

              assert_equals(arrayBufferView.length, mediaData.length, "arrayBufferView.length before transfer.");

              // Send the buffer as in a message so it gets neutered.
              window.postMessage( "test", "*", [arrayBufferView.buffer]);

              assert_equals(arrayBufferView.length, 0, "arrayBufferView.length after transfer.");

              sourceBuffer.appendBuffer(arrayBufferView);

              assert_true(sourceBuffer.updating, "updating attribute is true");

              test.waitForExpectedEvents(function()
              {
                 assert_false(sourceBuffer.updating, "updating attribute is false");
                 test.done();
              });
          }, "Test appending a neutered ArrayBufferView.");

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

              test.expectEvent(sourceBuffer, "updatestart", "Append started.");
              test.expectEvent(sourceBuffer, "update", "Append success.");
              test.expectEvent(sourceBuffer, "updateend", "Append ended.");
              sourceBuffer.appendBuffer(new ArrayBuffer(0));

              assert_true(sourceBuffer.updating, "updating attribute is true");

              test.waitForExpectedEvents(function()
              {
                  assert_false(sourceBuffer.updating, "updating attribute is false");
                  test.done();
              });
          }, "Test appending an empty ArrayBuffer.");

          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              test.expectEvent(sourceBuffer, "updatestart", "Append started.");
              test.expectEvent(sourceBuffer, "update", "Append success.");
              test.expectEvent(sourceBuffer, "updateend", "Append ended.");

              var arrayBuffer = mediaData.buffer.slice(0);

              assert_equals(arrayBuffer.byteLength, mediaData.buffer.byteLength, "arrayBuffer.byteLength before transfer.");

              // Send the buffer as in a message so it gets neutered.
              window.postMessage( "test", "*", [arrayBuffer]);

              assert_equals(arrayBuffer.byteLength, 0, "arrayBuffer.byteLength after transfer.");

              sourceBuffer.appendBuffer(arrayBuffer);

              assert_true(sourceBuffer.updating, "updating attribute is true");

              test.waitForExpectedEvents(function()
              {
                 assert_false(sourceBuffer.updating, "updating attribute is false");
                 test.done();
              });
          }, "Test appending a neutered ArrayBuffer.");

          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
              var halfIndex = (initSegment.length + 1) / 2;
              var partialInitSegment = initSegment.subarray(0, halfIndex);
              var remainingInitSegment = initSegment.subarray(halfIndex);
              var mediaSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.media[0]);

              test.expectEvent(sourceBuffer, "updateend", "partialInitSegment append ended.");
              sourceBuffer.appendBuffer(partialInitSegment);

              test.waitForExpectedEvents(function()
              {
                  assert_equals(mediaElement.readyState, mediaElement.HAVE_NOTHING);
                  assert_equals(mediaSource.duration, Number.NaN);
                  test.expectEvent(sourceBuffer, "updateend", "remainingInitSegment append ended.");
                  test.expectEvent(mediaElement, "loadedmetadata", "loadedmetadata event received.");
                  sourceBuffer.appendBuffer(remainingInitSegment);
              });

              test.waitForExpectedEvents(function()
              {
                  assert_equals(mediaElement.readyState, mediaElement.HAVE_METADATA);
                  assert_equals(mediaSource.duration, segmentInfo.duration);
                  test.expectEvent(sourceBuffer, "updateend", "mediaSegment append ended.");
                  test.expectEvent(mediaElement, "loadeddata", "loadeddata fired.");
                  sourceBuffer.appendBuffer(mediaSegment);
              });

              test.waitForExpectedEvents(function()
              {
                  assert_greater_than_equal(mediaElement.readyState, mediaElement.HAVE_CURRENT_DATA);
                  assert_equals(sourceBuffer.updating, false);
                  assert_equals(mediaSource.readyState, "open");
                  test.done();
              });
          }, "Test appendBuffer with partial init segments.");

          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
              var mediaSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.media[0]);
              var halfIndex = (mediaSegment.length + 1) / 2;
              var partialMediaSegment = mediaSegment.subarray(0, halfIndex);
              var remainingMediaSegment = mediaSegment.subarray(halfIndex);

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

              test.waitForExpectedEvents(function()
              {
                  assert_equals(mediaElement.readyState, mediaElement.HAVE_METADATA);
                  assert_equals(mediaSource.duration, segmentInfo.duration);
                  test.expectEvent(sourceBuffer, "updateend", "partial media segment append ended.");
                  sourceBuffer.appendBuffer(partialMediaSegment);
              });

              test.waitForExpectedEvents(function()
              {
                  test.expectEvent(sourceBuffer, "updateend", "mediaSegment append ended.");
                  test.expectEvent(mediaElement, "loadeddata", "loadeddata fired.");
                  sourceBuffer.appendBuffer(remainingMediaSegment);
              });

              test.waitForExpectedEvents(function()
              {
                  assert_greater_than_equal(mediaElement.readyState, mediaElement.HAVE_CURRENT_DATA);
                  assert_equals(mediaSource.readyState, "open");
                  assert_equals(sourceBuffer.updating, false);
                  test.done();
              });
          }, "Test appendBuffer with partial media segments.");

          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
              var partialInitSegment = initSegment.subarray(0, initSegment.length / 2);
              var mediaSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.media[0]);

              test.expectEvent(sourceBuffer, "updateend", "partialInitSegment append ended.");
              sourceBuffer.appendBuffer(partialInitSegment);

              test.waitForExpectedEvents(function()
              {
                  // Call abort to reset the parser.
                  sourceBuffer.abort();

                  // Append the full intiialization segment.
                  test.expectEvent(sourceBuffer, "updateend", "initSegment append ended.");
                  sourceBuffer.appendBuffer(initSegment);
              });

              test.waitForExpectedEvents(function()
              {
                  test.expectEvent(sourceBuffer, "updateend", "mediaSegment append ended.");
                  test.expectEvent(mediaElement, "loadeddata", "loadeddata fired.");
                  sourceBuffer.appendBuffer(mediaSegment);
              });

              test.waitForExpectedEvents(function()
              {
                  test.done();
              });
          }, "Test abort in the middle of an initialization segment.");

          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              test.expectEvent(mediaSource.sourceBuffers, "removesourcebuffer", "SourceBuffer removed.");
              mediaSource.removeSourceBuffer(sourceBuffer);
              test.waitForExpectedEvents(function()
              {
                  assert_throws("InvalidStateError",
                      function() { sourceBuffer.abort(); },
                      "sourceBuffer.abort() throws an exception for InvalidStateError.");

                  test.done();
              });
          }, "Test abort after removing sourcebuffer.");

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

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

              test.waitForExpectedEvents(function()
              {
                  assert_equals(mediaSource.readyState, "open", "readyState is open after init segment appended.");
                  test.expectEvent(sourceBuffer, "updateend", "mediaSegment append ended.");
                  sourceBuffer.appendBuffer(mediaSegment);
              });

              test.waitForExpectedEvents(function()
              {
                  assert_equals(sourceBuffer.buffered.length, 1, "sourceBuffer has a buffered range");
                  assert_equals(mediaSource.readyState, "open", "readyState is open after media segment appended.");
                  test.expectEvent(mediaSource, "sourceended", "source ended");
                  mediaSource.endOfStream();
              });

              test.waitForExpectedEvents(function()
              {
                  assert_equals(mediaSource.readyState, "ended", "readyState is ended.");
                  assert_throws("InvalidStateError",
                      function() { sourceBuffer.abort(); },
                      "sourceBuffer.abort() throws an exception for InvalidStateError.");
                  test.done();
              });

          }, "Test abort after readyState is ended following init segment and media segment.");

          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              test.expectEvent(sourceBuffer, "updatestart", "Append started.");
              test.expectEvent(sourceBuffer, "updateend", "Append ended.");
              sourceBuffer.appendWindowStart = 1;
              sourceBuffer.appendWindowEnd = 100;
              sourceBuffer.appendBuffer(mediaData);

              test.waitForExpectedEvents(function()
              {
                  assert_false(sourceBuffer.updating, "updating attribute is false");
                  sourceBuffer.abort();
                  assert_equals(sourceBuffer.appendWindowStart, 0, "appendWindowStart is reset to 0");
                  assert_equals(sourceBuffer.appendWindowEnd, Number.POSITIVE_INFINITY,
                      "appendWindowEnd is reset to +INFINITY");
                  test.done();
              });
          }, "Test abort after appendBuffer update ends.");

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

              test.expectEvent(sourceBuffer, "updatestart", "Append started.");
              test.expectEvent(sourceBuffer, "update", "Append success.");
              test.expectEvent(sourceBuffer, "updateend", "Append ended.");

              assert_throws( { name: "TypeError"} ,
                  function() { sourceBuffer.appendBuffer(null); },
                  "appendBuffer(null) throws an exception.");
              test.done();
          }, "Test appending null.");

          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              mediaSource.removeSourceBuffer(sourceBuffer);

              assert_throws( { name: "InvalidStateError"} ,
                  function() { sourceBuffer.appendBuffer(mediaData); },
                  "appendBuffer() throws an exception when called after removeSourceBuffer().");
              test.done();
          }, "Test appending after removeSourceBuffer().");

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