| <html> |
| <head> |
| <script> |
| function log(m) { |
| document.getElementById("log").innerHTML += m + "<br>"; |
| } |
| |
| var multiplyFactor = 2; // Create this many timers in every timer callback. |
| var targetLatency = 10000; // Multiply timers until it takes this much to fire all their callbacks. |
| var timerCount = 1; |
| |
| function timerCallback(creationTimestamp) { |
| --timerCount; |
| |
| if (!multiplyFactor) { |
| if (timerCount == 0) |
| log("No more timers - UI should be responsive now."); |
| return; |
| } |
| |
| // Create more timers. Capture the current time so when callbacks are fired, |
| // we can check how long it actually took (latency caused by a long timer queue). |
| var timestamp = new Date().getTime(); |
| for (i = 0; i < multiplyFactor; ++i) { |
| setTimeout(function() { timerCallback(timestamp); }, 0); |
| ++timerCount; |
| } |
| |
| // Once the timer queue gets long enough for the timer firing latency to be over the limit, |
| // stop multplying them and keep the number of timers constant. |
| if (multiplyFactor > 1 && new Date().getTime() - creationTimestamp > targetLatency) |
| multiplyFactor = 1; |
| } |
| |
| function runTest() { |
| log("Freezing UI..."); |
| setTimeout(function() { timerCallback(new Date().getTime()); }, 0); |
| setTimeout("multiplyFactor = 0; log('Finishing. Started to drain timers.');", 10000); |
| } |
| |
| </script> |
| </head> |
| <body onload="runTest()"> |
| This test will create enough timers to freeze browser UI. After 10 seconds, it |
| will start drain the timers so the UI becomes responsive again in a few seconds. |
| You don't need to kill the browser.<br>If the bug is fixed, there will be no |
| UI freeze. Refresh the page to repeat the experiment.<br>Try to click at this |
| button (or browser's menu) while UI is frozen: <button onclick="log('clicked')">Click Me</button> <hr> |
| <div id="log"></div> |
| </body> |
| </html> |