Skip to content

Commit b850e17

Browse files
committed
New children notify fragment instances in Fabric (#33093)
When a new child of a fragment instance is inserted, we need to notify the instance to keep any relevant tracking up to date. For example, we automatically observe the new child with any active IntersectionObserver. For mutable renderers (DOM), we reuse the existing traversal in `commitPlacement` that does the insertions for HostComponents. Immutable renderers (Fabric) exit this path before the traversal though, so currently we can't notify the fragment instances. Here I've created a separate traversal in `commitPlacement`, specifically for immutable renders when `enableFragmentRefs` is on. DiffTrain build for [1835b3f](1835b3f)
1 parent e76c452 commit b850e17

24 files changed

+666
-455
lines changed

compiled-rn/VERSION_NATIVE_FB

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
19.2.0-native-fb-4c6967be-20250520
1+
19.2.0-native-fb-1835b3f7-20250521

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-dev.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<8a1de7d79c73e6c2e1075d7fd4792000>>
10+
* @generated SignedSource<<96dea4b21533bb54606cc48477b6d39d>>
1111
*/
1212

1313
"use strict";
@@ -404,5 +404,5 @@ __DEV__ &&
404404
exports.useFormStatus = function () {
405405
return resolveDispatcher().useHostTransitionStatus();
406406
};
407-
exports.version = "19.2.0-native-fb-4c6967be-20250520";
407+
exports.version = "19.2.0-native-fb-1835b3f7-20250521";
408408
})();

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-prod.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<8a2709664554a8b29233a80c9ff76f19>>
10+
* @generated SignedSource<<aff3aa2c96bd713940aa1302c6d0252a>>
1111
*/
1212

