1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/content/media/test/test_info_leak.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,155 @@ 1.4 +<!DOCTYPE HTML> 1.5 +<html> 1.6 +<!-- 1.7 +https://bugzilla.mozilla.org/show_bug.cgi?id=478957 1.8 +--> 1.9 +<head> 1.10 + <title>Test for Bug 478957</title> 1.11 + <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> 1.12 + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 1.13 + <script type="text/javascript" src="manifest.js"></script> 1.14 +</head> 1.15 +<body> 1.16 +<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=478957">Mozilla Bug 478957</a> 1.17 +<p id="display"></p> 1.18 +<div id="content" style="display: none"> 1.19 + 1.20 +</div> 1.21 + 1.22 +<div id="log" style="font-size: small;"></div> 1.23 + 1.24 +<pre id="test"> 1.25 +<script type="application/javascript"> 1.26 + 1.27 +/** Test for Bug 478957 **/ 1.28 + 1.29 +// Tests whether we leak events and state change info when loading stuff from local files from a webserver. 1.30 + 1.31 +var manager = new MediaTestManager; 1.32 + 1.33 +var gEventTypes = [ 'loadstart', 'progress', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'play', 'pause', 'loadedmetadata', 'loadeddata', 'waiting', 'playing', 'canplay', 'canplaythrough', 'seeking', 'seeked', 'timeupdate', 'ended', 'ratechange', 'durationchange', 'volumechange' ]; 1.34 + 1.35 +var gExpectedEvents = ['ratechange', 'loadstart', 'error']; 1.36 + 1.37 +function createTestArray() { 1.38 + var tests = []; 1.39 + var tmpVid = document.createElement("video"); 1.40 + 1.41 + for (var testNum=0; testNum<gInfoLeakTests.length; testNum++) { 1.42 + var test = gInfoLeakTests[testNum]; 1.43 + if (!tmpVid.canPlayType(test.type)) { 1.44 + continue; 1.45 + } 1.46 + 1.47 + var t = new Object; 1.48 + t.name = test.src; 1.49 + t.type = test.type; 1.50 + 1.51 + tests.push(t); 1.52 + } 1.53 + return tests; 1.54 +} 1.55 + 1.56 +function log(msg) { 1.57 + //dump(msg + "\n"); 1.58 + var l = document.getElementById('log'); 1.59 + l.innerHTML += msg + "<br>"; 1.60 +} 1.61 + 1.62 +function finish(v) { 1.63 + log("finish: " + v.name); 1.64 + v.parentNode.removeChild(v); 1.65 + clearInterval(v.checkStateInterval); 1.66 + manager.finished(v.token); 1.67 + v = null; 1.68 +} 1.69 + 1.70 +function listener(evt) { 1.71 + var v = evt.target; 1.72 + //log(filename(v.name) + ' got event ' + evt.type); 1.73 + ok(v.eventNum < gExpectedEvents.length, filename(v.name) + " Too many events received"); 1.74 + var expected = (v.eventNum < gExpectedEvents.length) ? gExpectedEvents[v.eventNum] : "NoEvent"; 1.75 + is(evt.type, expected, filename(v.name) + " Events received in wrong order"); 1.76 + v.eventNum++; 1.77 + if (v.eventNum == gExpectedEvents.length) { 1.78 + // In one second, move onto the next test. This give a chance for any 1.79 + // other events to come in. Note: we don't expect any events to come 1.80 + // in, unless we've leaked some info, and 1 second should be enough time 1.81 + // for the leak to show up. 1.82 + setTimeout(function() {finish(v);}, 1000); 1.83 + } 1.84 +} 1.85 + 1.86 +function createMedia(type, src, token) { 1.87 + var tag = getMajorMimeType(test.type); 1.88 + var v = document.createElement(tag); 1.89 + for (var i=0; i<gEventTypes.length; i++) { 1.90 + v.addEventListener(gEventTypes[i], listener, false); 1.91 + } 1.92 + v.src = src; 1.93 + v.name = src; 1.94 + document.body.appendChild(v); 1.95 + v.eventNum = 0; 1.96 + v.token = token; 1.97 + setTimeout( 1.98 + function() { 1.99 + v.checkStateInterval = setInterval(function(){checkState(v);},1); 1.100 + }, 0); 1.101 +} 1.102 + 1.103 +// Define our own ok() and is() functions. The mochitest ones take ages constructing the log 1.104 +// of all the passes, so only report failures. 1.105 +function test_ok(b, msg) { 1.106 + if (!b) { 1.107 + log("FAILED test_ok: " + msg); 1.108 + ok(b, msg); 1.109 + } 1.110 +} 1.111 + 1.112 +function test_is(a, b, msg) { 1.113 + if (a != b) { 1.114 + log("FAILED test_is: " + msg); 1.115 + is(a,b,msg); 1.116 + } 1.117 +} 1.118 + 1.119 +function filename(uri) { 1.120 + return uri.substr(uri.lastIndexOf("/")+1); 1.121 +} 1.122 + 1.123 +function checkState(v) { 1.124 + test_ok(v.networkState <= HTMLMediaElement.NETWORK_LOADING || 1.125 + v.networkState == HTMLMediaElement.NETWORK_NO_SOURCE, 1.126 + "NetworkState of " + v.networkState + " was leaked."); 1.127 + test_ok(v.readyState == HTMLMediaElement.HAVE_NOTHING, 1.128 + "Ready state of " + v.readyState + " was leaked"); 1.129 + test_is(v.seeking, false, "Seeking leaked"); 1.130 + test_is(v.currentTime, 0, "Leaked currentTime"); 1.131 + test_ok(isNaN(v.duration), "Leaked duration"); 1.132 + test_is(v.paused, true, "Paused leaked"); 1.133 + test_is(v.ended, false, "Ended leaked"); 1.134 + test_is(v.autoplay, false, "Autoplay leaked"); 1.135 + test_is(v.controls, false, "Controls leaked"); 1.136 + test_is(v.muted, false, "muted leaked"); 1.137 + test_ok(v.error==null || v.error.code==MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED, 1.138 + "Error code should not exist or be SRC_NOT_SUPPORTED. v.error=" + 1.139 + (v.error ? v.error.code : "null")); 1.140 + test_ok(filename(v.currentSrc) == filename(v.name) || 1.141 + v.networkState == HTMLMediaElement.NETWORK_NO_SOURCE, 1.142 + "currentSrc should match candidate uri, if we've got a valid source"); 1.143 +} 1.144 + 1.145 + 1.146 +function startTest(test, token) { 1.147 + manager.started(token); 1.148 + log("Testing: " + test.type + " @ " + test.name); 1.149 + createMedia(test.type, test.name, token); 1.150 +} 1.151 + 1.152 +manager.runTests(createTestArray(), startTest); 1.153 + 1.154 +</script> 1.155 +</pre> 1.156 + 1.157 +</body> 1.158 +</html>