Skip to content

fix(collaboration): move content validation from beforeTransaction to filterTransaction#7600

Open
dearlordylord wants to merge 2 commits intoueberdosis:mainfrom
dearlordylord:fix/f1-yjs-before-transaction-ignored
Open

fix(collaboration): move content validation from beforeTransaction to filterTransaction#7600
dearlordylord wants to merge 2 commits intoueberdosis:mainfrom
dearlordylord:fix/f1-yjs-before-transaction-ignored

Conversation

@dearlordylord
Copy link

@dearlordylord dearlordylord commented Mar 15, 2026

Fixes #6927

Problem

enableContentCheck + onContentError don't work for collaboration:

  1. beforeTransaction return value is ignored by Yjs - return false is a no-op
  2. beforeTransaction reads pre-transaction state via yXmlFragmentToProsemirrorJSON(fragment) - the first corrupt transaction is invisible
  3. filterTransaction always returns true - the TODO at line 260 confirms this was known-incomplete

Fix

Remove beforeTransaction. Move validation into filterTransaction:

  • transaction.doc.check() validates post-transaction state
  • return false is respected by ProseMirror - transaction is rejected
  • isChangeOrigin(transaction) targets only Yjs sync transactions
  • Non-Yjs transactions and awareness updates (!docChanged) pass through unvalidated
  • On failure: sets isDisabled, emits contentError with disableCollaboration callback

@netlify
Copy link

netlify bot commented Mar 15, 2026

Deploy Preview for tiptap-embed ready!

Name Link
🔨 Latest commit a832c30
🔍 Latest deploy log https://app.netlify.com/projects/tiptap-embed/deploys/69b8016518c3240008ff227b
😎 Deploy Preview https://deploy-preview-7600--tiptap-embed.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@changeset-bot
Copy link

changeset-bot bot commented Mar 15, 2026

🦋 Changeset detected

Latest commit: a832c30

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

This PR includes changesets to release 72 packages
Name Type
@tiptap/extension-collaboration Patch
@tiptap/extension-collaboration-caret Patch
@tiptap/extension-drag-handle Patch
@tiptap/extension-drag-handle-react Patch
@tiptap/extension-drag-handle-vue-2 Patch
@tiptap/extension-drag-handle-vue-3 Patch
@tiptap/core Patch
@tiptap/extension-audio Patch
@tiptap/extension-blockquote Patch
@tiptap/extension-bold Patch
@tiptap/extension-bubble-menu Patch
@tiptap/extension-bullet-list Patch
@tiptap/extension-code-block-lowlight Patch
@tiptap/extension-code-block Patch
@tiptap/extension-code Patch
@tiptap/extension-color Patch
@tiptap/extension-details Patch
@tiptap/extension-document Patch
@tiptap/extension-emoji Patch
@tiptap/extension-file-handler Patch
@tiptap/extension-floating-menu Patch
@tiptap/extension-font-family Patch
@tiptap/extension-hard-break Patch
@tiptap/extension-heading Patch
@tiptap/extension-highlight Patch
@tiptap/extension-horizontal-rule Patch
@tiptap/extension-image Patch
@tiptap/extension-invisible-characters Patch
@tiptap/extension-italic Patch
@tiptap/extension-link Patch
@tiptap/extension-list Patch
@tiptap/extension-mathematics Patch
@tiptap/extension-mention Patch
@tiptap/extension-node-range Patch
@tiptap/extension-ordered-list Patch
@tiptap/extension-paragraph Patch
@tiptap/extension-strike Patch
@tiptap/extension-subscript Patch
@tiptap/extension-superscript Patch
@tiptap/extension-table-of-contents Patch
@tiptap/extension-table Patch
@tiptap/extension-text-align Patch
@tiptap/extension-text-style Patch
@tiptap/extension-text Patch
@tiptap/extension-twitch Patch
@tiptap/extension-typography Patch
@tiptap/extension-underline Patch
@tiptap/extension-unique-id Patch
@tiptap/extension-youtube Patch
@tiptap/extensions Patch
@tiptap/html Patch
@tiptap/markdown Patch
@tiptap/pm Patch
@tiptap/react Patch
@tiptap/starter-kit Patch
@tiptap/static-renderer Patch
@tiptap/suggestion Patch
@tiptap/vue-2 Patch
@tiptap/vue-3 Patch
@tiptap/extension-character-count Patch
@tiptap/extension-dropcursor Patch
@tiptap/extension-focus Patch
@tiptap/extension-gapcursor Patch
@tiptap/extension-history Patch
@tiptap/extension-list-item Patch
@tiptap/extension-list-keymap Patch
@tiptap/extension-placeholder Patch
@tiptap/extension-table-cell Patch
@tiptap/extension-table-header Patch
@tiptap/extension-table-row Patch
@tiptap/extension-task-item Patch
@tiptap/extension-task-list 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

