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