Home | History | Annotate | Download | only in ManualTests
      1 <html>
      2 <head>
      3 <script>
      4 function log(m) {
      5     document.getElementById("log").innerHTML += m + "<br>";
      6 }
      7 
      8 var multiplyFactor = 2;   // Create this many timers in every timer callback.
      9 var targetLatency = 10000; // Multiply timers until it takes this much to fire all their callbacks.
     10 var timerCount = 1;
     11 
     12 function timerCallback(creationTimestamp) {
     13     --timerCount;
     14 
     15     if (!multiplyFactor) {
     16         if (timerCount == 0)
     17             log("No more timers - UI should be responsive now.");
     18         return;
     19     }
     20 
     21     // Create more timers. Capture the current time so when callbacks are fired,
     22     // we can check how long it actually took (latency caused by a long timer queue).
     23     var timestamp = new Date().getTime();
     24     for (i = 0; i < multiplyFactor; ++i) {
     25         setTimeout(function() { timerCallback(timestamp); }, 0);
     26         ++timerCount;
     27     }
     28 
     29     // Once the timer queue gets long enough for the timer firing latency to be over the limit,
     30     // stop multplying them and keep the number of timers constant.
     31     if (multiplyFactor > 1 && new Date().getTime() - creationTimestamp > targetLatency)
     32         multiplyFactor = 1;
     33 }
     34 
     35 function runTest() {
     36     log("Freezing UI...");
     37     setTimeout(function() { timerCallback(new Date().getTime()); }, 0);
     38     setTimeout("multiplyFactor = 0; log('Finishing. Started to drain timers.');", 10000);
     39 }
     40 
     41 </script>
     42 </head>
     43 <body onload="runTest()">
     44 This test will create enough timers to freeze browser UI. After 10 seconds, it
     45 will start drain the timers so the UI becomes responsive again in a few seconds.
     46 You don't need to kill the browser.<br>If the bug is fixed, there will be no
     47 UI freeze. Refresh the page to repeat the experiment.<br>Try to click at this
     48 button (or browser's menu) while UI is frozen: <button onclick="log('clicked')">Click Me</button> <hr>
     49 <div id="log"></div>
     50 </body>
     51 </html>
     52