<!DOCTYPE html>
<html>
<head>
    <title>media-webm-vorbis-partial</title>
    <script src="../../media/media-source/media-source-loader.js"></script>
    <script src="../../media/video-test.js"></script>
    <script>
    var loader;
    var source;
    var sourceBuffer;

    function loaderPromise(loader) {
        return new Promise((resolve, reject) => {
            loader.onload = resolve;
            loader.onerror = reject;
        });
    }

    // Append a vorbis webm with a single incomplete cluster. Ensure that content that is less
    // than 2s in duration is properly demuxed.
    window.addEventListener('load', async event => {
        try {
            findMediaElement();
            loader = new MediaSourceLoader('content/test-vorbis-manifest.json');
            await loaderPromise(loader);

            source = new MediaSource();
            run('video.src = URL.createObjectURL(source)');
            await waitFor(source, 'sourceopen');
            waitFor(video, 'error').then(failTest);

            run('source.duration = loader.duration()');
            run('sourceBuffer = source.addSourceBuffer(loader.type())');
            run('sourceBuffer.appendBuffer(loader.initSegment())');
            await waitFor(sourceBuffer, 'update');

            consoleWrite('Append a media segment.')
            run('sourceBuffer.appendBuffer(loader.mediaSegment(0))');
            await waitFor(sourceBuffer, 'update');

            testExpected('sourceBuffer.buffered.end(0) == source.duration', true);

            endTest();
        } catch (e) {
            failTest(`Caught exception: "${e}"`);
        }
    });
    </script>
</head>
<body>
    <video controls></video>
</body>
</html>
