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 テキストが表示される)。
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/pngfoo は image/png に
前方一致するが別MIME。許可リストは完全一致判定なのでクリアされる
(前方一致で実装していたら誤って保持してしまうケース)。