<!DOCTYPE html>
<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<meta charset="utf-8">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="mediasource-util.js"></script>
<script>
    function sourceBufferTrackDefaultsTest(callback, description)
    {
        mediasource_test(function(test, mediaElement, mediaSource)
        {
            var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE);
            assert_array_equals(sourceBuffer.trackDefaults, [], "Empty initial SourceBuffer.trackDefaults");
            callback(test, mediaElement, mediaSource, sourceBuffer);
        }, description);
    };

    sourceBufferTrackDefaultsTest(function(test, mediaElement, mediaSource, sourceBuffer)
    {
        var emptyList = new TrackDefaultList([]);
        assert_not_equals(sourceBuffer.trackDefaults, emptyList, "Initial trackDefaults object differs from new empty list");

        sourceBuffer.trackDefaults = emptyList;

        assert_array_equals(sourceBuffer.trackDefaults, [], "Round-tripped empty trackDefaults");
        assert_equals(sourceBuffer.trackDefaults, emptyList, "Round-tripped the empty TrackDefaultList object");
        test.done();
    }, "Test round-trip of empty SourceBuffer.trackDefaults");

    sourceBufferTrackDefaultsTest(function(test, mediaElement, mediaSource, sourceBuffer)
    {
        var trackDefault = new TrackDefault("audio", "en-US", "audio label", ["main"], "1");
        var trackDefaults = new TrackDefaultList([ trackDefault ]);

        sourceBuffer.trackDefaults = trackDefaults;

        assert_array_equals(sourceBuffer.trackDefaults, trackDefaults, "Round-tripped non-empty trackDefaults");
        assert_equals(sourceBuffer.trackDefaults.length, 1, "Confirmed non-empty trackDefaults");
        assert_equals(sourceBuffer.trackDefaults, trackDefaults, "Round-tripped the non-empty TrackDefaultList object");
        test.done();
    }, "Test round-trip of non-empty SourceBuffer.trackDefaults");

    sourceBufferTrackDefaultsTest(function(test, mediaElement, mediaSource, sourceBuffer)
    {
        mediaSource.removeSourceBuffer(sourceBuffer);
        assert_throws("InvalidStateError",
                      function() { sourceBuffer.trackDefaults = new TrackDefaultList([]); },
                      "Exception thrown when setting trackDefaults on SourceBuffer that is removed from MediaSource");
        test.done();
    }, "Test setting trackDefaults on an already-removed SourceBuffer");

    mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
    {
        assert_array_equals(sourceBuffer.trackDefaults, [], "Empty initial SourceBuffer.trackDefaults");
        test.expectEvent(sourceBuffer, "updateend", "Append ended");
        sourceBuffer.appendBuffer(mediaData);
        assert_true(sourceBuffer.updating, "SourceBuffer is updating");

        assert_throws("InvalidStateError",
                      function() { sourceBuffer.trackDefaults = new TrackDefaultList([]); },
                      "Exception thrown when setting trackDefaults on SourceBuffer that is updating");

        test.waitForExpectedEvents(function()
        {
            assert_false(sourceBuffer.updating, "SourceBuffer is not updating");
            sourceBuffer.trackDefaults = new TrackDefaultList([]);
            test.done();
        });
    }, "Test setting trackDefaults on a SourceBuffer that is updating");

    sourceBufferTrackDefaultsTest(function(test, mediaElement, mediaSource, sourceBuffer)
    {
        assert_throws(new TypeError(),
            function() { sourceBuffer.trackDefaults = null; },
            "null should be disallowed by trackDefaults setter");
        test.done();
    }, "Test setting null SourceBuffer.trackDefaults");
</script>
