Dashboard sipadu mbip
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

scheduler-unstable_mock.development.js 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869
  1. /** @license React v0.18.0
  2. * scheduler-unstable_mock.development.js
  3. *
  4. * Copyright (c) Facebook, Inc. and its affiliates.
  5. *
  6. * This source code is licensed under the MIT license found in the
  7. * LICENSE file in the root directory of this source tree.
  8. */
  9. 'use strict';
  10. (function (global, factory) {
  11. typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
  12. typeof define === 'function' && define.amd ? define(['exports'], factory) :
  13. (factory((global.SchedulerMock = {})));
  14. }(this, (function (exports) { 'use strict';
  15. var enableSchedulerDebugging = false;
  16. var enableProfiling = true;
  17. var currentTime = 0;
  18. var scheduledCallback = null;
  19. var scheduledTimeout = null;
  20. var timeoutTime = -1;
  21. var yieldedValues = null;
  22. var expectedNumberOfYields = -1;
  23. var didStop = false;
  24. var isFlushing = false;
  25. var needsPaint = false;
  26. var shouldYieldForPaint = false;
  27. function requestHostCallback(callback) {
  28. scheduledCallback = callback;
  29. }
  30. function requestHostTimeout(callback, ms) {
  31. scheduledTimeout = callback;
  32. timeoutTime = currentTime + ms;
  33. }
  34. function cancelHostTimeout() {
  35. scheduledTimeout = null;
  36. timeoutTime = -1;
  37. }
  38. function shouldYieldToHost() {
  39. if (expectedNumberOfYields !== -1 && yieldedValues !== null && yieldedValues.length >= expectedNumberOfYields || shouldYieldForPaint && needsPaint) {
  40. // We yielded at least as many values as expected. Stop flushing.
  41. didStop = true;
  42. return true;
  43. }
  44. return false;
  45. }
  46. function getCurrentTime() {
  47. return currentTime;
  48. }
  49. function forceFrameRate() {// No-op
  50. }
  51. // Should only be used via an assertion helper that inspects the yielded values.
  52. function unstable_flushNumberOfYields(count) {
  53. if (isFlushing) {
  54. throw new Error('Already flushing work.');
  55. }
  56. if (scheduledCallback !== null) {
  57. var cb = scheduledCallback;
  58. expectedNumberOfYields = count;
  59. isFlushing = true;
  60. try {
  61. var hasMoreWork = true;
  62. do {
  63. hasMoreWork = cb(true, currentTime);
  64. } while (hasMoreWork && !didStop);
  65. if (!hasMoreWork) {
  66. scheduledCallback = null;
  67. }
  68. } finally {
  69. expectedNumberOfYields = -1;
  70. didStop = false;
  71. isFlushing = false;
  72. }
  73. }
  74. }
  75. function unstable_flushUntilNextPaint() {
  76. if (isFlushing) {
  77. throw new Error('Already flushing work.');
  78. }
  79. if (scheduledCallback !== null) {
  80. var cb = scheduledCallback;
  81. shouldYieldForPaint = true;
  82. needsPaint = false;
  83. isFlushing = true;
  84. try {
  85. var hasMoreWork = true;
  86. do {
  87. hasMoreWork = cb(true, currentTime);
  88. } while (hasMoreWork && !didStop);
  89. if (!hasMoreWork) {
  90. scheduledCallback = null;
  91. }
  92. } finally {
  93. shouldYieldForPaint = false;
  94. didStop = false;
  95. isFlushing = false;
  96. }
  97. }
  98. }
  99. function unstable_flushExpired() {
  100. if (isFlushing) {
  101. throw new Error('Already flushing work.');
  102. }
  103. if (scheduledCallback !== null) {
  104. isFlushing = true;
  105. try {
  106. var hasMoreWork = scheduledCallback(false, currentTime);
  107. if (!hasMoreWork) {
  108. scheduledCallback = null;
  109. }
  110. } finally {
  111. isFlushing = false;
  112. }
  113. }
  114. }
  115. function unstable_flushAllWithoutAsserting() {
  116. // Returns false if no work was flushed.
  117. if (isFlushing) {
  118. throw new Error('Already flushing work.');
  119. }
  120. if (scheduledCallback !== null) {
  121. var cb = scheduledCallback;
  122. isFlushing = true;
  123. try {
  124. var hasMoreWork = true;
  125. do {
  126. hasMoreWork = cb(true, currentTime);
  127. } while (hasMoreWork);
  128. if (!hasMoreWork) {
  129. scheduledCallback = null;
  130. }
  131. return true;
  132. } finally {
  133. isFlushing = false;
  134. }
  135. } else {
  136. return false;
  137. }
  138. }
  139. function unstable_clearYields() {
  140. if (yieldedValues === null) {
  141. return [];
  142. }
  143. var values = yieldedValues;
  144. yieldedValues = null;
  145. return values;
  146. }
  147. function unstable_flushAll() {
  148. if (yieldedValues !== null) {
  149. throw new Error('Log is not empty. Assert on the log of yielded values before ' + 'flushing additional work.');
  150. }
  151. unstable_flushAllWithoutAsserting();
  152. if (yieldedValues !== null) {
  153. throw new Error('While flushing work, something yielded a value. Use an ' + 'assertion helper to assert on the log of yielded values, e.g. ' + 'expect(Scheduler).toFlushAndYield([...])');
  154. }
  155. }
  156. function unstable_yieldValue(value) {
  157. if (yieldedValues === null) {
  158. yieldedValues = [value];
  159. } else {
  160. yieldedValues.push(value);
  161. }
  162. }
  163. function unstable_advanceTime(ms) {
  164. currentTime += ms;
  165. if (!isFlushing) {
  166. if (scheduledTimeout !== null && timeoutTime <= currentTime) {
  167. scheduledTimeout(currentTime);
  168. timeoutTime = -1;
  169. scheduledTimeout = null;
  170. }
  171. unstable_flushExpired();
  172. }
  173. }
  174. function requestPaint() {
  175. needsPaint = true;
  176. }
  177. function push(heap, node) {
  178. var index = heap.length;
  179. heap.push(node);
  180. siftUp(heap, node, index);
  181. }
  182. function peek(heap) {
  183. var first = heap[0];
  184. return first === undefined ? null : first;
  185. }
  186. function pop(heap) {
  187. var first = heap[0];
  188. if (first !== undefined) {
  189. var last = heap.pop();
  190. if (last !== first) {
  191. heap[0] = last;
  192. siftDown(heap, last, 0);
  193. }
  194. return first;
  195. } else {
  196. return null;
  197. }
  198. }
  199. function siftUp(heap, node, i) {
  200. var index = i;
  201. while (true) {
  202. var parentIndex = Math.floor((index - 1) / 2);
  203. var parent = heap[parentIndex];
  204. if (parent !== undefined && compare(parent, node) > 0) {
  205. // The parent is larger. Swap positions.
  206. heap[parentIndex] = node;
  207. heap[index] = parent;
  208. index = parentIndex;
  209. } else {
  210. // The parent is smaller. Exit.
  211. return;
  212. }
  213. }
  214. }
  215. function siftDown(heap, node, i) {
  216. var index = i;
  217. var length = heap.length;
  218. while (index < length) {
  219. var leftIndex = (index + 1) * 2 - 1;
  220. var left = heap[leftIndex];
  221. var rightIndex = leftIndex + 1;
  222. var right = heap[rightIndex]; // If the left or right node is smaller, swap with the smaller of those.
  223. if (left !== undefined && compare(left, node) < 0) {
  224. if (right !== undefined && compare(right, left) < 0) {
  225. heap[index] = right;
  226. heap[rightIndex] = node;
  227. index = rightIndex;
  228. } else {
  229. heap[index] = left;
  230. heap[leftIndex] = node;
  231. index = leftIndex;
  232. }
  233. } else if (right !== undefined && compare(right, node) < 0) {
  234. heap[index] = right;
  235. heap[rightIndex] = node;
  236. index = rightIndex;
  237. } else {
  238. // Neither child is smaller. Exit.
  239. return;
  240. }
  241. }
  242. }
  243. function compare(a, b) {
  244. // Compare sort index first, then task id.
  245. var diff = a.sortIndex - b.sortIndex;
  246. return diff !== 0 ? diff : a.id - b.id;
  247. }
  248. // TODO: Use symbols?
  249. var NoPriority = 0;
  250. var ImmediatePriority = 1;
  251. var UserBlockingPriority = 2;
  252. var NormalPriority = 3;
  253. var LowPriority = 4;
  254. var IdlePriority = 5;
  255. var runIdCounter = 0;
  256. var mainThreadIdCounter = 0;
  257. var profilingStateSize = 4;
  258. var sharedProfilingBuffer = enableProfiling ? // $FlowFixMe Flow doesn't know about SharedArrayBuffer
  259. typeof SharedArrayBuffer === 'function' ? new SharedArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : // $FlowFixMe Flow doesn't know about ArrayBuffer
  260. typeof ArrayBuffer === 'function' ? new ArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : null // Don't crash the init path on IE9
  261. : null;
  262. var profilingState = enableProfiling && sharedProfilingBuffer !== null ? new Int32Array(sharedProfilingBuffer) : []; // We can't read this but it helps save bytes for null checks
  263. var PRIORITY = 0;
  264. var CURRENT_TASK_ID = 1;
  265. var CURRENT_RUN_ID = 2;
  266. var QUEUE_SIZE = 3;
  267. if (enableProfiling) {
  268. profilingState[PRIORITY] = NoPriority; // This is maintained with a counter, because the size of the priority queue
  269. // array might include canceled tasks.
  270. profilingState[QUEUE_SIZE] = 0;
  271. profilingState[CURRENT_TASK_ID] = 0;
  272. } // Bytes per element is 4
  273. var INITIAL_EVENT_LOG_SIZE = 131072;
  274. var MAX_EVENT_LOG_SIZE = 524288; // Equivalent to 2 megabytes
  275. var eventLogSize = 0;
  276. var eventLogBuffer = null;
  277. var eventLog = null;
  278. var eventLogIndex = 0;
  279. var TaskStartEvent = 1;
  280. var TaskCompleteEvent = 2;
  281. var TaskErrorEvent = 3;
  282. var TaskCancelEvent = 4;
  283. var TaskRunEvent = 5;
  284. var TaskYieldEvent = 6;
  285. var SchedulerSuspendEvent = 7;
  286. var SchedulerResumeEvent = 8;
  287. function logEvent(entries) {
  288. if (eventLog !== null) {
  289. var offset = eventLogIndex;
  290. eventLogIndex += entries.length;
  291. if (eventLogIndex + 1 > eventLogSize) {
  292. eventLogSize *= 2;
  293. if (eventLogSize > MAX_EVENT_LOG_SIZE) {
  294. console.error("Scheduler Profiling: Event log exceeded maximum size. Don't " + 'forget to call `stopLoggingProfilingEvents()`.');
  295. stopLoggingProfilingEvents();
  296. return;
  297. }
  298. var newEventLog = new Int32Array(eventLogSize * 4);
  299. newEventLog.set(eventLog);
  300. eventLogBuffer = newEventLog.buffer;
  301. eventLog = newEventLog;
  302. }
  303. eventLog.set(entries, offset);
  304. }
  305. }
  306. function startLoggingProfilingEvents() {
  307. eventLogSize = INITIAL_EVENT_LOG_SIZE;
  308. eventLogBuffer = new ArrayBuffer(eventLogSize * 4);
  309. eventLog = new Int32Array(eventLogBuffer);
  310. eventLogIndex = 0;
  311. }
  312. function stopLoggingProfilingEvents() {
  313. var buffer = eventLogBuffer;
  314. eventLogSize = 0;
  315. eventLogBuffer = null;
  316. eventLog = null;
  317. eventLogIndex = 0;
  318. return buffer;
  319. }
  320. function markTaskStart(task, ms) {
  321. if (enableProfiling) {
  322. profilingState[QUEUE_SIZE]++;
  323. if (eventLog !== null) {
  324. // performance.now returns a float, representing milliseconds. When the
  325. // event is logged, it's coerced to an int. Convert to microseconds to
  326. // maintain extra degrees of precision.
  327. logEvent([TaskStartEvent, ms * 1000, task.id, task.priorityLevel]);
  328. }
  329. }
  330. }
  331. function markTaskCompleted(task, ms) {
  332. if (enableProfiling) {
  333. profilingState[PRIORITY] = NoPriority;
  334. profilingState[CURRENT_TASK_ID] = 0;
  335. profilingState[QUEUE_SIZE]--;
  336. if (eventLog !== null) {
  337. logEvent([TaskCompleteEvent, ms * 1000, task.id]);
  338. }
  339. }
  340. }
  341. function markTaskCanceled(task, ms) {
  342. if (enableProfiling) {
  343. profilingState[QUEUE_SIZE]--;
  344. if (eventLog !== null) {
  345. logEvent([TaskCancelEvent, ms * 1000, task.id]);
  346. }
  347. }
  348. }
  349. function markTaskErrored(task, ms) {
  350. if (enableProfiling) {
  351. profilingState[PRIORITY] = NoPriority;
  352. profilingState[CURRENT_TASK_ID] = 0;
  353. profilingState[QUEUE_SIZE]--;
  354. if (eventLog !== null) {
  355. logEvent([TaskErrorEvent, ms * 1000, task.id]);
  356. }
  357. }
  358. }
  359. function markTaskRun(task, ms) {
  360. if (enableProfiling) {
  361. runIdCounter++;
  362. profilingState[PRIORITY] = task.priorityLevel;
  363. profilingState[CURRENT_TASK_ID] = task.id;
  364. profilingState[CURRENT_RUN_ID] = runIdCounter;
  365. if (eventLog !== null) {
  366. logEvent([TaskRunEvent, ms * 1000, task.id, runIdCounter]);
  367. }
  368. }
  369. }
  370. function markTaskYield(task, ms) {
  371. if (enableProfiling) {
  372. profilingState[PRIORITY] = NoPriority;
  373. profilingState[CURRENT_TASK_ID] = 0;
  374. profilingState[CURRENT_RUN_ID] = 0;
  375. if (eventLog !== null) {
  376. logEvent([TaskYieldEvent, ms * 1000, task.id, runIdCounter]);
  377. }
  378. }
  379. }
  380. function markSchedulerSuspended(ms) {
  381. if (enableProfiling) {
  382. mainThreadIdCounter++;
  383. if (eventLog !== null) {
  384. logEvent([SchedulerSuspendEvent, ms * 1000, mainThreadIdCounter]);
  385. }
  386. }
  387. }
  388. function markSchedulerUnsuspended(ms) {
  389. if (enableProfiling) {
  390. if (eventLog !== null) {
  391. logEvent([SchedulerResumeEvent, ms * 1000, mainThreadIdCounter]);
  392. }
  393. }
  394. }
  395. /* eslint-disable no-var */
  396. // Math.pow(2, 30) - 1
  397. // 0b111111111111111111111111111111
  398. var maxSigned31BitInt = 1073741823; // Times out immediately
  399. var IMMEDIATE_PRIORITY_TIMEOUT = -1; // Eventually times out
  400. var USER_BLOCKING_PRIORITY = 250;
  401. var NORMAL_PRIORITY_TIMEOUT = 5000;
  402. var LOW_PRIORITY_TIMEOUT = 10000; // Never times out
  403. var IDLE_PRIORITY = maxSigned31BitInt; // Tasks are stored on a min heap
  404. var taskQueue = [];
  405. var timerQueue = []; // Incrementing id counter. Used to maintain insertion order.
  406. var taskIdCounter = 1; // Pausing the scheduler is useful for debugging.
  407. var isSchedulerPaused = false;
  408. var currentTask = null;
  409. var currentPriorityLevel = NormalPriority; // This is set while performing work, to prevent re-entrancy.
  410. var isPerformingWork = false;
  411. var isHostCallbackScheduled = false;
  412. var isHostTimeoutScheduled = false;
  413. function advanceTimers(currentTime) {
  414. // Check for tasks that are no longer delayed and add them to the queue.
  415. var timer = peek(timerQueue);
  416. while (timer !== null) {
  417. if (timer.callback === null) {
  418. // Timer was cancelled.
  419. pop(timerQueue);
  420. } else if (timer.startTime <= currentTime) {
  421. // Timer fired. Transfer to the task queue.
  422. pop(timerQueue);
  423. timer.sortIndex = timer.expirationTime;
  424. push(taskQueue, timer);
  425. if (enableProfiling) {
  426. markTaskStart(timer, currentTime);
  427. timer.isQueued = true;
  428. }
  429. } else {
  430. // Remaining timers are pending.
  431. return;
  432. }
  433. timer = peek(timerQueue);
  434. }
  435. }
  436. function handleTimeout(currentTime) {
  437. isHostTimeoutScheduled = false;
  438. advanceTimers(currentTime);
  439. if (!isHostCallbackScheduled) {
  440. if (peek(taskQueue) !== null) {
  441. isHostCallbackScheduled = true;
  442. requestHostCallback(flushWork);
  443. } else {
  444. var firstTimer = peek(timerQueue);
  445. if (firstTimer !== null) {
  446. requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);
  447. }
  448. }
  449. }
  450. }
  451. function flushWork(hasTimeRemaining, initialTime) {
  452. if (enableProfiling) {
  453. markSchedulerUnsuspended(initialTime);
  454. } // We'll need a host callback the next time work is scheduled.
  455. isHostCallbackScheduled = false;
  456. if (isHostTimeoutScheduled) {
  457. // We scheduled a timeout but it's no longer needed. Cancel it.
  458. isHostTimeoutScheduled = false;
  459. cancelHostTimeout();
  460. }
  461. isPerformingWork = true;
  462. var previousPriorityLevel = currentPriorityLevel;
  463. try {
  464. if (enableProfiling) {
  465. try {
  466. return workLoop(hasTimeRemaining, initialTime);
  467. } catch (error) {
  468. if (currentTask !== null) {
  469. var currentTime = getCurrentTime();
  470. markTaskErrored(currentTask, currentTime);
  471. currentTask.isQueued = false;
  472. }
  473. throw error;
  474. }
  475. } else {
  476. // No catch in prod codepath.
  477. return workLoop(hasTimeRemaining, initialTime);
  478. }
  479. } finally {
  480. currentTask = null;
  481. currentPriorityLevel = previousPriorityLevel;
  482. isPerformingWork = false;
  483. if (enableProfiling) {
  484. var _currentTime = getCurrentTime();
  485. markSchedulerSuspended(_currentTime);
  486. }
  487. }
  488. }
  489. function workLoop(hasTimeRemaining, initialTime) {
  490. var currentTime = initialTime;
  491. advanceTimers(currentTime);
  492. currentTask = peek(taskQueue);
  493. while (currentTask !== null && !(enableSchedulerDebugging && isSchedulerPaused)) {
  494. if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) {
  495. // This currentTask hasn't expired, and we've reached the deadline.
  496. break;
  497. }
  498. var callback = currentTask.callback;
  499. if (callback !== null) {
  500. currentTask.callback = null;
  501. currentPriorityLevel = currentTask.priorityLevel;
  502. var didUserCallbackTimeout = currentTask.expirationTime <= currentTime;
  503. markTaskRun(currentTask, currentTime);
  504. var continuationCallback = callback(didUserCallbackTimeout);
  505. currentTime = getCurrentTime();
  506. if (typeof continuationCallback === 'function') {
  507. currentTask.callback = continuationCallback;
  508. markTaskYield(currentTask, currentTime);
  509. } else {
  510. if (enableProfiling) {
  511. markTaskCompleted(currentTask, currentTime);
  512. currentTask.isQueued = false;
  513. }
  514. if (currentTask === peek(taskQueue)) {
  515. pop(taskQueue);
  516. }
  517. }
  518. advanceTimers(currentTime);
  519. } else {
  520. pop(taskQueue);
  521. }
  522. currentTask = peek(taskQueue);
  523. } // Return whether there's additional work
  524. if (currentTask !== null) {
  525. return true;
  526. } else {
  527. var firstTimer = peek(timerQueue);
  528. if (firstTimer !== null) {
  529. requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);
  530. }
  531. return false;
  532. }
  533. }
  534. function unstable_runWithPriority(priorityLevel, eventHandler) {
  535. switch (priorityLevel) {
  536. case ImmediatePriority:
  537. case UserBlockingPriority:
  538. case NormalPriority:
  539. case LowPriority:
  540. case IdlePriority:
  541. break;
  542. default:
  543. priorityLevel = NormalPriority;
  544. }
  545. var previousPriorityLevel = currentPriorityLevel;
  546. currentPriorityLevel = priorityLevel;
  547. try {
  548. return eventHandler();
  549. } finally {
  550. currentPriorityLevel = previousPriorityLevel;
  551. }
  552. }
  553. function unstable_next(eventHandler) {
  554. var priorityLevel;
  555. switch (currentPriorityLevel) {
  556. case ImmediatePriority:
  557. case UserBlockingPriority:
  558. case NormalPriority:
  559. // Shift down to normal priority
  560. priorityLevel = NormalPriority;
  561. break;
  562. default:
  563. // Anything lower than normal priority should remain at the current level.
  564. priorityLevel = currentPriorityLevel;
  565. break;
  566. }
  567. var previousPriorityLevel = currentPriorityLevel;
  568. currentPriorityLevel = priorityLevel;
  569. try {
  570. return eventHandler();
  571. } finally {
  572. currentPriorityLevel = previousPriorityLevel;
  573. }
  574. }
  575. function unstable_wrapCallback(callback) {
  576. var parentPriorityLevel = currentPriorityLevel;
  577. return function () {
  578. // This is a fork of runWithPriority, inlined for performance.
  579. var previousPriorityLevel = currentPriorityLevel;
  580. currentPriorityLevel = parentPriorityLevel;
  581. try {
  582. return callback.apply(this, arguments);
  583. } finally {
  584. currentPriorityLevel = previousPriorityLevel;
  585. }
  586. };
  587. }
  588. function timeoutForPriorityLevel(priorityLevel) {
  589. switch (priorityLevel) {
  590. case ImmediatePriority:
  591. return IMMEDIATE_PRIORITY_TIMEOUT;
  592. case UserBlockingPriority:
  593. return USER_BLOCKING_PRIORITY;
  594. case IdlePriority:
  595. return IDLE_PRIORITY;
  596. case LowPriority:
  597. return LOW_PRIORITY_TIMEOUT;
  598. case NormalPriority:
  599. default:
  600. return NORMAL_PRIORITY_TIMEOUT;
  601. }
  602. }
  603. function unstable_scheduleCallback(priorityLevel, callback, options) {
  604. var currentTime = getCurrentTime();
  605. var startTime;
  606. var timeout;
  607. if (typeof options === 'object' && options !== null) {
  608. var delay = options.delay;
  609. if (typeof delay === 'number' && delay > 0) {
  610. startTime = currentTime + delay;
  611. } else {
  612. startTime = currentTime;
  613. }
  614. timeout = typeof options.timeout === 'number' ? options.timeout : timeoutForPriorityLevel(priorityLevel);
  615. } else {
  616. timeout = timeoutForPriorityLevel(priorityLevel);
  617. startTime = currentTime;
  618. }
  619. var expirationTime = startTime + timeout;
  620. var newTask = {
  621. id: taskIdCounter++,
  622. callback: callback,
  623. priorityLevel: priorityLevel,
  624. startTime: startTime,
  625. expirationTime: expirationTime,
  626. sortIndex: -1
  627. };
  628. if (enableProfiling) {
  629. newTask.isQueued = false;
  630. }
  631. if (startTime > currentTime) {
  632. // This is a delayed task.
  633. newTask.sortIndex = startTime;
  634. push(timerQueue, newTask);
  635. if (peek(taskQueue) === null && newTask === peek(timerQueue)) {
  636. // All tasks are delayed, and this is the task with the earliest delay.
  637. if (isHostTimeoutScheduled) {
  638. // Cancel an existing timeout.
  639. cancelHostTimeout();
  640. } else {
  641. isHostTimeoutScheduled = true;
  642. } // Schedule a timeout.
  643. requestHostTimeout(handleTimeout, startTime - currentTime);
  644. }
  645. } else {
  646. newTask.sortIndex = expirationTime;
  647. push(taskQueue, newTask);
  648. if (enableProfiling) {
  649. markTaskStart(newTask, currentTime);
  650. newTask.isQueued = true;
  651. } // Schedule a host callback, if needed. If we're already performing work,
  652. // wait until the next time we yield.
  653. if (!isHostCallbackScheduled && !isPerformingWork) {
  654. isHostCallbackScheduled = true;
  655. requestHostCallback(flushWork);
  656. }
  657. }
  658. return newTask;
  659. }
  660. function unstable_pauseExecution() {
  661. isSchedulerPaused = true;
  662. }
  663. function unstable_continueExecution() {
  664. isSchedulerPaused = false;
  665. if (!isHostCallbackScheduled && !isPerformingWork) {
  666. isHostCallbackScheduled = true;
  667. requestHostCallback(flushWork);
  668. }
  669. }
  670. function unstable_getFirstCallbackNode() {
  671. return peek(taskQueue);
  672. }
  673. function unstable_cancelCallback(task) {
  674. if (enableProfiling) {
  675. if (task.isQueued) {
  676. var currentTime = getCurrentTime();
  677. markTaskCanceled(task, currentTime);
  678. task.isQueued = false;
  679. }
  680. } // Null out the callback to indicate the task has been canceled. (Can't
  681. // remove from the queue because you can't remove arbitrary nodes from an
  682. // array based heap, only the first one.)
  683. task.callback = null;
  684. }
  685. function unstable_getCurrentPriorityLevel() {
  686. return currentPriorityLevel;
  687. }
  688. function unstable_shouldYield() {
  689. var currentTime = getCurrentTime();
  690. advanceTimers(currentTime);
  691. var firstTask = peek(taskQueue);
  692. return firstTask !== currentTask && currentTask !== null && firstTask !== null && firstTask.callback !== null && firstTask.startTime <= currentTime && firstTask.expirationTime < currentTask.expirationTime || shouldYieldToHost();
  693. }
  694. var unstable_requestPaint = requestPaint;
  695. var unstable_Profiling = enableProfiling ? {
  696. startLoggingProfilingEvents: startLoggingProfilingEvents,
  697. stopLoggingProfilingEvents: stopLoggingProfilingEvents,
  698. sharedProfilingBuffer: sharedProfilingBuffer
  699. } : null;
  700. exports.unstable_flushAllWithoutAsserting = unstable_flushAllWithoutAsserting;
  701. exports.unstable_flushNumberOfYields = unstable_flushNumberOfYields;
  702. exports.unstable_flushExpired = unstable_flushExpired;
  703. exports.unstable_clearYields = unstable_clearYields;
  704. exports.unstable_flushUntilNextPaint = unstable_flushUntilNextPaint;
  705. exports.unstable_flushAll = unstable_flushAll;
  706. exports.unstable_yieldValue = unstable_yieldValue;
  707. exports.unstable_advanceTime = unstable_advanceTime;
  708. exports.unstable_ImmediatePriority = ImmediatePriority;
  709. exports.unstable_UserBlockingPriority = UserBlockingPriority;
  710. exports.unstable_NormalPriority = NormalPriority;
  711. exports.unstable_IdlePriority = IdlePriority;
  712. exports.unstable_LowPriority = LowPriority;
  713. exports.unstable_runWithPriority = unstable_runWithPriority;
  714. exports.unstable_next = unstable_next;
  715. exports.unstable_scheduleCallback = unstable_scheduleCallback;
  716. exports.unstable_cancelCallback = unstable_cancelCallback;
  717. exports.unstable_wrapCallback = unstable_wrapCallback;
  718. exports.unstable_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel;
  719. exports.unstable_shouldYield = unstable_shouldYield;
  720. exports.unstable_requestPaint = unstable_requestPaint;
  721. exports.unstable_continueExecution = unstable_continueExecution;
  722. exports.unstable_pauseExecution = unstable_pauseExecution;
  723. exports.unstable_getFirstCallbackNode = unstable_getFirstCallbackNode;
  724. exports.unstable_now = getCurrentTime;
  725. exports.unstable_forceFrameRate = forceFrameRate;
  726. exports.unstable_Profiling = unstable_Profiling;
  727. Object.defineProperty(exports, '__esModule', { value: true });
  728. })));