プレフェッチ

草案コミュニティグループレポート,

このバージョン:
https://wicg.github.io/nav-speculation/prefetch.html
課題追跡:
GitHub
仕様内インライン
編集者:
(Google)
(Google)

概要

ナビゲーションプレフェッチの仕様

この文書のステータス

この仕様はWeb Platform Incubator Community Groupによって公開されました。 W3C標準ではなく、W3C標準トラック上にもありません。 W3Cコミュニティコントリビューターライセンス契約 (CLA)のもとで 限定的なオプトアウトおよび他の条件が適用されますのでご注意ください。 W3Cコミュニティおよびビジネスグループについて詳細を知る。

1. 概念

ストレージ分割を踏まえ、本仕様は同じパーティション内で発生するナビゲーション(例:同じサイト内のトップレベルナビゲーション)および別パーティションで発生するナビゲーション(例:異なるサイトへのトップレベルナビゲーション)のためのプレフェッチを定義します。

矛盾する認証情報が存在する レスポンス response、navigable navigableとネットワークパーティションキー sourcePartitionKeyが与えられ、以下の手順がtrueを返す場合:
  1. hypotheticalEnvironmentを予約されたクライアントの作成により、navigable、responseのURL、nullを用いて得る。

  2. hypotheticalPartitionKeyをネットワークパーティションキーの決定によりhypotheticalEnvironmentから得る。

  3. hypotheticalPartitionKeyがsourcePartitionKeyと等しい場合、または認証情報がURLおよびhypotheticalPartitionKeyに関連付けられていない場合、falseを返す。

  4. trueを返す。


交換レコードは、以下の項目を持つ構造体です:

これらのレコードは通常ナビゲートフェッチ時に行われるチェックを遅延させたり、変更された認証情報のチェックに利用できます。

リダイレクトチェーンはリスト形式の交換レコードです。

更新はリダイレクトチェーン redirectChainに、リクエスト requestおよびレスポンス responseを与えた時のアルゴリズムです:
  1. アサート:redirectChainが空ではない。

  2. アサート:redirectChainの最後の項目のリクエストがrequestと同じで、レスポンスがnullである。

  3. redirectChainの最後の項目のリクエストに、requestのクローンをセットする。

    クローンすることで、リダイレクトの間でrequestが修正されても保存されたリクエストには影響しません。これは活性化時(prefetch recordからナビゲーションパラメータを作成)に元のリダイレクトチェーンの全体像を取得するために参照されます。現時点で唯一既知の、リクエストフィールドがミューテートされ、活性化時に参照されるケースはreferrerフィールドですが、仕様の堅牢性のため、リクエスト全体をクローンしています。

    プレフェッチは`GET`リクエストのみで実行されるため、リクエストのbodyは常にnullとなり、クローンは比較的簡単です。

  4. redirectChainの最後の項目のレスポンスにresponseをセットする。


各Documentは、prefetchレコードを持ち、これはリスト形式のprefetchレコードです。

prefetchレコードは、以下の項目を持つ構造体です:

プレフェッチ開始時から使用・廃棄まで追跡し、一部のフィールドは不変、一部は進行中のアクティビティ(例:フェッチコントローラー)、一部(例:有効期限)は完了時にセットされます。

通常は認証情報付きリクエストでも、クロスパーティションプレフェッチのため認証情報を送れない場合、プレフェッチは中止されます。

prefetch recordのresponseは、そのredirect chainの最後の要素のresponse、もしくはそのリストが空の場合はnullである。

ユーザーエージェントは、キャンセル・廃棄を、未失効でも(資源制約等により)prefetchレコードから行う場合があります。一致するプレフェッチレコードの待機対象外となった過去の有効期限レコードは、観測上の影響なく削除可能です。

prefetchレコード prefetchRecordがURLに一致するかどうかは、URL urlを与えたとき、以下のアルゴリズムがtrueを返すかどうかで判定します:
  1. prefetchRecordのURLとurlが等しければtrueを返す。

  2. prefetchRecordのレスポンスがnullでなければ:

    1. searchVariance を URL検索バリアンスの取得を prefetchRecordのリダイレクトチェーン[0]のレスポンスに対して行う。

      0番目のレスポンスを確認することが重要です。最後のレスポンス(つまりprefetchRecordのレスポンス)ではありません。prefetchレコードの URLは最初のリクエスト/レスポンスの組のURLなので、一致判定に影響するのは、その最初のレスポンスの`No-Vary-Search`ヘッダーだけです。

    2. prefetchRecordのURLとurlがsearchVarianceに基づき変動無視で同等ならtrueを返す。

  3. それ以外はfalseを返す。

prefetchレコード prefetchRecordがURLに一致する見込みかどうかは、URL urlを与えたとき、以下のアルゴリズムがtrueを返すかどうかで判定します:
  1. prefetchRecordがURLに一致する場合、trueを返す。

  2. prefetchRecordのレスポンスがnullの場合:

    1. searchVarianceをNo-Vary-Searchヒントより取得。

    2. prefetchRecordのURLとurlがsearchVarianceに基づき変動無視で同等ならtrueを返す。

  3. それ以外はfalseを返す。

キャンセル・廃棄はprefetchレコード prefetchRecordとDocument documentに対して、以下の手順を行います:
  1. アサート:prefetchRecordがdocumentのprefetchレコードに存在する。

  2. アサート:prefetchRecordの状態が"canceled"でない。

  3. prefetchRecordの状態を"canceled"にセット。

  4. Abort prefetchRecordのフェッチコントローラー。これにより進行中のフェッチを中断し、ネットワークエラーとなります。

  5. prefetchRecordのprerendering traversableがtraversable navigableなら、破棄する。

  6. 削除:prefetchRecordをdocumentのprefetchレコードから除去。

  7. prefetchステータス更新イベントの発火:documentのノードナビゲーブル、prefetchRecord、"失敗" ステータスを与える。

完了済みのprefetchやprerenderであっても、これを活性化することはありません。ただしプレフェッチやprerenderの過程でHTTPキャッシュが更新され、以降のナビゲーションが高速化される場合があります。

完了はprefetchレコード prefetchRecordとDocument documentに対して、以下の手順で処理されます:
  1. アサート:documentが完全にアクティブである。

  2. currentTimeを現在の高精度時刻(documentの関連グローバルオブジェクト)として取得。

  3. expiryTimeをcurrentTime+300,000(5分)とする。

  4. 削除:documentのprefetchレコードから、prefetchRecordと同じURLかつ状態が"completed"の要素を全部除去。

  5. prefetchRecordの状態を"completed"、有効期限をexpiryTimeにセット。

  6. prefetchステータス更新イベントの発火:documentのノードナビゲーブル、prefetchRecord、"ready" ステータスを与える。

