Skip to content

Preserve insertion points when range ends are removed - #6204

Merged
dylans merged 2 commits into
mainfrom
insert-void-range
Oct 10, 2026
Merged

dylans merged 2 commits into
mainfrom
insert-void-range

Conversation

@dylans

@dylans dylans commented Oct 10, 2026

Copy link
Copy Markdown
Collaborator

Replacing a selection ending inside an inline or block void could throw after deletion removed the insertion point. Track both endpoints, keep the surviving point, and release both references. When both endpoints are removed, insert at a point taken just before the range, then fall back to the document start. Apply the same fallback to insertFragment for read-only endpoints.

Fixes #4328

Case Before After
insertNodes: selection ends in an inline/block void Throws on null insertion point Replaces the selection
insertFragment: selection ends in an inline/block read-only node Throws after deletion Replaces the selection
insertNodes: selection starts and ends in inline voids Throws on null insertion point Inserts at the point just before the range
insertFragment: selection ends in a void Ignored by the existing guard Unchanged

Validation: against main 8f59fd3, the four crash fixtures and the start-and-end fixture fail; the two expanded-void fragment fixtures pass. The fixture harness also exercises batched/unbatched insertion. Both references are checked for cleanup. check.sh passed on Node 24.21.0: 1,480 Mocha tests, 141 Jest tests, build, TypeScript, ESLint and Prettier.

The handoff described insertFragment's void endpoint as another crash, but its explicit guard already prevents that. Keeping that guard avoids introducing a new deletion behavior when both endpoints are inside voids. Existing list/table, collapsed void, voids:true and normalization fixtures pass in the full core suite.

dylans added 2 commits October 9, 2026 13:41
When the replaced range both starts and ends inside voids, the delete
removes both, so neither point ref survives and insertNodes would still
crash. Take a ref to the point just before the range first and insert
there, falling back to the document start.
@changeset-bot

changeset-bot Bot commented Oct 10, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1766436

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
slate Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@dylans
dylans merged commit 94b1fcd into main Oct 10, 2026
16 checks passed
@github-actions github-actions Bot mentioned this pull request Oct 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The error is thrown with Transforms.insertNodes when the selection end is void element

1 participant