プレフェッチ

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

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

概要

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

この文書のステータス

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

1. 概念

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

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

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

  3. hypotheticalPartitionKeysourcePartitionKeyと等しい場合、または認証情報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 recordresponseは、そのredirect chainの最後の要素のresponse、もしくはそのリストが空の場合はnullである。

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

prefetchレコード prefetchRecordURLに一致するかどうかは、以下アルゴリズムにより判定します:
  1. prefetchRecordURLurlが等しければtrueを返す。

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

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

      0番目のレスポンスを確認することが重要です(最後ではなく)、 URLが最初のリクエスト/レスポンスペアのため、No-Vary-Searchヘッダーも最初だけが判定に影響します。

    2. prefetchRecordURLurlsearchVarianceに基づき変動無視で同等ならtrueを返す。

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

prefetchレコード prefetchRecordURLに一致する見込みかどうかは、以下アルゴリズムにより判定します:
  1. prefetchRecordURLに一致する場合、trueを返す。

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

    1. searchVarianceNo-Vary-Searchヒントより取得。

    2. prefetchRecordURLurlsearchVarianceに基づき変動無視で同等ならtrueを返す。

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

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

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

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

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

  5. prefetchRecordprerendering traversabletraversable navigableなら、破棄する。

  6. 削除prefetchRecorddocumentprefetchレコードから除去。

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

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

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

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

  3. expiryTimecurrentTime+300,000(5分)とする。

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

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

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

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

  2. inexactRecordをnullとする。

  3. recordsourceSnapshotParamsprefetchレコード)について:

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

    2. recordURLurlと等しければ:

      1. exactRecordrecordをセット。

      2. break

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

      1. inexactRecordrecordをセット。

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

  5. recordToUseがnullでなければ:

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

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

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

      2. nullを返す。

    3. exchangeRecordrecordToUseリダイレクトチェーン)について:

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

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

        2. nullを返す。

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

  6. nullを返す。

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

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

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

  2. timeoutをnullとする。

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

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

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

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

    1. while(true):

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

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

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

      4. recordsourceSnapshotParamsprefetchレコード)について:

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

          なら追加potentialRecordsrecordを追加。

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

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

      5. potentialRecordsならnullを返す。

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

  6. nullを返す。

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

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

    1. prefetchRecordcandidateURLと一致しない場合は、continue

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

    3. candidateprerender候補で、 prefetchRecordprerendering traversable がnullなら、continue

    4. trueを返す。

  2. falseを返す。

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

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

    2. checkPrerenderがtrueの場合:

      1. recordprerendering traversableがnullなら、continue

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

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

    3. recordNVSをnullとする。

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

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

    6. recordUnderConsiderationNo-Vary-SearchヒントrecordNVSが等しくなければ、continue

    7. recordUnderConsiderationURLrecordURL検索バリアンス無視で同等recordUnderConsiderationNo-Vary-Searchヒントを用いる)ならtrueを返す。

  2. falseを返す。

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

