Add `alwaysThrottleDisappearingFallbacks` Flag (#28550)
## Summary Creates a new `alwaysThrottleDisappearingFallbacks` feature flag that gates the changes from https://github.com/facebook/react/pull/26802 (instead of being controlled by `alwaysThrottleRetries`). The values of this new flag mirror the current values of `alwaysThrottleRetries` such that there is no behavior difference. This additional feature flag allows us to incrementally validate the change (arguably bug fix) from https://github.com/facebook/react/pull/26802 independently from `alwaysThrottleRetries`. ## How did you test this change? ``` $ yarn test $ yarn flow dom-browser $ yarn flow dom-fb $ yarn flow fabric ```
Timothy Yung committed
Mar 18, 2024 at 11:16 UTC
0aab065eb3250a9714a62dc05587cbb571da7f71
11 files changed
+13
-2
packages/react-reconciler/src/ReactFiberCommitWork.js
+2
-2
@@ -40,6 +40,7 @@ import type {
40
} from './ReactFiberTracingMarkerComponent';
41
42
import {
43
+ alwaysThrottleDisappearingFallbacks,
44
enableCreateEventHandleAPI,
45
enableProfilerTimer,
46
enableProfilerCommitHooks,
@@ -53,7 +54,6 @@ import {
54
enableUseEffectEventHook,
55
enableFloat,
56
enableLegacyHidden,
56
- alwaysThrottleRetries,
57
disableStringRefs,
58
} from 'shared/ReactFeatureFlags';
59
import {
@@ -2896,7 +2896,7 @@ function commitMutationEffectsOnFiber(
2896
current !== null &&
2897
(current.memoizedState: SuspenseState | null) !== null;
2898
2899
- if (alwaysThrottleRetries) {
2899
+ if (alwaysThrottleDisappearingFallbacks) {
2900
if (isShowingFallback !== wasShowingFallback) {
2901
// A fallback is either appearing or disappearing.
2902
markCommitTimeOfFallback();
packages/shared/ReactFeatureFlags.js
+2
@@ -113,6 +113,8 @@ export const enableUseEffectEventHook = __EXPERIMENTAL__;
113
// (handled with an MutationObserver) instead of inline-scripts
114
export const enableFizzExternalRuntime = true;
115
116
+export const alwaysThrottleDisappearingFallbacks = true;
117
+
118
export const alwaysThrottleRetries = true;
119
120
export const passChildrenWhenCloningPersistedNodes = false;
packages/shared/forks/ReactFeatureFlags.native-fb-dynamic.js
+1
@@ -20,6 +20,7 @@ import typeof * as DynamicFlagsType from 'ReactNativeInternalFeatureFlags';
20
// flag here but it won't be set to `true` in any of our test runs. Need to
21
// update the test configuration.
22
23
+export const alwaysThrottleDisappearingFallbacks = __VARIANT__;
24
export const alwaysThrottleRetries = __VARIANT__;
25
export const consoleManagedByDevToolsDuringStrictMode = __VARIANT__;
26
export const enableAsyncActions = __VARIANT__;
packages/shared/forks/ReactFeatureFlags.native-fb.js
+1
@@ -18,6 +18,7 @@ import * as dynamicFlags from 'ReactNativeInternalFeatureFlags';
18
// We destructure each value before re-exporting to avoid a dynamic look-up on
19
// the exports object every time a flag is read.
20
export const {
21
+ alwaysThrottleDisappearingFallbacks,
22
alwaysThrottleRetries,
23
consoleManagedByDevToolsDuringStrictMode,
24
enableAsyncActions,
packages/shared/forks/ReactFeatureFlags.native-oss.js
+1
@@ -86,6 +86,7 @@ export const enableInfiniteRenderLoopDetection = false;
86
87
export const enableAsyncActions = false;
88
89
+export const alwaysThrottleDisappearingFallbacks = false;
90
export const alwaysThrottleRetries = false;
91
92
export const passChildrenWhenCloningPersistedNodes = false;
packages/shared/forks/ReactFeatureFlags.test-renderer.js
+1
@@ -76,6 +76,7 @@ export const enableDeferRootSchedulingToMicrotask = true;
76
77
export const enableAsyncActions = true;
78
79
+export const alwaysThrottleDisappearingFallbacks = true;
80
export const alwaysThrottleRetries = true;
81
82
export const passChildrenWhenCloningPersistedNodes = false;
packages/shared/forks/ReactFeatureFlags.test-renderer.native.js
+1
@@ -77,6 +77,7 @@ export const enableDeferRootSchedulingToMicrotask = false;
77
78
export const enableAsyncActions = true;
79
80
+export const alwaysThrottleDisappearingFallbacks = true;
81
export const alwaysThrottleRetries = true;
82
83
export const passChildrenWhenCloningPersistedNodes = false;
packages/shared/forks/ReactFeatureFlags.test-renderer.www.js
+1
@@ -78,6 +78,7 @@ export const enableDeferRootSchedulingToMicrotask = true;
78
79
export const enableAsyncActions = true;
80
81
+export const alwaysThrottleDisappearingFallbacks = false;
82
export const alwaysThrottleRetries = true;
83
84
export const passChildrenWhenCloningPersistedNodes = false;
packages/shared/forks/ReactFeatureFlags.www-dynamic.js
+1
@@ -23,6 +23,7 @@ export const forceConcurrentByDefaultForTesting = __VARIANT__;
23
export const enableUnifiedSyncLane = __VARIANT__;
24
export const enableTransitionTracing = __VARIANT__;
25
export const enableDeferRootSchedulingToMicrotask = __VARIANT__;
26
+export const alwaysThrottleDisappearingFallbacks = __VARIANT__;
27
export const alwaysThrottleRetries = __VARIANT__;
28
export const enableDO_NOT_USE_disableStrictPassiveEffect = __VARIANT__;
29
export const enableUseDeferredValueInitialArg = __VARIANT__;
packages/shared/forks/ReactFeatureFlags.www.js
+1
@@ -26,6 +26,7 @@ export const {
26
enableRetryLaneExpiration,
27
enableTransitionTracing,
28
enableDeferRootSchedulingToMicrotask,
29
+ alwaysThrottleDisappearingFallbacks,
30
alwaysThrottleRetries,
31
enableDO_NOT_USE_disableStrictPassiveEffect,
32
disableSchedulerTimeoutInWorkLoop,
scripts/flow/xplat.js
+1
@@ -8,6 +8,7 @@
8
*/
9
10
declare module 'ReactNativeInternalFeatureFlags' {
11
+ declare export var alwaysThrottleDisappearingFallbacks: boolean;
12
declare export var alwaysThrottleRetries: boolean;
13
declare export var consoleManagedByDevToolsDuringStrictMode: boolean;
14
declare export var enableAsyncActions: boolean;