ブロッククォートへのペースト時のリグレッションテストを追加
ブロッククォートにテキストをペーストすると内容が引用外に脱出するバグ(#4979)に対し、再発防止のためのPlaywrightリグレッションテストが追加されました。バグ修正とテストが別々のPRで管理されてきた経緯から、テストが失われていたことへの対処です。
背景
このバグは、修正・削除・偶発的な再修正という複雑な経緯をたどっています。#839 でブロッククォートへのペースト時にテキストが外部に脱出する問題が修正されましたが、その後のツールバーリワーク (#891) のリファクタリング中に、修正コードとテストの両方が誤って削除されました。
#891 のリファクタリングでは、toggleBlockquote の構造が変更され、<blockquote> 内のコンテンツを常に <p> 要素でラップするようになりました。この変更により、Lexicalの selection.insertNodes() がペーストされたノードをブロッククォートの外に分割するのではなく、内部の段落に挿入するようになり、バグが副作用として偶発的に修正されていました。
しかしテストが存在しないまま修正が維持されていたため、将来のリファクタリングで再び同じバグが混入するリスクがありました。本PRはそのリスクを明示的なテストで封じるものです。
技術的な変更
test/browser/tests/paste/paste.test.js に、ブロッククォートへのペーストシナリオをカバーする3つのPlaywrightテストが新たに追加されました。
追加されたテストスイートは Paste — Blockquote として整理されており、以下の3つのシナリオを網羅します:
- 改行を含むプレーンテキストを空のブロッククォートにペーストした場合、すべての行が引用内に留まること
- HTMLの複数段落構造(
<p>タグ)を含むリッチテキストをブロッククォートにペーストした場合、すべての段落が引用内に留まること - 既存のコンテンツがあるブロッククォートにプレーンテキストをペーストした場合の動作
最初のテストの実装を例に挙げると、ユーザーの操作を忠実に再現する構造になっています。
test("pasting plain text with newlines into an empty blockquote keeps all lines inside the quote", async ({
page,
editor,
}) => {
await page.goto("/")
await editor.waitForConnected()
await editor.click()
await page.getByRole("button", { name: "Quote" }).click()
await editor.flush()
await editor.paste("this \nis\nwhat\n\nI am pasting")
await editor.flush()
await assertEditorContent(editor, async (content) => {
await expect(content.locator("blockquote")).toHaveCount(1)
const outerParagraphs = content.locator(":scope > p")
await expect(outerParagraphs).toHaveCount(0)
})
})
アサーションの設計が明確で、「blockquote が1つ存在すること」と「トップレベルに <p> が存在しないこと」という2軸でコンテンツの脱出を検出します。これにより、ペーストされたテキストが引用外に分割される現象を確実に検知できます。
設計判断
バグ修正コードそのものではなく、テストのみを追加するという方針が採られています。
現在のバグは #891 のリファクタリングによって偶発的に修正済みであるため、コード変更は不要な状態です。本PRは「動いているコードに手を加えない」原則を守りつつ、将来の変更に対して安全網を張ることに集中しています。
また、\n(単一改行)と \n\n(段落区切り)の両方を含む入力文字列 "this \nis\nwhat\n\nI am pasting" をテストケースに使用し、#839 が特定した複数のエッジケースをカバーしています。これはオリジナルの修正PRが対処した「単一改行・複数行・段落区切り」の3パターンを踏まえた設計です。
まとめ
バグ修正・削除・再修正という経緯を経て、本PRはリグレッション防止の最後のピースであるテストを補完しました。コードの変更を伴わない純粋なテスト追加ですが、toggleBlockquote の構造変更という暗黙の前提を明示的な期待値として記録することで、将来のリファクタリングに対する耐性を高める意義があります。