prefetchレコードからナビゲーションパラメータを作成は、トップレベルナビゲーブル navigabledocument state documentStatenavigation id navigationIdNavigationTimingType navTimingTyperequest requestprefetchレコード recordtarget snapshot params targetSnapshotParamssource snapshot params sourceSnapshotParamsを与え、次の手順で処理される:
  1. responseOrigin=null。

  2. responseCOOP=null。

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

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

  5. responsePolicyContainer=null。

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

  7. responserecordレスポンス

  8. exchangeRecordrecordリダイレクトチェーン)について:

    1. redirectChainRequest=exchangeRecordリクエスト

    2. redirectChainResponse=exchangeRecordレスポンス

    3. 追加redirectChainRequestURLurlListに追加。

    4. responsePolicyContainerfetchレスポンスからのポリシーコンテナ作成 (redirectChainResponseredirectChainRequest予約クライアント)で設定。

    5. finalSandboxFlagstargetSnapshotParamsサンドボックスフラグresponsePolicyContainerCSPリストCSP由来サンドボックスフラグの和集合を設定。

    6. responseOriginオリジン決定 (redirectChainResponseURLfinalSandboxFlagsdocumentStateinitiator origin、null)で設定。

    7. responseCOOPCOOP取得 (redirectChainResponseredirectChainRequest予約クライアント)で設定。

    8. coopEnforcementResultレスポンスCOOP強制処理 (navigableアクティブ閲覧コンテキストredirectChainResponseURLresponseOriginresponseCOOPcoopEnforcementResultredirectChainRequestreferrer)で設定。

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

  9. requestURLurlList[0]と等しくなければ、requestURLurlListの0番目の項目の後に挿入。

    この場合はrequestURLへナビゲートするが、プレフェッチは最初のレスポンス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 »となり、生成されるDocumentURL/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=2https://other.example/ »となり、生成されるDocumentURLhttps://other.example/となる。

  10. requestURLリストurlListを設定。

  11. request予約クライアント予約クライアント作成navigablerequestURL)で設定。

    これは生成されるDocument環境設定オブジェクト用の環境となる。 consume毎に個別環境が必要。recordリダイレクトチェーン の最後のリクエスト予約クライアント を使い回すと複数ナビゲーションでidを共有してしまうため( clients.get()APIなどで可視化されてしまう)。

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

    Service Workerの選択については、プレフェッチ最終応答をインターセプトしたSWと、ナビゲート先URL用SWのどちらもありうる(通常同じだが、 No-Vary-Search+個別SWなどだと異なる場合も)。 プレフェッチ時の最終応答を担当したSWを採用する。これはprerenderの振る舞いと一致し、追加SW探索が不要で単純である。
  13. resultPolicyContainerナビゲーションパラメータ用ポリシーコンテナ決定 (recordレスポンスURLdocumentState履歴ポリシーコンテナsourceSnapshotParamsソースポリシーコンテナ、null、responsePolicyContainer)をセット。

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

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

      複数回consumeされる場合(将来prerenderで利用され、prerendering traversableが破棄されても、クローンすれば再利用できる等)、実装はこの手順を行うことがある。

    2. 上記任意手順を行わなかった場合、recordnavigableアクティブドキュメント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

    recordfetch 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. requestURLオリジンpolicyoriginと同じであれば、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 recordssourceDocumentprefetch recordscloneをセット。


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

予約クライアント作成navigable navigableURL urlopaque 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 = parentEnvironmenttop-level creation URL

    3. topLevelOrigin = parentEnvironmenttop-level origin

  5. 新しいenvironmentを返す。idはユニークな不透明文字列、 target browsing contextnavigableアクティブブラウジングコンテキストcreation URLurltop-level creation URLtopLevelCreationURLtop-level origintopLevelOrigin


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

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

url

activeDocumentURL

origin

activeDocumentorigin

cross-origin opener policy

activeDocumentcross-origin opener policy

current context is navigation source

