From d445cee60f5635e52f15762be9bd8917edac7e93 Mon Sep 17 00:00:00 2001 From: Tianyu Yao Date: Tue, 18 Jul 2023 11:58:01 -0700 Subject: [PATCH] Make temporary `NoStrictPassiveEffects` option work with `useModernStrictMode` (#27105) ## Summary Since we are enabling `useModernStrictMode` flag internally, to make sure the internal testing of half StrictMode doesn't suddenly break, this PR makes sure it also works with `useModernStrictMode` true. ## Test plan: Manually set `useModernStrictMode` to true. `yarn test ReactOffscreenStrictMode-test -r=www-modern --env=development --variant=true` `yarn test ReactStrictMode-test.internal -r=www-modern --env=development --variant=true` --- .../src/ReactFiberWorkLoop.js | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberWorkLoop.js b/packages/react-reconciler/src/ReactFiberWorkLoop.js index 1b3e274191..9ff0fbf3b7 100644 --- a/packages/react-reconciler/src/ReactFiberWorkLoop.js +++ b/packages/react-reconciler/src/ReactFiberWorkLoop.js @@ -90,6 +90,7 @@ import { ConcurrentMode, StrictLegacyMode, StrictEffectsMode, + NoStrictPassiveEffectsMode, } from './ReactTypeOfMode'; import { HostRoot, @@ -3538,11 +3539,19 @@ function recursivelyTraverseAndDoubleInvokeEffectsInDEV( } // Unconditionally disconnects and connects passive and layout effects. -function doubleInvokeEffectsOnFiber(root: FiberRoot, fiber: Fiber) { +function doubleInvokeEffectsOnFiber( + root: FiberRoot, + fiber: Fiber, + shouldDoubleInvokePassiveEffects: boolean = true, +) { disappearLayoutEffects(fiber); - disconnectPassiveEffect(fiber); + if (shouldDoubleInvokePassiveEffects) { + disconnectPassiveEffect(fiber); + } reappearLayoutEffects(root, fiber.alternate, fiber, false); - reconnectPassiveEffects(root, fiber, NoLanes, null, false); + if (shouldDoubleInvokePassiveEffects) { + reconnectPassiveEffects(root, fiber, NoLanes, null, false); + } } function doubleInvokeEffectsInDEVIfNecessary( @@ -3559,7 +3568,11 @@ function doubleInvokeEffectsInDEVIfNecessary( if (fiber.flags & PlacementDEV) { setCurrentDebugFiberInDEV(fiber); if (isInStrictMode) { - doubleInvokeEffectsOnFiber(root, fiber); + doubleInvokeEffectsOnFiber( + root, + fiber, + (fiber.mode & NoStrictPassiveEffectsMode) === NoMode, + ); } resetCurrentDebugFiberInDEV(); } else {