<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>