activeDocumentorigininitiatorOriginsame originならtrue、それ以外はfalse


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

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

  1. documentResource = entrydocument stateresource

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

    url

    entryURL

    policy container

    entrydocument statehistory policy container

    client

    fetchClient

    destination

    "document"

    credentials mode

    "include"

    use-URL-credentials flag

    set

    redirect mode

    "manual"

    mode

    "navigate"

    referrer

    entrydocument staterequest referrer

    referrer policy

    entrydocument staterequest referrer policy

  3. documentResourcePOST resourceなら:

    1. requestmethod`POST`をセット

    2. requestbodydocumentResourcerequest bodyをセット

    3. セット`Content-Type`documentResourcerequest content-typerequestheader list

  4. entrydocument statereload pendingがtrueなら requestreload-navigation flagをセット

  5. それ以外でentrydocument stateever populatedがtrueなら requesthistory-navigation flagをセット

  6. hasTransientActivationがtrueならrequestuser-activationにtrueをセット

  7. containerが非nullなら:

    1. containerbrowsing context scope originがある場合、 requestoriginにそれをセット

    2. requestdestinationおよび initiator typecontainerlocal nameにセット

  8. requestを返す


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

    ならば:

    1. request = ナビゲーションリクエスト作成結果 (entry, sourceSnapshotParamsfetch client, navigablecontainer, sourceSnapshotParamshas transient activationを与えて)

    2. requestreplaces client idnavigableactive documentrelevant settings objectidにセット

    3. prefetched = false の初期化

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

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

      2. prefetchRecordがnullでなければ:

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

        2. prefetchクッキーのコピーprefetchRecordisolated partition keynavigationParamsreserved 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 requestsession history entry entry、navigable navigablesource snapshot params sourceSnapshotParamstarget snapshot params targetSnapshotParams、string cspNavigationTypenavigation IDまたはnull navigationIdNavigationTimingType navTimingType、およびオプションのprefetch record prefetchRecordを与え、以下の手順を実行する。

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

  2. アサートrequestURLentryURLである。

  3. アサートrequestmodeは"navigate"である。

  4. アサートrequestredirect modeは"manual"である。

  5. アサートrequestreserved clientはnullである。

  6. responseをnullとする。

  7. responseOriginをnullとする。

  8. fetchControllerをnullとする。

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

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

  11. responsePolicyContainerをnullとする。

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

  13. locationURLをnullとする。

  14. currentURLrequestcurrent URLとする。

  15. commitEarlyHintsをnullとする。

  16. isolationOriginをnullとする。

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

    1. isolationSite = prefetchRecordisolated partition key[0]。

    2. アサートisolationSiteopaque originである。

    3. isolationOrigin = isolationSiteとする。

  18. while true:

    1. requestreserved clientがnullでなく、 currentURLoriginrequestreserved clientcreation URLoriginと異なる場合:

      1. 環境廃棄手順requestreserved clientに対して)を実行。

      2. requestreserved clientをnullにする。

      3. commitEarlyHintsをnullにする。

    2. requestreserved clientがnullの場合:

      1. requestreserved client予約クライアント作成navigablecurrentURLisolationOrigin)で設定。

      2. prefetchRecordが与えられていれば、requestreserved clientis navigational prefetch clientをtrueにする。

    3. should navigation request of type be blocked by Content Security Policy?requestcspNavigationType)が"Blocked"ならresponsenetwork errorをセットし、break

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

      1. purposeList型、Tokenprefetchで初期化。

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

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

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

          現状IP匿名化の方法は未定義。実装依存(プロキシやリレー等)で処理される見込み。理想的にはfetch connection取得へ伝搬する形式で標準化したい。

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

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

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

        1. tagsListとし、prefetchRecordtagsの各itemを、文字列はStrings、nullはnullトークンにマッピング。

        2. structured field値セット ( `Sec-Speculation-Tags`, tagsrequestheader listへ設定。

      6. requestcurrent URL信頼できる可能性があるURLでなければ、responsenetwork errorをセットし、break

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

      8. proposedPartitionKeyprefetchRecordsource partition keyと異なり、requestreferrer policy十分厳格な推測ナビゲーションreferrerポリシー一覧に含まれない場合、responsenetwork errorをセットし、break

        実際にはクロスサイトprefetchは、referrer URLがoriginより広い情報を漏らさないよう破棄される形となる。
      9. requestanonymization policyによりフェッチできない場合(実装依存)、 responsenetwork errorをセットし、break

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

    5. responseをnullにする。

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

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

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

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

    8. responseがnullになるか、navigableongoing navigationnavigationIdと一致しなくなるまで待つ。

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

    9. requestbodyがnullなら、entrydocument stateresourceをnullにセット。

    10. responsePolicyContainerfetchレスポンスからのポリシーコンテナ作成 (responserequestreserved client)で設定。

    11. finalSandboxFlagsに、targetSnapshotParamssandboxing flagsresponsePolicyContainerCSPリストCSP由来サンドボックスフラグの和集合をセット。

    12. responseOriginオリジン決定 (responseURLfinalSandboxFlagsentrydocument stateinitiator origin、null)で設定。

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

      1. responseCOOPCOOP取得responserequestreserved client)でセット。

      2. coopEnforcementResultCOOP強制処理 (navigableブラウジングコンテキストrequestURLresponseOriginresponseCOOPcoopEnforcementResultrequestreferrer)でセット。

      3. もしfinalSandboxFlagsが空でなく、 responseCOOPvalueが"unsafe-none"でなければ、 responsenetwork errorをセットし、break

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

    14. responsenetwork errorでなく、navigable子navigableで、CORP判定の結果がblockedの場合は、 responsenetwork errorをセットし、break

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

      1. リダイレクトチェーン更新prefetchRecordredirect chainrequestresponse)を実行。

      2. 矛盾する認証情報が存在するresponsenavigableprefetchRecordsource partition key)の場合、 prefetchRecordhad conflicting credentialsをtrue。

        これはprefetchを直ちにabortせず、リダイレクト追従も止めない。ユーザーがナビゲーション前に外部ストレージ状態保有有無を観測されないよう。prefetchは矛盾認証情報状態でも続行されるが実利用は不可。ユーザーエージェントはコンソールで警告出力等推奨可。

    16. locationURLresponselocation URLcurrentURLfragment付き)でセット。

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

    18. アサートlocationURLURL

    19. entryserialized stateStructuredSerializeForStorage(null)をセット。

    20. oldDocStateentrydocument stateとする。

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

      history policy container

      oldDocStatehistory policy containerclone

      request referrer

      oldDocStaterequest referrer

      request referrer policy

      oldDocStaterequest referrer policy

      origin

      oldDocStateorigin

      resource

      oldDocStateresource

      ever populated

      oldDocStateever populated

      navigable target name

      oldDocStatenavigable target name

    22. locationURLschemeHTTP(S) schemeでなければ:

      1. entrydocument stateresourceをnullにする。

      2. break

    23. currentURL = locationURL

    24. entryURLcurrentURLにセット。

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

    initiator origin

    requestcurrent URLorigin

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

    ならばnullを返す。
  21. resultPolicyContainer = ナビゲーションパラメータ用ポリシーコンテナ決定responseURLentrydocument statehistory policy containersourceSnapshotParamssource 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

    requestreserved client

    navigable

    navigable

    navigation timing type

    navTimingType

    fetch controller

    fetchController

    commit early hints

    commitEarlyHints


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

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

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

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

