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; | ||
|  |   })(); | ||
|  | } |