一致する完了プレフェッチレコードの検索はトップレベルナビゲーブル navigable、ソーススナップショットパラメーター sourceSnapshotParams、URL urlを対象とする:
  1. exactRecordをnullとする。

  2. inexactRecordをnullとする。

  3. 各 record(sourceSnapshotParamsのprefetchレコード)について:

    1. recordの状態が"completed"でない場合はcontinue。

    2. recordのURLがurlと等しければ:

      1. exactRecordにrecordをセット。

      2. break。

    3. inexactRecordがnullかつrecordがURLに一致する場合:

      1. inexactRecordにrecordをセット。

  4. recordToUseは、exactRecordがnullでなければexactRecord、nullならinexactRecord。

  5. recordToUseがnullでなければ:

    1. currentTimeを現在の高精度時刻(navigableのアクティブドキュメント)として取得。

    2. recordToUseの有効期限がcurrentTimeより小さければ:

      1. prefetchステータス更新イベントの発火:navigable、recordToUse、"失敗"ステータスを与える。

      2. nullを返す。

    3. 各 exchangeRecord(recordToUseのリダイレクトチェーン)について:

      1. 矛盾する認証情報が存在するなら、exchangeRecordのレスポンスに対してnavigable、recordToUseのソースパーティションキーを与える:

        1. prefetchステータス更新イベントの発火:navigable、recordToUse、"失敗" ステータス。

        2. nullを返す。

      開始時にクロスパーティション認証情報がなくても、途中で付与される場合を扱います。ユーザーエージェントは、URLに関連するクッキーの変更監視やハッシュ・タイムスタンプ・リビジョン番号での管理など、より粗いアルゴリズムも可能です。
    4. recordToUseを返す。

  6. nullを返す。

実際には、prefetchで完全なボディ受信を必要とせず、応答ヘッダーのみでよい点に注意。ナビゲーションによってprefetch応答を使っても即時ロードとは限りません。

キャッシュレスポンスヘッダーで複数回利用できるタイミングを判断できるかもしれませんが、prefetchバッファの寿命短さで有効性は不明です。

一致するプレフェッチレコードの待機はトップレベルナビゲーブル navigable、ソーススナップショットパラメーター sourceSnapshotParams、URL urlを対象とします:
  1. アサート:この処理は並列実行です。

  2. timeoutをnullとする。

  3. 実装依存の最大待機時間をtimeoutとする場合も任意。

    適切なtimeout選択は難しく、ナビゲーションやprefetchの発起者(推測ルールの積極性や、prerenderに使われるかどうか等)による場合もありうる。一般にはタイムアウトは回避推奨ですが、非prefetchで再開した方が良い結果のケースはまれ。実装によっては数秒程度のtimeoutが好結果となる場合もあります。

  4. startTimeを未保護共有現在時刻とする。

  5. 次を実行。ただし、中断はtimeoutがnullでなく、未保護共有現在時刻−startTimeがtimeoutを超えた場合:

    1. while(true):

      1. completeRecordを一致する完了プレフェッチレコードの検索の結果(navigable、sourceSnapshotParams、url)とする。

      2. completeRecordがnullでなければ、それを返す。

      3. potentialRecordsを空のリストとする。

      4. 各 record(sourceSnapshotParamsのprefetchレコード)について:

        1. 次のすべてがtrueなら:

          なら追加:potentialRecordsにrecordを追加。

        ループごとにpotentialRecordsが再計算され、次回イテレーションのpotentialRecordsは前イテレーションの部分集合となる。prefetchレコードが静的スナップショットで、条件がfalse→trueに変化しないためです。

        一度初期potentialRecordsを構築し、条件から外れたら除去する戦略でも同等。

      5. potentialRecordsが空ならnullを返す。

      6. いずれかの状態が変更されるまで(sourceSnapshotParamsのprefetchレコード)待機。

  6. nullを返す。

sourceSnapshotParamsのprefetchレコードがスナップショットなので、ナビゲーション後に開始したprefetchは活性化できません。

prefetchレコード prefetchRecordが推測中であるかどうかは、推測ロード候補candidatesのリストを与え、次の手順がtrueを返す場合とする:
  1. 各 candidate(candidates)について:

    1. prefetchRecordがcandidateのURLを与えてURLと一致しない場合は、continue。

    2. candidateがprefetch候補で、 prefetchRecordの匿名化ポリシーが candidateの匿名化ポリシーと等しくない場合は、continue。

    3. candidateがprerender候補で、 prefetchRecordのprerendering traversable がnullなら、continue。

    4. trueを返す。

  2. falseを返す。

Document documentが一致するprefetchレコードを持つかどうかは、prefetchレコード recordUnderConsiderationとオプションのboolean checkPrerender(デフォルトfalse)を与え、以下アルゴリズムがtrueを返す場合とする:
  1. 各 record(documentのprefetchレコード)について:

    1. recordの状態が"canceled"なら、continue。

    2. checkPrerenderがtrueの場合:

      1. recordのprerendering traversableがnullなら、continue。

      2. recordのprerenderingターゲットナビゲーブル名ヒントが recordUnderConsiderationのprerenderingターゲットナビゲーブル名ヒントと等しくなければ、ユーザーエージェントはcontinueしてよい。

        ユーザーエージェントがprerendering traversableを prerenderingターゲットナビゲーブル名ヒントごとに分けて管理している場合はここでcontinueし、 それらを区別する。一方、既存のprerendering traversableをprerenderingターゲットナビゲーブル名ヒントに関わらず活性化できる場合は、これらのレコードを同等とみなす。

    3. recordNVSをnullとする。

    4. recordのレスポンスがnullでなければ、 recordNVSをURL検索バリアンス取得(recordのレスポンスで)で得る。

    5. それ以外はrecordのNo-Vary-SearchヒントをrecordNVSにセットする。

    6. recordUnderConsiderationのNo-Vary-SearchヒントとrecordNVSが等しくなければ、continue。

    7. recordUnderConsiderationのURLと recordのURLが 検索バリアンス無視で同等(recordUnderConsiderationのNo-Vary-Searchヒントを用いる)ならtrueを返す。

  2. falseを返す。

No-Vary-Search比較の議論はHTML標準内の比較も参照。