ナビゲーションタイミングエントリの作成string型の deliveryType引数(追加パラメータ)を受け取り、resource timing entryのセットアップへの追加引数として渡す。

4. Service Workerパッチ

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

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

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

5. Clear Site Dataパッチ

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

"prefetchCache"

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

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

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

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

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

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

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

    2. navigablenavigables内)について:

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

      2. activeDocumentoriginoriginsame originでなければ、continue

      3. prefetchRecordactiveDocumentprefetch records内)について:

        1. prefetchRecordprerendering traversableがnullでなければ、continue

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

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

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

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

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

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

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

  4. targetSnapshotParams = target snapshot paramsのスナップショット化documentnode navigable

  5. prefetchRecordsource partition keynetwork partition keyの決定documentrelevant settings object)でセット

  6. アサートprefetchRecordURLschemeHTTP(S) schemeである。

  7. 追加prefetchRecorddocumentprefetch recordsに追加。

  8. prefetchRecordstart time現在の高精度時刻documentrelevant global object)でセット

  9. prefetchステータス更新イベントの発火documentnode navigableprefetchRecord、"pending" ステータス)

  10. referrerPolicy = prefetchRecordreferrer policy が空文字列でなければそれ、そうでなければdocumentpolicy containerreferrer policy

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

    request referrer policy

    referrerPolicy

    initiator origin

    documentorigin

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

    URL

    prefetchRecordURL

    document state

    documentState

  13. request = ナビゲーションリクエスト作成 (entry, documentrelevant settings object, documentnode navigablecontainer, false)

  14. global = documentrelevant global object

  15. 並列で

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

      ここでprefetch時に使うnavigabledocumentnode navigable)は、活性化時(navigateアルゴリズム)で使うnavigableと異なる可能性があるが、問題はない。 ナビゲーション(活性化)時にターゲットnavigableで主要な判定が行われるため。

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

      また、アルゴリズム内でnavigationParamsは基本的にprefetchレスポンスのラッパー用途のみ。長期保存はされず、値がシステム外に漏れることはない。活性化時は、prefetch recordからナビゲーションパラメータ作成 により都度新規 paramsが生成され、適切なnavigableを含む。

    2. navigationParamsresponseprefetch非対応ならnavigationParamsをnullにする。

    3. prefetchRecordhad conflicting credentials がtrueならnavigationParamsをnullにする。

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

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

      2. アサートnavigationParamsresponseprefetchRecordredirect chainの 最終要素のresponseと一致すること。

      3. 完了(prefetchRecorddocument)の実行。

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

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

  3. statusokステータスでなければ falseを返す

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

