Index: pkg/dev_compiler/tool/input_sdk/private/preambles/d8.js |
diff --git a/pkg/dev_compiler/tool/input_sdk/private/preambles/d8.js b/pkg/dev_compiler/tool/input_sdk/private/preambles/d8.js |
index c330ad8fe4ae436de3456287b0850c9a3cf72609..0c432f514d0bec04a179a8853077b402c934f9ef 100644 |
--- a/pkg/dev_compiler/tool/input_sdk/private/preambles/d8.js |
+++ b/pkg/dev_compiler/tool/input_sdk/private/preambles/d8.js |
@@ -85,7 +85,7 @@ if (typeof global != "undefined") self = global; // Node.js. |
var id = timerIdCounter++; |
f.$timerId = id; |
timerIds[id] = f; |
- if (ms == 0) { |
+ if (ms == 0 && !isNextTimerDue()) { |
zeroTimerQueue.push(f); |
} else { |
addDelayedTimer(f, ms); |
@@ -134,7 +134,10 @@ if (typeof global != "undefined") self = global; // Node.js. |
var originalDate = Date; |
var originalNow = originalDate.now; |
function advanceTimeTo(time) { |
- timeOffset = time - originalNow(); |
+ var now = originalNow(); |
+ if (timeOffset < time - now) { |
+ timeOffset = time - now; |
+ } |
} |
function installMockDate() { |
var NewDate = function Date(Y, M, D, h, m, s, ms) { |
@@ -179,6 +182,12 @@ if (typeof global != "undefined") self = global; // Node.js. |
} |
} |
+ function isNextTimerDue() { |
+ if (timerHeap.length == 0) return false; |
+ var head = timerHeap[0]; |
+ return head[0] < originalNow() + timeOffset; |
+ } |
+ |
function nextDelayedTimerQueue() { |
if (timerHeap.length == 0) return null; |
var result = timerHeap[0]; |