blob: 0db1e576e7cc3f364aa2792b48c66557c37c0145 [file] [log] [blame]
<html>
<title>Test media source replacement</title>
<body>
<p>Test that media keeps playing when the source element is replaced.</p>
<script src=video-test.js></script>
<script src=media-file.js></script>
<script src=../resources/gc.js></script>
<script>
var timeupdateEventCount = 0;
var skippedCount = 0;
var sourceReplaced = false;
function swapAudio() {
v = document.getElementsByTagName('audio')[0];
v.removeChild(v.childNodes[0]);
var s = document.createElement('source');
s.src = findMediaFile("audio", "content/test");
v.appendChild(s);
}
function errorListener(event)
{
logResult(false, "Caught 'error' event, audio.error.code = " + this.error.code);
endTest();
}
function canplaythroughListener(event)
{
consoleWrite("EVENT(canplaythrough)");
testElement = this;
testExpected("testElement.currentTime", 0);
this.play();
}
function playingListener(event)
{
consoleWrite("EVENT(playing)");
}
function timeupdateListener(event)
{
++timeupdateEventCount;
if (timeupdateEventCount-skippedCount == 1) {
// First time update after source replacement should be 0.
// We allow one late time update to come in from the previous
// source element. This was done to help the cr-linux test
// pass, and does not necessarily indicate a problem.
if (sourceReplaced) {
if (skippedCount >= 1 || this.currentTime == 0) {
testElement = this;
testExpected("testElement.currentTime", 0);
} else {
// The time is not 0 as expected. Hope this is a
// late update from the previous source.
++skippedCount;
}
}
} else if (timeupdateEventCount-skippedCount >= 2) {
// We wait 2 timeupdate events so we are sure the media engine
// is playing the media, and make sure time is advancing.
testElement = this;
testExpected("testElement.currentTime", 0, '>');
if (!sourceReplaced) {
consoleWrite("Replacing the media's source element:");
sourceReplaced = true;
timeupdateEventCount = 0;
skippedCount = 0;
// The ports are not consistent in regards to whether
// the canplaythrough and playing events are triggered
// a second time, so stop listening for them. This was
// done to help the cr-linux test pass, and does not
// necessarily indicate a problem.
this.removeEventListener('playing', playingListener);
this.removeEventListener('canplaythrough', canplaythroughListener);
swapAudio();
} else {
this.removeEventListener('timeupdate', timeupdateListener);
this.pause();
endTest();
}
}
}
function testAudioElement(count)
{
timeupdateEventCount = 0;
skippedCount = 0;
var audioElement = document.getElementsByTagName('audio')[count];
//audioElement.removeChild(audioElement.childNodes[0]);
audioElement.addEventListener('error', errorListener);
audioElement.addEventListener('canplaythrough', canplaythroughListener);
audioElement.addEventListener('timeupdate', timeupdateListener);
audioElement.addEventListener('playing', playingListener);
var s = document.createElement('source');
s.src = findMediaFile("audio", "content/silence");
audioElement.appendChild(s);
}
document.write("<audio controls></audio>");
testAudioElement(0);
gc();
gc();
</script>
</body>
</html>