@dearlordylord dearlordylord force-pushed the fix/f1-yjs-before-transaction-ignored branch from 4c50365 to c75344d Compare March 15, 2026 05:37
@pkg-pr-new
Copy link

pkg-pr-new bot commented Mar 15, 2026

Open in StackBlitz

@tiptap/core

npm i https://pkg.pr.new/@tiptap/core@7600

@tiptap/extension-audio

npm i https://pkg.pr.new/@tiptap/extension-audio@7600

@tiptap/extension-blockquote

npm i https://pkg.pr.new/@tiptap/extension-blockquote@7600

@tiptap/extension-bold

npm i https://pkg.pr.new/@tiptap/extension-bold@7600

@tiptap/extension-bullet-list

npm i https://pkg.pr.new/@tiptap/extension-bullet-list@7600

@tiptap/extension-code

npm i https://pkg.pr.new/@tiptap/extension-code@7600

@tiptap/extension-bubble-menu

npm i https://pkg.pr.new/@tiptap/extension-bubble-menu@7600

@tiptap/extension-code-block

npm i https://pkg.pr.new/@tiptap/extension-code-block@7600

@tiptap/extension-code-block-lowlight

npm i https://pkg.pr.new/@tiptap/extension-code-block-lowlight@7600

@tiptap/extension-collaboration

npm i https://pkg.pr.new/@tiptap/extension-collaboration@7600

@tiptap/extension-color

npm i https://pkg.pr.new/@tiptap/extension-color@7600

@tiptap/extension-collaboration-caret

npm i https://pkg.pr.new/@tiptap/extension-collaboration-caret@7600

@tiptap/extension-details

npm i https://pkg.pr.new/@tiptap/extension-details@7600

@tiptap/extension-drag-handle

npm i https://pkg.pr.new/@tiptap/extension-drag-handle@7600

@tiptap/extension-document

npm i https://pkg.pr.new/@tiptap/extension-document@7600

@tiptap/extension-drag-handle-react

npm i https://pkg.pr.new/@tiptap/extension-drag-handle-react@7600

@tiptap/extension-drag-handle-vue-2

npm i https://pkg.pr.new/@tiptap/extension-drag-handle-vue-2@7600

@tiptap/extension-drag-handle-vue-3

npm i https://pkg.pr.new/@tiptap/extension-drag-handle-vue-3@7600

@tiptap/extension-emoji

npm i https://pkg.pr.new/@tiptap/extension-emoji@7600

@tiptap/extension-file-handler

npm i https://pkg.pr.new/@tiptap/extension-file-handler@7600

@tiptap/extension-floating-menu

npm i https://pkg.pr.new/@tiptap/extension-floating-menu@7600

@tiptap/extension-font-family

npm i https://pkg.pr.new/@tiptap/extension-font-family@7600

@tiptap/extension-hard-break

npm i https://pkg.pr.new/@tiptap/extension-hard-break@7600

@tiptap/extension-highlight

npm i https://pkg.pr.new/@tiptap/extension-highlight@7600

@tiptap/extension-horizontal-rule

npm i https://pkg.pr.new/@tiptap/extension-horizontal-rule@7600

@tiptap/extension-image

npm i https://pkg.pr.new/@tiptap/extension-image@7600

@tiptap/extension-italic

npm i https://pkg.pr.new/@tiptap/extension-italic@7600

@tiptap/extension-invisible-characters

npm i https://pkg.pr.new/@tiptap/extension-invisible-characters@7600

@tiptap/extension-link

npm i https://pkg.pr.new/@tiptap/extension-link@7600

@tiptap/extension-list

npm i https://pkg.pr.new/@tiptap/extension-list@7600

@tiptap/extension-mathematics

npm i https://pkg.pr.new/@tiptap/extension-mathematics@7600

@tiptap/extension-mention

npm i https://pkg.pr.new/@tiptap/extension-mention@7600

@tiptap/extension-node-range

npm i https://pkg.pr.new/@tiptap/extension-node-range@7600

@tiptap/extension-paragraph

npm i https://pkg.pr.new/@tiptap/extension-paragraph@7600

@tiptap/extension-ordered-list

npm i https://pkg.pr.new/@tiptap/extension-ordered-list@7600

@tiptap/extension-strike

npm i https://pkg.pr.new/@tiptap/extension-strike@7600

@tiptap/extension-subscript

npm i https://pkg.pr.new/@tiptap/extension-subscript@7600

@tiptap/extension-superscript

npm i https://pkg.pr.new/@tiptap/extension-superscript@7600

