diff options
Diffstat (limited to 'dom/media/test/test_played.html')
-rw-r--r-- | dom/media/test/test_played.html | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/dom/media/test/test_played.html b/dom/media/test/test_played.html new file mode 100644 index 000000000..52d3ab45f --- /dev/null +++ b/dom/media/test/test_played.html @@ -0,0 +1,250 @@ +<!DOCTYPE HTML> +<html> +<head> +<title>Test played member for media elements</title> +<script type="text/javascript" src="/MochiKit/MochiKit.js"></script> +<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> +<script type="text/javascript" src="manifest.js"></script> +</head> +<body> +<pre id='test'> +<script class="testbody" type='application/javascript;version=1.8'> +//longer timeout for sometimes B2G emulator runs very slowly +if (SpecialPowers.Services.appinfo.name == "B2G") { + SimpleTest.requestLongerTimeout(3); +} + +SimpleTest.requestCompleteLog(); +let manager = new MediaTestManager; + +function finish_test(element) { + removeNodeAndSource(element); + manager.finished(element.token); +} + +// Check that a file has been played in its entirety. +function check_full_file_played(element) { + element.addEventListener('ended', (function(e) { + let interval_count = e.target.played.length; + is(interval_count, 1, element.token + ": played.length must be 1"); + is(element.played.start(0), 0, element.token + ": start time shall be 0"); + is(element.played.end(0), e.target.duration, element.token + ": end time shall be duration"); + finish_test(e.target); + }), false); +} + +var tests = [ +// Without playing, check that player.played.length == 0. +{ + setup : function(element) { + element.addEventListener("loadedmetadata", function() { + is(element.played.length, 0, element.token + ": initial played.length equals zero"); + finish_test(element); + }); + }, + name: "test1" +}, +// Play the file, test the range we have. +{ + setup : function(element) { + check_full_file_played(element); + element.play(); + }, + name: "test2" +}, + +// Play the second half of the file, pause, play +// an check we have only one range. +{ + setup : function (element) { + element.onended = function (e) { + var t = e.target; + t.onended = null; + check_full_file_played(t); + t.pause(); + t.currentTime = 0; + t.play(); + }; + element.addEventListener("loadedmetadata", function() { + element.currentTime = element.duration / 2; + element.play(); + }, false); + }, + name: "test3" +}, + +// Play the first half of the file, seek back, while +// continuing to play. We shall have only one range. +{ + setup : function (element) { + let onTimeUpdate = function() { + if (element.currentTime > element.duration / 2) { + info(element.token + ": currentTime=" + element.currentTime + ", duration=" + element.duration); + element.removeEventListener("timeupdate", onTimeUpdate, false); + element.pause(); + var oldEndRange = element.played.end(0); + element.currentTime = element.duration / 4; + is(element.played.end(0), oldEndRange, + element.token + ": When seeking back, |played| should not be changed"); + element.play(); + } + } + element.addEventListener("timeupdate", onTimeUpdate, false); + check_full_file_played(element); + element.play(); + }, + name: "test4" +}, + +// Play and seek to have two ranges, and check that, as well a +// boundaries. +{ + setup : function (element) { + let seekTarget = 0; + let onTimeUpdate = function() { + if (element.currentTime > element.duration / 2) { + info(element.token + ": currentTime=" + element.currentTime + ", duration=" + element.duration); + element.removeEventListener("timeupdate", onTimeUpdate, false); + element.pause(); + // Remember seek target for later comparison since duration may change + // during playback. + seekTarget = element.currentTime = element.duration / 10; + element.currentTime = seekTarget; + element.play(); + } + } + + element.addEventListener("loadedmetadata", function() { + element.addEventListener("timeupdate", onTimeUpdate, false); + }, false); + + + element.addEventListener("ended", (function() { + if(element.played.length > 1) { + is(element.played.length, 2, element.token + ": element.played.length == 2"); + is(element.played.start(1), seekTarget, element.token + ": we should have seeked forward by one tenth of the duration"); + is(element.played.end(1), element.duration, element.token + ": end of second range shall be the total duration"); + } + is(element.played.start(0), 0, element.token + ": start of first range shall be 0"); + finish_test(element); + }), false); + + element.play(); + }, + name: "test5" +}, + +// Play to create two ranges, in the reverse order. check that they are sorted. +{ + setup : function (element) { + function end() { + element.pause(); + let p = element.played; + ok(p.length >= 1, element.token + ": There should be at least one range=" + p.length); + is(p.start(0), seekTarget, element.token + ": Start of first range should be the sixth of the duration"); + ok(p.end(p.length - 1) > 5 * element.duration / 6, element.token + ": End of last range should be greater that five times the sixth of the duration"); + finish_test(element); + } + + let seekTarget = 0; + function pauseseekrestart() { + element.pause(); + // Remember seek target for later comparison since duration may change + // during playback. + seekTarget = element.duration / 6; + element.currentTime = seekTarget; + element.play(); + } + + function onTimeUpdate_pauseseekrestart() { + if (element.currentTime > 5 * element.duration / 6) { + element.removeEventListener("timeupdate", onTimeUpdate_pauseseekrestart, false); + pauseseekrestart(); + element.addEventListener("timeupdate", onTimeUpdate_end, false); + } + } + + function onTimeUpdate_end() { + if (element.currentTime > 3 * element.duration / 6) { + element.removeEventListener("timeupdate", onTimeUpdate_end, false); + end(); + } + } + + element.addEventListener("timeupdate", onTimeUpdate_pauseseekrestart, false); + + element.addEventListener('loadedmetadata', function() { + element.currentTime = 4 * element.duration / 6; + element.play(); + }, false); + }, + name: "test6" +}, +// Seek repeatedly without playing. No range should appear. +{ + setup : function(element) { + let index = 1; + + element.addEventListener('seeked', function() { + index++; + element.currentTime = index * element.duration / 5; + is(element.played.length, 0, element.token + ": played.length should be 0"); + if (index == 5) { + finish_test(element); + } + }, false); + + element.addEventListener('loadedmetadata', function() { + element.currentTime = element.duration / 5; + }, false); + }, + name: "test7" +} +]; + +function createTestArray() { + var A = []; + for (var i=0; i<tests.length; i++) { + for (var k=0; k<gPlayedTests.length; k++) { + var t = new Object(); + t.setup = tests[i].setup; + t.name = tests[i].name + "-" + gPlayedTests[k].name; + t.type = gPlayedTests[k].type; + t.src = gPlayedTests[k].name; + A.push(t); + } + } + return A; +} + +function startTest(test, token) { + var elemType = getMajorMimeType(test.type); + var element = document.createElement(elemType); + element.src = test.src; + element.token = token; + element.preload = "metadata"; + test.setup(element); + manager.started(token); + + // Log events for debugging. + var events = ["suspend", "play", "canplay", "canplaythrough", "loadstart", "loadedmetadata", + "loadeddata", "playing", "ended", "error", "stalled", "emptied", "abort", + "waiting", "pause"]; + function logEvent(e) { + var v = e.target; + info(v.token + ": got " + e.type); + } + events.forEach(function(e) { + element.addEventListener(e, logEvent, false); + }); + +} + + +manager.runTests(createTestArray(), startTest); + +</script> +</pre> +</body> +</html> |