Skip to content

Commit 3d76fe9

Browse files
committed
Improve cyclic thenable detection in ReactFlightReplyServer (facebook#35369)
## Summary This PR improves cyclic thenable detection in `ReactFlightReplyServer.js`. Fixes facebook#35368. The previous fix only detected direct self-references (`inspectedValue === chunk`) and relied on the `cycleProtection` counter to eventually bail out of longer cycles. This change keeps the existing MAX_THENABLE_CYCLE_DEPTH ($1000$) `cycleProtection` cap as a hard guardrail and adds a visited set so that we can detect self-cycles and multi-node cycles as soon as any `ReactPromise` is revisited and while still bounding the amount of work we do for deep acyclic chains via `cycleProtection`. ## How did you test this change? - Ran the existing test suite for the server renderer: ```bash yarn test react-server yarn test --prod react-server yarn flow dom-node yarn linc ``` --------- Co-authored-by: Hendrik Liebau <mail@hendrik-liebau.de> DiffTrain build for [b731fe2](facebook@b731fe2)
1 parent 6ef883c commit 3d76fe9

File tree

21 files changed

+94
-158
lines changed

21 files changed

+94
-158
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.3.0-native-fb-454fc41f-20251217
1+
19.3.0-native-fb-b731fe28-20251217

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<<6e0912ff4f1a4d90f39516488ea308b4>>
10+
* @generated SignedSource<<34c3216eabe797f777828d0d6fae260c>>
1111
*/
1212

1313
"use strict";
@@ -410,5 +410,5 @@ __DEV__ &&
410410
exports.useFormStatus = function () {
411411
return resolveDispatcher().useHostTransitionStatus();
412412
};
413-
exports.version = "19.3.0-native-fb-454fc41f-20251217";
413+
exports.version = "19.3.0-native-fb-b731fe28-20251217";
414414
})();

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<<c005b64359218e5836fbec34685b3356>>
10+
* @generated SignedSource<<59b3f29d19388a924467ff72674f1a10>>
1111
*/
1212

