Skip to content

Conversation

@eps1lon
Copy link
Collaborator

@eps1lon eps1lon commented Feb 9, 2026

Summary

Stacked on #35736

A Suspense boundary is considered unblocked by I/O removal if no more children (until the next Suspense boundary) are blocked on the same I/O. However, we used to unblock if at least one children with this I/O was removed. Now we check if no more children are blocked on the same I/O.

This was probably an oversight. The unblocking should happen in the same codeblock that checks if all dependencies are removed.

Found with Claude + Opus 4.6

How did you test this change?

  • added test (see first commit for current behavior vs 2nd commit for changed behavior)

@meta-cla meta-cla bot added the CLA Signed label Feb 9, 2026
@github-actions github-actions bot added the React Core Team Opened by a member of the React Core Team label Feb 9, 2026
@eps1lon eps1lon changed the title [test] Include uniqueSuspenders in Suspense tree snapshots [DevTools] Only block child Suspense boundaries if the parent has all shared suspenders removed Feb 9, 2026
@eps1lon eps1lon marked this pull request as ready for review February 9, 2026 23:24
@eps1lon eps1lon requested a review from hoxyq February 9, 2026 23:26
Comment on lines 3691 to 3693
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the definition of a unique suspender for boundary? This wording is a bit confusing to me, because there are 2 boundaries and they have the same suspender, but the statement is that both these boundaries have unique suspenders.

Copy link
Collaborator Author

@eps1lon eps1lon Feb 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah I forgot to mention that we currently don't model going from some unique suspenders to none at all i.e. true -> false. Only false -> true.
Clarified that in the comment and switched to using present tense to make it clear the comment isn't talking about the previous snapshot.

A boundary has a unique suspender if that suspender does not suspend any ancestor boundary. We use that flag to filter out boundaries that can't show their fallback. If the same suspender appears in ancestor and a descendant boundary, the descendant will also be revealed when the ancestor is revealed. React will never reveal the ancestor but leave the descendant fallback in place. They'll always reveal together if the descendant suspenders are a subset of the ancestor suspenders.

@eps1lon eps1lon force-pushed the sebbie/02-09-_devtools_only_block_child_suspense_boundaries_if_the_parent_has_all_shared_suspenders_removed branch from eaa0db2 to 4cd0fb6 Compare February 10, 2026 15:11
@eps1lon eps1lon merged commit 57b79b0 into facebook:main Feb 10, 2026
635 of 637 checks passed
@eps1lon eps1lon deleted the sebbie/02-09-_devtools_only_block_child_suspense_boundaries_if_the_parent_has_all_shared_suspenders_removed branch February 10, 2026 17:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed React Core Team Opened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants