From 03a62b20fddb197876ce20ac5ea34994b0e5b242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Markb=C3=A5ge?= Date: Tue, 14 Oct 2025 07:21:12 -0400 Subject: [PATCH 1/4] [Flight] Look for moved debugInfo when logging component performance track (#34839) --- .../react-client/src/ReactFlightClient.js | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/react-client/src/ReactFlightClient.js b/packages/react-client/src/ReactFlightClient.js index 701d9df33cdd9..2121903b87e47 100644 --- a/packages/react-client/src/ReactFlightClient.js +++ b/packages/react-client/src/ReactFlightClient.js @@ -4318,7 +4318,26 @@ function flushComponentPerformance( // First find the start time of the first component to know if it was running // in parallel with the previous. - const debugInfo = __DEV__ && root._debugInfo; + let debugInfo = null; + if (__DEV__) { + debugInfo = root._debugInfo; + if (debugInfo.length === 0 && root.status === 'fulfilled') { + const resolvedValue = resolveLazy(root.value); + if ( + typeof resolvedValue === 'object' && + resolvedValue !== null && + (isArray(resolvedValue) || + typeof resolvedValue[ASYNC_ITERATOR] === 'function' || + resolvedValue.$$typeof === REACT_ELEMENT_TYPE || + resolvedValue.$$typeof === REACT_LAZY_TYPE) && + isArray(resolvedValue._debugInfo) + ) { + // It's possible that the value has been given the debug info. + // In that case we need to look for it on the resolved value. + debugInfo = resolvedValue._debugInfo; + } + } + } if (debugInfo) { let startTime = 0; for (let i = 0; i < debugInfo.length; i++) { From 73507ec457349263bffa4c8132b2674664d5f421 Mon Sep 17 00:00:00 2001 From: "Sebastian \"Sebbie\" Silbermann" Date: Tue, 14 Oct 2025 13:57:08 +0200 Subject: [PATCH 2/4] [DevTools] Exclude Suspense boundaries in hidden Activity (#34756) --- .../src/__tests__/store-test.js | 101 ++++++++++++++++++ .../src/backend/fiber/renderer.js | 44 ++++++-- 2 files changed, 138 insertions(+), 7 deletions(-) diff --git a/packages/react-devtools-shared/src/__tests__/store-test.js b/packages/react-devtools-shared/src/__tests__/store-test.js index d5280c091c953..3638852c20b72 100644 --- a/packages/react-devtools-shared/src/__tests__/store-test.js +++ b/packages/react-devtools-shared/src/__tests__/store-test.js @@ -3142,4 +3142,105 @@ describe('Store', () => { await actAsync(() => render(null)); expect(store).toMatchInlineSnapshot(``); }); + + // @reactVersion >= 19 + it('should keep suspended boundaries in the Suspense tree but not hidden Activity', async () => { + const Activity = React.Activity || React.unstable_Activity; + + const never = new Promise(() => {}); + function Never() { + readValue(never); + return null; + } + function Component({children}) { + return
{children}
; + } + + function App({hidden}) { + return ( + <> + + + inside Activity + + + + + inside Suspense + + {hidden ? : null} + + + ); + } + + await actAsync(() => { + render(