2026-07-07 07:11:50 +00:00
/** @license React v0.20.2
2026-07-05 06:41:32 +00:00
* scheduler-unstable_mock.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' ;
var enableSchedulerDebugging = false ;
var enableProfiling = false ;
2026-07-07 07:11:50 +00:00
var currentTime = 0 ;
var scheduledCallback = null ;
var scheduledTimeout = null ;
var timeoutTime = - 1 ;
var yieldedValues = null ;
var expectedNumberOfYields = - 1 ;
var didStop = false ;
var isFlushing = false ;
var needsPaint = false ;
var shouldYieldForPaint = false ;
function requestHostCallback ( callback ) {
scheduledCallback = callback ;
}
function requestHostTimeout ( callback , ms ) {
scheduledTimeout = callback ;
timeoutTime = currentTime + ms ;
}
function cancelHostTimeout ( ) {
scheduledTimeout = null ;
timeoutTime = - 1 ;
}
function shouldYieldToHost ( ) {
if ( expectedNumberOfYields !== - 1 && yieldedValues !== null && yieldedValues . length >= expectedNumberOfYields || shouldYieldForPaint && needsPaint ) {
// We yielded at least as many values as expected. Stop flushing.
didStop = true ;
return true ;
}
return false ;
}
function getCurrentTime ( ) {
return currentTime ;
}
function forceFrameRate ( ) { // No-op
}
function unstable _flushNumberOfYields ( count ) {
if ( isFlushing ) {
throw new Error ( 'Already flushing work.' ) ;
}
if ( scheduledCallback !== null ) {
var cb = scheduledCallback ;
expectedNumberOfYields = count ;
isFlushing = true ;
try {
var hasMoreWork = true ;
do {
hasMoreWork = cb ( true , currentTime ) ;
} while ( hasMoreWork && ! didStop ) ;
if ( ! hasMoreWork ) {
scheduledCallback = null ;
}
} finally {
expectedNumberOfYields = - 1 ;
didStop = false ;
isFlushing = false ;
}
}
}
function unstable _flushUntilNextPaint ( ) {
if ( isFlushing ) {
throw new Error ( 'Already flushing work.' ) ;
}
if ( scheduledCallback !== null ) {
var cb = scheduledCallback ;
shouldYieldForPaint = true ;
needsPaint = false ;
isFlushing = true ;
try {
var hasMoreWork = true ;
do {
hasMoreWork = cb ( true , currentTime ) ;
} while ( hasMoreWork && ! didStop ) ;
if ( ! hasMoreWork ) {
scheduledCallback = null ;
}
} finally {
shouldYieldForPaint = false ;
didStop = false ;
isFlushing = false ;
}
}
}
function unstable _flushExpired ( ) {
if ( isFlushing ) {
throw new Error ( 'Already flushing work.' ) ;
}
if ( scheduledCallback !== null ) {
isFlushing = true ;
try {
var hasMoreWork = scheduledCallback ( false , currentTime ) ;
if ( ! hasMoreWork ) {
scheduledCallback = null ;
}
} finally {
isFlushing = false ;
}
}
}
function unstable _flushAllWithoutAsserting ( ) {
// Returns false if no work was flushed.
if ( isFlushing ) {
throw new Error ( 'Already flushing work.' ) ;
}
if ( scheduledCallback !== null ) {
var cb = scheduledCallback ;
isFlushing = true ;
try {
var hasMoreWork = true ;
do {
hasMoreWork = cb ( true , currentTime ) ;
} while ( hasMoreWork ) ;
if ( ! hasMoreWork ) {
scheduledCallback = null ;
}
return true ;
} finally {
isFlushing = false ;
}
} else {
return false ;
}
}
function unstable _clearYields ( ) {
if ( yieldedValues === null ) {
return [ ] ;
}
var values = yieldedValues ;
yieldedValues = null ;
return values ;
}
function unstable _flushAll ( ) {
if ( yieldedValues !== null ) {
throw new Error ( 'Log is not empty. Assert on the log of yielded values before ' + 'flushing additional work.' ) ;
}
unstable _flushAllWithoutAsserting ( ) ;
if ( yieldedValues !== null ) {
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([...])' ) ;
}
}
function unstable _yieldValue ( value ) {
// eslint-disable-next-line react-internal/no-production-logging
if ( console . log . name === 'disabledLog' ) {
// If console.log has been patched, we assume we're in render
// replaying and we ignore any values yielding in the second pass.
return ;
}
if ( yieldedValues === null ) {
yieldedValues = [ value ] ;
} else {
yieldedValues . push ( value ) ;
}
}
function unstable _advanceTime ( ms ) {
// eslint-disable-next-line react-internal/no-production-logging
if ( console . log . name === 'disabledLog' ) {
// If console.log has been patched, we assume we're in render
// replaying and we ignore any time advancing in the second pass.
return ;
}
currentTime += ms ;
if ( scheduledTimeout !== null && timeoutTime <= currentTime ) {
scheduledTimeout ( currentTime ) ;
timeoutTime = - 1 ;
scheduledTimeout = null ;
}
}
function requestPaint ( ) {
needsPaint = true ;
}
2026-07-05 06:41:32 +00:00
function push ( heap , node ) {
var index = heap . length ;
heap . push ( node ) ;
siftUp ( heap , node , index ) ;
}
function peek ( heap ) {
2026-07-07 07:11:50 +00:00
var first = heap [ 0 ] ;
return first === undefined ? null : first ;
2026-07-05 06:41:32 +00:00
}
function pop ( heap ) {
var first = heap [ 0 ] ;
2026-07-07 07:11:50 +00:00
if ( first !== undefined ) {
var last = heap . pop ( ) ;
if ( last !== first ) {
heap [ 0 ] = last ;
siftDown ( heap , last , 0 ) ;
}
2026-07-05 06:41:32 +00:00
2026-07-07 07:11:50 +00:00
return first ;
} else {
return null ;
}
2026-07-05 06:41:32 +00:00
}
function siftUp ( heap , node , i ) {
var index = i ;
2026-07-07 07:11:50 +00:00
while ( true ) {
2026-07-05 06:41:32 +00:00
var parentIndex = index - 1 >>> 1 ;
var parent = heap [ parentIndex ] ;
2026-07-07 07:11:50 +00:00
if ( parent !== undefined && compare ( parent , node ) > 0 ) {
2026-07-05 06:41:32 +00:00
// The parent is larger. Swap positions.
heap [ parentIndex ] = node ;
heap [ index ] = parent ;
index = parentIndex ;
} else {
// The parent is smaller. Exit.
return ;
}
}
}
function siftDown ( heap , node , i ) {
var index = i ;
var length = heap . length ;
2026-07-07 07:11:50 +00:00
while ( index < length ) {
2026-07-05 06:41:32 +00:00
var leftIndex = ( index + 1 ) * 2 - 1 ;
var left = heap [ leftIndex ] ;
var rightIndex = leftIndex + 1 ;
var right = heap [ rightIndex ] ; // If the left or right node is smaller, swap with the smaller of those.
2026-07-07 07:11:50 +00:00
if ( left !== undefined && compare ( left , node ) < 0 ) {
if ( right !== undefined && compare ( right , left ) < 0 ) {
2026-07-05 06:41:32 +00:00
heap [ index ] = right ;
heap [ rightIndex ] = node ;
index = rightIndex ;
} else {
heap [ index ] = left ;
heap [ leftIndex ] = node ;
index = leftIndex ;
}
2026-07-07 07:11:50 +00:00
} else if ( right !== undefined && compare ( right , node ) < 0 ) {
2026-07-05 06:41:32 +00:00
heap [ index ] = right ;
heap [ rightIndex ] = node ;
index = rightIndex ;
} else {
// Neither child is smaller. Exit.
return ;
}
}
}
function compare ( a , b ) {
// Compare sort index first, then task id.
var diff = a . sortIndex - b . sortIndex ;
return diff !== 0 ? diff : a . id - b . id ;
}
// TODO: Use symbols?
var ImmediatePriority = 1 ;
var UserBlockingPriority = 2 ;
var NormalPriority = 3 ;
var LowPriority = 4 ;
var IdlePriority = 5 ;
function markTaskErrored ( task , ms ) {
}
/* eslint-disable no-var */
// Math.pow(2, 30) - 1
// 0b111111111111111111111111111111
var maxSigned31BitInt = 1073741823 ; // Times out immediately
var IMMEDIATE _PRIORITY _TIMEOUT = - 1 ; // Eventually times out
var USER _BLOCKING _PRIORITY _TIMEOUT = 250 ;
var NORMAL _PRIORITY _TIMEOUT = 5000 ;
var LOW _PRIORITY _TIMEOUT = 10000 ; // Never times out
var IDLE _PRIORITY _TIMEOUT = maxSigned31BitInt ; // Tasks are stored on a min heap
var taskQueue = [ ] ;
var timerQueue = [ ] ; // Incrementing id counter. Used to maintain insertion order.
var taskIdCounter = 1 ; // Pausing the scheduler is useful for debugging.
var currentTask = null ;
2026-07-07 07:11:50 +00:00
var currentPriorityLevel = NormalPriority ; // This is set while performing work, to prevent re-entrancy.
2026-07-05 06:41:32 +00:00
var isPerformingWork = false ;
var isHostCallbackScheduled = false ;
var isHostTimeoutScheduled = false ;
function advanceTimers ( currentTime ) {
// Check for tasks that are no longer delayed and add them to the queue.
var timer = peek ( timerQueue ) ;
while ( timer !== null ) {
if ( timer . callback === null ) {
// Timer was cancelled.
pop ( timerQueue ) ;
} else if ( timer . startTime <= currentTime ) {
// Timer fired. Transfer to the task queue.
pop ( timerQueue ) ;
timer . sortIndex = timer . expirationTime ;
push ( taskQueue , timer ) ;
} else {
// Remaining timers are pending.
return ;
}
timer = peek ( timerQueue ) ;
}
}
function handleTimeout ( currentTime ) {
isHostTimeoutScheduled = false ;
advanceTimers ( currentTime ) ;
if ( ! isHostCallbackScheduled ) {
if ( peek ( taskQueue ) !== null ) {
isHostCallbackScheduled = true ;
requestHostCallback ( flushWork ) ;
} else {
var firstTimer = peek ( timerQueue ) ;
if ( firstTimer !== null ) {
requestHostTimeout ( handleTimeout , firstTimer . startTime - currentTime ) ;
}
}
}
}
function flushWork ( hasTimeRemaining , initialTime ) {
isHostCallbackScheduled = false ;
if ( isHostTimeoutScheduled ) {
// We scheduled a timeout but it's no longer needed. Cancel it.
isHostTimeoutScheduled = false ;
cancelHostTimeout ( ) ;
}
isPerformingWork = true ;
var previousPriorityLevel = currentPriorityLevel ;
try {
if ( enableProfiling ) {
try {
return workLoop ( hasTimeRemaining , initialTime ) ;
} catch ( error ) {
if ( currentTask !== null ) {
var currentTime = getCurrentTime ( ) ;
markTaskErrored ( currentTask , currentTime ) ;
currentTask . isQueued = false ;
}
throw error ;
}
} else {
// No catch in prod code path.
return workLoop ( hasTimeRemaining , initialTime ) ;
}
} finally {
currentTask = null ;
currentPriorityLevel = previousPriorityLevel ;
isPerformingWork = false ;
}
}
function workLoop ( hasTimeRemaining , initialTime ) {
var currentTime = initialTime ;
advanceTimers ( currentTime ) ;
currentTask = peek ( taskQueue ) ;
while ( currentTask !== null && ! ( enableSchedulerDebugging ) ) {
if ( currentTask . expirationTime > currentTime && ( ! hasTimeRemaining || shouldYieldToHost ( ) ) ) {
// This currentTask hasn't expired, and we've reached the deadline.
break ;
}
var callback = currentTask . callback ;
if ( typeof callback === 'function' ) {
currentTask . callback = null ;
currentPriorityLevel = currentTask . priorityLevel ;
var didUserCallbackTimeout = currentTask . expirationTime <= currentTime ;
var continuationCallback = callback ( didUserCallbackTimeout ) ;
currentTime = getCurrentTime ( ) ;
if ( typeof continuationCallback === 'function' ) {
currentTask . callback = continuationCallback ;
} else {
if ( currentTask === peek ( taskQueue ) ) {
pop ( taskQueue ) ;
}
}
advanceTimers ( currentTime ) ;
} else {
pop ( taskQueue ) ;
}
currentTask = peek ( taskQueue ) ;
} // Return whether there's additional work
if ( currentTask !== null ) {
return true ;
} else {
var firstTimer = peek ( timerQueue ) ;
if ( firstTimer !== null ) {
requestHostTimeout ( handleTimeout , firstTimer . startTime - currentTime ) ;
}
return false ;
}
}
function unstable _runWithPriority ( priorityLevel , eventHandler ) {
switch ( priorityLevel ) {
case ImmediatePriority :
case UserBlockingPriority :
case NormalPriority :
case LowPriority :
case IdlePriority :
break ;
default :
priorityLevel = NormalPriority ;
}
var previousPriorityLevel = currentPriorityLevel ;
currentPriorityLevel = priorityLevel ;
try {
return eventHandler ( ) ;
} finally {
currentPriorityLevel = previousPriorityLevel ;
}
}
function unstable _next ( eventHandler ) {
var priorityLevel ;
switch ( currentPriorityLevel ) {
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 ;
break ;
}
var previousPriorityLevel = currentPriorityLevel ;
currentPriorityLevel = priorityLevel ;
try {
return eventHandler ( ) ;
} finally {
currentPriorityLevel = previousPriorityLevel ;
}
}
function unstable _wrapCallback ( callback ) {
var parentPriorityLevel = currentPriorityLevel ;
return function ( ) {
// This is a fork of runWithPriority, inlined for performance.
var previousPriorityLevel = currentPriorityLevel ;
currentPriorityLevel = parentPriorityLevel ;
try {
return callback . apply ( this , arguments ) ;
} finally {
currentPriorityLevel = previousPriorityLevel ;
}
} ;
}
function unstable _scheduleCallback ( priorityLevel , callback , options ) {
var currentTime = getCurrentTime ( ) ;
var startTime ;
if ( typeof options === 'object' && options !== null ) {
var delay = options . delay ;
if ( typeof delay === 'number' && delay > 0 ) {
startTime = currentTime + delay ;
} else {
startTime = currentTime ;
}
} else {
startTime = currentTime ;
}
var timeout ;
switch ( priorityLevel ) {
case ImmediatePriority :
timeout = IMMEDIATE _PRIORITY _TIMEOUT ;
break ;
case UserBlockingPriority :
timeout = USER _BLOCKING _PRIORITY _TIMEOUT ;
break ;
case IdlePriority :
timeout = IDLE _PRIORITY _TIMEOUT ;
break ;
case LowPriority :
timeout = LOW _PRIORITY _TIMEOUT ;
break ;
case NormalPriority :
default :
timeout = NORMAL _PRIORITY _TIMEOUT ;
break ;
}
var expirationTime = startTime + timeout ;
var newTask = {
id : taskIdCounter ++ ,
callback : callback ,
priorityLevel : priorityLevel ,
startTime : startTime ,
expirationTime : expirationTime ,
sortIndex : - 1
} ;
if ( startTime > currentTime ) {
// This is a delayed task.
newTask . sortIndex = startTime ;
push ( timerQueue , newTask ) ;
if ( peek ( taskQueue ) === null && newTask === peek ( timerQueue ) ) {
// All tasks are delayed, and this is the task with the earliest delay.
if ( isHostTimeoutScheduled ) {
// Cancel an existing timeout.
cancelHostTimeout ( ) ;
} else {
isHostTimeoutScheduled = true ;
} // Schedule a timeout.
requestHostTimeout ( handleTimeout , startTime - currentTime ) ;
}
} else {
newTask . sortIndex = expirationTime ;
push ( taskQueue , newTask ) ;
// wait until the next time we yield.
if ( ! isHostCallbackScheduled && ! isPerformingWork ) {
isHostCallbackScheduled = true ;
requestHostCallback ( flushWork ) ;
}
}
return newTask ;
}
function unstable _pauseExecution ( ) {
}
function unstable _continueExecution ( ) {
if ( ! isHostCallbackScheduled && ! isPerformingWork ) {
isHostCallbackScheduled = true ;
requestHostCallback ( flushWork ) ;
}
}
function unstable _getFirstCallbackNode ( ) {
return peek ( taskQueue ) ;
}
function unstable _cancelCallback ( task ) {
// remove from the queue because you can't remove arbitrary nodes from an
// array based heap, only the first one.)
task . callback = null ;
}
function unstable _getCurrentPriorityLevel ( ) {
return currentPriorityLevel ;
}
2026-07-07 07:11:50 +00:00
var unstable _requestPaint = requestPaint ;
2026-07-05 06:41:32 +00:00
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 _advanceTime = unstable _advanceTime ;
exports . unstable _cancelCallback = unstable _cancelCallback ;
exports . unstable _clearYields = unstable _clearYields ;
exports . unstable _continueExecution = unstable _continueExecution ;
exports . unstable _flushAll = unstable _flushAll ;
exports . unstable _flushAllWithoutAsserting = unstable _flushAllWithoutAsserting ;
exports . unstable _flushExpired = unstable _flushExpired ;
exports . unstable _flushNumberOfYields = unstable _flushNumberOfYields ;
exports . unstable _flushUntilNextPaint = unstable _flushUntilNextPaint ;
exports . unstable _forceFrameRate = forceFrameRate ;
exports . unstable _getCurrentPriorityLevel = unstable _getCurrentPriorityLevel ;
exports . unstable _getFirstCallbackNode = unstable _getFirstCallbackNode ;
exports . unstable _next = unstable _next ;
exports . unstable _now = getCurrentTime ;
exports . unstable _pauseExecution = unstable _pauseExecution ;
2026-07-07 07:11:50 +00:00
exports . unstable _requestPaint = unstable _requestPaint ;
2026-07-05 06:41:32 +00:00
exports . unstable _runWithPriority = unstable _runWithPriority ;
exports . unstable _scheduleCallback = unstable _scheduleCallback ;
exports . unstable _shouldYield = shouldYieldToHost ;
exports . unstable _wrapCallback = unstable _wrapCallback ;
exports . unstable _yieldValue = unstable _yieldValue ;
} ) ( ) ;
}