123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- /** @license React v0.20.2
- * scheduler-unstable_post_task.development.js
- *
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
- 'use strict';
- if (process.env.NODE_ENV !== "production") {
- (function() {
- 'use strict';
- // TODO: Use symbols?
- var ImmediatePriority = 1;
- var UserBlockingPriority = 2;
- var NormalPriority = 3;
- var LowPriority = 4;
- var IdlePriority = 5;
- var perf = window.performance;
- var setTimeout = window.setTimeout; // Use experimental Chrome Scheduler postTask API.
- var scheduler = global.scheduler;
- var getCurrentTime = perf.now.bind(perf);
- var unstable_now = getCurrentTime; // Scheduler periodically yields in case there is other work on the main
- // thread, like user events. By default, it yields multiple times per frame.
- // It does not attempt to align with frame boundaries, since most tasks don't
- // need to be frame aligned; for those that do, use requestAnimationFrame.
- var yieldInterval = 5;
- var deadline = 0;
- var currentPriorityLevel_DEPRECATED = NormalPriority; // `isInputPending` is not available. Since we have no way of knowing if
- // there's pending input, always yield at the end of the frame.
- function unstable_shouldYield() {
- return getCurrentTime() >= deadline;
- }
- function unstable_requestPaint() {// Since we yield every frame regardless, `requestPaint` has no effect.
- }
- function unstable_scheduleCallback(priorityLevel, callback, options) {
- var postTaskPriority;
- switch (priorityLevel) {
- case ImmediatePriority:
- case UserBlockingPriority:
- postTaskPriority = 'user-blocking';
- break;
- case LowPriority:
- case NormalPriority:
- postTaskPriority = 'user-visible';
- break;
- case IdlePriority:
- postTaskPriority = 'background';
- break;
- default:
- postTaskPriority = 'user-visible';
- break;
- }
- var controller = new TaskController();
- var postTaskOptions = {
- priority: postTaskPriority,
- delay: typeof options === 'object' && options !== null ? options.delay : 0,
- signal: controller.signal
- };
- var node = {
- _controller: controller
- };
- scheduler.postTask(runTask.bind(null, priorityLevel, postTaskPriority, node, callback), postTaskOptions).catch(handleAbortError);
- return node;
- }
- function runTask(priorityLevel, postTaskPriority, node, callback) {
- deadline = getCurrentTime() + yieldInterval;
- try {
- currentPriorityLevel_DEPRECATED = priorityLevel;
- var _didTimeout_DEPRECATED = false;
- var result = callback(_didTimeout_DEPRECATED);
- if (typeof result === 'function') {
- // Assume this is a continuation
- var continuation = result;
- var continuationController = new TaskController();
- var continuationOptions = {
- priority: postTaskPriority,
- signal: continuationController.signal
- }; // Update the original callback node's controller, since even though we're
- // posting a new task, conceptually it's the same one.
- node._controller = continuationController;
- scheduler.postTask(runTask.bind(null, priorityLevel, postTaskPriority, node, continuation), continuationOptions).catch(handleAbortError);
- }
- } catch (error) {
- // We're inside a `postTask` promise. If we don't handle this error, then it
- // will trigger an "Unhandled promise rejection" error. We don't want that,
- // but we do want the default error reporting behavior that normal
- // (non-Promise) tasks get for unhandled errors.
- //
- // So we'll re-throw the error inside a regular browser task.
- setTimeout(function () {
- throw error;
- });
- } finally {
- currentPriorityLevel_DEPRECATED = NormalPriority;
- }
- }
- function handleAbortError(error) {// Abort errors are an implementation detail. We don't expose the
- // TaskController to the user, nor do we expose the promise that is returned
- // from `postTask`. So we should suppress them, since there's no way for the
- // user to handle them.
- }
- function unstable_cancelCallback(node) {
- var controller = node._controller;
- controller.abort();
- }
- function unstable_runWithPriority(priorityLevel, callback) {
- var previousPriorityLevel = currentPriorityLevel_DEPRECATED;
- currentPriorityLevel_DEPRECATED = priorityLevel;
- try {
- return callback();
- } finally {
- currentPriorityLevel_DEPRECATED = previousPriorityLevel;
- }
- }
- function unstable_getCurrentPriorityLevel() {
- return currentPriorityLevel_DEPRECATED;
- }
- function unstable_next(callback) {
- var priorityLevel;
- switch (currentPriorityLevel_DEPRECATED) {
- case ImmediatePriority:
- case UserBlockingPriority:
- case NormalPriority:
- // Shift down to normal priority
- priorityLevel = NormalPriority;
- break;
- default:
- // Anything lower than normal priority should remain at the current level.
- priorityLevel = currentPriorityLevel_DEPRECATED;
- break;
- }
- var previousPriorityLevel = currentPriorityLevel_DEPRECATED;
- currentPriorityLevel_DEPRECATED = priorityLevel;
- try {
- return callback();
- } finally {
- currentPriorityLevel_DEPRECATED = previousPriorityLevel;
- }
- }
- function unstable_wrapCallback(callback) {
- var parentPriorityLevel = currentPriorityLevel_DEPRECATED;
- return function () {
- var previousPriorityLevel = currentPriorityLevel_DEPRECATED;
- currentPriorityLevel_DEPRECATED = parentPriorityLevel;
- try {
- return callback();
- } finally {
- currentPriorityLevel_DEPRECATED = previousPriorityLevel;
- }
- };
- }
- function unstable_forceFrameRate() {}
- function unstable_pauseExecution() {}
- function unstable_continueExecution() {}
- function unstable_getFirstCallbackNode() {
- return null;
- } // Currently no profiling build
- var unstable_Profiling = null;
- exports.unstable_IdlePriority = IdlePriority;
- exports.unstable_ImmediatePriority = ImmediatePriority;
- exports.unstable_LowPriority = LowPriority;
- exports.unstable_NormalPriority = NormalPriority;
- exports.unstable_Profiling = unstable_Profiling;
- exports.unstable_UserBlockingPriority = UserBlockingPriority;
- exports.unstable_cancelCallback = unstable_cancelCallback;
- exports.unstable_continueExecution = unstable_continueExecution;
- exports.unstable_forceFrameRate = unstable_forceFrameRate;
- exports.unstable_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel;
- exports.unstable_getFirstCallbackNode = unstable_getFirstCallbackNode;
- exports.unstable_next = unstable_next;
- exports.unstable_now = unstable_now;
- exports.unstable_pauseExecution = unstable_pauseExecution;
- exports.unstable_requestPaint = unstable_requestPaint;
- exports.unstable_runWithPriority = unstable_runWithPriority;
- exports.unstable_scheduleCallback = unstable_scheduleCallback;
- exports.unstable_shouldYield = unstable_shouldYield;
- exports.unstable_wrapCallback = unstable_wrapCallback;
- })();
- }
|