From 4c9d62d2b47be424ad9050725d8bdd8df12fe2a3 Mon Sep 17 00:00:00 2001 From: "Sebastian \"Sebbie\" Silbermann" Date: Mon, 9 Feb 2026 22:52:24 +0100 Subject: [PATCH] [DevTools] Fix crash when revealing stable, filtered `` children (#35734) --- .../src/__tests__/store-test.js | 44 +++++++++++++++++++ .../src/backend/fiber/renderer.js | 11 +++++ 2 files changed, 55 insertions(+) diff --git a/packages/react-devtools-shared/src/__tests__/store-test.js b/packages/react-devtools-shared/src/__tests__/store-test.js index 5e39a0fe68..871b44827e 100644 --- a/packages/react-devtools-shared/src/__tests__/store-test.js +++ b/packages/react-devtools-shared/src/__tests__/store-test.js @@ -3572,4 +3572,48 @@ describe('Store', () => { `); }); + + // @reactVersion >= 19 + it('can reconcile newly visible Activity with filtered, stable children', async () => { + const Activity = React.Activity || React.unstable_Activity; + + function IgnoreMe({children}) { + return children; + } + + function Component({children}) { + return
{children}
; + } + + await actAsync( + async () => + (store.componentFilters = [createDisplayNameFilter('^IgnoreMe', true)]), + ); + + const children = ( + + Left + + ); + + await actAsync(() => { + render({children}); + }); + + expect(store).toMatchInlineSnapshot(` + [root] + + `); + + await actAsync(() => { + render({children}); + }); + + expect(store).toMatchInlineSnapshot(` + [root] + ▾ + ▾ +
+ `); + }); }); diff --git a/packages/react-devtools-shared/src/backend/fiber/renderer.js b/packages/react-devtools-shared/src/backend/fiber/renderer.js index 7363c66d15..61c6f86dd6 100644 --- a/packages/react-devtools-shared/src/backend/fiber/renderer.js +++ b/packages/react-devtools-shared/src/backend/fiber/renderer.js @@ -5416,6 +5416,17 @@ export function attach( // We're hiding the children. Remove them from the Frontend unmountRemainingChildren(); } + } else if (prevWasHidden && !nextIsHidden) { + // Since we don't mount hidden children and unmount children when hiding, + // we need to enter the mount path when revealing. + const nextChildSet = nextFiber.child; + if (nextChildSet !== null) { + mountChildrenRecursively( + nextChildSet, + traceNearestHostComponentUpdate, + ); + updateFlags |= ShouldResetChildren | ShouldResetSuspenseChildren; + } } else if ( nextFiber.tag === SuspenseComponent && OffscreenComponent !== -1 &&