From 9da3e594c67b708db958f2db73bbecec110a79e0 Mon Sep 17 00:00:00 2001 From: mianguyen Date: Tue, 24 Mar 2026 13:53:23 -0500 Subject: [PATCH 1/2] fix: add link on commented text removes the comment highlight (2573) --- .../src/extensions/LinkToolbar/LinkToolbar.ts | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/core/src/extensions/LinkToolbar/LinkToolbar.ts b/packages/core/src/extensions/LinkToolbar/LinkToolbar.ts index 1a61d67d44..01150862b4 100644 --- a/packages/core/src/extensions/LinkToolbar/LinkToolbar.ts +++ b/packages/core/src/extensions/LinkToolbar/LinkToolbar.ts @@ -79,23 +79,38 @@ export const LinkToolbarExtension = createExtension(({ editor }) => { ) { editor.transact((tr) => { const pmSchema = getPmSchema(tr); - const { range } = getMarkAtPos(position + 1, "link") || { + + const linkInfo = getMarkAtPos(position + 1, "link") || { range: { from: tr.selection.from, to: tr.selection.to, }, }; + + const { range } = linkInfo; + if (!range) { return; } + const existingMarks = + tr.doc.nodeAt(Math.max(range.from, range.to - 1))?.marks ?? []; + tr.insertText(text, range.from, range.to); + + for (const existingMark of existingMarks) { + if (existingMark.type.name !== "link") { + tr.addMark(range.from, range.from + text.length, existingMark); + } + } + tr.addMark( range.from, range.from + text.length, pmSchema.mark("link", { href: url }), ); - }); - editor.prosemirrorView.focus(); + }); + + editor.prosemirrorView.focus(); }, deleteLink(position = editor.transact((tr) => tr.selection.anchor)) { editor.transact((tr) => { From 34e5340a4fc9fe4e7c1bae172a0b88a0ada0b7ca Mon Sep 17 00:00:00 2001 From: mianguyen Date: Sun, 5 Apr 2026 17:41:50 -0500 Subject: [PATCH 2/2] test: add e2e test for preserving marks when editing a link (#2573) --- .../linktoolbar/linktoolbar.test.ts | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 tests/src/end-to-end/linktoolbar/linktoolbar.test.ts diff --git a/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts b/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts new file mode 100644 index 0000000000..9a047f8f53 --- /dev/null +++ b/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts @@ -0,0 +1,50 @@ +import { expect } from "@playwright/test"; +import { test } from "../../setup/setupScript.js"; +import { BASE_URL, LINK_BUTTON_SELECTOR } from "../../utils/const.js"; +import { focusOnEditor } from "../../utils/editor.js"; + +test.beforeEach(async ({ page }) => { + await page.goto(BASE_URL); +}); + +test.describe("Check Link Toolbar functionality", () => { + test("Should preserve existing marks when editing a link", async ({ + page, + }) => { + await focusOnEditor(page); + + // Type bold text + await page.keyboard.type("hello"); + await page.keyboard.press("Shift+Home"); + + // Make it bold via formatting toolbar + await page.waitForSelector(`[data-test="bold"]`); + await page.click(`[data-test="bold"]`); + + // Add link + await page.keyboard.press("Shift+Home"); + await page.waitForSelector(LINK_BUTTON_SELECTOR); + await page.click(LINK_BUTTON_SELECTOR); + await page.keyboard.type("https://example.com"); + await page.keyboard.press("Enter"); + + // Move cursor back onto the linked text to trigger link toolbar + await page.keyboard.press("ArrowLeft"); + await page.waitForTimeout(500); + + // Click Edit link button + const editButton = page.getByText("Edit link"); + await editButton.waitFor({ state: "visible" }); + await editButton.click(); + + await page.keyboard.press("Control+A"); + await page.keyboard.type("https://example2.com"); + await page.keyboard.press("Enter"); + + await page.waitForTimeout(300); + + // Verify bold mark is still present on the text + const boldText = page.locator("strong a, a strong"); + await expect(boldText).toBeVisible(); + }); +}); \ No newline at end of file