1<html>
2<head>
3<script>
4function log(m) {
5    document.getElementById("log").innerHTML += m + "<br>";
6}
7
8var multiplyFactor = 2;   // Create this many timers in every timer callback.
9var targetLatency = 10000; // Multiply timers until it takes this much to fire all their callbacks.
10var timerCount = 1;
11
12function 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
35function 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()">
44This test will create enough timers to freeze browser UI. After 10 seconds, it
45will start drain the timers so the UI becomes responsive again in a few seconds.
46You don't need to kill the browser.<br>If the bug is fixed, there will be no
47UI freeze. Refresh the page to repeat the experiment.<br>Try to click at this
48button (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