content/media/test/test_info_leak.html

Fri, 16 Jan 2015 04:50:19 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Fri, 16 Jan 2015 04:50:19 +0100
branch
TOR_BUG_9701
changeset 13
44a2da4a2ab2
permissions
-rw-r--r--

Replace accessor implementation with direct member state manipulation, by
request https://trac.torproject.org/projects/tor/ticket/9701#comment:32

     1 <!DOCTYPE HTML>
     2 <html>
     3 <!--
     4 https://bugzilla.mozilla.org/show_bug.cgi?id=478957
     5 -->
     6 <head>
     7   <title>Test for Bug 478957</title>
     8   <script type="application/javascript" 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>
    11 </head>
    12 <body>
    13 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=478957">Mozilla Bug 478957</a>
    14 <p id="display"></p>
    15 <div id="content" style="display: none">
    17 </div>
    19 <div id="log" style="font-size: small;"></div>
    21 <pre id="test">
    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 = ['ratechange', 'loadstart', 'error'];
    34 function createTestArray() {
    35   var tests = [];
    36   var tmpVid = document.createElement("video");
    38   for (var testNum=0; testNum<gInfoLeakTests.length; testNum++) {
    39     var test = gInfoLeakTests[testNum];
    40     if (!tmpVid.canPlayType(test.type)) {
    41       continue;
    42     }
    44     var t = new Object;
    45     t.name = test.src;
    46     t.type = test.type;
    48     tests.push(t);
    49   }
    50   return tests;
    51 }
    53 function log(msg) {
    54   //dump(msg + "\n");
    55   var l = document.getElementById('log');
    56   l.innerHTML += msg + "<br>";
    57 }
    59 function finish(v) {
    60   log("finish: " + v.name);
    61   v.parentNode.removeChild(v);
    62   clearInterval(v.checkStateInterval);
    63   manager.finished(v.token);
    64   v = null;
    65 }
    67 function listener(evt) {
    68   var v = evt.target;
    69   //log(filename(v.name) + ' got event ' + evt.type);
    70   ok(v.eventNum < gExpectedEvents.length, filename(v.name)  + " Too many events received");
    71   var expected = (v.eventNum < gExpectedEvents.length) ? gExpectedEvents[v.eventNum] : "NoEvent";
    72   is(evt.type, expected, filename(v.name) + " Events received in wrong order");
    73   v.eventNum++;
    74   if (v.eventNum == gExpectedEvents.length) {
    75     // In one second, move onto the next test. This give a chance for any
    76     // other events to come in. Note: we don't expect any events to come
    77     // in, unless we've leaked some info, and 1 second should be enough time
    78     // for the leak to show up.
    79     setTimeout(function() {finish(v);}, 1000); 
    80   }
    81 }
    83 function createMedia(type, src, token) {
    84   var tag = getMajorMimeType(test.type);
    85   var v = document.createElement(tag);
    86   for (var i=0; i<gEventTypes.length; i++) {
    87     v.addEventListener(gEventTypes[i], listener, false);
    88   }
    89   v.src = src;
    90   v.name = src;
    91   document.body.appendChild(v);
    92   v.eventNum = 0;
    93   v.token = token;
    94   setTimeout(
    95   function() {
    96     v.checkStateInterval = setInterval(function(){checkState(v);},1);
    97   }, 0);
    98 }
   100 // Define our own ok() and is() functions. The mochitest ones take ages constructing the log
   101 // of all the passes, so only report failures.
   102 function test_ok(b, msg) {
   103   if (!b) {
   104     log("FAILED test_ok: " + msg);
   105     ok(b, msg);
   106   }
   107 }
   109 function test_is(a, b, msg) {
   110   if (a != b) {
   111     log("FAILED test_is: " + msg);
   112     is(a,b,msg);
   113   }
   114 }
   116 function filename(uri) {
   117   return uri.substr(uri.lastIndexOf("/")+1);
   118 }
   120 function checkState(v) {
   121   test_ok(v.networkState <= HTMLMediaElement.NETWORK_LOADING || 
   122           v.networkState == HTMLMediaElement.NETWORK_NO_SOURCE,
   123           "NetworkState of " + v.networkState + " was leaked.");
   124   test_ok(v.readyState == HTMLMediaElement.HAVE_NOTHING,
   125           "Ready state of " + v.readyState + " was leaked");
   126   test_is(v.seeking, false, "Seeking leaked");
   127   test_is(v.currentTime, 0, "Leaked currentTime");
   128   test_ok(isNaN(v.duration), "Leaked duration");
   129   test_is(v.paused, true, "Paused leaked");
   130   test_is(v.ended, false, "Ended leaked");
   131   test_is(v.autoplay, false, "Autoplay leaked");
   132   test_is(v.controls, false, "Controls leaked");
   133   test_is(v.muted, false, "muted leaked");
   134   test_ok(v.error==null || v.error.code==MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,
   135           "Error code should not exist or be SRC_NOT_SUPPORTED. v.error=" +
   136           (v.error ? v.error.code : "null"));
   137   test_ok(filename(v.currentSrc) == filename(v.name) ||
   138           v.networkState == HTMLMediaElement.NETWORK_NO_SOURCE,
   139           "currentSrc should match candidate uri, if we've got a valid source");
   140 }
   143 function startTest(test, token) {
   144   manager.started(token);
   145   log("Testing: " + test.type + " @ " + test.name);
   146   createMedia(test.type, test.name, token);  
   147 }
   149 manager.runTests(createTestArray(), startTest);
   151 </script>
   152 </pre>
   154 </body>
   155 </html>

mercurial