fix: invalidate node maps when nodes change in-between paints #5694. #5746
+76
−37
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description
This fixes an editor crash where the user types quickly after earlier nodes have been added, split or deleted, but the node maps have not yet been regenerated on React render.
Issue
Fixes: (link to issue)
Example
Recording (from issue linked above)
https://github.com/user-attachments/assets/a68453b1-df47-4324-a542-9313569958ca
Sandbox (from issue linked above)
https://codesandbox.io/s/slate-selection-change-repro-ztssmp
Context
The
NODE_TO_INDEX
WeakMap is built on each React render as part of theuseChildren
hook. BothonDOMBeforeInput
andonDOMSelectionChange
use these maps to set the selection. This change introduces a newWeakMap
calledIS_NODE_MAP_DIRTY
to track whether the underlying nodes have changed (eg:remove_node
orinsert_node
), allowing those methods to skip attempts tosetSelection
that could crash the component.Recommend you compare with "Ignore white space" selected.
Checks
yarn test
.yarn lint
. (Fix errors withyarn fix
.)yarn start
.)yarn changeset add
.)