prefetchレコードからナビゲーションパラメータを作成は、トップレベルナビゲーブル navigable、document state documentState、navigation id navigationId、NavigationTimingType navTimingType、request request、prefetchレコード record、target snapshot params targetSnapshotParams、source snapshot params sourceSnapshotParamsを与え、次の手順で処理される:
  1. responseOrigin=null。

  2. responseCOOP=null。

  3. coopEnforcementResultをクロスオリジンオープナーポリシー検証結果生成 (navigableのアクティブドキュメント、documentStateのinitiator origin)で取得。

  4. finalSandboxFlagsを空のサンドボックスフラグセットとする。

  5. responsePolicyContainer=null。

  6. urlListを空のリストとする。

  7. responseはrecordのレスポンス。

  8. 各 exchangeRecord(recordのリダイレクトチェーン)について:

    1. redirectChainRequest=exchangeRecordのリクエスト。

    2. redirectChainResponse=exchangeRecordのレスポンス。

    3. 追加:redirectChainRequestのURLをurlListに追加。

    4. responsePolicyContainerをfetchレスポンスからのポリシーコンテナ作成 (redirectChainResponse、redirectChainRequestの予約クライアント)で設定。

    5. finalSandboxFlagsにtargetSnapshotParamsのサンドボックスフラグとresponsePolicyContainerのCSPリストのCSP由来サンドボックスフラグの和集合を設定。

    6. responseOriginをオリジン決定 (redirectChainResponseのURL、finalSandboxFlags、documentStateのinitiator origin、null)で設定。

    7. responseCOOPをCOOP取得 (redirectChainResponse、redirectChainRequestの予約クライアント)で設定。

    8. coopEnforcementResultを レスポンスCOOP強制処理 (navigableのアクティブ閲覧コンテキスト、redirectChainResponseのURL、responseOrigin、responseCOOP、coopEnforcementResult、redirectChainRequestのreferrer)で設定。

    9. finalSandboxFlagsが空でなく、responseCOOPのvalueが"unsafe-none"なら responseに適切なネットワークエラーを設定し、break。

  9. requestのURLがurlList[0]と等しくなければ、requestのURLをurlListの0番目の項目の後に挿入。

    この場合はrequestのURLへナビゲートするが、URLがurlList[0]であるレスポンスに由来するプレフェッチでそれを満たす。`No-Vary-Search`のためで、これは0番目レスポンスからURLへのリダイレクトとして扱われる。挿入後にurlListのサイズが2なら、生成されるDocumentがナビゲート先のURLを使う。それより大なら影響なし。

    例)/page?param=1をprefetchし、サーバーがNo-Vary-Search: params=("param")および200コードで応答する。

    後で/page?param=2へナビゲートすると、prefetchが利用され、このステップでurlListは« /page?param=1、 /page?param=2 »となり、生成されるDocument のURLは/page?param=2となる。

    例)/page?param=1をprefetchし、サーバーがNo-Vary-Search: params=("param")、301コード、Location: https://other.example/で応答。

    後で/page?param=2へナビゲートすると、prefetchが利用され、urlListは« /page?param=1、 /page?param=2、https://other.example/ »となり、生成されるDocument のURLはhttps://other.example/となる。

  10. requestのURLリストにurlListを設定。

  11. requestの予約クライアントを予約クライアント作成(navigable、requestのURL)で設定。

    これは生成されるDocument と環境設定オブジェクトの構築に用いられる環境となる。 prefetchレコードを消費するたびに個別の環境が必要。recordのリダイレクトチェーン の最後のリクエストの 予約クライアント を使い回すと、同じprefetchレコードから複数のナビゲーションパラメータ(つまり複数のナビゲーション)を生成した際に、作成された環境設定オブジェクトがidを共有し、たとえば clients.get() APIを通じて非常に紛らわしい形で観測できてしまうため。

  12. requestの予約クライアントのアクティブServiceWorkerを recordのリダイレクトチェーンの最後のリクエストの予約クライアントのアクティブServiceWorkerに設定。

    生成されるDocumentを制御するService Workerとしては、プレフェッチ中の最終レスポンスをインターセプトしたものと、登録がナビゲート先URL(つまりrequestのURL)に一致するものの2つが適切な候補になりえます。ほぼ常に同じですが、 `No-Vary-Search`を用い、何らかの理由で開発者が/page?param=1と/page?param=2に異なるService Workerを作成しているような境界的なケースでは、両者が異なる可能性があります。 ここではプレフェッチ中の最終レスポンスをインターセプトしたService Workerを使います。追加のService Worker検索が不要で多少単純になるうえ、活性化時のURL更新によってService Workerが切り替わらないprerenderingの動作と一致するためです。
  13. resultPolicyContainerにナビゲーションパラメータ用ポリシーコンテナ決定 (recordのレスポンスのURL、documentStateの履歴ポリシーコンテナ、sourceSnapshotParamsのソースポリシーコンテナ、null、responsePolicyContainer)をセット。

  14. responseがネットワークエラーでなければ:

    1. 任意でresponseをクローンに置き換えてよい。

      実装は、プレフェッチが複数回消費されると見込む場合、この手順を行うことを選ぶ場合があります。たとえば、後でレスポンスがprerenderに消費され、そのprerendering traversableが さまざまな方法で破棄されることがあります。通常はレスポンスも破棄されますが、この手順を行えば、プレフェッチ済みレスポンスを将来のナビゲーションに引き続き利用できます。

    2. 上記任意手順を行わなかった場合、recordをnavigableのアクティブドキュメントのprefetchレコードから除去しなければならない。

  15. 新しいナビゲーションパラメータを次の値で返す:

    id

    navigationId

    request

    request

    response

    response

    origin

    responseOrigin

    policy container

    resultPolicyContainer

    final sandboxing flag set

    finalSandboxFlags

    cross-origin opener policy

    responseCOOP

    COOP enforcement result

    coopEnforcementResult

    reserved environment

    requestの予約クライアント

    navigable

    navigable

    navigation timing type

    navTimingType

    fetch controller

    recordのfetch controller

    上記の任意の手順を実行し、このアルゴリズムを複数回呼び出してrecordから複数のナビゲーションパラメータを生成する場合でも、それらすべてのナビゲーションパラメータが同じ fetch controllerを共有して構いません。ナビゲーションパラメータのfetch controllerはナビゲーションタイミング情報の計算にしか使われず、その情報は再利用のたびに同じであってほしいためです。

    commit early hints

    null

    prefetchされたドキュメントのearly hintsは処理されない(見直し可能性はある)。現状prefetchはヘッダー到着まで提供されないため、early hintsは本応答ヘッダーとほぼ同時になる。将来の仕様で何らかの利用法を提案可能。

    delivery type

    "navigational-prefetch"

prefetch IP匿名化ポリシーpolicyが匿名性を要求するかどうかは、requestrequestを与え、次の手順がtrueを返す場合とする:
  1. policyがクロスオリジンプレフェッチIP匿名化ポリシーであれば:

    1. requestのURLのオリジンがpolicyのoriginと同一オリジンであれば、falseを返す。

    2. trueを返す。

  2. アサート:policyはnull。

  3. falseを返す。

2. HTMLパッチ

この節は[HTML]へのパッチを含みます。

以下のようにenvironmentへ追加項目を加えます:

is navigational prefetch client

boolean型(デフォルト: false)

以下のようにnavigation paramsへ追加項目を加えます:

delivery type

string型(PerformanceResourceTiming delivery typeに対応)

全ての生成箇所で空文字列を供給するよう更新します(ただし本仕様で異なる値が供給される記述がある場合は除きます。prefetch recordからナビゲーションパラメータを作成など)。


