зеркало из https://github.com/mozilla/gecko-dev.git
227 строки
6.8 KiB
HTML
227 строки
6.8 KiB
HTML
<!DOCTYPE HTML>
|
|
<html>
|
|
<!--
|
|
https://bugzilla.mozilla.org/show_bug.cgi?id=479859
|
|
-->
|
|
<head>
|
|
<title>Test for Bug 479859</title>
|
|
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
|
<script type="application/javascript" src="manifest.js"></script>
|
|
</head>
|
|
<body>
|
|
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=479859">Mozilla Bug 479859</a>
|
|
<p id="display"></p>
|
|
<div id="content" style="display: none">
|
|
|
|
</div>
|
|
<pre id="test">
|
|
<script type="text/javascript">
|
|
|
|
function log(msg) {
|
|
//document.getElementById('log').innerHTML += "<p>" + msg + "</p>";
|
|
}
|
|
|
|
// We don't track: progress, canplay, canplaythrough and stalled events,
|
|
// as these can be delivered out of order, and/or multiple times.
|
|
var gEventTypes = [ 'loadstart', 'abort', 'error', 'emptied', 'play',
|
|
'pause', 'loadedmetadata', 'loadeddata', 'waiting', 'playing', 'seeking',
|
|
'seeked', 'timeupdate', 'ended', 'ratechange', 'durationchange', 'volumechange' ];
|
|
|
|
var gEventNum = 0;
|
|
var gTestNum = 0;
|
|
var gTestFileNum = 0;
|
|
var gExpectedEvents = null;
|
|
var gTest = null;
|
|
var gTestName = "?";
|
|
|
|
function listener(evt) {
|
|
log('event ' + evt.type);
|
|
ok(gEventNum < gExpectedEvents.length, gTestName+" - corrent number of events received");
|
|
var expected = (gEventNum < gExpectedEvents.length) ? gExpectedEvents[gEventNum] : "NoEvent";
|
|
is(evt.type, expected, gTestName+" - events received in order");
|
|
gEventNum++;
|
|
if (gEventNum == gExpectedEvents.length) {
|
|
setTimeout(nextTest, 0);
|
|
}
|
|
}
|
|
|
|
function source_error(evt) {
|
|
log('event source_error');
|
|
ok(evt.type == "error", "Should only get error events here");
|
|
ok(gEventNum < gExpectedEvents.length, gTestName+" - corrent number of events received");
|
|
var expected = (gEventNum < gExpectedEvents.length) ? gExpectedEvents[gEventNum] : "NoEvent";
|
|
is("source_error", expected, gTestName+" - events received in order");
|
|
gEventNum++;
|
|
if (gEventNum == gExpectedEvents.length) {
|
|
setTimeout(nextTest, 0);
|
|
}
|
|
}
|
|
|
|
var gMedia = null;
|
|
|
|
function createMedia(tag) {
|
|
gMedia = document.createElement(tag);
|
|
gMedia.preload = "metadata";
|
|
for (var i=0; i<gEventTypes.length; i++) {
|
|
gMedia.addEventListener(gEventTypes[i], listener, false);
|
|
}
|
|
}
|
|
|
|
function addSource(src, type) {
|
|
var s = document.createElement("source");
|
|
s.addEventListener("error", source_error, false);
|
|
s.src = src;
|
|
s.type = type;
|
|
gMedia.appendChild(s);
|
|
return s;
|
|
}
|
|
|
|
function prependSource(src, type) {
|
|
var s = document.createElement("source");
|
|
s.addEventListener("error", source_error, false);
|
|
s.src = src;
|
|
s.type = type;
|
|
gMedia.insertBefore(s, gMedia.firstChild);
|
|
return s;
|
|
}
|
|
|
|
var gTests = [
|
|
{
|
|
// Test 0: adding video to doc, then setting src should load implicitly.
|
|
create:
|
|
function(src, type) {
|
|
document.body.appendChild(gMedia);
|
|
gMedia.src = src;
|
|
},
|
|
expectedEvents: ['ratechange', 'loadstart', 'durationchange', 'loadedmetadata', 'loadeddata']
|
|
}, {
|
|
// Test 1: adding video to doc, then adding source.
|
|
create:
|
|
function(src, type) {
|
|
document.body.appendChild(gMedia);
|
|
addSource(src, type);
|
|
},
|
|
expectedEvents: ['loadstart', 'durationchange', 'loadedmetadata', 'loadeddata']
|
|
},{
|
|
// Test 2: video with multiple source, the first of which are bad, we should load the last,
|
|
// and receive error events for failed loads on the source children.
|
|
create:
|
|
function(src, type) {
|
|
document.body.appendChild(gMedia);
|
|
addSource("404a", type);
|
|
addSource("404b", type);
|
|
addSource(src, type);
|
|
},
|
|
expectedEvents: ['loadstart', 'source_error', 'source_error', 'durationchange', 'loadedmetadata', 'loadeddata']
|
|
}, {
|
|
// Test 3: video with bad src, good <source>, ensure that <source> aren't used.
|
|
create:
|
|
function(src, type) {
|
|
gMedia.src = "404a";
|
|
addSource(src, type);
|
|
document.body.appendChild(gMedia);
|
|
},
|
|
expectedEvents: ['ratechange', 'loadstart', 'error']
|
|
}, {
|
|
// Test 4: video with only bad source, loading, then adding a good source
|
|
// - should resume load.
|
|
create:
|
|
function(src, type) {
|
|
addSource("404a", type);
|
|
var s2 = addSource("404b", type);
|
|
s2.addEventListener("error",
|
|
function(e) {
|
|
// Should awaken waiting load, causing successful load.
|
|
addSource(src, type);
|
|
},
|
|
false);
|
|
document.body.appendChild(gMedia);
|
|
},
|
|
expectedEvents: ['loadstart', 'source_error', 'source_error', 'durationchange', 'loadedmetadata', 'loadeddata']
|
|
}, {
|
|
// Test 5: video with only 1 bad source, let it fail to load, then prepend
|
|
// a good <source> to the video, it shouldn't be selected, because the
|
|
// "pointer" should be after the last child - the bad source.
|
|
prepended: false,
|
|
create:
|
|
function(src, type) {
|
|
var prepended = false;
|
|
addSource("404a", type);
|
|
var s2 = addSource("404b", type);
|
|
s2.addEventListener("error",
|
|
function(e) {
|
|
// Should awaken waiting load, causing successful load.
|
|
if (!prepended) {
|
|
prependSource(src, type);
|
|
prepended = true;
|
|
}
|
|
},
|
|
false);
|
|
document.body.appendChild(gMedia);
|
|
},
|
|
expectedEvents: ['loadstart', 'source_error', 'source_error']
|
|
}, {
|
|
// Test 6: (Bug 1165203) preload="none" then followed by an explicit
|
|
// call to load() should load metadata
|
|
create:
|
|
function(src, type) {
|
|
gMedia.preload = "none";
|
|
gMedia.src = src;
|
|
document.body.appendChild(gMedia);
|
|
addSource(src, type);
|
|
gMedia.load();
|
|
},
|
|
expectedEvents: ['emptied', 'ratechange', 'loadstart', 'durationchange', 'loadedmetadata', 'loadeddata']
|
|
}
|
|
];
|
|
|
|
function nextTest() {
|
|
if (gMedia) {
|
|
for (var i=0; i<gEventTypes.length; i++) {
|
|
gMedia.removeEventListener(gEventTypes[i], listener, false);
|
|
}
|
|
removeNodeAndSource(gMedia);
|
|
gMedia = null;
|
|
}
|
|
gEventNum = 0;
|
|
|
|
if (gTestNum == gTests.length) {
|
|
gTestNum = 0;
|
|
++gTestFileNum;
|
|
if (gTestFileNum == gSmallTests.length) {
|
|
SimpleTest.finish();
|
|
return;
|
|
}
|
|
}
|
|
|
|
var src = gSmallTests[gTestFileNum].name;
|
|
var type = gSmallTests[gTestFileNum].type;
|
|
|
|
var t = gTests[gTestNum];
|
|
gTestNum++;
|
|
|
|
createMedia(type.match(/^audio\//) ? "audio" : "video");
|
|
if (!gMedia.canPlayType(type)) {
|
|
// Unsupported type, skip to next test
|
|
nextTest();
|
|
return;
|
|
}
|
|
|
|
gTestName = "Test " + src + " " + (gTestNum - 1);
|
|
log("Starting " + gTestName);
|
|
gExpectedEvents = t.expectedEvents;
|
|
|
|
t.create(src, type);
|
|
}
|
|
|
|
addLoadEvent(nextTest);
|
|
SimpleTest.waitForExplicitFinish();
|
|
|
|
</script>
|
|
</pre>
|
|
|
|
<div id="log" style="font-size: small"></div>
|
|
</body>
|
|
</html>
|