アップロード中の添付ファイルをDOM出力から除外

basecamp/lexxy

LexxyのRich Textエディタにおいて、アップロード中および失敗した添付ファイルがDOM出力に含まれないよう変更されました。これにより、未完了の添付ファイルがフォーム送信時にHTMLに含まれる問題が解消されます。

背景

従来の実装では、ファイルアップロード中の添付ファイルノードが exportDOM() メソッドで空の <img> タグを返していました。このため、アップロードが完了していない状態でフォームを送信すると、実体のない画像要素がHTMLに含まれてしまう問題がありました。Rich Textエディタの内容をサーバーに送信する際、完了していないアップロードの情報が含まれることは、データ整合性の観点から望ましくありません。

技術的な変更

ActionTextAttachmentUploadNode クラスの exportDOM() メソッドが変更され、DOM要素として null を返すようになりました。

変更前:

exportDOM() {
  const img = document.createElement("img")
  return { element: img }
}

変更後:

exportDOM() {
  return { element: null }
}

element: null を返すことで、Lexicalエディタのシリアライゼーション処理において、このノードがHTML出力から除外されます。exportJSON() メソッドは変更されていないため、エディタの内部状態としてはアップロード情報が保持され続けます。

テストコードでは、アップロード完了を待機する処理が追加されました。wait_until ブロックでエディタの empty?blank? が両方とも false になるまで待機し、タイムアウト時は例外をキャッチして後続のアサーションに進みます。これにより、アップロード完了後の状態を確実にテストできるようになっています。

設計判断

DOM出力の完全な抑制 という方針が採用されました。

空の <img> タグを出力する代わりに null を返すことで、未完了のアップロードがHTMLに一切現れないようにしています。PR内のコミットメッセージ「Don't export any DOM for in-progress / errored uploads」が示すように、この変更はアップロード進行中だけでなく、エラー状態の添付ファイルにも適用されます。

この変更は、不完全な情報をHTMLに含めないことを優先した結果です。エディタのUI上ではアップロード状態が表示され続ける一方、HTMLシリアライゼーションの結果には含まれないという、表示層とデータ層の適切な分離が実現されています。

本PRは、Rich Textエディタにおけるファイルアップロードの状態管理を改善する変更です。exportDOM()null を返すという単純な変更により、未完了の添付ファイルがフォーム送信データに含まれる問題を解消し、データの整合性を保証しています。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

「総論→各論→結論」の構成が明確です。リード文、背景、技術的な変更、設計判断、まとめの各要素が適切に配置されており、記事全体の流れが非常に分かりやすいです。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライトとGitHubのPRリンク記法が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

専門用語を前提として使用しており、専門知識を持つエンジニアという対象読者に適した技術レベルと表現で書かれています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論→各論で構成され、各段落はトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が遵守されています。これにより、非常に高い可読性が確保されています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事で引用されているコード変更(`exportDOM`メソッド)およびテストコードの変更に関する説明は、提供されたDiff情報と完全に一致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`exportDOM`, `シリアライゼーション`, `ActionTextAttachmentUploadNode` などの技術用語が正確かつ適切に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

「`element: null` を返すことでノードがHTML出力から除外される」という説明は、Lexicalフレームワークの仕様に照らして技術的に正確です。テストコードに関する説明も的確です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張は、PRのタイトル、説明、およびDiff内のコード変更によって裏付けられており、ハルシネーション(捏造)は見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#729)やクラス名、メソッド名などの固有名詞はすべて正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトル「アップロード中の添付ファイルをDOM出力から除外」は、PRのタイトル「Don't export any DOM until upload completes」の内容を的確に反映しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

PR情報に基づかない外部知識(バージョンのサポート状況など)の追記はなく、記事内容は提供された情報源に忠実です。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

記事内の時間表現に歪曲はなく、PRの変更内容を事実として正確に記述しています。