Skip to content

Commit eacf8b8

Browse files
committed
[Fiber] Don't unhide a node if a direct parent offscreen is still hidden (#34821)
If an inner Offscreen commits an unhide, but an outer Offscreen is still hidden but they're controlling the same DOM node then we shouldn't unhide the DOM node yet. This keeps track of whether we're directly inside a hidden offscreen. It might be better to just do the tree search instead of keeping the stack state since it's a rare case. Although this hide/unhide path does trigger a lot of times even when there's no change. This was technically a bug with Suspense too but it doesn't appear because a suspended Suspense boundary never commits its partial state. If it did, it would trigger this same path. But it can happen with an outer Activity and inner Suspense. DiffTrain build for [1d68bce](1d68bce)
1 parent b5356aa commit eacf8b8

34 files changed

+1660
-1526
lines changed

compiled/facebook-www/REVISION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4b3e662e4ce54eb54a8701c48a967cc84a389501
1+
1d68bce19c9409ed70604d1d16b70b68ce71dc4a
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4b3e662e4ce54eb54a8701c48a967cc84a389501
1+
1d68bce19c9409ed70604d1d16b70b68ce71dc4a

compiled/facebook-www/React-dev.classic.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1460,7 +1460,7 @@ __DEV__ &&
14601460
exports.useTransition = function () {
14611461
return resolveDispatcher().useTransition();
14621462
};
1463-
exports.version = "19.3.0-www-classic-4b3e662e-20251008";
1463+
exports.version = "19.3.0-www-classic-1d68bce1-20251012";
14641464
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
14651465
"function" ===
14661466
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled/facebook-www/React-dev.modern.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1460,7 +1460,7 @@ __DEV__ &&
14601460
exports.useTransition = function () {
14611461
return resolveDispatcher().useTransition();
14621462
};
1463-
exports.version = "19.3.0-www-modern-4b3e662e-20251008";
1463+
exports.version = "19.3.0-www-modern-1d68bce1-20251012";
14641464
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
14651465
"function" ===
14661466
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled/facebook-www/React-prod.classic.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -606,4 +606,4 @@ exports.useSyncExternalStore = function (
606606
exports.useTransition = function () {
607607
return ReactSharedInternals.H.useTransition();
608608
};
609-
exports.version = "19.3.0-www-classic-4b3e662e-20251008";
609+
exports.version = "19.3.0-www-classic-1d68bce1-20251012";

compiled/facebook-www/React-prod.modern.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -606,4 +606,4 @@ exports.useSyncExternalStore = function (
606606
exports.useTransition = function () {
607607
return ReactSharedInternals.H.useTransition();
608608
};
609-
exports.version = "19.3.0-www-modern-4b3e662e-20251008";
609+
exports.version = "19.3.0-www-modern-1d68bce1-20251012";

compiled/facebook-www/React-profiling.classic.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,7 @@ exports.useSyncExternalStore = function (
610610
exports.useTransition = function () {
611611
return ReactSharedInternals.H.useTransition();
612612
};
613-
exports.version = "19.3.0-www-classic-4b3e662e-20251008";
613+
exports.version = "19.3.0-www-classic-1d68bce1-20251012";
614614
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
615615
"function" ===
616616
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled/facebook-www/React-profiling.modern.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,7 @@ exports.useSyncExternalStore = function (
610610
exports.useTransition = function () {
611611
return ReactSharedInternals.H.useTransition();
612612
};
613-
exports.version = "19.3.0-www-modern-4b3e662e-20251008";
613+
exports.version = "19.3.0-www-modern-1d68bce1-20251012";
614614
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
615615
"function" ===
616616
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled/facebook-www/ReactART-dev.classic.js

Lines changed: 62 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -12886,7 +12886,10 @@ __DEV__ &&
1288612886
case 26:
1288712887
case 27:
1288812888
case 5:
12889+
var prevOffscreenDirectParentIsHidden = offscreenDirectParentIsHidden;
12890+
offscreenDirectParentIsHidden = !1;
1288912891
recursivelyTraverseMutationEffects(root, finishedWork, lanes);
12892+
offscreenDirectParentIsHidden = prevOffscreenDirectParentIsHidden;
1289012893
commitReconciliationEffects(finishedWork);
1289112894
flags & 512 &&
1289212895
(offscreenSubtreeWasHidden ||
@@ -13018,13 +13021,17 @@ __DEV__ &&
1301813021
suspenseCallback = null !== finishedWork.memoizedState;
1301913022
retryQueue = null !== current && null !== current.memoizedState;
1302013023
var prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden,
13021-
prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;
13024+
prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden,
13025+
_prevOffscreenDirectParentIsHidden = offscreenDirectParentIsHidden;
1302213026
offscreenSubtreeIsHidden =
1302313027
prevOffscreenSubtreeIsHidden || suspenseCallback;
13028+
offscreenDirectParentIsHidden =
13029+
_prevOffscreenDirectParentIsHidden || suspenseCallback;
1302413030
offscreenSubtreeWasHidden =
1302513031
prevOffscreenSubtreeWasHidden || retryQueue;
1302613032
recursivelyTraverseMutationEffects(root, finishedWork, lanes);
1302713033
offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;
13034+
offscreenDirectParentIsHidden = _prevOffscreenDirectParentIsHidden;
1302813035
offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden;
1302913036
retryQueue &&
1303013037
!suspenseCallback &&
@@ -13041,47 +13048,49 @@ __DEV__ &&
1304113048
componentEffectEndTime
1304213049
);
1304313050
commitReconciliationEffects(finishedWork);
13044-
if (flags & 8192)
13045-
a: for (
13046-
root = finishedWork.stateNode,
13047-
root._visibility = suspenseCallback
13048-
? root._visibility & ~OffscreenVisible
13049-
: root._visibility | OffscreenVisible,
13050-
!suspenseCallback ||
13051-
null === current ||
13052-
retryQueue ||
13053-
offscreenSubtreeIsHidden ||
13054-
offscreenSubtreeWasHidden ||
13055-
(recursivelyTraverseDisappearLayoutEffects(finishedWork),
13056-
enableComponentPerformanceTrack &&
13057-
0 !== (finishedWork.mode & 2) &&
13058-
0 <= componentEffectStartTime &&
13059-
0 <= componentEffectEndTime &&
13060-
0.05 < componentEffectEndTime - componentEffectStartTime &&
13061-
logComponentTrigger(
13062-
finishedWork,
13063-
componentEffectStartTime,
13064-
componentEffectEndTime,
13065-
"Disconnect"
13066-
)),
13067-
current = null,
13068-
root = finishedWork;
13069-
;
13070-
13071-
) {
13051+
if (
13052+
flags & 8192 &&
13053+
((root = finishedWork.stateNode),
13054+
(root._visibility = suspenseCallback
13055+
? root._visibility & ~OffscreenVisible
13056+
: root._visibility | OffscreenVisible),
13057+
!suspenseCallback ||
13058+
null === current ||
13059+
retryQueue ||
13060+
offscreenSubtreeIsHidden ||
13061+
offscreenSubtreeWasHidden ||
13062+
(recursivelyTraverseDisappearLayoutEffects(finishedWork),
13063+
enableComponentPerformanceTrack &&
13064+
0 !== (finishedWork.mode & 2) &&
13065+
0 <= componentEffectStartTime &&
13066+
0 <= componentEffectEndTime &&
13067+
0.05 < componentEffectEndTime - componentEffectStartTime &&
13068+
logComponentTrigger(
13069+
finishedWork,
13070+
componentEffectStartTime,
13071+
componentEffectEndTime,
13072+
"Disconnect"
13073+
)),
13074+
suspenseCallback || !offscreenDirectParentIsHidden)
13075+
)
13076+
a: for (current = null, root = finishedWork; ; ) {
1307213077
if (5 === root.tag) {
1307313078
if (null === current) {
1307413079
lanes = current = root;
1307513080
try {
13076-
var instance = lanes.stateNode;
13077-
suspenseCallback
13078-
? runWithFiberInDEV(lanes, hideInstance, instance)
13079-
: runWithFiberInDEV(
13080-
lanes,
13081-
unhideInstance,
13082-
lanes.stateNode,
13083-
lanes.memoizedProps
13084-
);
13081+
(prevOffscreenDirectParentIsHidden = lanes.stateNode),
13082+
suspenseCallback
13083+
? runWithFiberInDEV(
13084+
lanes,
13085+
hideInstance,
13086+
prevOffscreenDirectParentIsHidden
13087+
)
13088+
: runWithFiberInDEV(
13089+
lanes,
13090+
unhideInstance,
13091+
lanes.stateNode,
13092+
lanes.memoizedProps
13093+
);
1308513094
} catch (error) {
1308613095
captureCommitPhaseError(lanes, lanes.return, error);
1308713096
}
@@ -13090,17 +13099,13 @@ __DEV__ &&
1309013099
if (null === current) {
1309113100
lanes = root;
1309213101
try {
13093-
var instance$jscomp$0 = lanes.stateNode;
13102+
var instance = lanes.stateNode;
1309413103
suspenseCallback
13095-
? runWithFiberInDEV(
13096-
lanes,
13097-
hideTextInstance,
13098-
instance$jscomp$0
13099-
)
13104+
? runWithFiberInDEV(lanes, hideTextInstance, instance)
1310013105
: runWithFiberInDEV(
1310113106
lanes,
1310213107
unhideTextInstance,
13103-
instance$jscomp$0,
13108+
instance,
1310413109
lanes.memoizedProps
1310513110
);
1310613111
trackHostMutation();
@@ -13112,12 +13117,12 @@ __DEV__ &&
1311213117
if (null === current) {
1311313118
lanes = root;
1311413119
try {
13115-
var instance$jscomp$1 = lanes.stateNode;
13120+
var instance$jscomp$0 = lanes.stateNode;
1311613121
suspenseCallback
1311713122
? runWithFiberInDEV(
1311813123
lanes,
1311913124
hideDehydratedBoundary,
13120-
instance$jscomp$1
13125+
instance$jscomp$0
1312113126
)
1312213127
: runWithFiberInDEV(
1312313128
lanes,
@@ -13173,17 +13178,15 @@ __DEV__ &&
1317313178
null === current ||
1317413179
safelyDetachRef(current, current.return)),
1317513180
(flags = pushMutationContext()),
13176-
(instance = enableViewTransition && (lanes & 335544064) === lanes),
13177-
(instance$jscomp$0 = finishedWork.memoizedProps),
13178-
instance &&
13181+
(prevOffscreenDirectParentIsHidden =
13182+
enableViewTransition && (lanes & 335544064) === lanes),
13183+
(instance = finishedWork.memoizedProps),
13184+
prevOffscreenDirectParentIsHidden &&
1317913185
"none" !==
13180-
getViewTransitionClassName(
13181-
instance$jscomp$0.default,
13182-
instance$jscomp$0.update
13183-
),
13186+
getViewTransitionClassName(instance.default, instance.update),
1318413187
recursivelyTraverseMutationEffects(root, finishedWork, lanes),
1318513188
commitReconciliationEffects(finishedWork),
13186-
instance &&
13189+
prevOffscreenDirectParentIsHidden &&
1318713190
null !== current &&
1318813191
viewTransitionMutationContext &&
1318913192
(finishedWork.flags |= 4),
@@ -19992,6 +19995,7 @@ __DEV__ &&
1999219995
didWarnAboutName = {},
1999319996
offscreenSubtreeIsHidden = !1,
1999419997
offscreenSubtreeWasHidden = !1,
19998+
offscreenDirectParentIsHidden = !1,
1999519999
PossiblyWeakSet = "function" === typeof WeakSet ? WeakSet : Set,
1999620000
nextEffect = null,
1999720001
inProgressLanes = null,
@@ -20348,10 +20352,10 @@ __DEV__ &&
2034820352
(function () {
2034920353
var internals = {
2035020354
bundleType: 1,
20351-
version: "19.3.0-www-classic-4b3e662e-20251008",
20355+
version: "19.3.0-www-classic-1d68bce1-20251012",
2035220356
rendererPackageName: "react-art",
2035320357
currentDispatcherRef: ReactSharedInternals,
20354-
reconcilerVersion: "19.3.0-www-classic-4b3e662e-20251008"
20358+
reconcilerVersion: "19.3.0-www-classic-1d68bce1-20251012"
2035520359
};
2035620360
internals.overrideHookState = overrideHookState;
2035720361
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -20386,7 +20390,7 @@ __DEV__ &&
2038620390
exports.Shape = Shape;
2038720391
exports.Surface = Surface;
2038820392
exports.Text = Text;
20389-
exports.version = "19.3.0-www-classic-4b3e662e-20251008";
20393+
exports.version = "19.3.0-www-classic-1d68bce1-20251012";
2039020394
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
2039120395
"function" ===
2039220396
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

0 commit comments

Comments
 (0)