diff --git a/lib/backburner/index.js b/lib/backburner/index.js index 1710742e..11e05bc0 100644 --- a/lib/backburner/index.js +++ b/lib/backburner/index.js @@ -3,7 +3,8 @@ import { isString, isFunction, isNumber, - isCoercableNumber + isCoercableNumber, + now } from './utils'; import searchTimer from './binary-search'; @@ -379,7 +380,7 @@ Backburner.prototype = { } } - var executeAt = Date.now() + parseInt(wait !== wait ? 0 : wait, 10); + var executeAt = now() + parseInt(wait !== wait ? 0 : wait, 10); if (isString(method)) { method = target[method]; @@ -586,7 +587,7 @@ Backburner.prototype = { }, _scheduleExpiredTimers: function () { - var n = Date.now(); + var n = now(); var timers = this._timers; var i = 0; var l = timers.length; @@ -621,7 +622,7 @@ Backburner.prototype = { return; } var minExpiresAt = this._timers[0]; - var n = Date.now(); + var n = now(); var wait = Math.max(0, minExpiresAt - n); this._timerTimeoutId = this._platform.setTimeout(this._boundRunExpiredTimers, wait); } diff --git a/lib/backburner/utils.js b/lib/backburner/utils.js index c12788c5..6a979a21 100644 --- a/lib/backburner/utils.js +++ b/lib/backburner/utils.js @@ -1,5 +1,7 @@ var NUMBER = /\d+/; +export var now = Date.now; + export function each(collection, callback) { for (var i = 0; i < collection.length; i++) { callback(collection[i]); diff --git a/tests/set-timeout-test.js b/tests/set-timeout-test.js index 170a57de..5db38cf8 100644 --- a/tests/set-timeout-test.js +++ b/tests/set-timeout-test.js @@ -1,9 +1,11 @@ import Backburner from 'backburner'; +var originalDateNow = Date.now; var originalDateValueOf = Date.prototype.valueOf; module('setTimeout',{ teardown: function(){ + Date.now = originalDateNow; Date.prototype.valueOf = originalDateValueOf; } }); @@ -52,6 +54,21 @@ test('setTimeout', function() { }, 20); }); +test('setTimeout can continue when `Date.now` is monkey-patched', function() { + expect(1); + + var arbitraryTime = +new Date(); + var bb = new Backburner(['one']); + + Date.now = function() { return arbitraryTime; }; + + stop(); + bb.setTimeout(function() { + start(); + ok(true); + }, 1); +}); + var bb; module('setTimeout arguments / arity', { setup: function(){