以下のようにsource snapshot paramsへ追加項目を加えます:

prefetch records

list型、 prefetch recordのリストです。

snapshot source snapshot paramsアルゴリズムを修正し、 戻り値のprefetch recordsに sourceDocumentのprefetch recordsのcloneをセット。


これはfetchによるナビゲーションパラメータ作成から抽出したものです。

予約クライアント作成( navigable navigable、URL url、 opaque originまたはnull isolationOrigin )アルゴリズム:

  1. topLevelCreationURL = url

  2. topLevelOrigin = null

  3. isolationOriginがnullでなければ:

    1. topLevelCreationURL = about:blank

    2. topLevelOrigin = isolationOrigin

  4. それ以外でnavigableが トップレベル traversable でない場合:

    1. parentEnvironment = navigableの親のアクティブドキュメントのrelevant settings object

    2. topLevelCreationURL = parentEnvironmentのtop-level creation URL

    3. topLevelOrigin = parentEnvironmentのtop-level origin

  5. 新しいenvironmentを返す。idはユニークな不透明文字列、 target browsing contextは navigableのアクティブブラウジングコンテキスト、 creation URLはurl、 top-level creation URLは topLevelCreationURL、 top-level originは topLevelOrigin


これはfetchによるナビゲーションパラメータ作成から抽出したものです。

ナビゲーション用クロスオリジンオープナーポリシー検証結果の作成 Document activeDocumentとorigin initiatorOriginを与えて、 新しいcross-origin opener policy enforcement resultを返します

url

activeDocumentのURL

origin

activeDocumentのorigin

cross-origin opener policy

activeDocumentのcross-origin opener policy

current context is navigation source

activeDocumentのoriginがinitiatorOriginと same originならtrue、それ以外はfalse


これはfetchによるナビゲーションパラメータ作成から抽出したものです。

ナビゲーションリクエスト作成 session history entry entry、 environment settings object fetchClient、 navigable containerまたはnull container、 boolean hasTransientActivationを与え、以下の手順を行う

  1. documentResource = entryのdocument stateのresource

  2. request = 新しいrequest(以下をセット)

    url

    entryのURL

    policy container

    entryのdocument stateのhistory policy container

    client

    fetchClient

    destination

    "document"

    credentials mode

    "include"

    use-URL-credentials flag

    set

    redirect mode

    "manual"

    mode

    "navigate"

    referrer

    entryのdocument stateのrequest referrer

    referrer policy

    entryのdocument stateのrequest referrer policy

  3. documentResourceがPOST resourceなら:

    1. requestのmethodに`POST`をセット

    2. requestのbodyにdocumentResourceのrequest bodyをセット

    3. セット:`Content-Type`を documentResourceのrequest content-typeに requestのheader listで

  4. entryのdocument stateの reload pendingがtrueなら requestのreload-navigation flagをセット

  5. それ以外でentryのdocument stateの ever populatedがtrueなら requestのhistory-navigation flagをセット

  6. hasTransientActivationがtrueならrequestのuser-activationにtrueをセット

  7. containerが非nullなら:

    1. containerにbrowsing context scope originがある場合、 requestのoriginにそのbrowsing context scope originをセット

    2. requestのdestinationおよび initiator type をcontainerのlocal nameにセット

  8. requestを返す


履歴エントリのドキュメントを再現しようとする(algo)では fetchによるナビゲーションパラメータ作成を呼び出すステップを 次の手順に置き換える:
  1. 次の両方がtrueなら:

    ならば:

    1. request = ナビゲーションリクエスト作成結果 (entry, sourceSnapshotParamsのfetch client, navigableの container, sourceSnapshotParamsのhas transient activationを与えて)

    2. requestのreplaces client idを navigableのactive documentの relevant settings objectの idにセット

    3. prefetched = false の初期化

    4. documentResourceがnullかつnavigableが トップレベル traversableなら:

      1. prefetchRecord = 一致するprefetch recordの待機結果 (navigable, sourceSnapshotParams, entryの URL)

      2. prefetchRecordがnullでなければ:

        1. navigationParams = prefetch recordからナビゲーションパラメータ作成結果 (navigable, entryのdocument state, navigationId, navTimingType, request, prefetchRecord, targetSnapshotParams, sourceSnapshotParams)

        2. prefetchクッキーのコピー (prefetchRecordのisolated partition key、navigationParamsのreserved environment)

          このコピーは以後、サブリソースフェッチやdocument.cookie等で クッキーが観測可能になるまで完了。クロスサイトURLに到達していなければコピーされるクッキーはありません。
        3. prefetchedをtrueにセット

        4. prefetchステータス更新イベント発火 (navigable, prefetchRecord,"success" ステータス)

        この条件はprefetchを `GET`リクエストのみで満たすこと、 かつ トップレベル traversablesだけで起動することを保証。

    5. prefetchedがfalseならnavigationParams = fetchによるナビゲーションパラメータ作成結果 (request, entry, navigable, sourceSnapshotParams, targetSnapshotParams, cspNavigationType, navigationId, navTimingType)


これは既存のfetchによるナビゲーションパラメータ作成アルゴリズムの更新です。

