scheduler-unstable_post_task.development.js (6883B)
1/** 2 * @license React 3 * scheduler-unstable_post_task.development.js 4 * 5 * Copyright (c) Facebook, Inc. and its affiliates. 6 * 7 * This source code is licensed under the MIT license found in the 8 * LICENSE file in the root directory of this source tree. 9 */ 10 11'use strict'; 12 13if (process.env.NODE_ENV !== "production") { 14 (function() { 15'use strict'; 16 17// TODO: Use symbols? 18var ImmediatePriority = 1; 19var UserBlockingPriority = 2; 20var NormalPriority = 3; 21var LowPriority = 4; 22var IdlePriority = 5; 23 24var perf = window.performance; 25var setTimeout = window.setTimeout; // Use experimental Chrome Scheduler postTask API. 26 27var scheduler = global.scheduler; 28var getCurrentTime = perf.now.bind(perf); 29var unstable_now = getCurrentTime; // Scheduler periodically yields in case there is other work on the main 30// thread, like user events. By default, it yields multiple times per frame. 31// It does not attempt to align with frame boundaries, since most tasks don't 32// need to be frame aligned; for those that do, use requestAnimationFrame. 33 34var yieldInterval = 5; 35var deadline = 0; 36var currentPriorityLevel_DEPRECATED = NormalPriority; // `isInputPending` is not available. Since we have no way of knowing if 37// there's pending input, always yield at the end of the frame. 38 39function unstable_shouldYield() { 40 return getCurrentTime() >= deadline; 41} 42function unstable_requestPaint() {// Since we yield every frame regardless, `requestPaint` has no effect. 43} 44function unstable_scheduleCallback(priorityLevel, callback, options) { 45 var postTaskPriority; 46 47 switch (priorityLevel) { 48 case ImmediatePriority: 49 case UserBlockingPriority: 50 postTaskPriority = 'user-blocking'; 51 break; 52 53 case LowPriority: 54 case NormalPriority: 55 postTaskPriority = 'user-visible'; 56 break; 57 58 case IdlePriority: 59 postTaskPriority = 'background'; 60 break; 61 62 default: 63 postTaskPriority = 'user-visible'; 64 break; 65 } 66 67 var controller = new TaskController(); 68 var postTaskOptions = { 69 priority: postTaskPriority, 70 delay: typeof options === 'object' && options !== null ? options.delay : 0, 71 signal: controller.signal 72 }; 73 var node = { 74 _controller: controller 75 }; 76 scheduler.postTask(runTask.bind(null, priorityLevel, postTaskPriority, node, callback), postTaskOptions).catch(handleAbortError); 77 return node; 78} 79 80function runTask(priorityLevel, postTaskPriority, node, callback) { 81 deadline = getCurrentTime() + yieldInterval; 82 83 try { 84 currentPriorityLevel_DEPRECATED = priorityLevel; 85 var _didTimeout_DEPRECATED = false; 86 var result = callback(_didTimeout_DEPRECATED); 87 88 if (typeof result === 'function') { 89 // Assume this is a continuation 90 var continuation = result; 91 var continuationController = new TaskController(); 92 var continuationOptions = { 93 priority: postTaskPriority, 94 signal: continuationController.signal 95 }; // Update the original callback node's controller, since even though we're 96 // posting a new task, conceptually it's the same one. 97 98 node._controller = continuationController; 99 scheduler.postTask(runTask.bind(null, priorityLevel, postTaskPriority, node, continuation), continuationOptions).catch(handleAbortError); 100 } 101 } catch (error) { 102 // We're inside a `postTask` promise. If we don't handle this error, then it 103 // will trigger an "Unhandled promise rejection" error. We don't want that, 104 // but we do want the default error reporting behavior that normal 105 // (non-Promise) tasks get for unhandled errors. 106 // 107 // So we'll re-throw the error inside a regular browser task. 108 setTimeout(function () { 109 throw error; 110 }); 111 } finally { 112 currentPriorityLevel_DEPRECATED = NormalPriority; 113 } 114} 115 116function handleAbortError(error) {// Abort errors are an implementation detail. We don't expose the 117 // TaskController to the user, nor do we expose the promise that is returned 118 // from `postTask`. So we should suppress them, since there's no way for the 119 // user to handle them. 120} 121 122function unstable_cancelCallback(node) { 123 var controller = node._controller; 124 controller.abort(); 125} 126function unstable_runWithPriority(priorityLevel, callback) { 127 var previousPriorityLevel = currentPriorityLevel_DEPRECATED; 128 currentPriorityLevel_DEPRECATED = priorityLevel; 129 130 try { 131 return callback(); 132 } finally { 133 currentPriorityLevel_DEPRECATED = previousPriorityLevel; 134 } 135} 136function unstable_getCurrentPriorityLevel() { 137 return currentPriorityLevel_DEPRECATED; 138} 139function unstable_next(callback) { 140 var priorityLevel; 141 142 switch (currentPriorityLevel_DEPRECATED) { 143 case ImmediatePriority: 144 case UserBlockingPriority: 145 case NormalPriority: 146 // Shift down to normal priority 147 priorityLevel = NormalPriority; 148 break; 149 150 default: 151 // Anything lower than normal priority should remain at the current level. 152 priorityLevel = currentPriorityLevel_DEPRECATED; 153 break; 154 } 155 156 var previousPriorityLevel = currentPriorityLevel_DEPRECATED; 157 currentPriorityLevel_DEPRECATED = priorityLevel; 158 159 try { 160 return callback(); 161 } finally { 162 currentPriorityLevel_DEPRECATED = previousPriorityLevel; 163 } 164} 165function unstable_wrapCallback(callback) { 166 var parentPriorityLevel = currentPriorityLevel_DEPRECATED; 167 return function () { 168 var previousPriorityLevel = currentPriorityLevel_DEPRECATED; 169 currentPriorityLevel_DEPRECATED = parentPriorityLevel; 170 171 try { 172 return callback(); 173 } finally { 174 currentPriorityLevel_DEPRECATED = previousPriorityLevel; 175 } 176 }; 177} 178function unstable_forceFrameRate() {} 179function unstable_pauseExecution() {} 180function unstable_continueExecution() {} 181function unstable_getFirstCallbackNode() { 182 return null; 183} // Currently no profiling build 184 185var unstable_Profiling = null; 186 187exports.unstable_IdlePriority = IdlePriority; 188exports.unstable_ImmediatePriority = ImmediatePriority; 189exports.unstable_LowPriority = LowPriority; 190exports.unstable_NormalPriority = NormalPriority; 191exports.unstable_Profiling = unstable_Profiling; 192exports.unstable_UserBlockingPriority = UserBlockingPriority; 193exports.unstable_cancelCallback = unstable_cancelCallback; 194exports.unstable_continueExecution = unstable_continueExecution; 195exports.unstable_forceFrameRate = unstable_forceFrameRate; 196exports.unstable_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel; 197exports.unstable_getFirstCallbackNode = unstable_getFirstCallbackNode; 198exports.unstable_next = unstable_next; 199exports.unstable_now = unstable_now; 200exports.unstable_pauseExecution = unstable_pauseExecution; 201exports.unstable_requestPaint = unstable_requestPaint; 202exports.unstable_runWithPriority = unstable_runWithPriority; 203exports.unstable_scheduleCallback = unstable_scheduleCallback; 204exports.unstable_shouldYield = unstable_shouldYield; 205exports.unstable_wrapCallback = unstable_wrapCallback; 206 })(); 207}