@tiptap/extension-table

npm i https://pkg.pr.new/@tiptap/extension-table@7600

@tiptap/extension-table-of-contents

npm i https://pkg.pr.new/@tiptap/extension-table-of-contents@7600

@tiptap/extension-text

npm i https://pkg.pr.new/@tiptap/extension-text@7600

@tiptap/extension-text-align

npm i https://pkg.pr.new/@tiptap/extension-text-align@7600

@tiptap/extension-text-style

npm i https://pkg.pr.new/@tiptap/extension-text-style@7600

@tiptap/extension-twitch

npm i https://pkg.pr.new/@tiptap/extension-twitch@7600

@tiptap/extension-typography

npm i https://pkg.pr.new/@tiptap/extension-typography@7600

@tiptap/extension-underline

npm i https://pkg.pr.new/@tiptap/extension-underline@7600

@tiptap/extension-unique-id

npm i https://pkg.pr.new/@tiptap/extension-unique-id@7600

@tiptap/extension-youtube

npm i https://pkg.pr.new/@tiptap/extension-youtube@7600

@tiptap/extensions

npm i https://pkg.pr.new/@tiptap/extensions@7600

@tiptap/html

npm i https://pkg.pr.new/@tiptap/html@7600

@tiptap/markdown

npm i https://pkg.pr.new/@tiptap/markdown@7600

@tiptap/pm

npm i https://pkg.pr.new/@tiptap/pm@7600

@tiptap/starter-kit

npm i https://pkg.pr.new/@tiptap/starter-kit@7600

@tiptap/react

npm i https://pkg.pr.new/@tiptap/react@7600

@tiptap/static-renderer

npm i https://pkg.pr.new/@tiptap/static-renderer@7600

@tiptap/suggestion

npm i https://pkg.pr.new/@tiptap/suggestion@7600

@tiptap/vue-2

npm i https://pkg.pr.new/@tiptap/vue-2@7600

@tiptap/vue-3

npm i https://pkg.pr.new/@tiptap/vue-3@7600

@tiptap/extension-character-count

npm i https://pkg.pr.new/@tiptap/extension-character-count@7600

@tiptap/extension-dropcursor

npm i https://pkg.pr.new/@tiptap/extension-dropcursor@7600

@tiptap/extension-gapcursor

npm i https://pkg.pr.new/@tiptap/extension-gapcursor@7600

@tiptap/extension-focus

npm i https://pkg.pr.new/@tiptap/extension-focus@7600

@tiptap/extension-history

npm i https://pkg.pr.new/@tiptap/extension-history@7600

@tiptap/extension-list-item

npm i https://pkg.pr.new/@tiptap/extension-list-item@7600

@tiptap/extension-list-keymap

npm i https://pkg.pr.new/@tiptap/extension-list-keymap@7600

@tiptap/extension-placeholder

npm i https://pkg.pr.new/@tiptap/extension-placeholder@7600

@tiptap/extension-table-cell

npm i https://pkg.pr.new/@tiptap/extension-table-cell@7600

@tiptap/extension-table-header

npm i https://pkg.pr.new/@tiptap/extension-table-header@7600

@tiptap/extension-table-row

npm i https://pkg.pr.new/@tiptap/extension-table-row@7600

@tiptap/extension-task-item

npm i https://pkg.pr.new/@tiptap/extension-task-item@7600

@tiptap/extension-task-list

npm i https://pkg.pr.new/@tiptap/extension-task-list@7600

@tiptap/extension-heading

npm i https://pkg.pr.new/@tiptap/extension-heading@7600

commit: c75344d

@dearlordylord dearlordylord force-pushed the fix/f1-yjs-before-transaction-ignored branch from c75344d to d5908b2 Compare March 15, 2026 13:40
@dearlordylord
Copy link
Author

dearlordylord commented Mar 15, 2026

I'll get back on 3rd comment soon. Tackled the 1 and 2 comments now because that case was more obvious

@dearlordylord dearlordylord requested a review from bdbch March 15, 2026 23:55
Copy link
Member

@bdbch bdbch left a comment

Choose a reason for hiding this comment

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

Could you please add a changeset that describes what your PR will fix/change?

@dearlordylord dearlordylord force-pushed the fix/f1-yjs-before-transaction-ignored branch from d5908b2 to 1421d6f Compare March 16, 2026 13:08
@dearlordylord dearlordylord requested a review from bdbch March 16, 2026 13:11
@dearlordylord
Copy link
Author

dearlordylord commented Mar 16, 2026

Added a changeset
(I elected to force push to keep commits clean, but probably should've just left it for squash...)

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.

Content still gets removed after disabling collaboration on content errors

2 participants