103はokステータスでないが、early hintsはprefetchを妨げない。 このprefetch対応 判定は本応答(1xxステータスのないレスポンスのみに適用)。

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

7. クッキー

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

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

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

    1. cookieisolatedCookieStoreから削除する。

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

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

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

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

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

      1. topLevelOriginenvironmenttop-level originとする。

      2. もしtopLevelOriginがnullであれば、topLevelOriginenvironmenttop-level creation URLoriginを設定する。

      3. アサートtopLevelOriginoriginである。

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

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

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

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

    9. newCookiecookieのコピーとする。

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

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

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

      2. existingCookiecookieStoreから削除する。

    12. newCookiecookieStoreに挿入する。

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

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 prefetchRecordreferrer起点のナビゲーションプレフェッチを開始する状態を表します。
"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フィールドをnavigabletop-level traversablenavigable idに、urlフィールドをprefetchRecordURLに、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. イベントを発行する(引数はsessionbody)。

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

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

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

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

索引

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

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

参考文献

標準リファレンス

[CLEAR-SITE-DATA]
Mike West. Clear Site Data. URL: https://w3c.github.io/webappsec-clear-site-data/
[COOKIES]
A. Barth. HTTP State Management Mechanism. 2011年4月. Proposed Standard. URL: https://httpwg.org/specs/rfc6265.html
[CSP]
Mike West; Antonio Sartori. Content Security Policy Level 3. URL: https://w3c.github.io/webappsec-csp/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch Standard. Living Standard. URL: https://fetch.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; 他. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[NAVIGATION-TIMING-2]
Yoav Weiss; Noam Rosenthal. Navigation Timing Level 2. URL: https://w3c.github.io/navigation-timing/
The No-Vary-Search HTTP Response Header Field. Editor's Draft. URL: https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-no-vary-search
[PRERENDERING-REVAMPED]
Prerendering Revamped. Draft Community Group Report. URL: https://wicg.github.io/nav-speculation/prerendering.html
[REFERRER-POLICY]
Jochen Eisinger; Emily Stark. Referrer Policy. URL: https://w3c.github.io/webappsec-referrer-policy/
[RESOURCE-TIMING]
Yoav Weiss; Noam Rosenthal. Resource Timing. URL: https://w3c.github.io/resource-timing/
[RFC8610]
H. Birkholz; C. Vigano; C. Bormann. Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures. 2019年6月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8610
[RFC9651]
M. Nottingham; P-H. Kamp. Structured Field Values for HTTP. 2024年9月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc9651
[SECURE-CONTEXTS]
Mike West. Secure Contexts. URL: https://w3c.github.io/webappsec-secure-contexts/
[SERVICE-WORKERS]
Monica CHINTALA; Yoshisato Yanagisawa. Service Workers Nightly. URL: https://w3c.github.io/ServiceWorker/
[URL]
Anne van Kesteren. URL Standard. Living Standard. 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"型を使っている。現在他モジュールは参照できない。