mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
Remove decoupleUpdatePriorityFromScheduler
This commit is contained in:
+6
-20
@@ -40,7 +40,6 @@ import {getClosestInstanceFromNode} from '../client/ReactDOMComponentTree';
|
||||
|
||||
import {
|
||||
enableLegacyFBSupport,
|
||||
decoupleUpdatePriorityFromScheduler,
|
||||
enableNewReconciler,
|
||||
} from 'shared/ReactFeatureFlags';
|
||||
import {dispatchEventForPluginEventSystem} from './DOMPluginEventSystem';
|
||||
@@ -177,25 +176,10 @@ function dispatchContinuousEvent(
|
||||
container,
|
||||
nativeEvent,
|
||||
) {
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
const previousPriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
// TODO: Double wrapping is necessary while we decouple Scheduler priority.
|
||||
setCurrentUpdateLanePriority(InputContinuousLanePriority);
|
||||
runWithPriority(
|
||||
UserBlockingPriority,
|
||||
dispatchEvent.bind(
|
||||
null,
|
||||
domEventName,
|
||||
eventSystemFlags,
|
||||
container,
|
||||
nativeEvent,
|
||||
),
|
||||
);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousPriority);
|
||||
}
|
||||
} else {
|
||||
const previousPriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
// TODO: Double wrapping is necessary while we decouple Scheduler priority.
|
||||
setCurrentUpdateLanePriority(InputContinuousLanePriority);
|
||||
runWithPriority(
|
||||
UserBlockingPriority,
|
||||
dispatchEvent.bind(
|
||||
@@ -206,6 +190,8 @@ function dispatchContinuousEvent(
|
||||
nativeEvent,
|
||||
),
|
||||
);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousPriority);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@ import {
|
||||
enableSchedulingProfiler,
|
||||
enableNewReconciler,
|
||||
enableCache,
|
||||
decoupleUpdatePriorityFromScheduler,
|
||||
enableUseRefAccessWarning,
|
||||
enableStrictEffects,
|
||||
enableLazyContextPropagation,
|
||||
@@ -1713,66 +1712,37 @@ function rerenderDeferredValue<T>(value: T): T {
|
||||
|
||||
function startTransition(setPending, callback) {
|
||||
const priorityLevel = getCurrentPriorityLevel();
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
setCurrentUpdateLanePriority(
|
||||
higherLanePriority(previousLanePriority, InputContinuousLanePriority),
|
||||
);
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
setCurrentUpdateLanePriority(
|
||||
higherLanePriority(previousLanePriority, InputContinuousLanePriority),
|
||||
);
|
||||
|
||||
runWithPriority(
|
||||
priorityLevel < UserBlockingPriority
|
||||
? UserBlockingPriority
|
||||
: priorityLevel,
|
||||
() => {
|
||||
setPending(true);
|
||||
},
|
||||
);
|
||||
runWithPriority(
|
||||
priorityLevel < UserBlockingPriority ? UserBlockingPriority : priorityLevel,
|
||||
() => {
|
||||
setPending(true);
|
||||
},
|
||||
);
|
||||
|
||||
// TODO: Can remove this. Was only necessary because we used to give
|
||||
// different behavior to transitions without a config object. Now they are
|
||||
// all treated the same.
|
||||
setCurrentUpdateLanePriority(DefaultLanePriority);
|
||||
// TODO: Can remove this. Was only necessary because we used to give
|
||||
// different behavior to transitions without a config object. Now they are
|
||||
// all treated the same.
|
||||
setCurrentUpdateLanePriority(DefaultLanePriority);
|
||||
|
||||
runWithPriority(
|
||||
priorityLevel > NormalPriority ? NormalPriority : priorityLevel,
|
||||
() => {
|
||||
const prevTransition = ReactCurrentBatchConfig.transition;
|
||||
ReactCurrentBatchConfig.transition = 1;
|
||||
try {
|
||||
setPending(false);
|
||||
callback();
|
||||
} finally {
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
}
|
||||
ReactCurrentBatchConfig.transition = prevTransition;
|
||||
}
|
||||
},
|
||||
);
|
||||
} else {
|
||||
runWithPriority(
|
||||
priorityLevel < UserBlockingPriority
|
||||
? UserBlockingPriority
|
||||
: priorityLevel,
|
||||
() => {
|
||||
setPending(true);
|
||||
},
|
||||
);
|
||||
|
||||
runWithPriority(
|
||||
priorityLevel > NormalPriority ? NormalPriority : priorityLevel,
|
||||
() => {
|
||||
const prevTransition = ReactCurrentBatchConfig.transition;
|
||||
ReactCurrentBatchConfig.transition = 1;
|
||||
try {
|
||||
setPending(false);
|
||||
callback();
|
||||
} finally {
|
||||
ReactCurrentBatchConfig.transition = prevTransition;
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
runWithPriority(
|
||||
priorityLevel > NormalPriority ? NormalPriority : priorityLevel,
|
||||
() => {
|
||||
const prevTransition = ReactCurrentBatchConfig.transition;
|
||||
ReactCurrentBatchConfig.transition = 1;
|
||||
try {
|
||||
setPending(false);
|
||||
callback();
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
ReactCurrentBatchConfig.transition = prevTransition;
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
function mountTransition(): [(() => void) => void, boolean] {
|
||||
|
||||
@@ -27,7 +27,6 @@ import {
|
||||
enableSchedulingProfiler,
|
||||
enableNewReconciler,
|
||||
enableCache,
|
||||
decoupleUpdatePriorityFromScheduler,
|
||||
enableUseRefAccessWarning,
|
||||
enableStrictEffects,
|
||||
enableLazyContextPropagation,
|
||||
@@ -1713,66 +1712,37 @@ function rerenderDeferredValue<T>(value: T): T {
|
||||
|
||||
function startTransition(setPending, callback) {
|
||||
const priorityLevel = getCurrentPriorityLevel();
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
setCurrentUpdateLanePriority(
|
||||
higherLanePriority(previousLanePriority, InputContinuousLanePriority),
|
||||
);
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
setCurrentUpdateLanePriority(
|
||||
higherLanePriority(previousLanePriority, InputContinuousLanePriority),
|
||||
);
|
||||
|
||||
runWithPriority(
|
||||
priorityLevel < UserBlockingPriority
|
||||
? UserBlockingPriority
|
||||
: priorityLevel,
|
||||
() => {
|
||||
setPending(true);
|
||||
},
|
||||
);
|
||||
runWithPriority(
|
||||
priorityLevel < UserBlockingPriority ? UserBlockingPriority : priorityLevel,
|
||||
() => {
|
||||
setPending(true);
|
||||
},
|
||||
);
|
||||
|
||||
// TODO: Can remove this. Was only necessary because we used to give
|
||||
// different behavior to transitions without a config object. Now they are
|
||||
// all treated the same.
|
||||
setCurrentUpdateLanePriority(DefaultLanePriority);
|
||||
// TODO: Can remove this. Was only necessary because we used to give
|
||||
// different behavior to transitions without a config object. Now they are
|
||||
// all treated the same.
|
||||
setCurrentUpdateLanePriority(DefaultLanePriority);
|
||||
|
||||
runWithPriority(
|
||||
priorityLevel > NormalPriority ? NormalPriority : priorityLevel,
|
||||
() => {
|
||||
const prevTransition = ReactCurrentBatchConfig.transition;
|
||||
ReactCurrentBatchConfig.transition = 1;
|
||||
try {
|
||||
setPending(false);
|
||||
callback();
|
||||
} finally {
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
}
|
||||
ReactCurrentBatchConfig.transition = prevTransition;
|
||||
}
|
||||
},
|
||||
);
|
||||
} else {
|
||||
runWithPriority(
|
||||
priorityLevel < UserBlockingPriority
|
||||
? UserBlockingPriority
|
||||
: priorityLevel,
|
||||
() => {
|
||||
setPending(true);
|
||||
},
|
||||
);
|
||||
|
||||
runWithPriority(
|
||||
priorityLevel > NormalPriority ? NormalPriority : priorityLevel,
|
||||
() => {
|
||||
const prevTransition = ReactCurrentBatchConfig.transition;
|
||||
ReactCurrentBatchConfig.transition = 1;
|
||||
try {
|
||||
setPending(false);
|
||||
callback();
|
||||
} finally {
|
||||
ReactCurrentBatchConfig.transition = prevTransition;
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
runWithPriority(
|
||||
priorityLevel > NormalPriority ? NormalPriority : priorityLevel,
|
||||
() => {
|
||||
const prevTransition = ReactCurrentBatchConfig.transition;
|
||||
ReactCurrentBatchConfig.transition = 1;
|
||||
try {
|
||||
setPending(false);
|
||||
callback();
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
ReactCurrentBatchConfig.transition = prevTransition;
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
function mountTransition(): [(() => void) => void, boolean] {
|
||||
|
||||
@@ -28,7 +28,6 @@ import {
|
||||
enableSchedulerTracing,
|
||||
warnAboutUnmockedScheduler,
|
||||
deferRenderPhaseUpdateToNextBatch,
|
||||
decoupleUpdatePriorityFromScheduler,
|
||||
enableDebugTracing,
|
||||
enableSchedulingProfiler,
|
||||
disableSchedulerTimeoutInWorkLoop,
|
||||
@@ -455,10 +454,7 @@ export function requestUpdateLane(fiber: Fiber): Lane {
|
||||
schedulerPriority === UserBlockingSchedulerPriority
|
||||
) {
|
||||
lane = findUpdateLane(InputDiscreteLanePriority);
|
||||
} else if (
|
||||
decoupleUpdatePriorityFromScheduler &&
|
||||
getCurrentUpdateLanePriority() !== NoLanePriority
|
||||
) {
|
||||
} else if (getCurrentUpdateLanePriority() !== NoLanePriority) {
|
||||
const currentLanePriority = getCurrentUpdateLanePriority();
|
||||
lane = findUpdateLane(currentLanePriority);
|
||||
} else {
|
||||
@@ -567,10 +563,6 @@ export function scheduleUpdateOnFiber(
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: requestUpdateLanePriority also reads the priority. Pass the
|
||||
// priority as an argument to that function and this one.
|
||||
const priorityLevel = getCurrentPriorityLevel();
|
||||
|
||||
if (lane === SyncLane) {
|
||||
if (
|
||||
// Check if we're inside unbatchedUpdates
|
||||
@@ -598,7 +590,7 @@ export function scheduleUpdateOnFiber(
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
}
|
||||
} else if (decoupleUpdatePriorityFromScheduler) {
|
||||
} else {
|
||||
const updateLanePriority = getCurrentUpdateLanePriority();
|
||||
|
||||
// Schedule a discrete update but only if it's not Sync.
|
||||
@@ -619,26 +611,6 @@ export function scheduleUpdateOnFiber(
|
||||
// Schedule other updates after in case the callback is sync.
|
||||
ensureRootIsScheduled(root, eventTime);
|
||||
schedulePendingInteractions(root, lane);
|
||||
} else {
|
||||
// Schedule a discrete update but only if it's not Sync.
|
||||
if (
|
||||
(executionContext & DiscreteEventContext) !== NoContext &&
|
||||
// Only updates at user-blocking priority or greater are considered
|
||||
// discrete, even inside a discrete event.
|
||||
(priorityLevel === UserBlockingSchedulerPriority ||
|
||||
priorityLevel === ImmediateSchedulerPriority)
|
||||
) {
|
||||
// This is the result of a discrete event. Track the lowest priority
|
||||
// discrete update per root so we can flush them early, if needed.
|
||||
if (rootsWithPendingDiscreteUpdates === null) {
|
||||
rootsWithPendingDiscreteUpdates = new Set([root]);
|
||||
} else {
|
||||
rootsWithPendingDiscreteUpdates.add(root);
|
||||
}
|
||||
}
|
||||
// Schedule other updates after in case the callback is sync.
|
||||
ensureRootIsScheduled(root, eventTime);
|
||||
schedulePendingInteractions(root, lane);
|
||||
}
|
||||
|
||||
return root;
|
||||
@@ -1150,16 +1122,12 @@ export function flushDiscreteUpdates() {
|
||||
}
|
||||
|
||||
export function deferredUpdates<A>(fn: () => A): A {
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(DefaultLanePriority);
|
||||
return runWithPriority(NormalSchedulerPriority, fn);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
}
|
||||
} else {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(DefaultLanePriority);
|
||||
return runWithPriority(NormalSchedulerPriority, fn);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1218,36 +1186,20 @@ export function discreteUpdates<A, B, C, D, R>(
|
||||
const prevExecutionContext = executionContext;
|
||||
executionContext |= DiscreteEventContext;
|
||||
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(InputDiscreteLanePriority);
|
||||
return runWithPriority(
|
||||
UserBlockingSchedulerPriority,
|
||||
fn.bind(null, a, b, c, d),
|
||||
);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
executionContext = prevExecutionContext;
|
||||
if (executionContext === NoContext) {
|
||||
// Flush the immediate callbacks that were scheduled during this batch
|
||||
resetRenderTimer();
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
return runWithPriority(
|
||||
UserBlockingSchedulerPriority,
|
||||
fn.bind(null, a, b, c, d),
|
||||
);
|
||||
} finally {
|
||||
executionContext = prevExecutionContext;
|
||||
if (executionContext === NoContext) {
|
||||
// Flush the immediate callbacks that were scheduled during this batch
|
||||
resetRenderTimer();
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(InputDiscreteLanePriority);
|
||||
return runWithPriority(
|
||||
UserBlockingSchedulerPriority,
|
||||
fn.bind(null, a, b, c, d),
|
||||
);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
executionContext = prevExecutionContext;
|
||||
if (executionContext === NoContext) {
|
||||
// Flush the immediate callbacks that were scheduled during this batch
|
||||
resetRenderTimer();
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1282,68 +1234,39 @@ export function flushSync<A, R>(fn: A => R, a: A): R {
|
||||
}
|
||||
executionContext |= BatchedContext;
|
||||
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(SyncLanePriority);
|
||||
if (fn) {
|
||||
return runWithPriority(ImmediateSchedulerPriority, fn.bind(null, a));
|
||||
} else {
|
||||
return (undefined: $FlowFixMe);
|
||||
}
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
executionContext = prevExecutionContext;
|
||||
// Flush the immediate callbacks that were scheduled during this batch.
|
||||
// Note that this will happen even if batchedUpdates is higher up
|
||||
// the stack.
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
if (fn) {
|
||||
return runWithPriority(ImmediateSchedulerPriority, fn.bind(null, a));
|
||||
} else {
|
||||
return (undefined: $FlowFixMe);
|
||||
}
|
||||
} finally {
|
||||
executionContext = prevExecutionContext;
|
||||
// Flush the immediate callbacks that were scheduled during this batch.
|
||||
// Note that this will happen even if batchedUpdates is higher up
|
||||
// the stack.
|
||||
flushSyncCallbackQueue();
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(SyncLanePriority);
|
||||
if (fn) {
|
||||
return runWithPriority(ImmediateSchedulerPriority, fn.bind(null, a));
|
||||
} else {
|
||||
return (undefined: $FlowFixMe);
|
||||
}
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
executionContext = prevExecutionContext;
|
||||
// Flush the immediate callbacks that were scheduled during this batch.
|
||||
// Note that this will happen even if batchedUpdates is higher up
|
||||
// the stack.
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
}
|
||||
|
||||
export function flushControlled(fn: () => mixed): void {
|
||||
const prevExecutionContext = executionContext;
|
||||
executionContext |= BatchedContext;
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(SyncLanePriority);
|
||||
runWithPriority(ImmediateSchedulerPriority, fn);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(SyncLanePriority);
|
||||
runWithPriority(ImmediateSchedulerPriority, fn);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
|
||||
executionContext = prevExecutionContext;
|
||||
if (executionContext === NoContext) {
|
||||
// Flush the immediate callbacks that were scheduled during this batch
|
||||
resetRenderTimer();
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
runWithPriority(ImmediateSchedulerPriority, fn);
|
||||
} finally {
|
||||
executionContext = prevExecutionContext;
|
||||
if (executionContext === NoContext) {
|
||||
// Flush the immediate callbacks that were scheduled during this batch
|
||||
resetRenderTimer();
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
executionContext = prevExecutionContext;
|
||||
if (executionContext === NoContext) {
|
||||
// Flush the immediate callbacks that were scheduled during this batch
|
||||
resetRenderTimer();
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1954,11 +1877,8 @@ function commitRootImpl(root, renderPriorityLevel) {
|
||||
NoFlags;
|
||||
|
||||
if (subtreeHasEffects || rootHasEffect) {
|
||||
let previousLanePriority;
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
previousLanePriority = getCurrentUpdateLanePriority();
|
||||
setCurrentUpdateLanePriority(SyncLanePriority);
|
||||
}
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
setCurrentUpdateLanePriority(SyncLanePriority);
|
||||
|
||||
const prevExecutionContext = executionContext;
|
||||
executionContext |= CommitContext;
|
||||
@@ -2040,7 +1960,7 @@ function commitRootImpl(root, renderPriorityLevel) {
|
||||
}
|
||||
executionContext = prevExecutionContext;
|
||||
|
||||
if (decoupleUpdatePriorityFromScheduler && previousLanePriority != null) {
|
||||
if (previousLanePriority != null) {
|
||||
// Reset the priority to the previous non-sync value.
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
}
|
||||
@@ -2183,18 +2103,14 @@ export function flushPassiveEffects(): boolean {
|
||||
? NormalSchedulerPriority
|
||||
: pendingPassiveEffectsRenderPriority;
|
||||
pendingPassiveEffectsRenderPriority = NoSchedulerPriority;
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(
|
||||
schedulerPriorityToLanePriority(priorityLevel),
|
||||
);
|
||||
return runWithPriority(priorityLevel, flushPassiveEffectsImpl);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
}
|
||||
} else {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(
|
||||
schedulerPriorityToLanePriority(priorityLevel),
|
||||
);
|
||||
return runWithPriority(priorityLevel, flushPassiveEffectsImpl);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -28,7 +28,6 @@ import {
|
||||
enableSchedulerTracing,
|
||||
warnAboutUnmockedScheduler,
|
||||
deferRenderPhaseUpdateToNextBatch,
|
||||
decoupleUpdatePriorityFromScheduler,
|
||||
enableDebugTracing,
|
||||
enableSchedulingProfiler,
|
||||
disableSchedulerTimeoutInWorkLoop,
|
||||
@@ -455,10 +454,7 @@ export function requestUpdateLane(fiber: Fiber): Lane {
|
||||
schedulerPriority === UserBlockingSchedulerPriority
|
||||
) {
|
||||
lane = findUpdateLane(InputDiscreteLanePriority);
|
||||
} else if (
|
||||
decoupleUpdatePriorityFromScheduler &&
|
||||
getCurrentUpdateLanePriority() !== NoLanePriority
|
||||
) {
|
||||
} else if (getCurrentUpdateLanePriority() !== NoLanePriority) {
|
||||
const currentLanePriority = getCurrentUpdateLanePriority();
|
||||
lane = findUpdateLane(currentLanePriority);
|
||||
} else {
|
||||
@@ -567,10 +563,6 @@ export function scheduleUpdateOnFiber(
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: requestUpdateLanePriority also reads the priority. Pass the
|
||||
// priority as an argument to that function and this one.
|
||||
const priorityLevel = getCurrentPriorityLevel();
|
||||
|
||||
if (lane === SyncLane) {
|
||||
if (
|
||||
// Check if we're inside unbatchedUpdates
|
||||
@@ -598,7 +590,7 @@ export function scheduleUpdateOnFiber(
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
}
|
||||
} else if (decoupleUpdatePriorityFromScheduler) {
|
||||
} else {
|
||||
const updateLanePriority = getCurrentUpdateLanePriority();
|
||||
|
||||
// Schedule a discrete update but only if it's not Sync.
|
||||
@@ -619,26 +611,6 @@ export function scheduleUpdateOnFiber(
|
||||
// Schedule other updates after in case the callback is sync.
|
||||
ensureRootIsScheduled(root, eventTime);
|
||||
schedulePendingInteractions(root, lane);
|
||||
} else {
|
||||
// Schedule a discrete update but only if it's not Sync.
|
||||
if (
|
||||
(executionContext & DiscreteEventContext) !== NoContext &&
|
||||
// Only updates at user-blocking priority or greater are considered
|
||||
// discrete, even inside a discrete event.
|
||||
(priorityLevel === UserBlockingSchedulerPriority ||
|
||||
priorityLevel === ImmediateSchedulerPriority)
|
||||
) {
|
||||
// This is the result of a discrete event. Track the lowest priority
|
||||
// discrete update per root so we can flush them early, if needed.
|
||||
if (rootsWithPendingDiscreteUpdates === null) {
|
||||
rootsWithPendingDiscreteUpdates = new Set([root]);
|
||||
} else {
|
||||
rootsWithPendingDiscreteUpdates.add(root);
|
||||
}
|
||||
}
|
||||
// Schedule other updates after in case the callback is sync.
|
||||
ensureRootIsScheduled(root, eventTime);
|
||||
schedulePendingInteractions(root, lane);
|
||||
}
|
||||
|
||||
return root;
|
||||
@@ -1150,16 +1122,12 @@ export function flushDiscreteUpdates() {
|
||||
}
|
||||
|
||||
export function deferredUpdates<A>(fn: () => A): A {
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(DefaultLanePriority);
|
||||
return runWithPriority(NormalSchedulerPriority, fn);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
}
|
||||
} else {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(DefaultLanePriority);
|
||||
return runWithPriority(NormalSchedulerPriority, fn);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1218,36 +1186,20 @@ export function discreteUpdates<A, B, C, D, R>(
|
||||
const prevExecutionContext = executionContext;
|
||||
executionContext |= DiscreteEventContext;
|
||||
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(InputDiscreteLanePriority);
|
||||
return runWithPriority(
|
||||
UserBlockingSchedulerPriority,
|
||||
fn.bind(null, a, b, c, d),
|
||||
);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
executionContext = prevExecutionContext;
|
||||
if (executionContext === NoContext) {
|
||||
// Flush the immediate callbacks that were scheduled during this batch
|
||||
resetRenderTimer();
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
return runWithPriority(
|
||||
UserBlockingSchedulerPriority,
|
||||
fn.bind(null, a, b, c, d),
|
||||
);
|
||||
} finally {
|
||||
executionContext = prevExecutionContext;
|
||||
if (executionContext === NoContext) {
|
||||
// Flush the immediate callbacks that were scheduled during this batch
|
||||
resetRenderTimer();
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(InputDiscreteLanePriority);
|
||||
return runWithPriority(
|
||||
UserBlockingSchedulerPriority,
|
||||
fn.bind(null, a, b, c, d),
|
||||
);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
executionContext = prevExecutionContext;
|
||||
if (executionContext === NoContext) {
|
||||
// Flush the immediate callbacks that were scheduled during this batch
|
||||
resetRenderTimer();
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1282,68 +1234,39 @@ export function flushSync<A, R>(fn: A => R, a: A): R {
|
||||
}
|
||||
executionContext |= BatchedContext;
|
||||
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(SyncLanePriority);
|
||||
if (fn) {
|
||||
return runWithPriority(ImmediateSchedulerPriority, fn.bind(null, a));
|
||||
} else {
|
||||
return (undefined: $FlowFixMe);
|
||||
}
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
executionContext = prevExecutionContext;
|
||||
// Flush the immediate callbacks that were scheduled during this batch.
|
||||
// Note that this will happen even if batchedUpdates is higher up
|
||||
// the stack.
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
if (fn) {
|
||||
return runWithPriority(ImmediateSchedulerPriority, fn.bind(null, a));
|
||||
} else {
|
||||
return (undefined: $FlowFixMe);
|
||||
}
|
||||
} finally {
|
||||
executionContext = prevExecutionContext;
|
||||
// Flush the immediate callbacks that were scheduled during this batch.
|
||||
// Note that this will happen even if batchedUpdates is higher up
|
||||
// the stack.
|
||||
flushSyncCallbackQueue();
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(SyncLanePriority);
|
||||
if (fn) {
|
||||
return runWithPriority(ImmediateSchedulerPriority, fn.bind(null, a));
|
||||
} else {
|
||||
return (undefined: $FlowFixMe);
|
||||
}
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
executionContext = prevExecutionContext;
|
||||
// Flush the immediate callbacks that were scheduled during this batch.
|
||||
// Note that this will happen even if batchedUpdates is higher up
|
||||
// the stack.
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
}
|
||||
|
||||
export function flushControlled(fn: () => mixed): void {
|
||||
const prevExecutionContext = executionContext;
|
||||
executionContext |= BatchedContext;
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(SyncLanePriority);
|
||||
runWithPriority(ImmediateSchedulerPriority, fn);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(SyncLanePriority);
|
||||
runWithPriority(ImmediateSchedulerPriority, fn);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
|
||||
executionContext = prevExecutionContext;
|
||||
if (executionContext === NoContext) {
|
||||
// Flush the immediate callbacks that were scheduled during this batch
|
||||
resetRenderTimer();
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
runWithPriority(ImmediateSchedulerPriority, fn);
|
||||
} finally {
|
||||
executionContext = prevExecutionContext;
|
||||
if (executionContext === NoContext) {
|
||||
// Flush the immediate callbacks that were scheduled during this batch
|
||||
resetRenderTimer();
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
executionContext = prevExecutionContext;
|
||||
if (executionContext === NoContext) {
|
||||
// Flush the immediate callbacks that were scheduled during this batch
|
||||
resetRenderTimer();
|
||||
flushSyncCallbackQueue();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1954,11 +1877,8 @@ function commitRootImpl(root, renderPriorityLevel) {
|
||||
NoFlags;
|
||||
|
||||
if (subtreeHasEffects || rootHasEffect) {
|
||||
let previousLanePriority;
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
previousLanePriority = getCurrentUpdateLanePriority();
|
||||
setCurrentUpdateLanePriority(SyncLanePriority);
|
||||
}
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
setCurrentUpdateLanePriority(SyncLanePriority);
|
||||
|
||||
const prevExecutionContext = executionContext;
|
||||
executionContext |= CommitContext;
|
||||
@@ -2040,7 +1960,7 @@ function commitRootImpl(root, renderPriorityLevel) {
|
||||
}
|
||||
executionContext = prevExecutionContext;
|
||||
|
||||
if (decoupleUpdatePriorityFromScheduler && previousLanePriority != null) {
|
||||
if (previousLanePriority != null) {
|
||||
// Reset the priority to the previous non-sync value.
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
}
|
||||
@@ -2183,18 +2103,14 @@ export function flushPassiveEffects(): boolean {
|
||||
? NormalSchedulerPriority
|
||||
: pendingPassiveEffectsRenderPriority;
|
||||
pendingPassiveEffectsRenderPriority = NoSchedulerPriority;
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(
|
||||
schedulerPriorityToLanePriority(priorityLevel),
|
||||
);
|
||||
return runWithPriority(priorityLevel, flushPassiveEffectsImpl);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
}
|
||||
} else {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
setCurrentUpdateLanePriority(
|
||||
schedulerPriorityToLanePriority(priorityLevel),
|
||||
);
|
||||
return runWithPriority(priorityLevel, flushPassiveEffectsImpl);
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -15,7 +15,6 @@ import * as Scheduler from 'scheduler';
|
||||
import {__interactionsRef} from 'scheduler/tracing';
|
||||
import {
|
||||
enableSchedulerTracing,
|
||||
decoupleUpdatePriorityFromScheduler,
|
||||
enableSyncMicroTasks,
|
||||
} from 'shared/ReactFeatureFlags';
|
||||
import invariant from 'shared/invariant';
|
||||
@@ -184,63 +183,34 @@ function flushSyncCallbackQueueImpl() {
|
||||
// Prevent re-entrancy.
|
||||
isFlushingSyncQueue = true;
|
||||
let i = 0;
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
const isSync = true;
|
||||
const queue = syncQueue;
|
||||
setCurrentUpdateLanePriority(SyncLanePriority);
|
||||
runWithPriority(ImmediatePriority, () => {
|
||||
for (; i < queue.length; i++) {
|
||||
let callback = queue[i];
|
||||
do {
|
||||
callback = callback(isSync);
|
||||
} while (callback !== null);
|
||||
}
|
||||
});
|
||||
syncQueue = null;
|
||||
} catch (error) {
|
||||
// If something throws, leave the remaining callbacks on the queue.
|
||||
if (syncQueue !== null) {
|
||||
syncQueue = syncQueue.slice(i + 1);
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
const isSync = true;
|
||||
const queue = syncQueue;
|
||||
setCurrentUpdateLanePriority(SyncLanePriority);
|
||||
runWithPriority(ImmediatePriority, () => {
|
||||
for (; i < queue.length; i++) {
|
||||
let callback = queue[i];
|
||||
do {
|
||||
callback = callback(isSync);
|
||||
} while (callback !== null);
|
||||
}
|
||||
// Resume flushing in the next tick
|
||||
Scheduler_scheduleCallback(
|
||||
Scheduler_ImmediatePriority,
|
||||
flushSyncCallbackQueue,
|
||||
);
|
||||
throw error;
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
isFlushingSyncQueue = false;
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
const isSync = true;
|
||||
const queue = syncQueue;
|
||||
runWithPriority(ImmediatePriority, () => {
|
||||
for (; i < queue.length; i++) {
|
||||
let callback = queue[i];
|
||||
do {
|
||||
callback = callback(isSync);
|
||||
} while (callback !== null);
|
||||
}
|
||||
});
|
||||
syncQueue = null;
|
||||
} catch (error) {
|
||||
// If something throws, leave the remaining callbacks on the queue.
|
||||
if (syncQueue !== null) {
|
||||
syncQueue = syncQueue.slice(i + 1);
|
||||
}
|
||||
// Resume flushing in the next tick
|
||||
Scheduler_scheduleCallback(
|
||||
Scheduler_ImmediatePriority,
|
||||
flushSyncCallbackQueue,
|
||||
);
|
||||
throw error;
|
||||
} finally {
|
||||
isFlushingSyncQueue = false;
|
||||
});
|
||||
syncQueue = null;
|
||||
} catch (error) {
|
||||
// If something throws, leave the remaining callbacks on the queue.
|
||||
if (syncQueue !== null) {
|
||||
syncQueue = syncQueue.slice(i + 1);
|
||||
}
|
||||
// Resume flushing in the next tick
|
||||
Scheduler_scheduleCallback(
|
||||
Scheduler_ImmediatePriority,
|
||||
flushSyncCallbackQueue,
|
||||
);
|
||||
throw error;
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
isFlushingSyncQueue = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@ import * as Scheduler from 'scheduler';
|
||||
import {__interactionsRef} from 'scheduler/tracing';
|
||||
import {
|
||||
enableSchedulerTracing,
|
||||
decoupleUpdatePriorityFromScheduler,
|
||||
enableSyncMicroTasks,
|
||||
} from 'shared/ReactFeatureFlags';
|
||||
import invariant from 'shared/invariant';
|
||||
@@ -184,63 +183,34 @@ function flushSyncCallbackQueueImpl() {
|
||||
// Prevent re-entrancy.
|
||||
isFlushingSyncQueue = true;
|
||||
let i = 0;
|
||||
if (decoupleUpdatePriorityFromScheduler) {
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
const isSync = true;
|
||||
const queue = syncQueue;
|
||||
setCurrentUpdateLanePriority(SyncLanePriority);
|
||||
runWithPriority(ImmediatePriority, () => {
|
||||
for (; i < queue.length; i++) {
|
||||
let callback = queue[i];
|
||||
do {
|
||||
callback = callback(isSync);
|
||||
} while (callback !== null);
|
||||
}
|
||||
});
|
||||
syncQueue = null;
|
||||
} catch (error) {
|
||||
// If something throws, leave the remaining callbacks on the queue.
|
||||
if (syncQueue !== null) {
|
||||
syncQueue = syncQueue.slice(i + 1);
|
||||
const previousLanePriority = getCurrentUpdateLanePriority();
|
||||
try {
|
||||
const isSync = true;
|
||||
const queue = syncQueue;
|
||||
setCurrentUpdateLanePriority(SyncLanePriority);
|
||||
runWithPriority(ImmediatePriority, () => {
|
||||
for (; i < queue.length; i++) {
|
||||
let callback = queue[i];
|
||||
do {
|
||||
callback = callback(isSync);
|
||||
} while (callback !== null);
|
||||
}
|
||||
// Resume flushing in the next tick
|
||||
Scheduler_scheduleCallback(
|
||||
Scheduler_ImmediatePriority,
|
||||
flushSyncCallbackQueue,
|
||||
);
|
||||
throw error;
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
isFlushingSyncQueue = false;
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
const isSync = true;
|
||||
const queue = syncQueue;
|
||||
runWithPriority(ImmediatePriority, () => {
|
||||
for (; i < queue.length; i++) {
|
||||
let callback = queue[i];
|
||||
do {
|
||||
callback = callback(isSync);
|
||||
} while (callback !== null);
|
||||
}
|
||||
});
|
||||
syncQueue = null;
|
||||
} catch (error) {
|
||||
// If something throws, leave the remaining callbacks on the queue.
|
||||
if (syncQueue !== null) {
|
||||
syncQueue = syncQueue.slice(i + 1);
|
||||
}
|
||||
// Resume flushing in the next tick
|
||||
Scheduler_scheduleCallback(
|
||||
Scheduler_ImmediatePriority,
|
||||
flushSyncCallbackQueue,
|
||||
);
|
||||
throw error;
|
||||
} finally {
|
||||
isFlushingSyncQueue = false;
|
||||
});
|
||||
syncQueue = null;
|
||||
} catch (error) {
|
||||
// If something throws, leave the remaining callbacks on the queue.
|
||||
if (syncQueue !== null) {
|
||||
syncQueue = syncQueue.slice(i + 1);
|
||||
}
|
||||
// Resume flushing in the next tick
|
||||
Scheduler_scheduleCallback(
|
||||
Scheduler_ImmediatePriority,
|
||||
flushSyncCallbackQueue,
|
||||
);
|
||||
throw error;
|
||||
} finally {
|
||||
setCurrentUpdateLanePriority(previousLanePriority);
|
||||
isFlushingSyncQueue = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -428,7 +428,6 @@ describe('ReactDOMTracing', () => {
|
||||
});
|
||||
|
||||
// @gate experimental
|
||||
// @gate enableNativeEventPriorityInference
|
||||
it('should properly trace interactions when there is work of interleaved priorities', () => {
|
||||
const Child = () => {
|
||||
Scheduler.unstable_yieldValue('Child');
|
||||
@@ -550,7 +549,6 @@ describe('ReactDOMTracing', () => {
|
||||
});
|
||||
|
||||
// @gate experimental
|
||||
// @gate enableNativeEventPriorityInference
|
||||
it('should properly trace interactions through a multi-pass SuspenseList render', () => {
|
||||
const SuspenseList = React.SuspenseList;
|
||||
const Suspense = React.Suspense;
|
||||
|
||||
@@ -142,9 +142,6 @@ export const enableLegacyFBSupport = false;
|
||||
// new behavior.
|
||||
export const deferRenderPhaseUpdateToNextBatch = true;
|
||||
|
||||
// Replacement for runWithPriority in React internals.
|
||||
export const decoupleUpdatePriorityFromScheduler = false;
|
||||
|
||||
export const enableDiscreteEventFlushingChange = false;
|
||||
|
||||
export const enableUseRefAccessWarning = false;
|
||||
|
||||
@@ -49,7 +49,6 @@ export const skipUnmountedBoundaries = false;
|
||||
|
||||
export const enableNewReconciler = false;
|
||||
export const deferRenderPhaseUpdateToNextBatch = true;
|
||||
export const decoupleUpdatePriorityFromScheduler = false;
|
||||
export const enableDiscreteEventFlushingChange = false;
|
||||
|
||||
export const enableStrictEffects = false;
|
||||
|
||||
@@ -48,7 +48,6 @@ export const skipUnmountedBoundaries = false;
|
||||
|
||||
export const enableNewReconciler = false;
|
||||
export const deferRenderPhaseUpdateToNextBatch = true;
|
||||
export const decoupleUpdatePriorityFromScheduler = false;
|
||||
export const enableDiscreteEventFlushingChange = false;
|
||||
|
||||
export const enableStrictEffects = false;
|
||||
|
||||
@@ -48,7 +48,6 @@ export const skipUnmountedBoundaries = false;
|
||||
|
||||
export const enableNewReconciler = false;
|
||||
export const deferRenderPhaseUpdateToNextBatch = true;
|
||||
export const decoupleUpdatePriorityFromScheduler = false;
|
||||
export const enableDiscreteEventFlushingChange = false;
|
||||
|
||||
export const enableStrictEffects = false;
|
||||
|
||||
@@ -48,7 +48,6 @@ export const skipUnmountedBoundaries = false;
|
||||
|
||||
export const enableNewReconciler = false;
|
||||
export const deferRenderPhaseUpdateToNextBatch = true;
|
||||
export const decoupleUpdatePriorityFromScheduler = false;
|
||||
export const enableDiscreteEventFlushingChange = false;
|
||||
|
||||
export const enableStrictEffects = false;
|
||||
|
||||
@@ -48,7 +48,6 @@ export const skipUnmountedBoundaries = false;
|
||||
|
||||
export const enableNewReconciler = false;
|
||||
export const deferRenderPhaseUpdateToNextBatch = true;
|
||||
export const decoupleUpdatePriorityFromScheduler = false;
|
||||
export const enableDiscreteEventFlushingChange = false;
|
||||
|
||||
export const enableStrictEffects = true;
|
||||
|
||||
@@ -48,7 +48,6 @@ export const skipUnmountedBoundaries = false;
|
||||
|
||||
export const enableNewReconciler = false;
|
||||
export const deferRenderPhaseUpdateToNextBatch = true;
|
||||
export const decoupleUpdatePriorityFromScheduler = false;
|
||||
export const enableDiscreteEventFlushingChange = false;
|
||||
|
||||
export const enableStrictEffects = false;
|
||||
|
||||
@@ -48,7 +48,6 @@ export const skipUnmountedBoundaries = true;
|
||||
|
||||
export const enableNewReconciler = false;
|
||||
export const deferRenderPhaseUpdateToNextBatch = true;
|
||||
export const decoupleUpdatePriorityFromScheduler = false;
|
||||
export const enableDiscreteEventFlushingChange = true;
|
||||
|
||||
export const enableStrictEffects = false;
|
||||
|
||||
@@ -17,7 +17,6 @@ export const warnAboutSpreadingKeyToJSX = __VARIANT__;
|
||||
export const disableInputAttributeSyncing = __VARIANT__;
|
||||
export const enableFilterEmptyStringAttributesDOM = __VARIANT__;
|
||||
export const enableLegacyFBSupport = __VARIANT__;
|
||||
export const decoupleUpdatePriorityFromScheduler = __VARIANT__;
|
||||
export const skipUnmountedBoundaries = __VARIANT__;
|
||||
|
||||
// Enable this flag to help with concurrent mode debugging.
|
||||
|
||||
@@ -24,7 +24,6 @@ export const {
|
||||
enableFilterEmptyStringAttributesDOM,
|
||||
enableLegacyFBSupport,
|
||||
deferRenderPhaseUpdateToNextBatch,
|
||||
decoupleUpdatePriorityFromScheduler,
|
||||
enableDebugTracing,
|
||||
skipUnmountedBoundaries,
|
||||
enableStrictEffects,
|
||||
|
||||
Reference in New Issue
Block a user