`<wa-drawer>` の Safari バグ修正:`document.body` から `document` へのイベントリスナー移行

shoelace-style/webawesome

<wa-drawer> コンポーネントで、Web Awesome を <head> タグ内に読み込んだ際にエラーが発生するバグを修正しました。あわせて <wa-dialog> にも同様のワークアラウンドコードが追記されています。

背景

Safari には light dismiss(ポップオーバーやダイアログの外側をクリックして閉じる動作)が正常に機能しないバグが存在します。WebKit Bug #267688 として報告されているこの問題に対し、<wa-drawer><wa-dialog>pointerdown イベントリスナーを空のハンドラで登録するワークアラウンドを採用していました。

しかし <wa-drawer> の実装では、このイベントリスナーを document.body に対して登録していました。スクリプトが <head> 内で実行されるタイミングでは document.body がまだ存在しないため、null に対して addEventListener を呼び出すエラーが発生します。この問題は ディスカッション #2241 で報告されています。

技術的な変更

drawer.ts でのイベントリスナーの登録先を document.body から document に変更することで、<head> 内での実行時のエラーを解消しています。

変更前:

// Ugly, but it fixes light dismiss in Safari: https://bugs.webkit.org/show_bug.cgi?id=267688
document.body.addEventListener('pointerdown', () => {
  /* empty */
});

変更後:

//
// Ugly, but it fixes light dismiss in Safari: https://bugs.webkit.org/show_bug.cgi?id=267688
//
// [Mar 27, 2026] - This bug was fixed in Safari 18.3 beta so this can be removed in a year or so.
//
document.addEventListener('pointerdown', () => {
  /* empty */
});

あわせて dialog.ts にも同一のコメントブロックが追記されました。コードの動作自体は変わらず(もともと document を対象としていた)、コメントの追加のみの変更です。

//
// Ugly, but it fixes light dismiss in Safari: https://bugs.webkit.org/show_bug.cgi?id=267688
//
// [Mar 27, 2026] - This bug was fixed in Safari 18.3 beta so this can be removed in a year or so.
//
document.addEventListener('pointerdown', () => {
  /* empty */
});

設計判断

document.body ではなく document を登録先とする判断は、スクリプトの実行タイミングへの依存を排除するシンプルな修正です。

document オブジェクトはページ解析の最初期から存在するため、<head> 内での実行においても安全にアクセスできます。一方 document.body はHTMLパーサーが <body> タグに到達して初めて生成されるため、<head> 内での参照は null を返します。pointerdown イベントのバブリングは document.body から document へと伝播するため、機能的な差異はありません。

また両ファイルのコメントに「Safari 18.3 beta で修正済み」という注記が追加されたことで、将来的にワークアラウンドを削除するための目安が明示されています。

まとめ

document.bodydocument へ変更するという一行の修正が、<head> 読み込みというユースケースへの対応を可能にしています。コメントで削除タイミングの目安を明示した点も、技術的負債の管理という観点で参考になる判断です。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
d9127f17

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文(総論)→背景・技術詳細・設計判断(各論)→まとめ(結論)という3部構成が明確に適用されており、非常に分かりやすい記事構成です。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライト(`typescript:path/to/file.ts`)や、外部リンク(WebKit Bugzilla、GitHub Discussion/PR)の記法はすべて正しく使用されています。

対象読者への適合性 ✓ PASS

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

内容は`document`と`document.body`のライフサイクルの違いなど、専門知識を持つエンジニアを対象としており、過度な説明がなく適切です。

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

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

各セクションが総論→各論で構成され、各段落がトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が完全に遵守されています。非常に読みやすいです。

Diff内容との照合 ✓ PASS

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

記事内で引用されているコードブロックは、提供されたDiff情報と完全に一致しており、変更点(`document.body`から`document`への変更)を正確に反映しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`light dismiss`や`pointerdown`イベント、DOMのライフサイクルに関する用語が正確かつ適切に使用されています。

説明の技術的正確性 ✓ PASS

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

「`<head>`内での実行時に`document.body`が`null`である」というエラー原因の説明は技術的に正確であり、変更による影響も論理的に解説されています。

事実の突合 ✓ PASS

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

記事内の主張はすべてPRのDescription、Diff内のコード、コメント、Changelogの記述によって裏付けられており、ハルシネーションは検出されませんでした。

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

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

PR番号(#2242)、Discussion番号(#2241)、WebKit Bug番号(#267688)など、すべての数値・固有名詞は正確です。

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

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

PRの簡潔なタイトル「Fix safari bug fix」に対し、記事のタイトルは変更の核心(`document.body`から`document`への移行)を的確に表現しており、PRの内容と完全に一致しています。

外部知識の正確性 ✓ PASS

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

記事中の「Safari 18.3 beta」や「Mar 27, 2026」といった具体的な情報は、PRのDiff内のコメントを忠実に引用したものであり、外部からの無根拠な知識の追加ではありません。

時間表現の正確性 ✓ PASS

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

Diff内のコメントにある「in a year or so」という表現を「将来的にワークアラウンドを削除するための目安」と解釈しており、時間表現の歪曲はありません。