<!DOCTYPE html>
<html>
<script>
    function once(target, name, cb) {
        var p = new Promise(function(resolve, reject) {
            target.addEventListener(name, function() {
                target.removeEventListener(name, arguments.callee);
                resolve();
            });
        });
        if (cb) {
            p.then(cb);
        }
        return p;
    }

    function fetchWithXHR(uri, onLoadFunction) {
        var p = new Promise((resolve, reject) => {
            var xhr = new XMLHttpRequest();
            xhr.open("GET", uri, true);
            xhr.responseType = "arraybuffer";
            xhr.addEventListener("load", () => resolve(xhr.response));
            xhr.send();
        });
        if (onLoadFunction) {
            p.then(onLoadFunction);
        }
        return p;
    };

    function loadVideo() {
        var video = document.getElementsByTagName('video')[0];
        var ms = new MediaSource();
        video.src = URL.createObjectURL(ms);
        video.preload = "auto";
        once(ms, 'sourceopen', () => {
            var sb = ms.addSourceBuffer('video/mp4; codecs="avc1.4d401f"');
            ms.duration = Infinity;
            fetchWithXHR("video-with-audio-fragmented.mp4", buffer => {
                sb.appendBuffer(buffer);
                once(sb, "updateend", () => {
                    video.play();
                });
            });
        });
        video.ontimeupdate = () => {
            if (video.currentTime > 0.5 && ms.readyState != "ended") {
                ms.duration = video.buffered.end(0);
                ms.endOfStream();
                video.currentTime = 0;
                video.play();
            }
        };
    }
</script>
<body onload="loadVideo()">
    Ensure that the touchbar will display the time scrubber by the time the video ends.<br/>
    See <a href="https://bugs.webkit.org/show_bug.cgi?id=229286">https://bugs.webkit.org/show_bug.cgi?id=229286</a><br/>
    <video controls width=640 height=480></video>
</body>
<html>