Firefox 用フォールバック PNG を 120×90 に拡大しテストフレークを解消

basecamp/lexxy

Firefox でのみ発生していた画像プレビューのテストフレークを、サイズと形式を修正した PNG に置き換えることで根本的に解消しました。これにより、プレビュー画像が正しく表示され、クリックイベントが期待通りに伝搬します。

背景

Firefox は不正な画像データを "Image corrupt or truncated" と判定し <img>onerror を発火させます。その結果、テスト中にプレビュー画像がファイルアイコンに戻り、Deferred‑preview のスワップが失敗してフレークが発生していました。さらに、元の 1×1 ピクセル PNG は表示サイズが極端に小さく、<figure>min-inline-size (10ch) を下回るため、Firefox が figure intercepts pointer events と報告し、クリック系テストが失敗していました。これらはすべて test/browser/helpers/active_storage_mock.js のフォールバック PNG が原因でした。

技術的な変更

active_storage_mock.js で使用されていた定数 TRANSPARENT_PNGFALLBACK_PNG にリネームし、サイズを 120×90 ピクセルの有効な PNG データへ置き換えました。コード上の主な変更点は次のとおりです。

@@ -1,9 +1,13 @@
-// 1×1 transparent PNG used as a fallback when the fixture file doesn't exist on disk.
-const TRANSPARENT_PNG = Buffer.from(
-  "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQI12NgAAIABQABNjN9GQAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAAA0lEQVQI12P4z8BQDwAEgAF/QualzQAAAABJRU5ErkJggg==",
+// Fallback preview image. Must be byte-valid — Firefox rejects malformed data and
+// fires <img> onerror, reverting the preview swap to the file icon (a flake). Must
+// also be wider than the figure's min-inline-size (10ch); a sub-figure image leaves
+// the figure chrome on top of the click point, so Firefox reports the figure as
+// intercepting pointer events when tests click the preview img.
+const FALLBACK_PNG = Buffer.from(
+  "iVBORw0KGgoAAAANSUhEUgAAAHgAAABaCAYAAABzAJLvAAAA6ElEQVR4nO3RwQkAIBDAMMe+Ed1KxxBqHvkXumb2oWu9DsBgDMbgTxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcZ3CcwXEGxxkcdwGOw47/2hYVfQAAAABJRU5ErkJggg==",
   "base64"
 )

ルーティングロジックでも TRANSPARENT_PNG の参照を FALLBACK_PNG に置き換え、fallback が利用されるケースを明示しました。

@@
-      // Serve the fixture file if it exists, otherwise return a 1×1 transparent PNG.
+      // Serve the fixture file if it exists, otherwise the small FALLBACK_PNG.
@@
-        await route.fulfill({ status: 200, contentType: "image/png", body: TRANSPARENT_PNG })
+        await route.fulfill({ status: 200, contentType: "image/png", body: FALLBACK_PNG })

この変更により、Firefox でも PNG が正しくデコードされ、プレビュー画像が 120×90 ピクセルで表示されるため、<figure> の幅を完全に覆い、ポインターイベントの遮断が解消されます。

設計判断

フォールバック画像のサイズを 120×90 に変更した根拠は、Firefox の onerror を防止しつつ、レイアウトシフトを最小限に抑える点にあります。画像を大きくしすぎるとテスト全体で余計なレイアウト変化が発生する恐れがあるため、必要最小限の幅(figure の min-inline-size を上回る)と高さを確保する設計としました。さらに、既存のテストロジックや他ブラウザでの挙動を変更しないよう、同一の PNG データをすべてのブラウザで利用しています。これは新たなテストコードや条件分岐を導入せず、モックのデータだけで問題を解決するという 最小侵入性 の方針に沿った判断です。

まとめ

この PR は、Firefox 専用の画像プレビューテストフレークを、サイズと形式を修正したフォールバック PNG(120×90)に置き換えるだけで根本的に解消しました。結果として、全ブラウザで安定したテスト実行と、クリック対象領域の一貫性が確保され、既存コードへの影響も最小限に抑えられました。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
2c512dc0

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文→背景→技術的変更→設計判断→まとめという3部構成が明確に存在し、各要素が揃っている。

カスタムMarkdown構文 ⚠ WARNING

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

コードブロックは正しいdiffハイライトになっているが、PRリンクが "[PR #1128](...)" の形式で、仕様が要求する "[#1128](...)" と完全には一致していない。

対象読者への適合性 ✓ PASS

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

エンジニア向けの技術的記述で、初心者向けの余計な説明はなく適切。

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

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

各セクションは総論・各論・結論の段落構成で、トピックセンテンスが先頭にあり、1段落1トピック、長さも適切。段落間は空行で区切られている。

Diff内容との照合 ✓ PASS

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

記事内のdiffブロックは提供されたDiffと完全に一致し、ファイル名や変更箇所が正確に反映されている。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

TRANSPARENT_PNG、FALLBACK_PNG、Buffer.from などの用語はPRと一致し、誤用は見られない。

説明の技術的正確性 ✓ PASS

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

技術的な説明はPRの内容と合致し、根拠が示されている。

事実の突合 ✓ PASS

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

PR情報に裏付けられない主張や推測はなく、全ての記述が事実に基づいている。

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

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

PR番号#1128、画像サイズ120×90、元の1×1など数値は正確。

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

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

タイトルはFirefox専用テストフレークの修正を示し、PRの趣旨と合致している。

外部知識の正確性 ✓ PASS

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

バージョンサポートやリリース日程等、PRに無い外部情報は記載されていない。

時間表現の正確性 ✓ PASS

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

時間表現の歪曲はなく、PRの記述と整合している。