<!DOCTYPE html>
<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<html>
    <head>
        <title>Various MediaSource HTMLMediaElement preload tests.</title>
        <link rel="author" title="Matthew Wolenetz" href="mailto:wolenetz@chromium.org"/>
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
    </head>
    <body>
        <script>
            function attachWithPreloadTest(preload)
            {
                async_test(function(test)
                {
                    var video = document.createElement("video");
                    var mediaSource = new MediaSource();
                    var mediaSourceURL = URL.createObjectURL(mediaSource);

                    video.preload = preload;
                    document.body.appendChild(video);
                    test.add_cleanup(function() {
                        document.body.removeChild(video);
                        URL.revokeObjectURL(mediaSourceURL);
                    });

                    mediaSource.addEventListener("sourceopen", test.step_func_done());
                    video.src = mediaSourceURL;
                }, "sourceopen occurs with element preload=" + preload);
            }

            attachWithPreloadTest("auto");
            attachWithPreloadTest("metadata");
            attachWithPreloadTest("none");

            function errorWithPreloadTest(preload, bogusURLStyle)
            {
                async_test(function(test)
                {
                    var mediaSource = new MediaSource();
                    var bogusURL = URL.createObjectURL(mediaSource);

                    if (bogusURLStyle == "corrupted") {
                        var goodURL = bogusURL;
                        test.add_cleanup(function() { URL.revokeObjectURL(goodURL); });
                        bogusURL += "0";
                    } else if (bogusURLStyle == "revoked") {
                        URL.revokeObjectURL(bogusURL);
                    } else {
                        assert_unreached("invalid case");
                    }

                    var video = document.createElement("video");
                    video.preload = preload;
                    document.body.appendChild(video);
                    test.add_cleanup(function() { document.body.removeChild(video); });

                    mediaSource.addEventListener("sourceopen", test.unreached_func("'sourceopen' should not be fired"));

                    video.onerror = test.step_func_done();
                    video.src = bogusURL;
                }, "error occurs with bogus blob URL (" + bogusURLStyle + " MediaSource object URL) and element preload=" + preload);
            }

            errorWithPreloadTest("auto", "revoked");
            errorWithPreloadTest("metadata", "revoked");

            errorWithPreloadTest("auto", "corrupted");
            errorWithPreloadTest("metadata", "corrupted");
        </script>
    </body>
</html>
