From c1a1e884bba2385dd82ebccba59c65dc27132a9c Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Fri, 2 Apr 2021 20:50:37 -0400 Subject: [PATCH] Add enableSyncDefaultUpdates implementation --- .../src/ReactFiberLane.new.js | 4 +-- .../src/ReactFiberLane.old.js | 4 +-- .../src/ReactFiberWorkLoop.new.js | 29 +++++++++++++++++-- .../src/ReactFiberWorkLoop.old.js | 29 +++++++++++++++++-- 4 files changed, 58 insertions(+), 8 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberLane.new.js b/packages/react-reconciler/src/ReactFiberLane.new.js index 2a9571ece689c4..b01f824fc1cb90 100644 --- a/packages/react-reconciler/src/ReactFiberLane.new.js +++ b/packages/react-reconciler/src/ReactFiberLane.new.js @@ -47,7 +47,7 @@ export const NoLane: Lane = /* */ 0b0000000000000000000 export const SyncLane: Lane = /* */ 0b0000000000000000000000000000001; -const InputContinuousHydrationLane: Lane = /* */ 0b0000000000000000000000000000010; +export const InputContinuousHydrationLane: Lane = /* */ 0b0000000000000000000000000000010; export const InputContinuousLane: Lanes = /* */ 0b0000000000000000000000000000100; export const DefaultHydrationLane: Lane = /* */ 0b0000000000000000000000000001000; @@ -55,7 +55,7 @@ export const DefaultLane: Lanes = /* */ 0b0000000000000000000 const TransitionHydrationLane: Lane = /* */ 0b0000000000000000000000000100000; const TransitionLanes: Lanes = /* */ 0b0000000001111111111111111000000; -const TransitionLane1: Lane = /* */ 0b0000000000000000000000001000000; +export const TransitionLane1: Lane = /* */ 0b0000000000000000000000001000000; const TransitionLane2: Lane = /* */ 0b0000000000000000000000010000000; const TransitionLane3: Lane = /* */ 0b0000000000000000000000100000000; const TransitionLane4: Lane = /* */ 0b0000000000000000000001000000000; diff --git a/packages/react-reconciler/src/ReactFiberLane.old.js b/packages/react-reconciler/src/ReactFiberLane.old.js index 2a9571ece689c4..b01f824fc1cb90 100644 --- a/packages/react-reconciler/src/ReactFiberLane.old.js +++ b/packages/react-reconciler/src/ReactFiberLane.old.js @@ -47,7 +47,7 @@ export const NoLane: Lane = /* */ 0b0000000000000000000 export const SyncLane: Lane = /* */ 0b0000000000000000000000000000001; -const InputContinuousHydrationLane: Lane = /* */ 0b0000000000000000000000000000010; +export const InputContinuousHydrationLane: Lane = /* */ 0b0000000000000000000000000000010; export const InputContinuousLane: Lanes = /* */ 0b0000000000000000000000000000100; export const DefaultHydrationLane: Lane = /* */ 0b0000000000000000000000000001000; @@ -55,7 +55,7 @@ export const DefaultLane: Lanes = /* */ 0b0000000000000000000 const TransitionHydrationLane: Lane = /* */ 0b0000000000000000000000000100000; const TransitionLanes: Lanes = /* */ 0b0000000001111111111111111000000; -const TransitionLane1: Lane = /* */ 0b0000000000000000000000001000000; +export const TransitionLane1: Lane = /* */ 0b0000000000000000000000001000000; const TransitionLane2: Lane = /* */ 0b0000000000000000000000010000000; const TransitionLane3: Lane = /* */ 0b0000000000000000000000100000000; const TransitionLane4: Lane = /* */ 0b0000000000000000000001000000000; diff --git a/packages/react-reconciler/src/ReactFiberWorkLoop.new.js b/packages/react-reconciler/src/ReactFiberWorkLoop.new.js index 455067e47e2635..464c3440532d26 100644 --- a/packages/react-reconciler/src/ReactFiberWorkLoop.new.js +++ b/packages/react-reconciler/src/ReactFiberWorkLoop.new.js @@ -32,6 +32,7 @@ import { disableSchedulerTimeoutInWorkLoop, enableStrictEffects, skipUnmountedBoundaries, + enableSyncDefaultUpdates, } from 'shared/ReactFeatureFlags'; import ReactSharedInternals from 'shared/ReactSharedInternals'; import invariant from 'shared/invariant'; @@ -137,6 +138,8 @@ import { NoLanes, NoLane, SyncLane, + DefaultLane, + DefaultHydrationLane, NoTimestamp, claimNextTransitionLane, claimNextRetryLane, @@ -159,6 +162,8 @@ import { markRootFinished, areLanesExpired, getHighestPriorityLane, + InputContinuousLane, + InputContinuousHydrationLane, } from './ReactFiberLane.new'; import { DiscreteEventPriority, @@ -426,6 +431,13 @@ export function requestUpdateLane(fiber: Fiber): Lane { // TODO: Move this type conversion to the event priority module. const updateLane: Lane = (getCurrentUpdatePriority(): any); if (updateLane !== NoLane) { + if ( + enableSyncDefaultUpdates && + (updateLane === InputContinuousLane || + updateLane === InputContinuousHydrationLane) + ) { + return DefaultLane; + } return updateLane; } @@ -682,7 +694,16 @@ function ensureRootIsScheduled(root: FiberRoot, currentTime: number) { // Schedule a new callback. let newCallbackNode; - if (newCallbackPriority === SyncLane) { + if ( + enableSyncDefaultUpdates && + (newCallbackPriority === DefaultLane || + newCallbackPriority === DefaultHydrationLane) + ) { + newCallbackNode = scheduleCallback( + ImmediateSchedulerPriority, + performSyncWorkOnRoot.bind(null, root), + ); + } else if (newCallbackPriority === SyncLane) { // Special case: Sync React callbacks are scheduled on a special // internal queue scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root)); @@ -1017,7 +1038,11 @@ function performSyncWorkOnRoot(root) { const finishedWork: Fiber = (root.current.alternate: any); root.finishedWork = finishedWork; root.finishedLanes = lanes; - commitRoot(root); + if (enableSyncDefaultUpdates && includesSomeLane(lanes, DefaultLane)) { + finishConcurrentRender(root, exitStatus, lanes); + } else { + commitRoot(root); + } // Before exiting, make sure there's a callback scheduled for the next // pending level. diff --git a/packages/react-reconciler/src/ReactFiberWorkLoop.old.js b/packages/react-reconciler/src/ReactFiberWorkLoop.old.js index 9d056a46402c34..e2f61f72e04b6e 100644 --- a/packages/react-reconciler/src/ReactFiberWorkLoop.old.js +++ b/packages/react-reconciler/src/ReactFiberWorkLoop.old.js @@ -32,6 +32,7 @@ import { disableSchedulerTimeoutInWorkLoop, enableStrictEffects, skipUnmountedBoundaries, + enableSyncDefaultUpdates, } from 'shared/ReactFeatureFlags'; import ReactSharedInternals from 'shared/ReactSharedInternals'; import invariant from 'shared/invariant'; @@ -137,6 +138,8 @@ import { NoLanes, NoLane, SyncLane, + DefaultLane, + DefaultHydrationLane, NoTimestamp, claimNextTransitionLane, claimNextRetryLane, @@ -159,6 +162,8 @@ import { markRootFinished, areLanesExpired, getHighestPriorityLane, + InputContinuousLane, + InputContinuousHydrationLane, } from './ReactFiberLane.old'; import { DiscreteEventPriority, @@ -426,6 +431,13 @@ export function requestUpdateLane(fiber: Fiber): Lane { // TODO: Move this type conversion to the event priority module. const updateLane: Lane = (getCurrentUpdatePriority(): any); if (updateLane !== NoLane) { + if ( + enableSyncDefaultUpdates && + (updateLane === InputContinuousLane || + updateLane === InputContinuousHydrationLane) + ) { + return DefaultLane; + } return updateLane; } @@ -682,7 +694,16 @@ function ensureRootIsScheduled(root: FiberRoot, currentTime: number) { // Schedule a new callback. let newCallbackNode; - if (newCallbackPriority === SyncLane) { + if ( + enableSyncDefaultUpdates && + (newCallbackPriority === DefaultLane || + newCallbackPriority === DefaultHydrationLane) + ) { + newCallbackNode = scheduleCallback( + ImmediateSchedulerPriority, + performSyncWorkOnRoot.bind(null, root), + ); + } else if (newCallbackPriority === SyncLane) { // Special case: Sync React callbacks are scheduled on a special // internal queue scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root)); @@ -1017,7 +1038,11 @@ function performSyncWorkOnRoot(root) { const finishedWork: Fiber = (root.current.alternate: any); root.finishedWork = finishedWork; root.finishedLanes = lanes; - commitRoot(root); + if (enableSyncDefaultUpdates && includesSomeLane(lanes, DefaultLane)) { + finishConcurrentRender(root, exitStatus, lanes); + } else { + commitRoot(root); + } // Before exiting, make sure there's a callback scheduled for the next // pending level.