[RN] experiment to move Fabric completeWork to the commit phase (#30513)
There is currently a mismatch in how the persistent mode JS API and the Fabric native code interpret `completeRoot`. This is a short-lived experiment to see the effect of moving the Fabric `completeRoot` call from `finalizeContainerChildren` to `replaceContainerChildren` which in some cases does not get called.
Jan Kassens committed
Jul 29, 2024 at 18:38 UTC
6b82f3c9048ff0dd7e6d628dc5770faf85d32a87
9 files changed
+22
-2
packages/react-native-renderer/src/ReactFiberConfigFabric.js
+10
-2
@@ -48,7 +48,10 @@ const {
48
unstable_getCurrentEventPriority: fabricGetCurrentEventPriority,
49
} = nativeFabricUIManager;
50
51
-import {passChildrenWhenCloningPersistedNodes} from 'shared/ReactFeatureFlags';
51
+import {
52
+ enableFabricCompleteRootInCommitPhase,
53
+ passChildrenWhenCloningPersistedNodes,
54
+} from 'shared/ReactFeatureFlags';
55
56
const {get: getViewConfigForType} = ReactNativeViewConfigRegistry;
57
@@ -469,7 +472,9 @@ export function finalizeContainerChildren(
472
container: Container,
473
newChildren: ChildSet,
474
): void {
472
- completeRoot(container, newChildren);
475
+ if (!enableFabricCompleteRootInCommitPhase) {
476
+ completeRoot(container, newChildren);
477
+ }
478
}
479
480
export function replaceContainerChildren(
@@ -477,6 +482,9 @@ export function replaceContainerChildren(
482
newChildren: ChildSet,
483
): void {
484
// Noop - children will be replaced in finalizeContainerChildren
485
+ if (enableFabricCompleteRootInCommitPhase) {
486
+ completeRoot(container, newChildren);
487
+ }
488
}
489
490
export function getInstanceFromNode(node: any): empty {
packages/shared/ReactFeatureFlags.js
+5
@@ -87,6 +87,11 @@ export const enableTaint = __EXPERIMENTAL__;
87
88
export const enablePostpone = __EXPERIMENTAL__;
89
90
+/**
91
+ * Switches the Fabric API from doing layout in commit work instead of complete work.
92
+ */
93
+export const enableFabricCompleteRootInCommitPhase = false;
94
+
95
/**
96
* Switches Fiber creation to a simple object instead of a constructor.
97
*/
packages/shared/forks/ReactFeatureFlags.native-fb-dynamic.js
+1
@@ -22,3 +22,4 @@ export const enableAddPropertiesFastPath = __VARIANT__;
22
export const enableObjectFiber = __VARIANT__;
23
export const enableShallowPropDiffing = __VARIANT__;
24
export const passChildrenWhenCloningPersistedNodes = __VARIANT__;
25
+export const enableFabricCompleteRootInCommitPhase = __VARIANT__;
packages/shared/forks/ReactFeatureFlags.native-fb.js
+1
@@ -21,6 +21,7 @@ const dynamicFlags: DynamicExportsType = (dynamicFlagsUntyped: any);
21
export const {
22
alwaysThrottleRetries,
23
enableAddPropertiesFastPath,
24
+ enableFabricCompleteRootInCommitPhase,
25
enableObjectFiber,
26
enableShallowPropDiffing,
27
passChildrenWhenCloningPersistedNodes,
packages/shared/forks/ReactFeatureFlags.native-oss.js
+1
@@ -44,6 +44,7 @@ export const enableCreateEventHandleAPI = false;
44
export const enableDebugTracing = false;
45
export const enableDeferRootSchedulingToMicrotask = true;
46
export const enableDO_NOT_USE_disableStrictPassiveEffect = false;
47
+export const enableFabricCompleteRootInCommitPhase = false;
48
export const enableFilterEmptyStringAttributesDOM = true;
49
export const enableFizzExternalRuntime = true;
50
export const enableFlightReadableStream = true;
packages/shared/forks/ReactFeatureFlags.test-renderer.js
+1
@@ -44,6 +44,7 @@ export const enableComponentStackLocations = true;
44
export const enableLegacyFBSupport = false;
45
export const enableFilterEmptyStringAttributesDOM = true;
46
export const enableGetInspectorDataForInstanceInProduction = false;
47
+export const enableFabricCompleteRootInCommitPhase = false;
48
49
export const enableRetryLaneExpiration = false;
50
export const retryLaneExpirationMs = 5000;
packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js
+1
@@ -78,6 +78,7 @@ export const retryLaneExpirationMs = 5000;
78
export const syncLaneExpirationMs = 250;
79
export const transitionLaneExpirationMs = 5000;
80
export const useModernStrictMode = true;
81
+export const enableFabricCompleteRootInCommitPhase = false;
82
83
// Flow magic to verify the exports of this file match the original version.
84
((((null: any): ExportsType): FeatureFlagsType): ExportsType);
packages/shared/forks/ReactFeatureFlags.test-renderer.www.js
+1
@@ -47,6 +47,7 @@ export const enableLegacyFBSupport = false;
47
export const enableFilterEmptyStringAttributesDOM = true;
48
export const enableGetInspectorDataForInstanceInProduction = false;
49
export const enableRenderableContext = false;
50
+export const enableFabricCompleteRootInCommitPhase = false;
51
52
export const enableRetryLaneExpiration = false;
53
export const retryLaneExpirationMs = 5000;
packages/shared/forks/ReactFeatureFlags.www.js
+1
@@ -46,6 +46,7 @@ export const enableProfilerTimer = __PROFILE__;
46
export const enableProfilerCommitHooks = __PROFILE__;
47
export const enableProfilerNestedUpdatePhase = __PROFILE__;
48
export const enableUpdaterTracking = __PROFILE__;
49
+export const enableFabricCompleteRootInCommitPhase = false;
50
51
export const enableSuspenseAvoidThisFallback = true;
52
export const enableSuspenseAvoidThisFallbackFizz = false;