1313
"use strict";
@@ -209,4 +209,4 @@ exports.useFormState = function (action, initialState, permalink) {
209209
exports.useFormStatus = function () {
210210
return ReactSharedInternals.H.useHostTransitionStatus();
211211
};
212-
exports.version = "19.3.0-native-fb-454fc41f-20251217";
212+
exports.version = "19.3.0-native-fb-b731fe28-20251217";

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<<c005b64359218e5836fbec34685b3356>>
10+
* @generated SignedSource<<59b3f29d19388a924467ff72674f1a10>>
1111
*/
1212

1313
"use strict";
@@ -209,4 +209,4 @@ exports.useFormState = function (action, initialState, permalink) {
209209
exports.useFormStatus = function () {
210210
return ReactSharedInternals.H.useHostTransitionStatus();
211211
};
212-
exports.version = "19.3.0-native-fb-454fc41f-20251217";
212+
exports.version = "19.3.0-native-fb-b731fe28-20251217";

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

Lines changed: 17 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<d8d1a37ce1be64588db023e092563239>>
10+
* @generated SignedSource<<063a06cb4929bc65dd0bf392668eec88>>
1111
*/
1212

1313
/*
@@ -21417,41 +21417,16 @@ __DEV__ &&
2141721417
normalizeMarkupForTextOrAttribute(serverValue) !== clientValue &&
2141821418
(serverDifferences[propName] = serverValue));
2141921419
}
21420-
function hasViewTransition(htmlElement) {
21421-
return !!(
21422-
htmlElement.getAttribute("vt-share") ||
21423-
htmlElement.getAttribute("vt-exit") ||
21424-
htmlElement.getAttribute("vt-enter") ||
21425-
htmlElement.getAttribute("vt-update")
21426-
);
21427-
}
21428-
function isExpectedViewTransitionName(htmlElement) {
21429-
if (!hasViewTransition(htmlElement)) return !1;
21430-
var expectedVtName = htmlElement.getAttribute("vt-name");
21431-
htmlElement = htmlElement.style["view-transition-name"];
21432-
return expectedVtName
21433-
? expectedVtName === htmlElement
21434-
: htmlElement.startsWith("_T_");
21435-
}
2143621420
function warnForExtraAttributes(
2143721421
domElement,
2143821422
attributeNames,
2143921423
serverDifferences
2144021424
) {
2144121425
attributeNames.forEach(function (attributeName) {
21442-
"style" === attributeName
21443-
? "" !== domElement.getAttribute(attributeName) &&
21444-
((attributeName = domElement.style),
21445-
(((1 === attributeName.length &&
21446-
"view-transition-name" === attributeName[0]) ||
21447-
(2 === attributeName.length &&
21448-
"view-transition-class" === attributeName[0] &&
21449-
"view-transition-name" === attributeName[1])) &&
21450-
isExpectedViewTransitionName(domElement)) ||
21451-
(serverDifferences.style =
21452-
getStylesObjectFromElement(domElement)))
21453-
: (serverDifferences[getPropNameFromAttributeName(attributeName)] =
21454-
domElement.getAttribute(attributeName));
21426+
serverDifferences[getPropNameFromAttributeName(attributeName)] =
21427+
"style" === attributeName
21428+
? getStylesObjectFromElement(domElement)
21429+
: domElement.getAttribute(attributeName);
2145521430
});
2145621431
}
2145721432
function warnForInvalidEventListener(registrationName, listener) {
@@ -22758,16 +22733,12 @@ __DEV__ &&
2275822733
}
2275922734
}
2276022735
function getStylesObjectFromElement(domElement) {
22761-
for (
22762-
var serverValueInObjectForm = {}, style = domElement.style, i = 0;
22763-
i < style.length;
22764-
i++
22765-
) {
22766-
var styleName = style[i];
22767-
("view-transition-name" === styleName &&
22768-
isExpectedViewTransitionName(domElement)) ||
22769-
(serverValueInObjectForm[styleName] =
22770-
style.getPropertyValue(styleName));
22736+
var serverValueInObjectForm = {};
22737+
domElement = domElement.style;
22738+
for (var i = 0; i < domElement.length; i++) {
22739+
var styleName = domElement[i];
22740+
serverValueInObjectForm[styleName] =
22741+
domElement.getPropertyValue(styleName);
2277122742
}
2277222743
return serverValueInObjectForm;
2277322744
}
@@ -22817,10 +22788,7 @@ __DEV__ &&
2281722788
value$jscomp$0 = domElement.getAttribute("style");
2281822789
value$jscomp$0 !== clientValue &&
2281922790
((clientValue = normalizeMarkupForTextOrAttribute(clientValue)),
22820-
(value$jscomp$0 = normalizeMarkupForTextOrAttribute(value$jscomp$0)),
22821-
value$jscomp$0 === clientValue ||
22822-
(";" === value$jscomp$0[value$jscomp$0.length - 1] &&
22823-
hasViewTransition(domElement)) ||
22791+
normalizeMarkupForTextOrAttribute(value$jscomp$0) !== clientValue &&
2282422792
(serverDifferences.style = getStylesObjectFromElement(domElement)));
2282522793
}
2282622794
}
@@ -30276,11 +30244,11 @@ __DEV__ &&
3027630244
};
3027730245
(function () {
3027830246
var isomorphicReactPackageVersion = React.version;
30279-
if ("19.3.0-native-fb-454fc41f-20251217" !== isomorphicReactPackageVersion)
30247+
if ("19.3.0-native-fb-b731fe28-20251217" !== isomorphicReactPackageVersion)
3028030248
throw Error(
3028130249
'Incompatible React versions: The "react" and "react-dom" packages must have the exact same version. Instead got:\n - react: ' +
3028230250
(isomorphicReactPackageVersion +
30283-
"\n - react-dom: 19.3.0-native-fb-454fc41f-20251217\nLearn more: https://react.dev/warnings/version-mismatch")
30251+
"\n - react-dom: 19.3.0-native-fb-b731fe28-20251217\nLearn more: https://react.dev/warnings/version-mismatch")
3028430252
);
3028530253
})();
3028630254
("function" === typeof Map &&
@@ -30317,10 +30285,10 @@ __DEV__ &&
3031730285
!(function () {
3031830286
var internals = {
3031930287
bundleType: 1,
30320-
version: "19.3.0-native-fb-454fc41f-20251217",
30288+
version: "19.3.0-native-fb-b731fe28-20251217",
3032130289
rendererPackageName: "react-dom",
3032230290
currentDispatcherRef: ReactSharedInternals,
30323-
reconcilerVersion: "19.3.0-native-fb-454fc41f-20251217"
30291+
reconcilerVersion: "19.3.0-native-fb-b731fe28-20251217"
3032430292
};
3032530293
internals.overrideHookState = overrideHookState;
3032630294
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -30470,5 +30438,5 @@ __DEV__ &&
3047030438
listenToAllSupportedEvents(container);
3047130439
return new ReactDOMHydrationRoot(initialChildren);
3047230440
};
30473-
exports.version = "19.3.0-native-fb-454fc41f-20251217";
30441+
exports.version = "19.3.0-native-fb-b731fe28-20251217";
3047430442
})();

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<a09d15dc53680cdaa07280be53eb1b74>>
10+
* @generated SignedSource<<986d6b6b8746e15efd79b423f5bd9cad>>
1111
*/
1212

1313
/*
@@ -17707,14 +17707,14 @@ ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) {
1770717707
};
1770817708
var isomorphicReactPackageVersion$jscomp$inline_2054 = React.version;
1770917709
if (
17710-
"19.3.0-native-fb-454fc41f-20251217" !==
17710+
"19.3.0-native-fb-b731fe28-20251217" !==
1771117711
isomorphicReactPackageVersion$jscomp$inline_2054
1771217712
)
1771317713
throw Error(
1771417714
formatProdErrorMessage(
1771517715
527,
1771617716
isomorphicReactPackageVersion$jscomp$inline_2054,
17717-
"19.3.0-native-fb-454fc41f-20251217"
17717+
"19.3.0-native-fb-b731fe28-20251217"
1771817718
)
1771917719
);
1772017720
ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
@@ -17736,10 +17736,10 @@ ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
1773617736
};
1773717737
var internals$jscomp$inline_2636 = {
1773817738
bundleType: 0,
17739-
version: "19.3.0-native-fb-454fc41f-20251217",
17739+
version: "19.3.0-native-fb-b731fe28-20251217",
1774017740
rendererPackageName: "react-dom",
1774117741
currentDispatcherRef: ReactSharedInternals,
17742-
reconcilerVersion: "19.3.0-native-fb-454fc41f-20251217"
17742+
reconcilerVersion: "19.3.0-native-fb-b731fe28-20251217"
1774317743
};
1774417744
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
1774517745
var hook$jscomp$inline_2637 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -17846,4 +17846,4 @@ exports.hydrateRoot = function (container, initialChildren, options) {
1784617846
listenToAllSupportedEvents(container);
1784717847
return new ReactDOMHydrationRoot(initialChildren);
1784817848
};
17849-
exports.version = "19.3.0-native-fb-454fc41f-20251217";
17849+
exports.version = "19.3.0-native-fb-b731fe28-20251217";

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<bc324d95ddc6d840f91629c56fea8614>>
10+
* @generated SignedSource<<0159bb5f64c94ae4427ccedc4d188688>>
1111
*/
1212

1313
/*
@@ -19833,14 +19833,14 @@ ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) {
1983319833
};
1983419834
var isomorphicReactPackageVersion$jscomp$inline_2369 = React.version;
1983519835
if (
19836-
"19.3.0-native-fb-454fc41f-20251217" !==
19836+
"19.3.0-native-fb-b731fe28-20251217" !==
1983719837
isomorphicReactPackageVersion$jscomp$inline_2369
1983819838
)
1983919839
throw Error(
1984019840
formatProdErrorMessage(
1984119841
527,
1984219842
isomorphicReactPackageVersion$jscomp$inline_2369,
19843-
"19.3.0-native-fb-454fc41f-20251217"
19843+
"19.3.0-native-fb-b731fe28-20251217"
1984419844
)
1984519845
);
1984619846
ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
@@ -19862,10 +19862,10 @@ ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
1986219862
};
1986319863
var internals$jscomp$inline_2376 = {
1986419864
bundleType: 0,
19865-
version: "19.3.0-native-fb-454fc41f-20251217",
19865+
version: "19.3.0-native-fb-b731fe28-20251217",
1986619866
rendererPackageName: "react-dom",
1986719867
currentDispatcherRef: ReactSharedInternals,
19868-
reconcilerVersion: "19.3.0-native-fb-454fc41f-20251217",
19868+
reconcilerVersion: "19.3.0-native-fb-b731fe28-20251217",
1986919869
getLaneLabelMap: function () {
1987019870
for (
1987119871
var map = new Map(), lane = 1, index$336 = 0;
@@ -19988,4 +19988,4 @@ exports.hydrateRoot = function (container, initialChildren, options) {
1998819988
listenToAllSupportedEvents(container);
1998919989
return new ReactDOMHydrationRoot(initialChildren);
1999019990
};
19991-
exports.version = "19.3.0-native-fb-454fc41f-20251217";
19991+
exports.version = "19.3.0-native-fb-b731fe28-20251217";

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

Lines changed: 17 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<1746ec0466716511e3ff4927385ee6c5>>
10+
* @generated SignedSource<<0d20c30a3016047523722d6f691dce9e>>
1111
*/
1212

1313
/*
@@ -21425,41 +21425,16 @@ __DEV__ &&
2142521425
normalizeMarkupForTextOrAttribute(serverValue) !== clientValue &&
2142621426
(serverDifferences[propName] = serverValue));
2142721427
}
21428-
function hasViewTransition(htmlElement) {
21429-
return !!(
21430-
htmlElement.getAttribute("vt-share") ||
21431-
htmlElement.getAttribute("vt-exit") ||
21432-
htmlElement.getAttribute("vt-enter") ||
21433-
htmlElement.getAttribute("vt-update")
21434-
);
21435-
}
21436-
function isExpectedViewTransitionName(htmlElement) {
21437-
if (!hasViewTransition(htmlElement)) return !1;
21438-
var expectedVtName = htmlElement.getAttribute("vt-name");
21439-
htmlElement = htmlElement.style["view-transition-name"];
21440-
return expectedVtName
21441-
? expectedVtName === htmlElement
21442-
: htmlElement.startsWith("_T_");
21443-
}
2144421428
function warnForExtraAttributes(
2144521429
domElement,
2144621430
attributeNames,
2144721431
serverDifferences
2144821432
) {
2144921433
attributeNames.forEach(function (attributeName) {
21450-
"style" === attributeName
21451-
? "" !== domElement.getAttribute(attributeName) &&
21452-
((attributeName = domElement.style),
21453-
(((1 === attributeName.length &&
21454-
"view-transition-name" === attributeName[0]) ||
21455-
(2 === attributeName.length &&
21456-
"view-transition-class" === attributeName[0] &&
21457-
"view-transition-name" === attributeName[1])) &&
21458-
isExpectedViewTransitionName(domElement)) ||
21459-
(serverDifferences.style =
21460-
getStylesObjectFromElement(domElement)))
21461-
: (serverDifferences[getPropNameFromAttributeName(attributeName)] =
21462-
domElement.getAttribute(attributeName));
21434+
serverDifferences[getPropNameFromAttributeName(attributeName)] =
21435+
"style" === attributeName
21436+
? getStylesObjectFromElement(domElement)
21437+
: domElement.getAttribute(attributeName);
2146321438
});
2146421439
}
2146521440
function warnForInvalidEventListener(registrationName, listener) {
@@ -22766,16 +22741,12 @@ __DEV__ &&
2276622741
}
2276722742
}
2276822743
function getStylesObjectFromElement(domElement) {
22769-
for (
22770-
var serverValueInObjectForm = {}, style = domElement.style, i = 0;
22771-
i < style.length;
22772-
i++
22773-
) {
22774-
var styleName = style[i];
22775-
("view-transition-name" === styleName &&
22776-
isExpectedViewTransitionName(domElement)) ||
22777-
(serverValueInObjectForm[styleName] =
22778-
style.getPropertyValue(styleName));
22744+
var serverValueInObjectForm = {};
22745+
domElement = domElement.style;
22746+
for (var i = 0; i < domElement.length; i++) {
22747+
var styleName = domElement[i];
22748+
serverValueInObjectForm[styleName] =
22749+
domElement.getPropertyValue(styleName);
2277922750
}
2278022751
return serverValueInObjectForm;
2278122752
}
@@ -22825,10 +22796,7 @@ __DEV__ &&
2282522796
value$jscomp$0 = domElement.getAttribute("style");
2282622797
value$jscomp$0 !== clientValue &&
2282722798
((clientValue = normalizeMarkupForTextOrAttribute(clientValue)),
22828-
(value$jscomp$0 = normalizeMarkupForTextOrAttribute(value$jscomp$0)),
22829-
value$jscomp$0 === clientValue ||
22830-
(";" === value$jscomp$0[value$jscomp$0.length - 1] &&
22831-
hasViewTransition(domElement)) ||
22799+
normalizeMarkupForTextOrAttribute(value$jscomp$0) !== clientValue &&
2283222800
(serverDifferences.style = getStylesObjectFromElement(domElement)));
2283322801
}
2283422802
}
@@ -30338,11 +30306,11 @@ __DEV__ &&
3033830306
};
3033930307
(function () {
3034030308
var isomorphicReactPackageVersion = React.version;
30341-
if ("19.3.0-native-fb-454fc41f-20251217" !== isomorphicReactPackageVersion)
30309+
if ("19.3.0-native-fb-b731fe28-20251217" !== isomorphicReactPackageVersion)
3034230310
throw Error(
3034330311
'Incompatible React versions: The "react" and "react-dom" packages must have the exact same version. Instead got:\n - react: ' +
3034430312
(isomorphicReactPackageVersion +
30345-
"\n - react-dom: 19.3.0-native-fb-454fc41f-20251217\nLearn more: https://react.dev/warnings/version-mismatch")
30313+
"\n - react-dom: 19.3.0-native-fb-b731fe28-20251217\nLearn more: https://react.dev/warnings/version-mismatch")
3034630314
);
3034730315
})();
3034830316
("function" === typeof Map &&
@@ -30379,10 +30347,10 @@ __DEV__ &&
3037930347
!(function () {
3038030348
var internals = {
3038130349
bundleType: 1,
30382-
version: "19.3.0-native-fb-454fc41f-20251217",
30350+
version: "19.3.0-native-fb-b731fe28-20251217",
3038330351
rendererPackageName: "react-dom",
3038430352
currentDispatcherRef: ReactSharedInternals,
30385-
reconcilerVersion: "19.3.0-native-fb-454fc41f-20251217"
30353+
reconcilerVersion: "19.3.0-native-fb-b731fe28-20251217"
3038630354
};
3038730355
internals.overrideHookState = overrideHookState;
3038830356
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -30848,7 +30816,7 @@ __DEV__ &&
3084830816
exports.useFormStatus = function () {
3084930817
return resolveDispatcher().useHostTransitionStatus();
3085030818
};
30851-
exports.version = "19.3.0-native-fb-454fc41f-20251217";
30819+
exports.version = "19.3.0-native-fb-b731fe28-20251217";
3085230820
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
3085330821
"function" ===
3085430822
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

0 commit comments

Comments
 (0)