<!DOCTYPE html>
<html>
<head>
    <title>media-source-remove-unload-crash</title>
    <script src="media-source-loader.js"></script>
    <script src="../video-test.js"></script>
    <script src="../../resources/gc.js"></script>
    <script>
    var loader;
    var source;
    var sourceBuffer;

    function runTest() {
        findMediaElement();

        loader = new MediaSourceLoader('content/test-fragmented-manifest.json');
        loader.onload = mediaDataLoaded;
        loader.onerror = mediaDataLoadingFailed;
    }

    function mediaDataLoadingFailed() {
        failTest('Media data loading failed');
    }

    function mediaDataLoaded() {
        source = new MediaSource();
        waitForEvent('sourceopen', sourceOpen, false, false, source);
        run('video.src = URL.createObjectURL(source)');
    }

    function sourceOpen() {
        run('source.duration = loader.duration()');
        run('sourceBuffer = source.addSourceBuffer(loader.type())');
        waitForEventOn(sourceBuffer, 'update', sourceInitialized, false, true);
        run('sourceBuffer.appendBuffer(loader.initSegment())');
    }

    function sourceInitialized() {
        consoleWrite('Append a media segment.')
        waitForEventOn(sourceBuffer, 'update', mediaSegmentAppended, false, true);
        run('sourceBuffer.appendBuffer(loader.mediaSegment(0))');
    }

    function mediaSegmentAppended() {
        consoleWrite('Remove the SourceBuffer from its MediaSource, then unload the video element. Should not crash.')
        run('source.removeSourceBuffer(sourceBuffer)');
        run('sourceBuffer = null');
        setTimeout(afterRemove, 100);
    }

    function afterRemove(event) {
        run('gc()');
        run('video.src = ""');
        run('video.load()');
        endTest();
    }
    </script>
</head>
<body onload="runTest()">
    <video controls></video>
</body>
</html>
