summaryrefslogtreecommitdiffstats
path: root/dom/media/test/test_preload_actions.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/test/test_preload_actions.html')
-rw-r--r--dom/media/test/test_preload_actions.html582
1 files changed, 582 insertions, 0 deletions
diff --git a/dom/media/test/test_preload_actions.html b/dom/media/test/test_preload_actions.html
new file mode 100644
index 0000000000..a9de54988c
--- /dev/null
+++ b/dom/media/test/test_preload_actions.html
@@ -0,0 +1,582 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=548523
+-->
+<head>
+ <title>Test for Bug 548523</title>
+ <script 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>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=548523">Mozilla Bug 548523</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<!-- <button onClick="SimpleTest.finish();">Finish</button> -->
+<div>Tests complete: <span id="log" style="font-size: small;"></span></div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 548523 **/
+
+SimpleTest.requestCompleteLog();
+var manager = new MediaTestManager;
+
+manager.onFinished = function() {
+ is(gotLoadEvent, true, "Should not have delayed the load event indefinitely");
+};
+
+var test = getPlayableVideo(gSeekTests);
+var baseName = test.name;
+var gTest = test;
+var bogusSrc = "bogus.duh";
+var bogusType = "video/bogus";
+var gotLoadEvent = false;
+var finished = false;
+
+addLoadEvent(function() {gotLoadEvent=true;});
+
+function log(m) {
+ var l = document.getElementById("log");
+ // eslint-disable-next-line no-unsanitized/property
+ l.innerHTML += m;
+}
+
+function maybeFinish(v, n) {
+ if (v._finished) {
+ return;
+ }
+ v._finished = true;
+ log(n + ",");
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+}
+
+function filename(uri) {
+ return uri.substr(uri.lastIndexOf("/")+1);
+}
+
+// Every test must have a setup(v) function, and must call maybeFinish() when test is complete.
+var tests = [
+ {
+ // 1. Add preload:none video with src to document. Load should halt at NETWORK_IDLE and HAVE_NOTHING,
+ // after receiving a suspend event. Should not receive loaded events until after we call load().
+ // Note the suspend event is explictly sent by our "stop the load" code, but other tests can't rely
+ // on it for the preload:metadata case, as there can be multiple suspend events when loading metadata.
+ suspend(e) {
+ var v = e.target;
+ is(v._gotLoadStart, true, "(1) Must get loadstart.");
+ is(v._gotLoadedMetaData, false, "(1) Must not get loadedmetadata.");
+ is(v.readyState, v.HAVE_NOTHING, "(1) ReadyState must be HAVE_NOTHING");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(1) NetworkState must be NETWORK_IDLE");
+ maybeFinish(v, 1);
+ },
+
+ setup(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "none";
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;});
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;});
+ v.addEventListener("suspend", this.suspend);
+ v.src = test.name;
+ document.body.appendChild(v); // Causes implicit load, which will be halted due to preload:none.
+ },
+
+ name: "test1",
+ },
+ {
+ // 2. Add preload:metadata video with src to document. Should halt with NETWORK_IDLE, HAVE_CURRENT_DATA
+ // after suspend event and after loadedmetadata.
+ loadeddata(e) {
+ var v = e.target;
+ is(v._gotLoadStart, true, "(2) Must get loadstart.");
+ is(v._gotLoadedMetaData, true, "(2) Must get loadedmetadata.");
+ ok(v.readyState >= v.HAVE_CURRENT_DATA, "(2) ReadyState must be >= HAVE_CURRENT_DATA");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(2) NetworkState must be NETWORK_IDLE");
+ maybeFinish(v, 2);
+ },
+
+ setup(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "metadata";
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;});
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;});
+ v.addEventListener("loadeddata", this.loadeddata);
+ v.src = test.name;
+ document.body.appendChild(v); // Causes implicit load, which will be halted after
+ // metadata due to preload:metadata.
+ },
+
+ name: "test2",
+ },
+ {
+ // 3. Add preload:auto to document. Should receive canplaythrough eventually.
+ canplaythrough(e) {
+ var v = e.target;
+ is(v._gotLoadStart, true, "(3) Must get loadstart.");
+ is(v._gotLoadedMetaData, true, "(3) Must get loadedmetadata.");
+ maybeFinish(v, 3);
+ },
+
+ setup(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "auto";
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;});
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;});
+ v.addEventListener("canplaythrough", this.canplaythrough);
+ v.src = test.name; // Causes implicit load.
+ document.body.appendChild(v);
+ },
+
+ name: "test3",
+ },
+ {
+ // 4. Add preload:none video to document. Call play(), should load then play through.
+ suspend(e) {
+ var v = e.target;
+ if (v._gotSuspend) {
+ return; // We can receive multiple suspend events, like the one after download completes.
+ }
+ v._gotSuspend = true;
+ is(v._gotLoadStart, true, "(4) Must get loadstart.");
+ is(v._gotLoadedMetaData, false, "(4) Must not get loadedmetadata.");
+ is(v.readyState, v.HAVE_NOTHING, "(4) ReadyState must be HAVE_NOTHING");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(4) NetworkState must be NETWORK_IDLE");
+ v.play(); // Should load and play through.
+ },
+
+ ended(e) {
+ ok(true, "(4) Got playback ended");
+ maybeFinish(e.target, 4);
+ },
+
+ setup(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v._gotSuspend = false;
+ v.preload = "none";
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;});
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;});
+ v.addEventListener("suspend", this.suspend);
+ v.addEventListener("ended", this.ended);
+ v.src = test.name;
+ document.body.appendChild(v);
+ },
+
+ name: "test4",
+ },
+ {
+ // 5. preload:none video without resource, add to document, will implicitly start a
+ // preload:none load. Add a src, it shouldn't load.
+ suspend(e) {
+ var v = e.target;
+ is(v._gotLoadStart, true, "(5) Must get loadstart.");
+ is(v._gotLoadedMetaData, false, "(5) Must not get loadedmetadata.");
+ is(v.readyState, v.HAVE_NOTHING, "(5) ReadyState must be HAVE_NOTHING");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(5) NetworkState must be NETWORK_IDLE");
+ maybeFinish(v, 5);
+ },
+
+ setup(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "none";
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;});
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;});
+ v.addEventListener("suspend", this.suspend);
+ document.body.appendChild(v); // Causes implicit load, which will be halted due to no resource.
+ v.src = test.name; // Load should start, and halt at preload:none.
+ },
+
+ name: "test5",
+ },
+ {
+ // 6. preload:none video without resource, add to document, will implicitly start a
+ // preload:none load. Add a source, it shouldn't load.
+ suspend(e) {
+ var v = e.target;
+ is(v._gotLoadStart, true, "(6) Must get loadstart.");
+ is(v._gotLoadedMetaData, false, "(6) Must not get loadedmetadata.");
+ is(v.readyState, v.HAVE_NOTHING, "(6) ReadyState must be HAVE_NOTHING");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(6) NetworkState must be NETWORK_IDLE");
+ maybeFinish(v, 6);
+ },
+
+ setup(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "none";
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;});
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;});
+ v.addEventListener("suspend", this.suspend);
+ document.body.appendChild(v); // Causes implicit load, which will be halted due to no resource.
+ var s = document.createElement("source");
+ s.src = test.name;
+ s.type = test.type;
+ v.appendChild(s); // Load should start, and halt at preload:none.
+ },
+
+ name: "test6",
+ },
+ {
+ // 7. create a preload:none document with multiple sources, the first of which is invalid.
+ // Add to document, then play. It should load and play through the second source.
+ suspend(e) {
+ var v = e.target;
+ if (v._gotSuspend)
+ return; // We can receive multiple suspend events, like the one after download completes.
+ v._gotSuspend = true;
+ is(v._gotLoadStart, true, "(7) Must get loadstart.");
+ is(v._gotLoadedMetaData, false, "(7) Must not get loadedmetadata.");
+ is(v.readyState, v.HAVE_NOTHING, "(7) ReadyState must be HAVE_NOTHING");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(7) NetworkState must be NETWORK_IDLE");
+ v.play(); // Should load and play through.
+ },
+
+ ended(e) {
+ ok(true, "(7) Got playback ended");
+ var v = e.target;
+ is(v._gotErrorEvent, true, "(7) Should get error event from first source load failure");
+ maybeFinish(v, 7);
+ },
+
+ setup(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "none";
+ v._gotErrorEvent = false;
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;});
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;});
+ v.addEventListener("suspend", this.suspend);
+ v.addEventListener("ended", this.ended);
+ var s1 = document.createElement("source");
+ s1.src = "not-a-real-file.404"
+ s1.type = test.type;
+ s1.addEventListener("error", function(e){v._gotErrorEvent = true;});
+ v.appendChild(s1);
+ var s2 = document.createElement("source");
+ s2.src = test.name;
+ s2.type = test.type;
+ v.appendChild(s2);
+ document.body.appendChild(v); // Causes implicit load, which will be halt at preload:none on the second resource.
+ },
+
+ name: "test7",
+ },
+ {
+ // 8. Change preload value from none to metadata should cause metadata to be loaded.
+ loadeddata(e) {
+ var v = e.target;
+ is(v._gotLoadedMetaData, true, "(8) Must get loadedmetadata.");
+ ok(v.readyState >= v.HAVE_CURRENT_DATA, "(8) ReadyState must be >= HAVE_CURRENT_DATA on suspend.");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(8) NetworkState must be NETWORK_IDLE when load is halted");
+ maybeFinish(v, 8);
+ },
+
+ setup(v) {
+ v._gotLoadedMetaData = false;
+ v.preload = "none";
+ v.addEventListener("loadstart", function(e){v.preload = "metadata";});
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;});
+ v.addEventListener("loadeddata", this.loadeddata);
+ v.src = test.name; // Causes implicit load.
+ document.body.appendChild(v);
+ },
+
+ name: "test8",
+ },
+ /*{
+ // 9. Change preload value from metadata to auto should cause entire media to be loaded.
+ // For some reason we don't always receive the canplaythrough event, particuarly on this test.
+ // We've disabled this test until bug 568402 is fixed.
+ canplaythrough:
+ function(e) {
+ var v = e.target;
+ is(v._gotLoadStart, true, "(9) Must get loadstart.");
+ is(v._gotLoadedMetaData, true, "(9) Must get loadedmetadata.");
+ maybeFinish(v, 9);
+ },
+
+ setup:
+ function(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "metadata";
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false);
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false);
+ v.addEventListener("loadeddata", function(){v.preload = "auto"}, false);
+ v.addEventListener("canplaythrough", this.canplaythrough, false);
+ v.src = test.name; // Causes implicit load.
+ document.body.appendChild(v);
+ },
+ },*/
+ {
+ // 10. Change preload value from none to auto should cause entire media to be loaded.
+ canplaythrough(e) {
+ var v = e.target;
+ is(v._gotLoadedMetaData, true, "(10) Must get loadedmetadata.");
+ maybeFinish(v, 10);
+ },
+
+ setup(v) {
+ v._gotLoadedMetaData = false;
+ v.preload = "none";
+ v.addEventListener("loadstart", function(e){v.preload = "auto";});
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;});
+ v.addEventListener("canplaythrough", this.canplaythrough);
+ v.src = test.name; // Causes implicit load.
+ document.body.appendChild(v);
+ },
+
+ name: "test10",
+ },
+ {
+ // 11. Change preload value from none to metadata should cause metadata to load.
+ loadeddata(e) {
+ var v = e.target;
+ is(v._gotLoadedMetaData, true, "(11) Must get loadedmetadata.");
+ ok(v.readyState >= v.HAVE_CURRENT_DATA, "(11) ReadyState must be >= HAVE_CURRENT_DATA.");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(11) NetworkState must be NETWORK_IDLE.");
+ maybeFinish(v, 11);
+ },
+
+ setup(v) {
+ v._gotLoadedMetaData = false;
+ v.preload = "none";
+ v.addEventListener("loadstart", function(e){v.preload = "metadata";});
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;});
+ v.addEventListener("loadeddata", this.loadeddata);
+ v.src = test.name; // Causes implicit load.
+ document.body.appendChild(v);
+ },
+
+ name: "test11",
+ },
+ {
+ // 13. Change preload value from auto to none after specifying a src
+ // should load according to preload none, no buffering should have taken place
+ suspend(e) {
+ var v = e.target;
+ is(v._gotLoadStart, true, "(13) Must get loadstart.");
+ is(v._gotLoadedMetaData, false, "(13) Must not get loadedmetadata.");
+ is(v.readyState, v.HAVE_NOTHING, "(13) ReadyState must be HAVE_NOTHING");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(13) NetworkState must be NETWORK_IDLE");
+ maybeFinish(v, 13);
+ },
+
+ setup(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "auto";
+ v.src = test.name;
+ v.preload = "none";
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;});
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;});
+ v.addEventListener("suspend", this.suspend);
+ document.body.appendChild(v); // Causes implicit load, should load according to preload none
+ document.createElement("source");
+ },
+
+ name: "test13",
+ },
+ {
+ // 14. Add preload:metadata video with src to document. Play(), should play through.
+ loadeddata(e) {
+ var v = e.target;
+ is(v._gotLoadStart, true, "(14) Must get loadstart.");
+ is(v._gotLoadedMetaData, true, "(14) Must get loadedmetadata.");
+ ok(v.readyState >= v.HAVE_CURRENT_DATA, "(14) ReadyState must be >= HAVE_CURRENT_DATA");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(14) NetworkState must be NETWORK_IDLE");
+ v.play();
+ },
+
+ ended(e) {
+ ok(true, "(14) Got playback ended");
+ var v = e.target;
+ maybeFinish(v, 14);
+ },
+
+ setup(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "metadata";
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;});
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;});
+ v.addEventListener("ended", this.ended);
+ v.addEventListener("loadeddata", this.loadeddata);
+ v.src = test.name;
+ document.body.appendChild(v); // Causes implicit load, which will be halted after
+ // metadata due to preload:metadata.
+ },
+
+ name: "test14",
+ },
+ {
+ // 15. Autoplay should override preload:none.
+ ended(e) {
+ ok(true, "(15) Got playback ended.");
+ var v = e.target;
+ maybeFinish(v, 15);
+ },
+
+ setup(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "none";
+ v.autoplay = true;
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;});
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;});
+ v.addEventListener("ended", this.ended);
+ v.src = test.name; // Causes implicit load.
+ document.body.appendChild(v);
+
+ // Log events for debugging.
+ var events = ["suspend", "play", "canplay", "canplaythrough", "loadstart", "loadedmetadata",
+ "loadeddata", "playing", "ended", "error", "stalled", "emptied", "abort",
+ "waiting", "pause"];
+ function logEvent(e) {
+ info(e.target.token + ": got " + e.type);
+ }
+ events.forEach(function(e) {
+ v.addEventListener(e, logEvent);
+ });
+ },
+
+ name: "test15",
+ },
+ {
+ // 16. Autoplay should override preload:metadata.
+ ended(e) {
+ ok(true, "(16) Got playback ended.");
+ var v = e.target;
+ maybeFinish(v, 16);
+ },
+
+ setup(v) {
+ v.preload = "metadata";
+ v.autoplay = true;
+ v.addEventListener("ended", this.ended);
+ v.src = test.name; // Causes implicit load.
+ document.body.appendChild(v);
+ },
+
+ name: "test16",
+ },
+ {
+ // 17. On a preload:none video, adding autoplay should disable preload none, i.e. don't break autoplay!
+ ended(e) {
+ ok(true, "(17) Got playback ended.");
+ var v = e.target;
+ maybeFinish(v, 17);
+ },
+
+ setup(v) {
+ v.addEventListener("ended", this.ended);
+ v.preload = "none";
+ document.body.appendChild(v); // Causes implicit load, which will be halted due to preload:none.
+ v.autoplay = true;
+ v.src = test.name;
+ },
+
+ name: "test17",
+ },
+ {
+ // 18. On a preload='none' video, call play() before load algorithms's sync
+ // has run, the play() call should override preload='none'.
+ ended(e) {
+ ok(true, "(18) Got playback ended.");
+ var v = e.target;
+ maybeFinish(v, 18);
+ },
+
+ setup(v) {
+ v.addEventListener("ended", this.ended);
+ v.preload = "none";
+ v.src = test.name; // Schedules async section to continue load algorithm.
+ document.body.appendChild(v);
+ v.play(); // Should cause preload:none to be overridden.
+ },
+
+ name: "test18",
+ },
+ {
+ // 19. Set preload='auto' on first video source then switching preload='none' and swapping the video source to another.
+ // The second video should not start playing as it's preload state has been changed to 'none' from 'auto'
+ setup(v) {
+ v.preload = "auto";
+ v.src = test.name;
+ // add a listener for when the video has loaded, so we know preload auto has worked
+ v.onloadedmetadata = function() {
+ is(v.preload, "auto", "(19) preload is initially auto");
+ // set preload state to none and switch video sources
+ v.preload="none";
+ v.src = test.name + "?asdf";
+
+ v.onloadedmetadata = function() {
+ ok(false, "(19) 'loadedmetadata' shouldn't fire when preload is none");
+ }
+
+ var ontimeout = function() {
+ v.removeEventListener("suspend", onsuspend);
+ ok(false, "(19) 'suspend' should've fired");
+ maybeFinish(v, 19);
+ }
+ var cancel = setTimeout(ontimeout, 10000);
+
+ var onsuspend = function() {
+ v.removeEventListener("suspend", onsuspend);
+ clearTimeout(cancel);
+ is(v.readyState, 0, "(19) no buffering has taken place");
+ maybeFinish(v, 19);
+ }
+ v.addEventListener("suspend", onsuspend);
+ }
+ document.body.appendChild(v);
+ },
+
+ name: "test19",
+ }
+];
+
+var iterationCount = 0;
+function startTest(t, token) {
+ if (t == tests[0]) {
+ ++iterationCount;
+ info("iterationCount=" + iterationCount);
+ }
+ if (iterationCount == 2) {
+ // Do this series of tests on logically different resources
+ t.name = baseName + "?" + Math.floor(Math.random()*100000);
+ }
+ var v = document.createElement("video");
+ v.token = token;
+ t.setup(v);
+ manager.started(token);
+}
+
+var twiceTests = tests.concat(tests);
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({"set": [["media.cache_size", 40000]]}, beginTest);
+function beginTest() {
+ manager.runTests(twiceTests, startTest);
+}
+</script>
+</pre>
+</body>
+</html>