You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					208 lines
				
				6.7 KiB
			
		
		
			
		
	
	
					208 lines
				
				6.7 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @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;
							 | 
						||
| 
								 | 
							
								  })();
							 | 
						||
| 
								 | 
							
								}
							 |