<!DOCTYPE html> <!-- webkit-test-runner [ internal:SourceBufferChangeTypeEnabled=true ] -->
<!-- Copyright © 2018 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<html>
    <head>
        <meta  charset="utf-8">
        <title>SourceBuffer.changeType() 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_throws(new TypeError(), function()
    {
        sourceBuffer.changeType("");
    }, "changeType");

    test.done();
}, "Test changeType with an empty type.");

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

    mediaSource.removeSourceBuffer(sourceBuffer);

    assert_throws("InvalidStateError", function()
    {
        sourceBuffer.changeType(MediaSourceUtil.AUDIO_VIDEO_TYPE);
    }, "changeType");

    test.done();
}, "Test changeType after SourceBuffer removed from mediaSource.");

mediasource_test(function(test, mediaElement, mediaSource)
{
    var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE);
    sourceBuffer.appendBuffer(new Uint8Array(0));
    assert_true(sourceBuffer.updating, "Updating flag set when a buffer is appended.");

    assert_throws("InvalidStateError", function()
    {
        sourceBuffer.changeType(MediaSourceUtil.AUDIO_VIDEO_TYPE);
    }, "changeType");

    test.done();
}, "Test changeType while update pending.");

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

    var unsupported_type = null;
    assert_false(MediaSource.isTypeSupported(unsupported_type), "null MIME type is not expected to be supported.");

    assert_throws("NotSupportedError", function()
    {
        sourceBuffer.changeType(unsupported_type);
    }, "changeType");

    test.done();
}, "Test changeType with null type.");

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

    var unsupported_type = 'invalidType';
    assert_false(MediaSource.isTypeSupported(unsupported_type), unsupported_type + " is not expected to be supported.");

    assert_throws("NotSupportedError", function()
    {
        sourceBuffer.changeType(unsupported_type);
    }, "changeType");

    test.done();
}, "Test changeType with unsupported type.");

mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
{
    test.expectEvent(sourceBuffer, "updatestart");
    test.expectEvent(sourceBuffer, "update");
    test.expectEvent(sourceBuffer, "updateend");
    sourceBuffer.appendBuffer(mediaData);

    test.waitForExpectedEvents(function()
    {
        mediaSource.endOfStream();
        assert_equals(mediaSource.readyState, "ended");

        test.expectEvent(mediaSource, "sourceopen");
        sourceBuffer.changeType(MediaSourceUtil.AUDIO_VIDEO_TYPE);
        assert_equals(mediaSource.readyState, "open");
    });

    test.waitForExpectedEvents(function()
    {
        test.done();
    });
}, "Test changeType transitioning readyState from 'ended' to 'open'.");

mediasource_test(function(test, mediaElement, mediaSource) {
    var sequenceType = "audio/aac";
    if (!MediaSource.isTypeSupported(sequenceType)) {
      sequenceType = "audio/mpeg";
      assert_true(MediaSource.isTypeSupported(sequenceType),
                  "No bytestream that generates timestamps is supported, aborting test");
    }

    assert_not_equals(MediaSourceUtil.AUDIO_ONLY_TYPE, sequenceType,
                      "This test requires distinct audio-only types");

    var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);
    assert_equals(sourceBuffer.mode, "segments",
                  "None of the audioOnlyTypes in the test util generate timestamps, but mode is incorrectly set");

    sourceBuffer.changeType(sequenceType);
    assert_equals(sourceBuffer.mode, "sequence",
                  "Mode is not updated correctly for a bytestream that generates timestamps");

    test.done();
}, "Test changeType sets mode to sequence for change to type that generates timestamps");

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

    assert_equals(sourceBuffer.mode, "segments",
                  "None of the audioOnlyTypes in the test util generate timestamps, but mode is incorrectly set");
    sourceBuffer.changeType(MediaSourceUtil.AUDIO_ONLY_TYPE);
    assert_equals(sourceBuffer.mode, "segments",
                  "Previous segments mode is not retained correctly for changeType to one that doesn't generate timestamps");

    sourceBuffer.mode = "sequence";
    assert_equals(sourceBuffer.mode, "sequence", "mode should be sequence now");
    sourceBuffer.changeType(MediaSourceUtil.AUDIO_ONLY_TYPE);
    assert_equals(sourceBuffer.mode, "sequence",
                  "Previous sequence mode is not retained correctly for changeType to one that doesn't generate timestamps");

    test.done();
}, "Test changeType retains previous mode when changing to type that doesn't generate timestamps");

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