summaryrefslogtreecommitdiffstats
path: root/dom/media/test/test_info_leak.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/test/test_info_leak.html')
-rw-r--r--dom/media/test/test_info_leak.html175
1 files changed, 175 insertions, 0 deletions
diff --git a/dom/media/test/test_info_leak.html b/dom/media/test/test_info_leak.html
new file mode 100644
index 0000000000..41b01c74c1
--- /dev/null
+++ b/dom/media/test/test_info_leak.html
@@ -0,0 +1,175 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=478957
+-->
+<head>
+ <title>Test for Bug 478957</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=478957">Mozilla Bug 478957</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+
+<div id="log" style="font-size: small;"></div>
+
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 478957 **/
+
+// Tests whether we leak events and state change info when loading stuff from local files from a webserver.
+
+var manager = new MediaTestManager;
+
+var gEventTypes = [ 'loadstart', 'progress', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'play', 'pause', 'loadedmetadata', 'loadeddata', 'waiting', 'playing', 'canplay', 'canplaythrough', 'seeking', 'seeked', 'timeupdate', 'ended', 'ratechange', 'durationchange', 'volumechange' ];
+
+var gExpectedEvents = ['loadstart', 'error'];
+
+function createTestArray() {
+ var tests = [];
+ var tmpVid = document.createElement("video");
+
+ return makeInfoLeakTests().then(infoLeakTests => {
+ for (var testNum=0; testNum < infoLeakTests.length; testNum++) {
+ var test = infoLeakTests[testNum];
+ if (!tmpVid.canPlayType(test.type)) {
+ continue;
+ }
+
+ var t = {};
+ t.name = test.src;
+ t.type = test.type;
+
+ tests.push(t);
+ }
+ return tests;
+ })
+}
+
+function log(msg) {
+ info(msg);
+ var l = document.getElementById('log');
+ // eslint-disable-next-line no-unsanitized/property
+ l.innerHTML += msg + "<br>";
+}
+
+function finish(v) {
+ log("finish: " + v.name);
+ clearInterval(v.checkStateInterval);
+
+ for (var i=0; i<gEventTypes.length; i++) {
+ v.removeEventListener(gEventTypes[i], listener);
+ }
+ removeNodeAndSource(v);
+
+ manager.finished(v.token);
+ v = null;
+}
+
+function listener(evt) {
+ var v = evt.target;
+ log(filename(v.name) + ': got ' + evt.type);
+
+ // On slow machines like B2G emulator, progress timer could time out before
+ // receiving any HTTP notification. We will ignore the 'stalled' event to
+ // pass the tests.
+ if (evt.type == 'stalled') {
+ return;
+ }
+
+ ok(v.eventNum < gExpectedEvents.length, filename(v.name) + " Too many events received");
+ var expected = (v.eventNum < gExpectedEvents.length) ? gExpectedEvents[v.eventNum] : "NoEvent";
+ is(evt.type, expected, filename(v.name) + " Events received in wrong order");
+ v.eventNum++;
+ if (v.eventNum == gExpectedEvents.length) {
+ // In one second, move onto the next test. This give a chance for any
+ // other events to come in. Note: we don't expect any events to come
+ // in, unless we've leaked some info, and 1 second should be enough time
+ // for the leak to show up.
+ setTimeout(function() {finish(v);}, 1000);
+ }
+}
+
+function createMedia(type, src, token) {
+ var tag = getMajorMimeType(type);
+ var v = document.createElement(tag);
+ for (var i=0; i<gEventTypes.length; i++) {
+ v.addEventListener(gEventTypes[i], listener);
+ }
+ v.preload = "metadata";
+ v.src = src;
+ v.name = src;
+ document.body.appendChild(v);
+ v.eventNum = 0;
+ v.token = token;
+ setTimeout(
+ function() {
+ v.checkStateInterval = setInterval(function(){checkState(v);},1);
+ }, 0);
+}
+
+// Define our own ok() and is() functions. The mochitest ones take ages constructing the log
+// of all the passes, so only report failures.
+function test_ok(b, msg) {
+ if (!b) {
+ log("FAILED test_ok: " + msg);
+ ok(b, msg);
+ }
+}
+
+function test_is(a, b, msg) {
+ if (a != b) {
+ log("FAILED test_is: " + msg);
+ is(a,b,msg);
+ }
+}
+
+function filename(uri) {
+ return uri.substr(uri.lastIndexOf("/")+1);
+}
+
+function checkState(v) {
+ test_ok(v.networkState <= HTMLMediaElement.NETWORK_LOADING ||
+ v.networkState == HTMLMediaElement.NETWORK_NO_SOURCE,
+ "NetworkState of " + v.networkState + " was leaked.");
+ test_ok(v.readyState == HTMLMediaElement.HAVE_NOTHING,
+ "Ready state of " + v.readyState + " was leaked");
+ test_is(v.seeking, false, "Seeking leaked");
+ test_is(v.currentTime, 0, "Leaked currentTime");
+ test_ok(isNaN(v.duration), "Leaked duration");
+ test_is(v.paused, true, "Paused leaked");
+ test_is(v.ended, false, "Ended leaked");
+ test_is(v.autoplay, false, "Autoplay leaked");
+ test_is(v.controls, false, "Controls leaked");
+ test_is(v.muted, false, "muted leaked");
+ test_ok(v.error==null || v.error.code==MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,
+ "Error code should not exist or be SRC_NOT_SUPPORTED. v.error=" +
+ (v.error ? v.error.code : "null"));
+ test_ok(filename(v.currentSrc) == filename(v.name) ||
+ v.networkState == HTMLMediaElement.NETWORK_NO_SOURCE,
+ "currentSrc should match candidate uri, if we've got a valid source");
+}
+
+
+function startTest(test, token) {
+ manager.started(token);
+ log("Testing: " + test.type + " @ " + test.name);
+ createMedia(test.type, test.name, token);
+}
+
+SimpleTest.waitForExplicitFinish();
+createTestArray().then(testArray => {
+ manager.runTests(testArray, startTest);
+});
+
+</script>
+</pre>
+
+</body>
+</html>