<!DOCTYPE html>
<title>Test to make sure a "source" moved after the media element begins processing is handled correctly.</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="media-file.js"></script>
<script>
for(var i = 0; i < 7; i++) {
async_test(function(t) {
var testInfo = [
{ func : moveToEnd, errorCount : 0, moved : null, elementToMove: function(video, current) {
// Moving previous "source" element to end of list, it should be processed again.
return video.removeChild(current.previousSibling);
} },
{ func : moveToEnd, errorCount : 0, moved : null, elementToMove: function(video, current) {
// Moving current "source" element, it should be processed again.
return video.removeChild(current);
} },
{ func : moveToEnd, errorCount : 0, moved : null, elementToMove: function(video, current) {
// Moving next "source" element, it should be processed again.
return video.removeChild(current.nextSibling);
} },
{ func : moveEarlier, errorCount : 0, moved : null, elementToMove: function(video, current) {
// Moving current "source" element to beginning of list, it should not be processed again.
return video.removeChild(current);
} },
{ func : moveEarlier, errorCount : 0, moved : null, elementToMove: function(video, current) {
// Moving next "source" element to beginning of list, it should never processed.
return video.removeChild(current.nextSibling);
} },
{ func : moveEarlier, errorCount : 0, moved : null, elementToMove: function(video, current) {
// span inserted after current "source" element before it is removed, processing should proceed normally.
var span = document.createElement("span")
span.appendChild(document.createTextNode("Your browser doesn't support HTML5 video!"));
video.insertBefore(span, current.nextSibling);
return video.removeChild(current);
} },
{ func : moveEarlier, errorCount : 0, moved : null, elementToMove: function(video, current) {
// span inserted after next "source" element before it is removed, processing should proceed normally.
var span = document.createElement("span")
span.appendChild(document.createTextNode("Your browser doesn't support HTML5 video!"));
video.insertBefore(span, current.nextSibling.nextSibling);
return video.removeChild(current.nextSibling);
} }
];
var test = testInfo[i];
var video = document.createElement("video");
// Add a bunch of source elements with bogus urls because we want to rearrange
// 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) {
var source = document.createElement("source");
source.src = index + "-" + Date.now() + ".ogv";
source.type = mimeTypeForExtension(source.src.split(".").pop());
video.appendChild(source);
source.onerror = t.step_func(function(event) {
test.func(event);
});
}
function findCurrentSourceElement() {
var sources = video.childNodes;
var currentSrc = video.currentSrc;
var index;
for (index = 0; index < sources.length; ++index) {
if (sources[index].src == currentSrc)
break;
}
assert_less_than(index, sources.length, currentSrc + " not found in <source> list");
return sources[index];
}
function moveEarlier(event) {
switch (++test.errorCount) {
case 1:
// Do nothing on the first error event
break;
case 2:
var current = findCurrentSourceElement();
test.moved = test.elementToMove(video, current);
assert_not_equals(test.moved, null);
video.insertBefore(test.moved, video.firstChild);
break;
default:
// We should never get an error for the element we moved.
assert_not_equals(event.target, test.moved);
if (event.target.nextSibling == null)
t.done();
break;
}
}
function moveToEnd(event) {
switch (++test.errorCount) {
case 1:
// Do nothing on the first error event
break;
case 2:
var current = findCurrentSourceElement();
test.moved = test.elementToMove(video, current);
assert_not_equals(test.moved, null);
video.appendChild(test.moved);
break;
default:
assert_true(event.target == test.moved || event.target.nextSibling != null);
if (event.target == test.moved)
t.done();
break;
}
}
});
}
</script>