1313
"use strict";
@@ -203,4 +203,4 @@ exports.useFormState = function (action, initialState, permalink) {
203203
exports.useFormStatus = function () {
204204
return ReactSharedInternals.H.useHostTransitionStatus();
205205
};
206-
exports.version = "19.2.0-native-fb-4c6967be-20250520";
206+
exports.version = "19.2.0-native-fb-1835b3f7-20250521";

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-profiling.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<8a2709664554a8b29233a80c9ff76f19>>
10+
* @generated SignedSource<<aff3aa2c96bd713940aa1302c6d0252a>>
1111
*/
1212

1313
"use strict";
@@ -203,4 +203,4 @@ exports.useFormState = function (action, initialState, permalink) {
203203
exports.useFormStatus = function () {
204204
return ReactSharedInternals.H.useHostTransitionStatus();
205205
};
206-
exports.version = "19.2.0-native-fb-4c6967be-20250520";
206+
exports.version = "19.2.0-native-fb-1835b3f7-20250521";

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-dev.js

Lines changed: 62 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<b322f5ff2b0b6e8c848892cfc866c41e>>
10+
* @generated SignedSource<<f0c95c16ccf11c5712db3c74ce3f5e68>>
1111
*/
1212

1313
/*
@@ -13195,11 +13195,16 @@ __DEV__ &&
1319513195
}
1319613196
}
1319713197
function commitNewChildToFragmentInstances(fiber, parentFragmentInstances) {
13198-
for (var i = 0; i < parentFragmentInstances.length; i++)
13199-
commitNewChildToFragmentInstance(
13200-
fiber.stateNode,
13201-
parentFragmentInstances[i]
13202-
);
13198+
if (
13199+
5 === fiber.tag &&
13200+
null === fiber.alternate &&
13201+
null !== parentFragmentInstances
13202+
)
13203+
for (var i = 0; i < parentFragmentInstances.length; i++)
13204+
commitNewChildToFragmentInstance(
13205+
fiber.stateNode,
13206+
parentFragmentInstances[i]
13207+
);
1320313208
}
1320413209
function commitFragmentInstanceDeletionEffects(fiber) {
1320513210
for (var parent = fiber.return; null !== parent; ) {
@@ -13259,39 +13264,36 @@ __DEV__ &&
1325913264
parentFragmentInstances
1326013265
) {
1326113266
var tag = node.tag;
13262-
if (5 === tag || 6 === tag) {
13263-
var stateNode = node.stateNode;
13264-
before
13265-
? (warnForReactChildrenConflict(parent),
13266-
(parent =
13267-
9 === parent.nodeType
13268-
? parent.body
13269-
: "HTML" === parent.nodeName
13270-
? parent.ownerDocument.body
13271-
: parent),
13272-
supportsMoveBefore && null !== stateNode.parentNode
13273-
? parent.moveBefore(stateNode, before)
13274-
: parent.insertBefore(stateNode, before))
13275-
: (warnForReactChildrenConflict(parent),
13276-
(before =
13277-
9 === parent.nodeType
13278-
? parent.body
13279-
: "HTML" === parent.nodeName
13280-
? parent.ownerDocument.body
13281-
: parent),
13282-
supportsMoveBefore && null !== stateNode.parentNode
13283-
? before.moveBefore(stateNode, null)
13284-
: before.appendChild(stateNode),
13285-
(stateNode = parent._reactRootContainer),
13286-
(null !== stateNode && void 0 !== stateNode) ||
13287-
null !== before.onclick ||
13288-
(before.onclick = noop$1));
13289-
enableFragmentRefs &&
13290-
5 === tag &&
13291-
null === node.alternate &&
13292-
null !== parentFragmentInstances &&
13293-
commitNewChildToFragmentInstances(node, parentFragmentInstances);
13294-
} else if (
13267+
if (5 === tag || 6 === tag)
13268+
(tag = node.stateNode),
13269+
before
13270+
? (warnForReactChildrenConflict(parent),
13271+
(parent =
13272+
9 === parent.nodeType
13273+
? parent.body
13274+
: "HTML" === parent.nodeName
13275+
? parent.ownerDocument.body
13276+
: parent),
13277+
supportsMoveBefore && null !== tag.parentNode
13278+
? parent.moveBefore(tag, before)
13279+
: parent.insertBefore(tag, before))
13280+
: (warnForReactChildrenConflict(parent),
13281+
(before =
13282+
9 === parent.nodeType
13283+
? parent.body
13284+
: "HTML" === parent.nodeName
13285+
? parent.ownerDocument.body
13286+
: parent),
13287+
supportsMoveBefore && null !== tag.parentNode
13288+
? before.moveBefore(tag, null)
13289+
: before.appendChild(tag),
13290+
(tag = parent._reactRootContainer),
13291+
(null !== tag && void 0 !== tag) ||
13292+
null !== before.onclick ||
13293+
(before.onclick = noop$1)),
13294+
enableFragmentRefs &&
13295+
commitNewChildToFragmentInstances(node, parentFragmentInstances);
13296+
else if (
1329513297
4 !== tag &&
1329613298
(27 === tag &&
1329713299
isSingletonScope(node.type) &&
@@ -13325,22 +13327,19 @@ __DEV__ &&
1332513327
parentFragmentInstances
1332613328
) {
1332713329
var tag = node.tag;
13328-
if (5 === tag || 6 === tag) {
13329-
var stateNode = node.stateNode;
13330-
before
13331-
? supportsMoveBefore && null !== stateNode.parentNode
13332-
? parent.moveBefore(stateNode, before)
13333-
: parent.insertBefore(stateNode, before)
13334-
: ((before = parent),
13335-
supportsMoveBefore && null !== stateNode.parentNode
13336-
? before.moveBefore(stateNode, null)
13337-
: before.appendChild(stateNode));
13338-
enableFragmentRefs &&
13339-
5 === tag &&
13340-
null === node.alternate &&
13341-
null !== parentFragmentInstances &&
13342-
commitNewChildToFragmentInstances(node, parentFragmentInstances);
13343-
} else if (
13330+
if (5 === tag || 6 === tag)
13331+
(tag = node.stateNode),
13332+
before
13333+
? supportsMoveBefore && null !== tag.parentNode
13334+
? parent.moveBefore(tag, before)
13335+
: parent.insertBefore(tag, before)
13336+
: ((before = parent),
13337+
supportsMoveBefore && null !== tag.parentNode
13338+
? before.moveBefore(tag, null)
13339+
: before.appendChild(tag)),
13340+
enableFragmentRefs &&
13341+
commitNewChildToFragmentInstances(node, parentFragmentInstances);
13342+
else if (
1334413343
4 !== tag &&
1334513344
(27 === tag && isSingletonScope(node.type) && (parent = node.stateNode),
1334613345
(node = node.child),
@@ -21249,20 +21248,20 @@ __DEV__ &&
2124921248
}
2125021249
return -1;
2125121250
}
21252-
function commitNewChildToFragmentInstance(childElement, fragmentInstance) {
21251+
function commitNewChildToFragmentInstance(childInstance, fragmentInstance) {
2125321252
var eventListeners = fragmentInstance._eventListeners;
2125421253
if (null !== eventListeners)
2125521254
for (var i = 0; i < eventListeners.length; i++) {
2125621255
var _eventListeners$i2 = eventListeners[i];
21257-
childElement.addEventListener(
21256+
childInstance.addEventListener(
2125821257
_eventListeners$i2.type,
2125921258
_eventListeners$i2.listener,
2126021259
_eventListeners$i2.optionsOrUseCapture
2126121260
);
2126221261
}
2126321262
null !== fragmentInstance._observers &&
2126421263
fragmentInstance._observers.forEach(function (observer) {
21265-
observer.observe(childElement);
21264+
observer.observe(childInstance);
2126621265
});
2126721266
}
2126821267
function clearContainerSparingly(container) {
@@ -27027,11 +27026,11 @@ __DEV__ &&
2702727026
};
2702827027
(function () {
2702927028
var isomorphicReactPackageVersion = React.version;
27030-
if ("19.2.0-native-fb-4c6967be-20250520" !== isomorphicReactPackageVersion)
27029+
if ("19.2.0-native-fb-1835b3f7-20250521" !== isomorphicReactPackageVersion)
2703127030
throw Error(
2703227031
'Incompatible React versions: The "react" and "react-dom" packages must have the exact same version. Instead got:\n - react: ' +
2703327032
(isomorphicReactPackageVersion +
27034-
"\n - react-dom: 19.2.0-native-fb-4c6967be-20250520\nLearn more: https://react.dev/warnings/version-mismatch")
27033+
"\n - react-dom: 19.2.0-native-fb-1835b3f7-20250521\nLearn more: https://react.dev/warnings/version-mismatch")
2703527034
);
2703627035
})();
2703727036
("function" === typeof Map &&
@@ -27068,10 +27067,10 @@ __DEV__ &&
2706827067
!(function () {
2706927068
var internals = {
2707027069
bundleType: 1,
27071-
version: "19.2.0-native-fb-4c6967be-20250520",
27070+
version: "19.2.0-native-fb-1835b3f7-20250521",
2707227071
rendererPackageName: "react-dom",
2707327072
currentDispatcherRef: ReactSharedInternals,
27074-
reconcilerVersion: "19.2.0-native-fb-4c6967be-20250520"
27073+
reconcilerVersion: "19.2.0-native-fb-1835b3f7-20250521"
2707527074
};
2707627075
internals.overrideHookState = overrideHookState;
2707727076
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -27209,5 +27208,5 @@ __DEV__ &&
2720927208
listenToAllSupportedEvents(container);
2721027209
return new ReactDOMHydrationRoot(initialChildren);
2721127210
};
27212-
exports.version = "19.2.0-native-fb-4c6967be-20250520";
27211+
exports.version = "19.2.0-native-fb-1835b3f7-20250521";
2721327212
})();

0 commit comments

Comments
 (0)