Skip to content

Commit c0e0f53

Browse files
committed
Revert "Remove revertRemovalOfSiblingPrerendering killswitch (facebook#26549)"
This reverts commit 7b0642b.
1 parent f567431 commit c0e0f53

9 files changed

+57
-10
lines changed

packages/react-reconciler/src/ReactFiberWorkLoop.js

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import {
3838
enableCache,
3939
enableTransitionTracing,
4040
useModernStrictMode,
41+
revertRemovalOfSiblingPrerendering,
4142
disableLegacyContext,
4243
} from 'shared/ReactFeatureFlags';
4344
import ReactSharedInternals from 'shared/ReactSharedInternals';
@@ -2440,14 +2441,28 @@ function completeUnitOfWork(unitOfWork: Fiber): void {
24402441
// sibling. If there are no more siblings, return to the parent fiber.
24412442
let completedWork: Fiber = unitOfWork;
24422443
do {
2443-
if (__DEV__) {
2444+
if (revertRemovalOfSiblingPrerendering) {
24442445
if ((completedWork.flags & Incomplete) !== NoFlags) {
2445-
// NOTE: If we re-enable sibling prerendering in some cases, this branch
2446-
// is where we would switch to the unwinding path.
2447-
console.error(
2448-
'Internal React error: Expected this fiber to be complete, but ' +
2449-
"it isn't. It should have been unwound. This is a bug in React.",
2450-
);
2446+
// This fiber did not complete, because one of its children did not
2447+
// complete. Switch to unwinding the stack instead of completing it.
2448+
//
2449+
// The reason "unwind" and "complete" is interleaved is because when
2450+
// something suspends, we continue rendering the siblings even though
2451+
// they will be replaced by a fallback.
2452+
// TODO: Disable sibling prerendering, then remove this branch.
2453+
unwindUnitOfWork(completedWork);
2454+
return;
2455+
}
2456+
} else {
2457+
if (__DEV__) {
2458+
if ((completedWork.flags & Incomplete) !== NoFlags) {
2459+
// NOTE: If we re-enable sibling prerendering in some cases, this branch
2460+
// is where we would switch to the unwinding path.
2461+
console.error(
2462+
'Internal React error: Expected this fiber to be complete, but ' +
2463+
"it isn't. It should have been unwound. This is a bug in React.",
2464+
);
2465+
}
24512466
}
24522467
}
24532468

@@ -2551,9 +2566,24 @@ function unwindUnitOfWork(unitOfWork: Fiber): void {
25512566
returnFiber.deletions = null;
25522567
}
25532568

2554-
// NOTE: If we re-enable sibling prerendering in some cases, here we
2555-
// would switch to the normal completion path: check if a sibling
2556-
// exists, and if so, begin work on it.
2569+
if (revertRemovalOfSiblingPrerendering) {
2570+
// If there are siblings, work on them now even though they're going to be
2571+
// replaced by a fallback. We're "prerendering" them. Historically our
2572+
// rationale for this behavior has been to initiate any lazy data requests
2573+
// in the siblings, and also to warm up the CPU cache.
2574+
// TODO: Don't prerender siblings. With `use`, we suspend the work loop
2575+
// until the data has resolved, anyway.
2576+
const siblingFiber = incompleteWork.sibling;
2577+
if (siblingFiber !== null) {
2578+
// This branch will return us to the normal work loop.
2579+
workInProgress = siblingFiber;
2580+
return;
2581+
}
2582+
} else {
2583+
// NOTE: If we re-enable sibling prerendering in some cases, this branch
2584+
// is where we would switch to the normal completion path: check if a
2585+
// sibling exists, and if so, begin work on it.
2586+
}
25572587

25582588
// Otherwise, return to the parent
25592589
// $FlowFixMe[incompatible-type] we bail out when we get a null

packages/shared/ReactFeatureFlags.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ export const enableComponentStackLocations = true;
2222
// when it rolls out to prod. We should remove these as soon as possible.
2323
// -----------------------------------------------------------------------------
2424

25+
// This is phrased as a negative so that if someone forgets to add a GK, the
26+
// default is to enable the feature. It should only be overridden if there's
27+
// a regression in prod.
28+
export const revertRemovalOfSiblingPrerendering = false;
29+
2530
// -----------------------------------------------------------------------------
2631
// Land or remove (moderate effort)
2732
//

packages/shared/forks/ReactFeatureFlags.native-fb.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export const enableScopeAPI = false;
4343
export const enableCreateEventHandleAPI = false;
4444
export const enableSuspenseCallback = false;
4545
export const disableLegacyContext = false;
46+
export const revertRemovalOfSiblingPrerendering = false;
4647
export const enableTrustedTypesIntegration = false;
4748
export const disableTextareaChildren = false;
4849
export const disableModulePatternComponents = false;

packages/shared/forks/ReactFeatureFlags.native-oss.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export const enableScopeAPI = false;
3232
export const enableCreateEventHandleAPI = false;
3333
export const enableSuspenseCallback = false;
3434
export const disableLegacyContext = false;
35+
export const revertRemovalOfSiblingPrerendering = false;
3536
export const enableTrustedTypesIntegration = false;
3637
export const disableTextareaChildren = false;
3738
export const disableModulePatternComponents = false;

packages/shared/forks/ReactFeatureFlags.test-renderer.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export const enableScopeAPI = false;
3232
export const enableCreateEventHandleAPI = false;
3333
export const enableSuspenseCallback = false;
3434
export const disableLegacyContext = false;
35+
export const revertRemovalOfSiblingPrerendering = false;
3536
export const enableTrustedTypesIntegration = false;
3637
export const disableTextareaChildren = false;
3738
export const disableModulePatternComponents = false;

packages/shared/forks/ReactFeatureFlags.test-renderer.native.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export const enableScopeAPI = false;
3232
export const enableCreateEventHandleAPI = false;
3333
export const enableSuspenseCallback = false;
3434
export const disableLegacyContext = false;
35+
export const revertRemovalOfSiblingPrerendering = false;
3536
export const enableTrustedTypesIntegration = false;
3637
export const disableTextareaChildren = false;
3738
export const disableModulePatternComponents = false;

packages/shared/forks/ReactFeatureFlags.test-renderer.www.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export const enableScopeAPI = true;
3232
export const enableCreateEventHandleAPI = false;
3333
export const enableSuspenseCallback = true;
3434
export const disableLegacyContext = false;
35+
export const revertRemovalOfSiblingPrerendering = false;
3536
export const enableTrustedTypesIntegration = false;
3637
export const disableTextareaChildren = false;
3738
export const disableModulePatternComponents = true;

packages/shared/forks/ReactFeatureFlags.www-dynamic.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ export const enableSchedulingProfiler = __VARIANT__;
3939
// so we don't need to use __VARIANT__ to get extra coverage.
4040
export const replayFailedUnitOfWorkWithInvokeGuardedCallback = __DEV__;
4141

42+
// This flag only exists so it can be connected to a www GK that acts as a
43+
// killswitch. We don't run our tests against the `true` value because 1) it
44+
// affects too many tests 2) it shouldn't break anything. But it is mildly
45+
// risky, hence this extra precaution.
46+
export const revertRemovalOfSiblingPrerendering = false;
47+
4248
// TODO: These flags are hard-coded to the default values used in open source.
4349
// Update the tests so that they pass in either mode, then set these
4450
// to __VARIANT__.

packages/shared/forks/ReactFeatureFlags.www.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export const {
1818
disableInputAttributeSyncing,
1919
disableIEWorkarounds,
2020
enableTrustedTypesIntegration,
21+
revertRemovalOfSiblingPrerendering,
2122
replayFailedUnitOfWorkWithInvokeGuardedCallback,
2223
enableLegacyFBSupport,
2324
enableDebugTracing,

0 commit comments

Comments
 (0)