/** * @license React * 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; })(); }