FessのbootstrapテーマでキャッシュしたHTMLを表示すると、相対URLの画像やリンクが元サイトへ解決されない問題を修正しました。キャッシュ表示の中でURLを元ページのアドレスに基づいて変換し、画像などの参照先を正しく組み立てます。
base要素が効かない理由
キャッシュビューアーはHTMLをsandbox付きのBlobフレームへ入れます。その文書に親ページのContent-Security-Policyが引き継がれ、base-uri 'self'によって元ページを指定するbase要素が無視されていました。ブラウザのコンソールにbase-uriの違反が出て、画像やリンクの相対アドレスがBlobを基準に扱われます。
今回の修正ではbase要素を取り除き、HTMLのhref、src、srcset、ポスター画像、背景画像などの参照を、APIが返した元ページURLで解決してから表示します。たとえば元ページがhttps://example.com/docs/page.htmlなら、img/photo.pngはhttps://example.com/docs/img/photo.pngになります。
利用条件と初期値
新しい切り替え設定はありません。修正を含むbootstrapテーマと、元ページURLを持つHTMLキャッシュが必要です。別配布のテーマや独自テーマは、そのテーマに対応する修正を確認してください。
本体の文書キャッシュ設定はcrawler.document.cache.enabled=true、対応MIMEタイプはcrawler.document.cache.supported.mimetypes=text/htmlが初期値です。最大サイズの初期値はcrawler.document.cache.max.size=2621440バイトです。実際に対象文書のキャッシュが保存されている必要があり、設定を有効にするだけで過去の文書へ本文が追加されるわけではありません。
元URLを返す既存HTMLキャッシュのURL解決だけなら再クロールで作り直す処理ではありません。修正版でキャッシュ画面を再読み込みし、元サイトにある画像が取得できるか確認します。
元ページと同じ表示にはならない
CSPやフレームのsandbox制限は維持します。元サイトの外部スタイルシート、フォント、メディア、object、埋め込みフレームは引き続き拒否されることがあります。画像や背景画像のURL解決が改善されても、元ページのデザインや動画をそのまま再現する機能ではありません。
フレーム内の通常リンクは、遷移先がframe-src blob:に合わず拒否される場合があります。target="_blank"のリンクは元URLを別タブで開けます。元URLがない場合は変換せず、ページ内アンカーや既に絶対URLの参照も維持します。
WebKitでBlob自体が空になる問題を扱うtheme.index.frame.ancestorsとは原因が異なります。今回の相対URL修正のためにCSPを緩める設定は必要ありません。修正PRのブラウザ確認はChromiumとFirefoxで行われています。