UNPKG

23.2 kBJavaScriptView Raw
1/** @license React v0.18.0
2 * scheduler-unstable_mock.development.js
3 *
4 * Copyright (c) Facebook, Inc. and its affiliates.
5 *
6 * This source code is licensed under the MIT license found in the
7 * LICENSE file in the root directory of this source tree.
8 */
9
10'use strict';
11
12(function (global, factory) {
13 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
14 typeof define === 'function' && define.amd ? define(['exports'], factory) :
15 (factory((global.SchedulerMock = {})));
16}(this, (function (exports) { 'use strict';
17
18var enableSchedulerDebugging = false;
19
20var enableProfiling = true;
21
22var currentTime = 0;
23var scheduledCallback = null;
24var scheduledTimeout = null;
25var timeoutTime = -1;
26var yieldedValues = null;
27var expectedNumberOfYields = -1;
28var didStop = false;
29var isFlushing = false;
30var needsPaint = false;
31var shouldYieldForPaint = false;
32function requestHostCallback(callback) {
33 scheduledCallback = callback;
34}
35
36function requestHostTimeout(callback, ms) {
37 scheduledTimeout = callback;
38 timeoutTime = currentTime + ms;
39}
40function cancelHostTimeout() {
41 scheduledTimeout = null;
42 timeoutTime = -1;
43}
44function shouldYieldToHost() {
45 if (expectedNumberOfYields !== -1 && yieldedValues !== null && yieldedValues.length >= expectedNumberOfYields || shouldYieldForPaint && needsPaint) {
46 // We yielded at least as many values as expected. Stop flushing.
47 didStop = true;
48 return true;
49 }
50
51 return false;
52}
53function getCurrentTime() {
54 return currentTime;
55}
56function forceFrameRate() {// No-op
57}
58 // Should only be used via an assertion helper that inspects the yielded values.
59
60function unstable_flushNumberOfYields(count) {
61 if (isFlushing) {
62 throw new Error('Already flushing work.');
63 }
64
65 if (scheduledCallback !== null) {
66 var cb = scheduledCallback;
67 expectedNumberOfYields = count;
68 isFlushing = true;
69
70 try {
71 var hasMoreWork = true;
72
73 do {
74 hasMoreWork = cb(true, currentTime);
75 } while (hasMoreWork && !didStop);
76
77 if (!hasMoreWork) {
78 scheduledCallback = null;
79 }
80 } finally {
81 expectedNumberOfYields = -1;
82 didStop = false;
83 isFlushing = false;
84 }
85 }
86}
87function unstable_flushUntilNextPaint() {
88 if (isFlushing) {
89 throw new Error('Already flushing work.');
90 }
91
92 if (scheduledCallback !== null) {
93 var cb = scheduledCallback;
94 shouldYieldForPaint = true;
95 needsPaint = false;
96 isFlushing = true;
97
98 try {
99 var hasMoreWork = true;
100
101 do {
102 hasMoreWork = cb(true, currentTime);
103 } while (hasMoreWork && !didStop);
104
105 if (!hasMoreWork) {
106 scheduledCallback = null;
107 }
108 } finally {
109 shouldYieldForPaint = false;
110 didStop = false;
111 isFlushing = false;
112 }
113 }
114}
115function unstable_flushExpired() {
116 if (isFlushing) {
117 throw new Error('Already flushing work.');
118 }
119
120 if (scheduledCallback !== null) {
121 isFlushing = true;
122
123 try {
124 var hasMoreWork = scheduledCallback(false, currentTime);
125
126 if (!hasMoreWork) {
127 scheduledCallback = null;
128 }
129 } finally {
130 isFlushing = false;
131 }
132 }
133}
134function unstable_flushAllWithoutAsserting() {
135 // Returns false if no work was flushed.
136 if (isFlushing) {
137 throw new Error('Already flushing work.');
138 }
139
140 if (scheduledCallback !== null) {
141 var cb = scheduledCallback;
142 isFlushing = true;
143
144 try {
145 var hasMoreWork = true;
146
147 do {
148 hasMoreWork = cb(true, currentTime);
149 } while (hasMoreWork);
150
151 if (!hasMoreWork) {
152 scheduledCallback = null;
153 }
154
155 return true;
156 } finally {
157 isFlushing = false;
158 }
159 } else {
160 return false;
161 }
162}
163function unstable_clearYields() {
164 if (yieldedValues === null) {
165 return [];
166 }
167
168 var values = yieldedValues;
169 yieldedValues = null;
170 return values;
171}
172function unstable_flushAll() {
173 if (yieldedValues !== null) {
174 throw new Error('Log is not empty. Assert on the log of yielded values before ' + 'flushing additional work.');
175 }
176
177 unstable_flushAllWithoutAsserting();
178
179 if (yieldedValues !== null) {
180 throw new Error('While flushing work, something yielded a value. Use an ' + 'assertion helper to assert on the log of yielded values, e.g. ' + 'expect(Scheduler).toFlushAndYield([...])');
181 }
182}
183function unstable_yieldValue(value) {
184 if (yieldedValues === null) {
185 yieldedValues = [value];
186 } else {
187 yieldedValues.push(value);
188 }
189}
190function unstable_advanceTime(ms) {
191 currentTime += ms;
192
193 if (!isFlushing) {
194 if (scheduledTimeout !== null && timeoutTime <= currentTime) {
195 scheduledTimeout(currentTime);
196 timeoutTime = -1;
197 scheduledTimeout = null;
198 }
199
200 unstable_flushExpired();
201 }
202}
203function requestPaint() {
204 needsPaint = true;
205}
206
207function push(heap, node) {
208 var index = heap.length;
209 heap.push(node);
210 siftUp(heap, node, index);
211}
212function peek(heap) {
213 var first = heap[0];
214 return first === undefined ? null : first;
215}
216function pop(heap) {
217 var first = heap[0];
218
219 if (first !== undefined) {
220 var last = heap.pop();
221
222 if (last !== first) {
223 heap[0] = last;
224 siftDown(heap, last, 0);
225 }
226
227 return first;
228 } else {
229 return null;
230 }
231}
232
233function siftUp(heap, node, i) {
234 var index = i;
235
236 while (true) {
237 var parentIndex = Math.floor((index - 1) / 2);
238 var parent = heap[parentIndex];
239
240 if (parent !== undefined && compare(parent, node) > 0) {
241 // The parent is larger. Swap positions.
242 heap[parentIndex] = node;
243 heap[index] = parent;
244 index = parentIndex;
245 } else {
246 // The parent is smaller. Exit.
247 return;
248 }
249 }
250}
251
252function siftDown(heap, node, i) {
253 var index = i;
254 var length = heap.length;
255
256 while (index < length) {
257 var leftIndex = (index + 1) * 2 - 1;
258 var left = heap[leftIndex];
259 var rightIndex = leftIndex + 1;
260 var right = heap[rightIndex]; // If the left or right node is smaller, swap with the smaller of those.
261
262 if (left !== undefined && compare(left, node) < 0) {
263 if (right !== undefined && compare(right, left) < 0) {
264 heap[index] = right;
265 heap[rightIndex] = node;
266 index = rightIndex;
267 } else {
268 heap[index] = left;
269 heap[leftIndex] = node;
270 index = leftIndex;
271 }
272 } else if (right !== undefined && compare(right, node) < 0) {
273 heap[index] = right;
274 heap[rightIndex] = node;
275 index = rightIndex;
276 } else {
277 // Neither child is smaller. Exit.
278 return;
279 }
280 }
281}
282
283function compare(a, b) {
284 // Compare sort index first, then task id.
285 var diff = a.sortIndex - b.sortIndex;
286 return diff !== 0 ? diff : a.id - b.id;
287}
288
289// TODO: Use symbols?
290var NoPriority = 0;
291var ImmediatePriority = 1;
292var UserBlockingPriority = 2;
293var NormalPriority = 3;
294var LowPriority = 4;
295var IdlePriority = 5;
296
297var runIdCounter = 0;
298var mainThreadIdCounter = 0;
299var profilingStateSize = 4;
300var sharedProfilingBuffer = enableProfiling ? // $FlowFixMe Flow doesn't know about SharedArrayBuffer
301typeof SharedArrayBuffer === 'function' ? new SharedArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : // $FlowFixMe Flow doesn't know about ArrayBuffer
302typeof ArrayBuffer === 'function' ? new ArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : null // Don't crash the init path on IE9
303: null;
304var profilingState = enableProfiling && sharedProfilingBuffer !== null ? new Int32Array(sharedProfilingBuffer) : []; // We can't read this but it helps save bytes for null checks
305
306var PRIORITY = 0;
307var CURRENT_TASK_ID = 1;
308var CURRENT_RUN_ID = 2;
309var QUEUE_SIZE = 3;
310
311if (enableProfiling) {
312 profilingState[PRIORITY] = NoPriority; // This is maintained with a counter, because the size of the priority queue
313 // array might include canceled tasks.
314
315 profilingState[QUEUE_SIZE] = 0;
316 profilingState[CURRENT_TASK_ID] = 0;
317} // Bytes per element is 4
318
319
320var INITIAL_EVENT_LOG_SIZE = 131072;
321var MAX_EVENT_LOG_SIZE = 524288; // Equivalent to 2 megabytes
322
323var eventLogSize = 0;
324var eventLogBuffer = null;
325var eventLog = null;
326var eventLogIndex = 0;
327var TaskStartEvent = 1;
328var TaskCompleteEvent = 2;
329var TaskErrorEvent = 3;
330var TaskCancelEvent = 4;
331var TaskRunEvent = 5;
332var TaskYieldEvent = 6;
333var SchedulerSuspendEvent = 7;
334var SchedulerResumeEvent = 8;
335
336function logEvent(entries) {
337 if (eventLog !== null) {
338 var offset = eventLogIndex;
339 eventLogIndex += entries.length;
340
341 if (eventLogIndex + 1 > eventLogSize) {
342 eventLogSize *= 2;
343
344 if (eventLogSize > MAX_EVENT_LOG_SIZE) {
345 console.error("Scheduler Profiling: Event log exceeded maximum size. Don't " + 'forget to call `stopLoggingProfilingEvents()`.');
346 stopLoggingProfilingEvents();
347 return;
348 }
349
350 var newEventLog = new Int32Array(eventLogSize * 4);
351 newEventLog.set(eventLog);
352 eventLogBuffer = newEventLog.buffer;
353 eventLog = newEventLog;
354 }
355
356 eventLog.set(entries, offset);
357 }
358}
359
360function startLoggingProfilingEvents() {
361 eventLogSize = INITIAL_EVENT_LOG_SIZE;
362 eventLogBuffer = new ArrayBuffer(eventLogSize * 4);
363 eventLog = new Int32Array(eventLogBuffer);
364 eventLogIndex = 0;
365}
366function stopLoggingProfilingEvents() {
367 var buffer = eventLogBuffer;
368 eventLogSize = 0;
369 eventLogBuffer = null;
370 eventLog = null;
371 eventLogIndex = 0;
372 return buffer;
373}
374function markTaskStart(task, ms) {
375 if (enableProfiling) {
376 profilingState[QUEUE_SIZE]++;
377
378 if (eventLog !== null) {
379 // performance.now returns a float, representing milliseconds. When the
380 // event is logged, it's coerced to an int. Convert to microseconds to
381 // maintain extra degrees of precision.
382 logEvent([TaskStartEvent, ms * 1000, task.id, task.priorityLevel]);
383 }
384 }
385}
386function markTaskCompleted(task, ms) {
387 if (enableProfiling) {
388 profilingState[PRIORITY] = NoPriority;
389 profilingState[CURRENT_TASK_ID] = 0;
390 profilingState[QUEUE_SIZE]--;
391
392 if (eventLog !== null) {
393 logEvent([TaskCompleteEvent, ms * 1000, task.id]);
394 }
395 }
396}
397function markTaskCanceled(task, ms) {
398 if (enableProfiling) {
399 profilingState[QUEUE_SIZE]--;
400
401 if (eventLog !== null) {
402 logEvent([TaskCancelEvent, ms * 1000, task.id]);
403 }
404 }
405}
406function markTaskErrored(task, ms) {
407 if (enableProfiling) {
408 profilingState[PRIORITY] = NoPriority;
409 profilingState[CURRENT_TASK_ID] = 0;
410 profilingState[QUEUE_SIZE]--;
411
412 if (eventLog !== null) {
413 logEvent([TaskErrorEvent, ms * 1000, task.id]);
414 }
415 }
416}
417function markTaskRun(task, ms) {
418 if (enableProfiling) {
419 runIdCounter++;
420 profilingState[PRIORITY] = task.priorityLevel;
421 profilingState[CURRENT_TASK_ID] = task.id;
422 profilingState[CURRENT_RUN_ID] = runIdCounter;
423
424 if (eventLog !== null) {
425 logEvent([TaskRunEvent, ms * 1000, task.id, runIdCounter]);
426 }
427 }
428}
429function markTaskYield(task, ms) {
430 if (enableProfiling) {
431 profilingState[PRIORITY] = NoPriority;
432 profilingState[CURRENT_TASK_ID] = 0;
433 profilingState[CURRENT_RUN_ID] = 0;
434
435 if (eventLog !== null) {
436 logEvent([TaskYieldEvent, ms * 1000, task.id, runIdCounter]);
437 }
438 }
439}
440function markSchedulerSuspended(ms) {
441 if (enableProfiling) {
442 mainThreadIdCounter++;
443
444 if (eventLog !== null) {
445 logEvent([SchedulerSuspendEvent, ms * 1000, mainThreadIdCounter]);
446 }
447 }
448}
449function markSchedulerUnsuspended(ms) {
450 if (enableProfiling) {
451 if (eventLog !== null) {
452 logEvent([SchedulerResumeEvent, ms * 1000, mainThreadIdCounter]);
453 }
454 }
455}
456
457/* eslint-disable no-var */
458// Math.pow(2, 30) - 1
459// 0b111111111111111111111111111111
460
461var maxSigned31BitInt = 1073741823; // Times out immediately
462
463var IMMEDIATE_PRIORITY_TIMEOUT = -1; // Eventually times out
464
465var USER_BLOCKING_PRIORITY = 250;
466var NORMAL_PRIORITY_TIMEOUT = 5000;
467var LOW_PRIORITY_TIMEOUT = 10000; // Never times out
468
469var IDLE_PRIORITY = maxSigned31BitInt; // Tasks are stored on a min heap
470
471var taskQueue = [];
472var timerQueue = []; // Incrementing id counter. Used to maintain insertion order.
473
474var taskIdCounter = 1; // Pausing the scheduler is useful for debugging.
475
476var isSchedulerPaused = false;
477var currentTask = null;
478var currentPriorityLevel = NormalPriority; // This is set while performing work, to prevent re-entrancy.
479
480var isPerformingWork = false;
481var isHostCallbackScheduled = false;
482var isHostTimeoutScheduled = false;
483
484function advanceTimers(currentTime) {
485 // Check for tasks that are no longer delayed and add them to the queue.
486 var timer = peek(timerQueue);
487
488 while (timer !== null) {
489 if (timer.callback === null) {
490 // Timer was cancelled.
491 pop(timerQueue);
492 } else if (timer.startTime <= currentTime) {
493 // Timer fired. Transfer to the task queue.
494 pop(timerQueue);
495 timer.sortIndex = timer.expirationTime;
496 push(taskQueue, timer);
497
498 if (enableProfiling) {
499 markTaskStart(timer, currentTime);
500 timer.isQueued = true;
501 }
502 } else {
503 // Remaining timers are pending.
504 return;
505 }
506
507 timer = peek(timerQueue);
508 }
509}
510
511function handleTimeout(currentTime) {
512 isHostTimeoutScheduled = false;
513 advanceTimers(currentTime);
514
515 if (!isHostCallbackScheduled) {
516 if (peek(taskQueue) !== null) {
517 isHostCallbackScheduled = true;
518 requestHostCallback(flushWork);
519 } else {
520 var firstTimer = peek(timerQueue);
521
522 if (firstTimer !== null) {
523 requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);
524 }
525 }
526 }
527}
528
529function flushWork(hasTimeRemaining, initialTime) {
530 if (enableProfiling) {
531 markSchedulerUnsuspended(initialTime);
532 } // We'll need a host callback the next time work is scheduled.
533
534
535 isHostCallbackScheduled = false;
536
537 if (isHostTimeoutScheduled) {
538 // We scheduled a timeout but it's no longer needed. Cancel it.
539 isHostTimeoutScheduled = false;
540 cancelHostTimeout();
541 }
542
543 isPerformingWork = true;
544 var previousPriorityLevel = currentPriorityLevel;
545
546 try {
547 if (enableProfiling) {
548 try {
549 return workLoop(hasTimeRemaining, initialTime);
550 } catch (error) {
551 if (currentTask !== null) {
552 var currentTime = getCurrentTime();
553 markTaskErrored(currentTask, currentTime);
554 currentTask.isQueued = false;
555 }
556
557 throw error;
558 }
559 } else {
560 // No catch in prod codepath.
561 return workLoop(hasTimeRemaining, initialTime);
562 }
563 } finally {
564 currentTask = null;
565 currentPriorityLevel = previousPriorityLevel;
566 isPerformingWork = false;
567
568 if (enableProfiling) {
569 var _currentTime = getCurrentTime();
570
571 markSchedulerSuspended(_currentTime);
572 }
573 }
574}
575
576function workLoop(hasTimeRemaining, initialTime) {
577 var currentTime = initialTime;
578 advanceTimers(currentTime);
579 currentTask = peek(taskQueue);
580
581 while (currentTask !== null && !(enableSchedulerDebugging && isSchedulerPaused)) {
582 if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) {
583 // This currentTask hasn't expired, and we've reached the deadline.
584 break;
585 }
586
587 var callback = currentTask.callback;
588
589 if (callback !== null) {
590 currentTask.callback = null;
591 currentPriorityLevel = currentTask.priorityLevel;
592 var didUserCallbackTimeout = currentTask.expirationTime <= currentTime;
593 markTaskRun(currentTask, currentTime);
594 var continuationCallback = callback(didUserCallbackTimeout);
595 currentTime = getCurrentTime();
596
597 if (typeof continuationCallback === 'function') {
598 currentTask.callback = continuationCallback;
599 markTaskYield(currentTask, currentTime);
600 } else {
601 if (enableProfiling) {
602 markTaskCompleted(currentTask, currentTime);
603 currentTask.isQueued = false;
604 }
605
606 if (currentTask === peek(taskQueue)) {
607 pop(taskQueue);
608 }
609 }
610
611 advanceTimers(currentTime);
612 } else {
613 pop(taskQueue);
614 }
615
616 currentTask = peek(taskQueue);
617 } // Return whether there's additional work
618
619
620 if (currentTask !== null) {
621 return true;
622 } else {
623 var firstTimer = peek(timerQueue);
624
625 if (firstTimer !== null) {
626 requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);
627 }
628
629 return false;
630 }
631}
632
633function unstable_runWithPriority(priorityLevel, eventHandler) {
634 switch (priorityLevel) {
635 case ImmediatePriority:
636 case UserBlockingPriority:
637 case NormalPriority:
638 case LowPriority:
639 case IdlePriority:
640 break;
641
642 default:
643 priorityLevel = NormalPriority;
644 }
645
646 var previousPriorityLevel = currentPriorityLevel;
647 currentPriorityLevel = priorityLevel;
648
649 try {
650 return eventHandler();
651 } finally {
652 currentPriorityLevel = previousPriorityLevel;
653 }
654}
655
656function unstable_next(eventHandler) {
657 var priorityLevel;
658
659 switch (currentPriorityLevel) {
660 case ImmediatePriority:
661 case UserBlockingPriority:
662 case NormalPriority:
663 // Shift down to normal priority
664 priorityLevel = NormalPriority;
665 break;
666
667 default:
668 // Anything lower than normal priority should remain at the current level.
669 priorityLevel = currentPriorityLevel;
670 break;
671 }
672
673 var previousPriorityLevel = currentPriorityLevel;
674 currentPriorityLevel = priorityLevel;
675
676 try {
677 return eventHandler();
678 } finally {
679 currentPriorityLevel = previousPriorityLevel;
680 }
681}
682
683function unstable_wrapCallback(callback) {
684 var parentPriorityLevel = currentPriorityLevel;
685 return function () {
686 // This is a fork of runWithPriority, inlined for performance.
687 var previousPriorityLevel = currentPriorityLevel;
688 currentPriorityLevel = parentPriorityLevel;
689
690 try {
691 return callback.apply(this, arguments);
692 } finally {
693 currentPriorityLevel = previousPriorityLevel;
694 }
695 };
696}
697
698function timeoutForPriorityLevel(priorityLevel) {
699 switch (priorityLevel) {
700 case ImmediatePriority:
701 return IMMEDIATE_PRIORITY_TIMEOUT;
702
703 case UserBlockingPriority:
704 return USER_BLOCKING_PRIORITY;
705
706 case IdlePriority:
707 return IDLE_PRIORITY;
708
709 case LowPriority:
710 return LOW_PRIORITY_TIMEOUT;
711
712 case NormalPriority:
713 default:
714 return NORMAL_PRIORITY_TIMEOUT;
715 }
716}
717
718function unstable_scheduleCallback(priorityLevel, callback, options) {
719 var currentTime = getCurrentTime();
720 var startTime;
721 var timeout;
722
723 if (typeof options === 'object' && options !== null) {
724 var delay = options.delay;
725
726 if (typeof delay === 'number' && delay > 0) {
727 startTime = currentTime + delay;
728 } else {
729 startTime = currentTime;
730 }
731
732 timeout = typeof options.timeout === 'number' ? options.timeout : timeoutForPriorityLevel(priorityLevel);
733 } else {
734 timeout = timeoutForPriorityLevel(priorityLevel);
735 startTime = currentTime;
736 }
737
738 var expirationTime = startTime + timeout;
739 var newTask = {
740 id: taskIdCounter++,
741 callback: callback,
742 priorityLevel: priorityLevel,
743 startTime: startTime,
744 expirationTime: expirationTime,
745 sortIndex: -1
746 };
747
748 if (enableProfiling) {
749 newTask.isQueued = false;
750 }
751
752 if (startTime > currentTime) {
753 // This is a delayed task.
754 newTask.sortIndex = startTime;
755 push(timerQueue, newTask);
756
757 if (peek(taskQueue) === null && newTask === peek(timerQueue)) {
758 // All tasks are delayed, and this is the task with the earliest delay.
759 if (isHostTimeoutScheduled) {
760 // Cancel an existing timeout.
761 cancelHostTimeout();
762 } else {
763 isHostTimeoutScheduled = true;
764 } // Schedule a timeout.
765
766
767 requestHostTimeout(handleTimeout, startTime - currentTime);
768 }
769 } else {
770 newTask.sortIndex = expirationTime;
771 push(taskQueue, newTask);
772
773 if (enableProfiling) {
774 markTaskStart(newTask, currentTime);
775 newTask.isQueued = true;
776 } // Schedule a host callback, if needed. If we're already performing work,
777 // wait until the next time we yield.
778
779
780 if (!isHostCallbackScheduled && !isPerformingWork) {
781 isHostCallbackScheduled = true;
782 requestHostCallback(flushWork);
783 }
784 }
785
786 return newTask;
787}
788
789function unstable_pauseExecution() {
790 isSchedulerPaused = true;
791}
792
793function unstable_continueExecution() {
794 isSchedulerPaused = false;
795
796 if (!isHostCallbackScheduled && !isPerformingWork) {
797 isHostCallbackScheduled = true;
798 requestHostCallback(flushWork);
799 }
800}
801
802function unstable_getFirstCallbackNode() {
803 return peek(taskQueue);
804}
805
806function unstable_cancelCallback(task) {
807 if (enableProfiling) {
808 if (task.isQueued) {
809 var currentTime = getCurrentTime();
810 markTaskCanceled(task, currentTime);
811 task.isQueued = false;
812 }
813 } // Null out the callback to indicate the task has been canceled. (Can't
814 // remove from the queue because you can't remove arbitrary nodes from an
815 // array based heap, only the first one.)
816
817
818 task.callback = null;
819}
820
821function unstable_getCurrentPriorityLevel() {
822 return currentPriorityLevel;
823}
824
825function unstable_shouldYield() {
826 var currentTime = getCurrentTime();
827 advanceTimers(currentTime);
828 var firstTask = peek(taskQueue);
829 return firstTask !== currentTask && currentTask !== null && firstTask !== null && firstTask.callback !== null && firstTask.startTime <= currentTime && firstTask.expirationTime < currentTask.expirationTime || shouldYieldToHost();
830}
831
832var unstable_requestPaint = requestPaint;
833var unstable_Profiling = enableProfiling ? {
834 startLoggingProfilingEvents: startLoggingProfilingEvents,
835 stopLoggingProfilingEvents: stopLoggingProfilingEvents,
836 sharedProfilingBuffer: sharedProfilingBuffer
837} : null;
838
839exports.unstable_flushAllWithoutAsserting = unstable_flushAllWithoutAsserting;
840exports.unstable_flushNumberOfYields = unstable_flushNumberOfYields;
841exports.unstable_flushExpired = unstable_flushExpired;
842exports.unstable_clearYields = unstable_clearYields;
843exports.unstable_flushUntilNextPaint = unstable_flushUntilNextPaint;
844exports.unstable_flushAll = unstable_flushAll;
845exports.unstable_yieldValue = unstable_yieldValue;
846exports.unstable_advanceTime = unstable_advanceTime;
847exports.unstable_ImmediatePriority = ImmediatePriority;
848exports.unstable_UserBlockingPriority = UserBlockingPriority;
849exports.unstable_NormalPriority = NormalPriority;
850exports.unstable_IdlePriority = IdlePriority;
851exports.unstable_LowPriority = LowPriority;
852exports.unstable_runWithPriority = unstable_runWithPriority;
853exports.unstable_next = unstable_next;
854exports.unstable_scheduleCallback = unstable_scheduleCallback;
855exports.unstable_cancelCallback = unstable_cancelCallback;
856exports.unstable_wrapCallback = unstable_wrapCallback;
857exports.unstable_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel;
858exports.unstable_shouldYield = unstable_shouldYield;
859exports.unstable_requestPaint = unstable_requestPaint;
860exports.unstable_continueExecution = unstable_continueExecution;
861exports.unstable_pauseExecution = unstable_pauseExecution;
862exports.unstable_getFirstCallbackNode = unstable_getFirstCallbackNode;
863exports.unstable_now = getCurrentTime;
864exports.unstable_forceFrameRate = forceFrameRate;
865exports.unstable_Profiling = unstable_Profiling;
866
867Object.defineProperty(exports, '__esModule', { value: true });
868
869})));