Skip to content

Commit 6c2bfb2

Browse files
committed
Re-add old Fabric Offscreen impl behind flag
There's a chance that #21960 will affect layout in a way that we don't expect, so I'm adding back the old implementation so we can toggle the feature with a flag. The flag should read from the ReactNativeFeatureFlags shim so that we can change it at runtime. I'll do that separately.
1 parent 8a37b0e commit 6c2bfb2

20 files changed

+257
-150
lines changed

packages/react-native-renderer/src/ReactFabricHostConfig.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,32 @@ export function getOffscreenContainerProps(
457457
}
458458
}
459459

460+
export function cloneHiddenInstance(
461+
instance: Instance,
462+
type: string,
463+
props: Props,
464+
internalInstanceHandle: Object,
465+
): Instance {
466+
const viewConfig = instance.canonical.viewConfig;
467+
const node = instance.node;
468+
const updatePayload = create(
469+
{style: {display: 'none'}},
470+
viewConfig.validAttributes,
471+
);
472+
return {
473+
node: cloneNodeWithNewProps(node, updatePayload),
474+
canonical: instance.canonical,
475+
};
476+
}
477+
478+
export function cloneHiddenTextInstance(
479+
instance: Instance,
480+
text: string,
481+
internalInstanceHandle: Object,
482+
): TextInstance {
483+
throw new Error('Not yet implemented.');
484+
}
485+
460486
export function createContainerChildSet(container: Container): ChildSet {
461487
return createChildNodeSet(container);
462488
}

packages/react-noop-renderer/src/createReactNoop.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,54 @@ function createReactNoop(reconciler: Function, useMutation: boolean) {
582582
children,
583583
};
584584
},
585+
586+
cloneHiddenInstance(
587+
instance: Instance,
588+
type: string,
589+
props: Props,
590+
internalInstanceHandle: Object,
591+
): Instance {
592+
const clone = cloneInstance(
593+
instance,
594+
null,
595+
type,
596+
props,
597+
props,
598+
internalInstanceHandle,
599+
true,
600+
null,
601+
);
602+
clone.hidden = true;
603+
return clone;
604+
},
605+
606+
cloneHiddenTextInstance(
607+
instance: TextInstance,
608+
text: string,
609+
internalInstanceHandle: Object,
610+
): TextInstance {
611+
const clone = {
612+
text: instance.text,
613+
id: instance.id,
614+
parent: instance.parent,
615+
hidden: true,
616+
context: instance.context,
617+
};
618+
// Hide from unit tests
619+
Object.defineProperty(clone, 'id', {
620+
value: clone.id,
621+
enumerable: false,
622+
});
623+
Object.defineProperty(clone, 'parent', {
624+
value: clone.parent,
625+
enumerable: false,
626+
});
627+
Object.defineProperty(clone, 'context', {
628+
value: clone.context,
629+
enumerable: false,
630+
});
631+
return clone;
632+
},
585633
};
586634

587635
const NoopRenderer = reconciler(hostConfig);

packages/react-reconciler/src/ReactFiberBeginWork.new.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ import {
8989
enableLazyContextPropagation,
9090
enableSuspenseLayoutEffectSemantics,
9191
enableSchedulingProfiler,
92+
enablePersistentOffscreenHostContainer,
9293
} from 'shared/ReactFeatureFlags';
9394
import invariant from 'shared/invariant';
9495
import isArray from 'shared/isArray';
@@ -744,7 +745,7 @@ function updateOffscreenComponent(
744745
workInProgress.updateQueue = spawnedCachePool;
745746
}
746747

747-
if (supportsPersistence) {
748+
if (enablePersistentOffscreenHostContainer && supportsPersistence) {
748749
// In persistent mode, the offscreen children are wrapped in a host node.
749750
// TODO: Optimize this to use the OffscreenComponent fiber instead of
750751
// an extra HostComponent fiber. Need to make sure this doesn't break Fabric
@@ -760,12 +761,10 @@ function updateOffscreenComponent(
760761
renderLanes,
761762
);
762763
return offscreenContainer;
763-
}
764-
if (supportsMutation) {
764+
} else {
765765
reconcileChildren(current, workInProgress, nextChildren, renderLanes);
766766
return workInProgress.child;
767767
}
768-
return null;
769768
}
770769

771770
function reconcileOffscreenHostContainer(
@@ -2383,7 +2382,7 @@ function updateSuspenseFallbackChildren(
23832382
currentPrimaryChildFragment.treeBaseDuration;
23842383
}
23852384

2386-
if (supportsPersistence) {
2385+
if (enablePersistentOffscreenHostContainer && supportsPersistence) {
23872386
// In persistent mode, the offscreen children are wrapped in a host node.
23882387
// We need to complete it now, because we're going to skip over its normal
23892388
// complete phase and go straight to rendering the fallback.
@@ -2411,7 +2410,7 @@ function updateSuspenseFallbackChildren(
24112410
primaryChildProps,
24122411
);
24132412

2414-
if (supportsPersistence) {
2413+
if (enablePersistentOffscreenHostContainer && supportsPersistence) {
24152414
// In persistent mode, the offscreen children are wrapped in a host node.
24162415
// We need to complete it now, because we're going to skip over its normal
24172416
// complete phase and go straight to rendering the fallback.

packages/react-reconciler/src/ReactFiberBeginWork.old.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ import {
8989
enableLazyContextPropagation,
9090
enableSuspenseLayoutEffectSemantics,
9191
enableSchedulingProfiler,
92+
enablePersistentOffscreenHostContainer,
9293
} from 'shared/ReactFeatureFlags';
9394
import invariant from 'shared/invariant';
9495
import isArray from 'shared/isArray';
@@ -744,7 +745,7 @@ function updateOffscreenComponent(
744745
workInProgress.updateQueue = spawnedCachePool;
745746
}
746747

747-
if (supportsPersistence) {
748+
if (enablePersistentOffscreenHostContainer && supportsPersistence) {
748749
// In persistent mode, the offscreen children are wrapped in a host node.
749750
// TODO: Optimize this to use the OffscreenComponent fiber instead of
750751
// an extra HostComponent fiber. Need to make sure this doesn't break Fabric
@@ -760,12 +761,10 @@ function updateOffscreenComponent(
760761
renderLanes,
761762
);
762763
return offscreenContainer;
763-
}
764-
if (supportsMutation) {
764+
} else {
765765
reconcileChildren(current, workInProgress, nextChildren, renderLanes);
766766
return workInProgress.child;
767767
}
768-
return null;
769768
}
770769

771770
function reconcileOffscreenHostContainer(
@@ -2383,7 +2382,7 @@ function updateSuspenseFallbackChildren(
23832382
currentPrimaryChildFragment.treeBaseDuration;
23842383
}
23852384

2386-
if (supportsPersistence) {
2385+
if (enablePersistentOffscreenHostContainer && supportsPersistence) {
23872386
// In persistent mode, the offscreen children are wrapped in a host node.
23882387
// We need to complete it now, because we're going to skip over its normal
23892388
// complete phase and go straight to rendering the fallback.
@@ -2411,7 +2410,7 @@ function updateSuspenseFallbackChildren(
24112410
primaryChildProps,
24122411
);
24132412

2414-
if (supportsPersistence) {
2413+
if (enablePersistentOffscreenHostContainer && supportsPersistence) {
24152414
// In persistent mode, the offscreen children are wrapped in a host node.
24162415
// We need to complete it now, because we're going to skip over its normal
24172416
// complete phase and go straight to rendering the fallback.

0 commit comments

Comments
 (0)