<!DOCTYPE html>
<title>Test to make sure removing a media element's source(s) does not cause a crash.</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="media-file.js"></script>
<script>
function test_remove_source(testFunction) {
    async_test(function(t) {
        var video = document.createElement("video");

        video.onloadstart = t.step_func(function() {
            testFunction(video);
            setTimeout(t.step_func_done(), 100);
        });

        // Add a bunch of source elements with bogus urls because we want to remove elements
        // after the media engine begins processing sources, and we can't predict the delay
        // between when the media element fires an "error" event and our handler is called,
        // but we need to guarantee that there are <source> elements that haven't been
        // processed when we run the test.
        for (var index = 1; index <= 10; index++)
            addSource(index);

        function addSource(index) {
            source = document.createElement("source");
            source.src = findMediaFile("video", index + "-" + Date.now());
            source.type = mimeTypeForExtension(source.src.split(".").pop());
            video.appendChild(source);
        }
    }, "source elements removed using " + testFunction.name + "()");
}

function removeChild(video) {
    // Removing all "source" elements with "removeChild()".
    var sources = video.childNodes;
    for (var source of sources)
        video.removeChild(source);
}

function innerHTML(video) {
    // Removing all "source" elements by setting "innerHTML".
    video.innerHTML = "";
}

function replaceChild(video) {
    // Removing all "source" elements with "replaceChild()".
    var sources = video.childNodes;
    var span = document.createElement("span");
    span.appendChild(document.createTextNode("Yo"));
    for (var source of sources)
       video.replaceChild(span, source);
}

test_remove_source(removeChild);
test_remove_source(innerHTML);
test_remove_source(replaceChild);
</script>