diff --git a/packages/scheduler/src/Scheduler.js b/packages/scheduler/src/Scheduler.js index 995a465b9fde8..d52babaa1c541 100644 --- a/packages/scheduler/src/Scheduler.js +++ b/packages/scheduler/src/Scheduler.js @@ -534,13 +534,13 @@ if (typeof window !== 'undefined' && window._schedMock) { } } - var scheduledCallback = null; - var isIdleScheduled = false; + var scheduledHostCallback = null; + var isMessageEventScheduled = false; var timeoutTime = -1; var isAnimationFrameScheduled = false; - var isPerformingIdleWork = false; + var isFlushingHostCallback = false; var frameDeadline = 0; // We start out assuming that we run at 30fps but then the heuristic tracking @@ -564,7 +564,12 @@ if (typeof window !== 'undefined' && window._schedMock) { return; } - isIdleScheduled = false; + isMessageEventScheduled = false; + + var prevScheduledCallback = scheduledHostCallback; + var prevTimeoutTime = timeoutTime; + scheduledHostCallback = null; + timeoutTime = -1; var currentTime = getCurrentTime(); @@ -572,7 +577,7 @@ if (typeof window !== 'undefined' && window._schedMock) { if (frameDeadline - currentTime <= 0) { // There's no time left in this idle period. Check if the callback has // a timeout and whether it's been exceeded. - if (timeoutTime !== -1 && timeoutTime <= currentTime) { + if (prevTimeoutTime !== -1 && prevTimeoutTime <= currentTime) { // Exceeded the timeout. Invoke the callback even though there's no // time left. didTimeout = true; @@ -584,19 +589,18 @@ if (typeof window !== 'undefined' && window._schedMock) { requestAnimationFrameWithTimeout(animationTick); } // Exit without invoking the callback. + scheduledHostCallback = prevScheduledCallback; + timeoutTime = prevTimeoutTime; return; } } - timeoutTime = -1; - var callback = scheduledCallback; - scheduledCallback = null; - if (callback !== null) { - isPerformingIdleWork = true; + if (prevScheduledCallback !== null) { + isFlushingHostCallback = true; try { - callback(didTimeout); + prevScheduledCallback(didTimeout); } finally { - isPerformingIdleWork = false; + isFlushingHostCallback = false; } } }; @@ -605,7 +609,7 @@ if (typeof window !== 'undefined' && window._schedMock) { window.addEventListener('message', idleTick, false); var animationTick = function(rafTime) { - if (scheduledCallback !== null) { + if (scheduledHostCallback !== null) { // Eagerly schedule the next animation callback at the beginning of the // frame. If the scheduler queue is not empty at the end of the frame, it // will continue flushing inside that callback. If the queue *is* empty, @@ -644,16 +648,16 @@ if (typeof window !== 'undefined' && window._schedMock) { previousFrameTime = nextFrameTime; } frameDeadline = rafTime + activeFrameTime; - if (!isIdleScheduled) { - isIdleScheduled = true; + if (!isMessageEventScheduled) { + isMessageEventScheduled = true; window.postMessage(messageKey, '*'); } }; requestHostCallback = function(callback, absoluteTimeout) { - scheduledCallback = callback; + scheduledHostCallback = callback; timeoutTime = absoluteTimeout; - if (isPerformingIdleWork || absoluteTimeout < 0) { + if (isFlushingHostCallback || absoluteTimeout < 0) { // Don't wait for the next frame. Continue working ASAP, in a new event. window.postMessage(messageKey, '*'); } else if (!isAnimationFrameScheduled) { @@ -667,8 +671,8 @@ if (typeof window !== 'undefined' && window._schedMock) { }; cancelHostCallback = function() { - scheduledCallback = null; - isIdleScheduled = false; + scheduledHostCallback = null; + isMessageEventScheduled = false; timeoutTime = -1; }; }