Skip to content

fix: use instance-specific pluginKey as transaction meta key in BubbleMenu/FloatingMenu to prevent cross-contamination#7512

Open
Re-cool wants to merge 1 commit intoueberdosis:developfrom
Re-cool:fix/menu-pluginkey-cross-contamination
Open

fix: use instance-specific pluginKey as transaction meta key in BubbleMenu/FloatingMenu to prevent cross-contamination#7512
Re-cool wants to merge 1 commit intoueberdosis:developfrom
Re-cool:fix/menu-pluginkey-cross-contamination

Conversation

@Re-cool
Copy link

@Re-cool Re-cool commented Feb 10, 2026

Changes Overview

When multiple BubbleMenu/FloatingMenu instances use different pluginKey values, all instances respond to any instance's option updates because the transaction meta key is hardcoded as "bubbleMenu"/"floatingMenu" instead of using the provided pluginKey.

Implementation Approach

  • BubbleMenuView/FloatingMenuView: Accept pluginKey in constructor and use it in getMeta() instead of hardcoded string
  • React BubbleMenu/FloatingMenu: Use pluginKey prop in setMeta() instead of hardcoded string
  • FloatingMenu extension: Use this.options.pluginKey in updateFloatingMenuPosition command

Default values remain "bubbleMenu"/"floatingMenu", maintaining full backward compatibility.

Testing Done

  • Added 11 new test cases across extension-bubble-menu and extension-floating-menu packages
  • Tests cover pluginKey isolation with both string and PluginKey instance types, cross-contamination prevention between instances, command meta key scoping, and backward compatibility with default pluginKey
  • Tests verified to fail before the fix and pass after (TDD approach)

Verification Steps

  1. Create two BubbleMenu or FloatingMenu instances with different pluginKey values and different options (e.g., different placement)
  2. Update one instance's options dynamically
  3. Verify the other instance's options remain unchanged

Checklist

  • I have created a changeset for this PR if necessary.
  • My changes do not break the library.
  • I have added tests where applicable.
  • I have followed the project guidelines.
  • I have fixed any lint issues.

…eMenu/FloatingMenu to prevent cross-contamination
@changeset-bot
Copy link

changeset-bot bot commented Feb 10, 2026

🦋 Changeset detected

Latest commit: 48e29ca

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-bubble-menu Patch
@tiptap/extension-floating-menu Patch
@tiptap/react Patch
@tiptap/vue-2 Patch
@tiptap/vue-3 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-bullet-list Patch
@tiptap/extension-code-block-lowlight Patch
@tiptap/extension-code-block Patch
@tiptap/extension-code Patch
@tiptap/extension-collaboration-caret Patch
@tiptap/extension-collaboration Patch
@tiptap/extension-color Patch
@tiptap/extension-details Patch
@tiptap/extension-document Patch
@tiptap/extension-drag-handle Patch
@tiptap/extension-emoji Patch
@tiptap/extension-file-handler 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/starter-kit Patch
@tiptap/static-renderer Patch
@tiptap/suggestion 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

@netlify
Copy link

netlify bot commented Feb 10, 2026

Deploy Preview for tiptap-embed ready!

Name Link
🔨 Latest commit 48e29ca
🔍 Latest deploy log https://app.netlify.com/projects/tiptap-embed/deploys/698ab1cffd55930008d8e8d5
😎 Deploy Preview https://deploy-preview-7512--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.

@Re-cool
Copy link
Author

Re-cool commented Feb 10, 2026

This builds on the work in #7445 by scoping the transaction meta key to each instance's pluginKey, so that multiple instances with different pluginKey values can be updated independently.

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.

1 participant