123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- <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 (var 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>
|