From 6d81f268649aa378cb9a775095e8b393e4d88d8d Mon Sep 17 00:00:00 2001 From: 01zulfi <85733202+01zulfi@users.noreply.github.com> Date: Wed, 8 Oct 2025 13:15:23 +0500 Subject: [PATCH] editor: restrict pasting premium features Signed-off-by: 01zulfi <85733202+01zulfi@users.noreply.github.com> --- .../clipboard/clipboard-dom-parser.ts | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/packages/editor/src/extensions/clipboard/clipboard-dom-parser.ts b/packages/editor/src/extensions/clipboard/clipboard-dom-parser.ts index cd4b48230..8eededd5e 100644 --- a/packages/editor/src/extensions/clipboard/clipboard-dom-parser.ts +++ b/packages/editor/src/extensions/clipboard/clipboard-dom-parser.ts @@ -42,7 +42,7 @@ export class ClipboardDOMParser extends ProsemirrorDOMParser { convertGoogleDocsChecklist(dom); formatCodeblocks(dom); convertBrToSingleSpacedParagraphs(dom); - removeImages(dom); + removePremiumFeatures(dom); removeBlockId(dom); } return super.parseSlice(dom, options); @@ -53,7 +53,7 @@ export class ClipboardDOMParser extends ProsemirrorDOMParser { convertGoogleDocsChecklist(dom); formatCodeblocks(dom); convertBrToSingleSpacedParagraphs(dom); - removeImages(dom); + removePremiumFeatures(dom); removeBlockId(dom); } return super.parse(dom, options); @@ -154,11 +154,29 @@ export function convertGoogleDocsChecklist(dom: HTMLElement | Document) { } } -export function removeImages(dom: HTMLElement | Document) { - let canInsertImages: boolean | null = null; - for (const img of dom.querySelectorAll(`img`)) { - canInsertImages = canInsertImages ?? hasPermission("insertImage"); - if (!canInsertImages) img.remove(); +const premiumFeatures = [ + { + selector: "div.callout", + permission: "setCallout" + }, + { + selector: 'ul[data-type="outlineList"]', + permission: "toggleOutlineList" + }, + { + selector: "ul.checklist", + permission: "toggleTaskList" + } +] as const; + +function removePremiumFeatures(dom: HTMLElement | Document) { + for (const feature of premiumFeatures) { + const elements = dom.querySelectorAll(feature.selector); + if (elements.length === 0) continue; + + if (!hasPermission(feature.permission)) { + elements.forEach((element) => element.remove()); + } } }