fetchによるナビゲーションパラメータ作成は、request request、session history entry entry、navigable navigable、source snapshot params sourceSnapshotParams、target snapshot params targetSnapshotParams、string cspNavigationType、navigation IDまたはnull navigationId、NavigationTimingType navTimingType、およびオプションのprefetch record prefetchRecordを与え、以下の手順を実行する。

  1. アサート:この処理は並列実行である。

  2. アサート:requestのURLはentryのURLである。

  3. アサート:requestのmodeは"navigate"である。

  4. アサート:requestのredirect modeは"manual"である。

  5. アサート:requestのreserved clientはnullである。

  6. responseをnullとする。

  7. responseOriginをnullとする。

  8. fetchControllerをnullとする。

  9. coopEnforcementResultをナビゲーション用クロスオリジンオープナーポリシー検証結果作成(navigableのアクティブドキュメント、entryのdocument stateのinitiator origin)で取得。

  10. finalSandboxFlagsを空のサンドボックスフラグセットとする。

  11. responsePolicyContainerをnullとする。

  12. responseCOOPを新しいcross-origin opener policyにする。

  13. locationURLをnullとする。

  14. currentURLをrequestのcurrent URLとする。

  15. commitEarlyHintsをnullとする。

  16. isolationOriginをnullとする。

  17. prefetchRecordが与えられていれば:

    1. isolationSite = prefetchRecordのisolated partition key[0]。

    2. アサート:isolationSiteはopaque originである。

    3. isolationOrigin = isolationSiteとする。

  18. while true:

    1. requestのreserved clientがnullでなく、 currentURLのoriginがrequestのreserved clientのcreation URLのoriginと同一オリジンでない場合:

      1. 環境廃棄手順(requestのreserved clientに対して)を実行。

      2. requestのreserved clientをnullにする。

      3. commitEarlyHintsをnullにする。

    2. requestのreserved clientがnullの場合:

      1. requestのreserved clientを 予約クライアント作成 (navigable、currentURL、isolationOrigin)で設定。

      2. prefetchRecordが与えられていれば、requestのreserved clientのis navigational prefetch clientをtrueにする。

    3. should navigation request of type be blocked by Content Security Policy?(request、cspNavigationType)が"Blocked"ならresponseにnetwork errorをセットし、break。

    4. prefetchRecordが与えられていれば:

      1. purposeをList型、Tokenのprefetchで初期化。

      2. prefetchRecordのanonymization policyが、匿名性を要求する場合(requestに対して):

        1. prefetchトークンに、キー"anonymous-client-ip"、値trueのパラメータを追加。

        2. ユーザーエージェントは、requestフェッチ時にクライアントIPアドレスを匿名化するconnection(例:プロキシ経由)を使用するか、responseにnetwork errorをセットし、breakとする。

          現時点では、IP匿名化の実現方法は大まかにしか説明されていません。おそらく、何らかのプロキシやリレーを用いる実装定義の方法で実現されます。理想的には 接続を取得する処理までこれを組み込み、場合によってはその仕組み自体もさらに標準化できるでしょう。

      3. prefetchRecordのprerendering traversableがnullでなければ、キー"prerender"、値trueのパラメータを追加。

      4. structured field値セット ( `Sec-Purpose`, purpose)をrequestのheader listに設定。

        実装では互換性維持のためベンダー独自ヘッダー(Chromium: `Purpose`/`prefetch`、Mozilla: `X-moz`/`prefetch`、WebKit: `X-Purpose`/`preview`等)も送る場合あり。今後は共通ヘッダーへの移行を希望。
      5. requestのcurrent URLのoriginが、prefetchRecordのURLのoriginと同一サイトなら:

        1. tagsをListとし、prefetchRecordのtagsの各itemを、文字列はStrings、nullはトークン nullにマッピングして構成する。

        2. structured field値セット ( `Sec-Speculation-Tags`, tagsをrequestのheader listへ設定。

      6. requestのcurrent URLが信頼できる可能性があるURLでなければ、responseにnetwork errorをセットし、break。

        これはprefetchトラフィックが中間者等に可視化されるリスク低減と、暗号化方式使用促進の意図。
      7. proposedPartitionKeyをネットワークパーティションキー決定 (requestのreserved client)で取得。

      8. proposedPartitionKeyがprefetchRecordのsource partition keyと異なり、requestのreferrer policy が十分厳格な推測ナビゲーションreferrerポリシー一覧に含まれない場合、responseにnetwork errorをセットし、break。

        実際にはクロスサイトprefetchは、referrer URLがoriginより広い情報を漏らさないよう破棄される形となる。
      9. requestがprefetchRecordのanonymization policyを与えられたときに実装定義の理由でフェッチできない場合、 responseにnetwork errorをセットし、break。

        これは実装毎に、匿名化アクセス不可能なホストや、private prefetch拒否アドバイスされたホスト等追加制限がありうることへの配慮。
      10. 追加:新規交換レコード (requestはrequest、 responseはnull)をprefetchRecordのredirect chainへ追加。

    5. responseをnullにする。

    6. fetchControllerがnullなら、以下を指定してrequestをfetch実行 ・processEarlyHintsResponse:下記定義 ・processResponse:下記定義 ・useParallelQueue:true

      processEarlyHintsResponseは、response earlyResponseを受け、 prefetchRecordが与えられていてcommitEarlyHintsがnullなら、early hint headers処理 (earlyResponse、requestのreserved client)結果をcommitEarlyHintsにセット。

      processResponseは、response fetchedResponseを受け、 responseにfetchedResponseをセット。

    7. それ以外の場合はfetchControllerで次のmanualリダイレクトを処理。

    8. responseがnullになるか、navigableのongoing navigationがnavigationIdと一致しなくなるまで待つ。

      後者の場合はfetchControllerのabortとし、終了。 それ以外は継続。ナビゲーション開始時にprefetchが即時abortされるが、これは望ましくない場合も。

    9. requestのbodyがnullなら、entryのdocument stateのresourceをnullにセット。

    10. responsePolicyContainerをfetchレスポンスからのポリシーコンテナ作成 (response、requestのreserved client)で設定。

    11. finalSandboxFlagsに、targetSnapshotParamsのsandboxing flagsとresponsePolicyContainerのCSPリストのCSP由来サンドボックスフラグの和集合をセット。

    12. responseOriginをオリジン決定 (responseのURL、finalSandboxFlags、entryのdocument stateのinitiator origin、null)で設定。

    13. navigableがトップレベル traversableでprefetchRecordが与えられていなければ:

      1. responseCOOPをCOOP取得(response、requestのreserved client)でセット。

      2. coopEnforcementResultをCOOP強制処理 (navigableのブラウジングコンテキスト、requestのURL、responseOrigin、responseCOOP、coopEnforcementResult、requestのreferrer)でセット。

      3. もしfinalSandboxFlagsが空でなく、 responseCOOPのvalueが"unsafe-none"でなければ、 responseにnetwork errorをセットし、break。

      prefetchのCOOP判定は活性化時に行う(ターゲットブラウジングコンテキスト判明時)。

    14. responseがnetwork errorでなく、navigableが子navigableで、CORP判定を、navigableのcontainer documentのorigin、navigableのcontainer documentのrelevant settings object、requestのdestination、response、trueを与えて行った結果がblockedの場合は、 responseにnetwork errorをセットし、break。

    15. prefetchRecordが与えられていれば:

      1. リダイレクトチェーン更新(prefetchRecordのredirect chain、request、response)を実行。

      2. 矛盾する認証情報が存在する (response、navigable、prefetchRecordのsource partition key)の場合、 prefetchRecordのhad conflicting credentialsをtrue。

        これによって直ちにプレフェッチを中止したりリダイレクトの追跡を停止したりはしません。そうすると、ユーザーがナビゲートする前に、現在のパーティション外にユーザーの状態が保存されているかどうかが明らかになるおそれがあるためです。代わりに、矛盾する認証情報がないかのようにプレフェッチを続けますが、そのプレフェッチを実際に利用することはできません。ユーザーエージェントはコンソールに警告を報告するなどして、この事態を制作者に知らせたい場合があります。

    16. locationURLをresponseのlocation URL(currentURLのfragment付き)でセット。

    17. locationURLがfailureまたはnullならbreak。

    18. アサート:locationURLはURL。

    19. entryのserialized stateにStructuredSerializeForStorage(null)をセット。

    20. oldDocStateをentryのdocument stateとする。

    21. entryのdocument stateを新しいdocument state(以下の値)でセット:

      history policy container

      oldDocStateのhistory policy containerのclone

      request referrer

      oldDocStateのrequest referrer

      request referrer policy

      oldDocStateのrequest referrer policy

      origin

      oldDocStateのorigin

      resource

      oldDocStateのresource

      ever populated

      oldDocStateのever populated

      navigable target name

      oldDocStateのnavigable target name

    22. locationURLのschemeがHTTP(S) schemeでなければ:

      1. entryのdocument stateのresourceをnullにする。

      2. break。

    23. currentURL = locationURL。

    24. entryのURLをcurrentURLにセット。

  19. locationURLがURLで、schemeがfetch schemeでない場合、新しいnon-fetch scheme navigation paramsを返す(以下の値):

    initiator origin

    requestのcurrent URLのorigin

  20. 以下のいずれかがtrueなら:

    ならばnullを返す。
  21. resultPolicyContainer = ナビゲーションパラメータ用ポリシーコンテナ決定 (responseのURL、entryのdocument stateのhistory policy container、sourceSnapshotParamsのsource policy container、null、responsePolicyContainer)

  22. 新しいnavigation paramsを以下の値で返す:

    id

    navigationId

    request

    request

    response

    response

    origin

    responseOrigin

    policy container

    resultPolicyContainer

    final sandboxing flag set

    finalSandboxFlags

    cross-origin opener policy

    responseCOOP

    COOP enforcement result

    coopEnforcementResult

    reserved environment

    requestのreserved client

    navigable

    navigable

    navigation timing type

    navTimingType

    fetch controller

    fetchController

    commit early hints

    commitEarlyHints


Documentオブジェクトの作成と初期化手順を更新し、 ナビゲーションタイミングエントリの作成に追加引数として navigationParamsのdelivery typeを渡すようにする。

ナビゲーション応答用のブラウジングコンテキスト取得の、 sourceOriginがdestinationOriginとsame siteでないことをチェックする手順に以下のサブステップを挿入する:
  1. navigationParamsのdelivery typeが"prefetch"なら、任意でswapGroupをtrueにセットする。

    これにより参照元サイトがロードタイミングを計測してprefetchが使われたかどうか判別しづらくなる。宛先サイト情報のリーク防止効果あり。

この節は[NAVIGATION-TIMING]へのパッチを含みます。

create the navigation timing entry に追加のパラメーターを 1 つ追加する。これは string deliveryType であり、これを setup the resource timing entry に追加の引数として渡す。

4. Service Workerパッチ

この節は[SERVICE-WORKERS]へのパッチを含みます。

Create Fetch Event and Dispatchで resultingClientId を設定する手順を以下のように変更:
requestが非サブリソースリクエストで、 requestのdestinationが "report"以外 かつ reservedClientのis navigational prefetch clientが false の場合はeのresultingClientId 属性にreservedClientのidを設定し、そうでなければ空文字列にする。

prefetchの場合は、requestにreserved clientが一時的に存在するが、 実際のクライアント生成は活性化時なので、 FetchEvent の発火後。例えばclients.matchAll() などで観測可能な本物のクライアントではありません。

5. Clear Site Dataパッチ

Clear Site Data § 3.1 The Clear-Site-Data HTTP Response Header Fieldの記述値に追加のヘッダー値を加える:

"prefetchCache"

"prefetchCache"タイプは、サーバーが特定originのresponseのURLで開始されたprefetchを削除したい意思を示す。

このタイプは"cache"タイプの部分集合です。

実装詳細は下記のとおり。

parse response’s Clear-Site-Data headerのパース手順を修正:

clear site data for responseのswitch記述に、"prefetchCache"を扱うケースを追加し、clear prefetch cache(origin対象)を呼び出すよう修正。

prefetchキャッシュのクリアは、origin originに対して次の手順を行う:
  1. 全ての トップレベル traversable traversable(ユーザーエージェントのトップレベル traversable セット内)について:

    1. navigablesをtraversableの包含するナビゲーブル集合(traversableのアクティブドキュメントから取得)とする。

    2. 各 navigable(navigables内)について:

      1. activeDocument = navigableのアクティブドキュメント。

      2. activeDocumentのoriginがoriginとsame originでなければ、continue。

      3. 各 prefetchRecord(activeDocumentのprefetch records内)について:

        1. prefetchRecordのprerendering traversableがnullでなければ、continue。

        2. キャンセル・廃棄 prefetchRecord(activeDocument対象)を実行。

6. プレフェッチアルゴリズム

十分に厳格な推測ナビゲーションのreferrerポリシーのリストは、以下を含むリストとする: "", "strict-origin-when-cross-origin", "strict-origin", "same-origin", "no-referrer"。

referrer起点のナビゲーションプレフェッチの開始(Document document, prefetchRecord prefetchRecord):
  1. アサート:documentのnode navigableはトップレベル traversableである。

    子ナビゲーブルのプレフェッチへの対応には複雑さがあり、現時点では仕様化されていません。将来的に定義可能性あり。

  2. documentが一致するprefetch recordを持つならprefetchRecordを与えてreturn。

  3. sourceSnapshotParams = source snapshot paramsのスナップショット化(document)

  4. targetSnapshotParams = target snapshot paramsのスナップショット化(documentのnode navigable)

  5. prefetchRecordのsource partition keyを network partition keyの決定 (documentのrelevant settings object)でセット

  6. アサート:prefetchRecordのURLのschemeはHTTP(S) schemeである。

  7. 追加:prefetchRecordをdocumentのprefetch recordsに追加。

  8. prefetchRecordのstart timeを現在の高精度時刻 (documentのrelevant global object)でセット

  9. prefetchステータス更新イベントの発火(documentのnode navigable、prefetchRecord、"pending" ステータス)

  10. referrerPolicy = prefetchRecordのreferrer policy が空文字列でなければprefetchRecordのreferrer policy、そうでなければdocumentのpolicy containerのreferrer policy

  11. documentState = 新規document state(以下をセット)

    request referrer policy

    referrerPolicy

    initiator origin

    documentのorigin

  12. entry = 新規session history entry(以下をセット)

    URL

    prefetchRecordのURL

    document state

    documentState

  13. request = ナビゲーションリクエスト作成 (entry, documentのrelevant settings object, documentのnode navigableのcontainer, false)

  14. global = documentのrelevant global object

  15. 並列で:

    1. navigationParams = fetchによるナビゲーションパラメータ作成 (request, entry, documentのnode navigable, sourceSnapshotParams, targetSnapshotParams, "other", null (navigationId), "navigate", prefetchRecordを与えて)

      ここでprefetch時に使うnavigable(documentのnode navigable)は、活性化時、つまり最終的にprefetchレコードからナビゲーションパラメータを作成するアルゴリズムを呼び出すnavigateアルゴリズムに渡すnavigableとは異なる可能性があります。 これは問題ありません。プレフェッチの活性化をもたらすナビゲーションでは、重要な判定の大半に引き続きターゲットnavigableが使われます。それらの判定は、履歴エントリーのドキュメントを設定する試みを呼び出すよりも前に行われます。

      prefetch時ナビゲーションパラメータ作成 でnavigableの影響を受ける部分を見ると次のとおり:

      また、アルゴリズム内でnavigationParamsは基本的にprefetchレスポンスのラッパー用途のみ。長期利用のために保存されることはありません。そのため、navigationParamsのnavigableの値がシステムの他の部分に漏れることはありません。活性化時は、prefetch recordからナビゲーションパラメータ作成 により新しいナビゲーションパラメータが生成され、適切なターゲットnavigableが含まれます。

    2. navigationParamsのresponseがprefetch非対応ならnavigationParamsをnullにする。

    3. prefetchRecordのhad conflicting credentials がtrueならnavigationParamsをnullにする。

      リダイレクトチェーンにクロスパーティションoriginで認証情報があれば、そのprefetchは廃棄される。これによりログイン状態のユーザーがログアウトページを誤って観測する可能性を低減。
    4. グローバルタスクのキュー(networking task source、global)で:

      1. navigationParamsがnavigation paramsでなければ キャンセル・廃棄 (documentでprefetchRecord)して、残り手順を中止。

      2. アサート:navigationParamsのresponseが prefetchRecordのredirect chainの 最終要素のresponseと一致すること。

      3. 完了(prefetchRecord、document)の実行。

response responseが prefetchに対応しているかは、次の手順がtrueを返す場合:
  1. status = responseのstatus

  2. アサート:statusがリダイレクトステータスでない

  3. statusがokステータスでなければ falseを返す

    つまり、エラー応答は保存されず、ナビゲーション時再試行される。エラーが一時的 or prefetch用リクエストで生じた場合にナビゲーション成功可能性を高める。サーバーも `Sec-Purpose` リクエストヘッダー入りリクエストに応答拒否も可能。
  4. trueを返す

103はokステータスでないが、early hintsはprefetchを妨げない。 このprefetch対応 判定は実際のレスポンス(1xxステータスを持たないもの)にのみ適用されます。

なお、他記載の通りearly hintsは現状prefetch時無視される。

7. クッキー

[COOKIES] は、`Set-Cookie` レスポンスヘッダーフィールドを使って設定できる「クッキー」を定義しています。"uncredentialed"というパーティショニング方式が別個のネットワークパーティションキーの使用を強制するため、これらのクッキーはナビゲーション時に受信されたかのように通常のパーティションへコピーする必要があります。

キャッシュは正確性のために必須ではありませんが、コピーできると有用でしょう。
認証情報のエントリはクロスサイト時に取得されることがありますが、これは稀である可能性が高いです。(例えば、サイトがURLに認証情報を含む別のURLへリダイレクトする場合など。)これらをコピーするのも理にかなっていますが、実際に奨励すべきかどうかは不明です。
プレフェッチのクッキーを コピーするには、ネットワーク パーティションキー isolatedPartitionKeyと環境 environmentを与え、以下の手順を実行します。
形式的には[COOKIES]にクッキーストアは1つしかありませんが、一部のブラウザは同一ドメインのクッキーを異なるトップレベルサイトごとに分離するようにクッキーストアを分割します。詳細はClient-Side Storage Partitioning (Privacy CG)を参照してください。
  1. isolatedCookieStoreを、isolatedPartitionKeyに紐付くクッキーストアとする。

  2. isolatedCookieStoreに含まれる各cookie cookieについて:

    1. cookieをisolatedCookieStoreから削除する。

    2. ユーザーエージェントは特定のクッキーを丸ごと無視してよい。もし無視するなら続行する。

      これは、[COOKIES]がクッキー受信時にこれを明示的に許可していることと整合します。
    3. topLevelSiteをnullとする。

    4. もしenvironmentのtarget browsing contextがトップレベルブラウジングコンテキストである場合:

      1. topLevelSiteを、サイトの取得(tuple origin("https", cookieのdomain, null, null)を与えて得られる値)に設定する。

        ここで"https"スキームとnullポートを使っているのは便宜上のもので、クッキーは通常の同一オリジンポリシーと異なりスキームやポートを越えて可視であるためです。したがってユーザーエージェントのクッキーストア選択はこれらに敏感であってはなりません。
      トップレベルブラウジングコンテキストでプレフェッチを行う場合、リクエスト(リダイレクトを含む)はトップレベルナビゲーションの準備です。environmentのトップレベルサイトはリダイレクトに従って変わることがあり、リダイレクトがクロスサイトであれば、あるクッキーが受信された時点と現在でトップレベルサイトが変わっている可能性があります。しかしナビゲーションはトップレベルで行われるため、そのクッキーを配信したオリジンは当時のトップレベルサイトであったはずです。クッキーのdomainはそれを配信したオリジンとsame-siteである必要があるため、クッキーのdomainを用いて正しいトップレベルサイトを決定できます。
    5. そうでなければ:

      1. topLevelOriginをenvironmentのtop-level originとする。

      2. もしtopLevelOriginがnullであれば、topLevelOriginにenvironmentのtop-level creation URLのoriginを設定する。

      3. アサート:topLevelOriginはoriginである。

      4. topLevelSiteを、サイトの取得(topLevelOriginを与えて)で得られる値に設定する。

      子ナビゲーブルでプレフェッチを行う場合、トップレベルサイトはそれを包含するトップレベル traversableで決まります。それはリダイレクトに従って変わらないため、environmentを使ってトップレベルサイトを特定できます。
    6. secondKeyをnullまたは実装依存の値とする。

      secondKeyは、このレスポンスがenvironmentのターゲットブラウジングコンテキストで通常のナビゲーションの一部として処理された場合に持つであろう値と一致することが期待されます。
    7. destinationPartitionKeyを(topLevelSite, secondKey)とする。

    8. cookieStoreを、destinationPartitionKeyに紐付くクッキーストアとする。

    9. newCookieをcookieのコピーとする。

    10. newCookieの作成時刻および最終アクセス時刻を現在日時に設定する。

    11. もしcookieStoreに、新規作成するクッキーと同じ名前・ドメイン・パスを持つクッキーexistingCookieが存在する場合:

      1. newCookieの作成時刻をexistingCookieの作成時刻に設定する。

      2. existingCookieをcookieStoreから削除する。

    12. newCookieをcookieStoreに挿入する。

      この削除して挿入するパターンは、クッキー受信時の振る舞いと一致します。

8. `Sec-Purpose` HTTPリクエストヘッダー

この節は[FETCH]で定義される`Sec-Purpose` HTTPリクエストヘッダーの定義を上書きします。

`Sec-Purpose` HTTPリクエストヘッダーは、リクエストがユーザーによる即時利用以外の目的を持つことを示します。

このヘッダーフィールドは[RFC9651]のStructured Headerであり、その値はListでなければなりません。

このヘッダーは、Itemとしてprefetchトークン(Token)を含むことができます。もし含まれるなら、そのリクエストの目的は間もなく取得されると見込まれるリソースをダウンロードすることであることを示します。

以下はprefetchトークンのために定義されたパラメータです:

9. 自動テスト

ユーザーエージェントの自動化およびアプリケーションテストの目的のために、本書は[WebDriver-BiDi] 仕様への拡張を定義します。

CDDLスニペットは、CDDLスニペットの独立したプログラム処理を許容するために"text"型を使っています。他のモジュールを参照することは現在できません。

9.1. speculationモジュール

speculationモジュールは、prefetch、prerender、およびspeculationルールのリモート側の挙動を管理するコマンドを含みます。

9.1.1. 定義

local end definition

speculation.PreloadingStatus = "pending" / "ready" / "success" / "failure"

speculation.PreloadingStatus型は、prefetchやprerenderで共有される様々なプリロード状態を表します。

"pending"
prefetch record prefetchRecordがreferrer起点のナビゲーションプレフェッチを開始する状態を表します。
"ready"
prefetch record prefetchRecordが完了している状態を表します。
"success"
prefetch record prefetchRecordがユーザーエージェントのナビゲーション等により活性化された状態を表します。
"failure"
prefetch record prefetchRecordが期限切れなどで失敗した状態を表します。

9.1.2. イベント

SpeculationEvent = (
  speculation.PrefetchStatusUpdated
)
9.1.2.1. speculation.prefetchStatusUpdated イベント
speculation.PrefetchStatusUpdated = (
   method: "speculation.prefetchStatusUpdated",
   params: speculation.PrefetchStatusUpdatedParameters
)

speculation.PrefetchStatusUpdatedParameters = {
   context: text,
   url: text,
   status: speculation.PreloadingStatus
}
To prefetchステータス更新イベントをトリガーする given a navigable navigable, a prefetch record prefetchRecord, and a speculation.PreloadingStatus preloadingStatus:
  1. paramsを、speculation.PrefetchStatusUpdatedParametersに対応するmapとして作り、contextフィールドをnavigableのtop-level traversableのnavigable idに、urlフィールドをprefetchRecordのURLに、statusフィールドをpreloadingStatusに設定する。

  2. bodyを、speculation.PrefetchStatusUpdatedParametersに対応するmapとして作り、paramsフィールドに上のparamsを設定する。

  3. relatedNavigablesを、setとして作り、navigableを含める。

  4. "speculation.prefetchStatusUpdated"およびrelatedNavigablesに対してイベントが有効になっているセッション群(set of sessions for which an event is enabled)の各sessionについて:

    1. イベントを発行する(引数はsessionとbody)。

10. セキュリティ考慮事項

詳細は HTML § 7.6.5 Security considerations を参照してください。

11. プライバシー考慮事項

詳細は HTML § 7.6.6 Privacy considerations を参照してください。

索引

この仕様で定義される用語

参照によって定義される用語

参考文献

標準リファレンス

[CLEAR-SITE-DATA]
Mike West. サイトデータの消去. URL: https://w3c.github.io/webappsec-clear-site-data/
[COOKIES]
A. Barth. HTTP 状態管理メカニズム. 2011年4月. 提案標準. URL: https://httpwg.org/specs/rfc6265.html
[CSP]
Mike West; Antonio Sartori. コンテンツセキュリティポリシー レベル 3. URL: https://w3c.github.io/webappsec-csp/
[DOM]
Anne van Kesteren. DOM 標準. 現行標準. URL: https://dom.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch 標準. 現行 標準. URL: https://fetch.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. 高分解能時間. URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; ほか. HTML 標準. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 標準. 現行標準. URL: https://infra.spec.whatwg.org/
[NAVIGATION-TIMING-2]
Yoav Weiss; Noam Rosenthal. ナビゲーションタイミング レベル 2. URL: https://w3c.github.io/navigation-timing/
No-Vary-Search HTTP キャッシュ拡張. 編集者草案. URL: https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-no-vary-search
[PRERENDERING-REVAMPED]
刷新された事前レンダリング. コミュニティグループ報告書草案. URL: https://wicg.github.io/nav-speculation/prerendering.html
[REFERRER-POLICY]
Jochen Eisinger; Emily Stark. リファラー ポリシー. URL: https://w3c.github.io/webappsec-referrer-policy/
[RESOURCE-TIMING]
Yoav Weiss; Noam Rosenthal. リソース タイミング. URL: https://w3c.github.io/resource-timing/
[RFC8610]
H. Birkholz; C. Vigano; C. Bormann. 簡潔データ 定義言語 (CDDL): Concise Binary Object Representation (CBOR) および JSON データ構造を表現するための表記規約. 2019年6月. 提案標準. URL: https://www.rfc-editor.org/info/rfc8610/
[RFC9651]
M. Nottingham; P-H. Kamp. HTTP の構造化フィールド値 . 2024年9月. 提案標準. URL: https://www.rfc-editor.org/info/rfc9651/
[SECURE-CONTEXTS]
Mike West. セキュアコンテキスト. URL: https://w3c.github.io/webappsec-secure-contexts/
[SERVICE-WORKERS]
Monica CHINTALA; Yoshisato Yanagisawa. Service Workers ナイトリー版. URL: https://w3c.github.io/ServiceWorker/
[URL]
Anne van Kesteren. URL 標準. 現行標準. URL: https://url.spec.whatwg.org/
[WebDriver-BiDi]
James Graham; Alex Rudenko; Maksim Sadym. WebDriver BiDi. URL: https://w3c.github.io/webdriver-bidi/

参考文献(参考) (非規定)

[CONSOLE]
Dominic Farolino; Robert Kowalski; Terin Stock. Console Standard. Living Standard. URL: https://console.spec.whatwg.org/
[NAVIGATION-TIMING]
Zhiheng Wang. Navigation Timing. 2012年12月17日. REC. URL: https://www.w3.org/TR/navigation-timing/

CDDL索引

課題索引

キャッシュ応答ヘッダーを使ってレスポンスが複数回利用可能か判定できるかもしれないが、prefetchバッファの寿命が短いため本当に価値があるか不明。 ↵
現時点でIP匿名化の実現方法はあいまい。おそらく何らかのプロキシやリレーを使った実装依存の手段による。理想的にはコネクション取得まで渡したいし、標準化も検討余地あり。 ↵
ナビゲーション開始と同時にprefetchがabortされるが、これは望ましくない場合もある。 ↵
正確性のために必須ではないが、キャッシュもコピーできると便利。 ↵
認証エントリはクロスサイト時に取得されることがあるが、稀なようだ(例えばURL認証情報付きURLへのリダイレクト等)。これもコピーしても良いかも知れないが実際奨励すべきか不明。 ↵
CDDLスニペットはCDDLスニペットの独立したプログラム処理を許すため"text"型を使っている。現在他モジュールは参照できない。 ↵