| <!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 = index + "-" + Date.now() + ".ogv"; |
| 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> |