4 https://bugzilla.mozilla.org/show_bug.cgi?id=478957
7 <title>Test for Bug
478957</title>
8 <script src=
"/tests/SimpleTest/SimpleTest.js"></script>
9 <link rel=
"stylesheet" type=
"text/css" href=
"/tests/SimpleTest/test.css"/>
10 <script type=
"text/javascript" src=
"manifest.js"></script>
13 <a target=
"_blank" href=
"https://bugzilla.mozilla.org/show_bug.cgi?id=478957">Mozilla Bug
478957</a>
15 <div id=
"content" style=
"display: none">
19 <div id=
"log" style=
"font-size: small;"></div>
22 <script type=
"application/javascript">
24 /** Test for Bug
478957 **/
26 // Tests whether we leak events and state change info when loading stuff from local files from a webserver.
28 var manager = new MediaTestManager;
30 var gEventTypes = [ 'loadstart', 'progress', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'play', 'pause', 'loadedmetadata', 'loadeddata', 'waiting', 'playing', 'canplay', 'canplaythrough', 'seeking', 'seeked', 'timeupdate', 'ended', 'ratechange', 'durationchange', 'volumechange' ];
32 var gExpectedEvents = ['loadstart', 'error'];
34 function createTestArray() {
36 var tmpVid = document.createElement(
"video");
38 return makeInfoLeakTests().then(infoLeakTests =
> {
39 for (var testNum=
0; testNum < infoLeakTests.length; testNum++) {
40 var test = infoLeakTests[testNum];
41 if (!tmpVid.canPlayType(test.type)) {
57 var l = document.getElementById('log');
58 // eslint-disable-next-line no-unsanitized/property
59 l.innerHTML += msg +
"<br>";
63 log(
"finish: " + v.name);
64 clearInterval(v.checkStateInterval);
66 for (var i=
0; i
<gEventTypes.length; i++) {
67 v.removeEventListener(gEventTypes[i], listener);
69 removeNodeAndSource(v);
71 manager.finished(v.token);
75 function listener(evt) {
77 log(filename(v.name) + ': got ' + evt.type);
79 // On slow machines like B2G emulator, progress timer could time out before
80 // receiving any HTTP notification. We will ignore the 'stalled' event to
82 if (evt.type == 'stalled') {
86 ok(v.eventNum < gExpectedEvents.length, filename(v.name) +
" Too many events received");
87 var expected = (v.eventNum < gExpectedEvents.length) ? gExpectedEvents[v.eventNum] :
"NoEvent";
88 is(evt.type, expected, filename(v.name) +
" Events received in wrong order");
90 if (v.eventNum == gExpectedEvents.length) {
91 // In one second, move onto the next test. This give a chance for any
92 // other events to come in. Note: we don't expect any events to come
93 // in, unless we've leaked some info, and
1 second should be enough time
94 // for the leak to show up.
95 setTimeout(function() {finish(v);},
1000);
99 function createMedia(type, src, token) {
100 var tag = getMajorMimeType(type);
101 var v = document.createElement(tag);
102 for (var i=
0; i
<gEventTypes.length; i++) {
103 v.addEventListener(gEventTypes[i], listener);
105 v.preload =
"metadata";
108 document.body.appendChild(v);
113 v.checkStateInterval = setInterval(function(){checkState(v);},
1);
117 // Define our own ok() and is() functions. The mochitest ones take ages constructing the log
118 // of all the passes, so only report failures.
119 function test_ok(b, msg) {
121 log(
"FAILED test_ok: " + msg);
126 function test_is(a, b, msg) {
128 log(
"FAILED test_is: " + msg);
133 function filename(uri) {
134 return uri.substr(uri.lastIndexOf(
"/")+
1);
137 function checkState(v) {
138 test_ok(v.networkState <= HTMLMediaElement.NETWORK_LOADING ||
139 v.networkState == HTMLMediaElement.NETWORK_NO_SOURCE,
140 "NetworkState of " + v.networkState +
" was leaked.");
141 test_ok(v.readyState == HTMLMediaElement.HAVE_NOTHING,
142 "Ready state of " + v.readyState +
" was leaked");
143 test_is(v.seeking, false,
"Seeking leaked");
144 test_is(v.currentTime,
0,
"Leaked currentTime");
145 test_ok(isNaN(v.duration),
"Leaked duration");
146 test_is(v.paused, true,
"Paused leaked");
147 test_is(v.ended, false,
"Ended leaked");
148 test_is(v.autoplay, false,
"Autoplay leaked");
149 test_is(v.controls, false,
"Controls leaked");
150 test_is(v.muted, false,
"muted leaked");
151 test_ok(v.error==null || v.error.code==MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,
152 "Error code should not exist or be SRC_NOT_SUPPORTED. v.error=" +
153 (v.error ? v.error.code :
"null"));
154 test_ok(filename(v.currentSrc) == filename(v.name) ||
155 v.networkState == HTMLMediaElement.NETWORK_NO_SOURCE,
156 "currentSrc should match candidate uri, if we've got a valid source");
160 function startTest(test, token) {
161 manager.started(token);
162 log(
"Testing: " + test.type +
" @ " + test.name);
163 createMedia(test.type, test.name, token);
166 SimpleTest.waitForExplicitFinish();
167 createTestArray().then(testArray =
> {
168 manager.runTests(testArray, startTest);