WebCore/manual-tests/input-starved-by-timers.html
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     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>