embed / object の data: URL キャプチャ検証

embed の src / object の data はキャプチャ時にクリアして外部リソースの読み込みを防ぐが、 自己完結型の data: URL(画像・動画・音声などの許可リストMIME)はクリアすると コンテンツ自体が失われるため保持される。
data:text/html や data:image/svg+xml は内部に script や外部参照を含められるため data: スキームでもクリアされる(fail-closed)。

Case 1: 外部URLの embed(PDF)→ クリアされる

期待: キャプチャ後は src がクリアされ、キャプチャデータ閲覧時に外部PDFをフェッチしない。 PDF自体は専用の収集経路(getCapturedPdf)で復元される。

Case 2: 外部URLの object(HTML)→ クリアされる

期待: キャプチャ後は data がクリアされ、キャプチャデータ閲覧時に外部リソースを読まない (fallback テキストが表示される)。

object の fallback テキスト

Case 3: data:image/png の embed → 保持される

期待: 自己完結型(image/png)なのでキャプチャ後も src が保持され、 キャプチャデータ閲覧時にも画像が表示される。

Case 4: data:image/png の object → 保持される

期待: Case 3 と同様、object の data も自己完結型なら保持される。

Case 5: data:image/gif の embed → 保持される

期待: 許可リストMIME(image/gif)なので保持される(1x1透明GIF)。

Case 6: data:audio/wav の embed → 保持される

期待: 許可リストMIME(audio/wav)なので保持される(無音の最小WAV)。

Case 7: data:image/svg+xml の embed → クリアされる

期待: data: スキームでも SVG は内部に script・外部参照を含められるため 保持対象に含めない。キャプチャ後は src がクリアされる。

Case 8: data:text/html の object → クリアされる

期待: data:text/html は内部に <script> や外部 <img> を含められるため 保持対象に含めない。キャプチャ後は data がクリアされる。

Case 9: MIME区切りの無い不正な data: URL → クリアされる

期待: 「;」「,」区切りを持たない不正形式は data: URL として不正なため 保持しない(fail-closed)。

Case 10: data:image/png+xml の embed → クリアされる

期待: MIME完全一致の境界確認。image/png+xml は許可リストの image/png前方一致するが完全一致しない。「+xml」で終わる MIME は XML文書として解釈され script・外部参照を内包し得るため、前方一致で誤って保持せず クリアする(境界を完全一致で保証)。

Case 11: data:image/pngfoo の embed → クリアされる

期待: 同じく境界確認。image/pngfooimage/png に 前方一致するが別MIME。許可リストは完全一致判定なのでクリアされる (前方一致で実装していたら誤って保持してしまうケース)。