プリレンダリングの刷新

ドラフトコミュニティグループレポート

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

概要

このドキュメントは、適切に仕様化されたプリレンダリングのための仕様パッチのコレクションを含みます。

この文書のステータス

この仕様はWeb Platform Incubator Community Groupによって公開されました。 これはW3Cの標準ではなく、またW3Cの標準化トラックにも乗っていません。 W3C Community Contributor License Agreement (CLA)のもとで、 限定的なオプトアウトが存在し、その他の条件も適用されます。 W3Cコミュニティおよびビジネスグループについて詳細をご確認ください。

1. 推測ルール

HTML § 7.6.1 Speculation rulesを以下のように変更してプリレンダリングをサポートする。

1.1. 構文解析

speculation rule set構造体を、追加で2つの要素を持つよう拡張する:

speculation rule構造体に、次の1つの要素を追加する:

parse a speculation rule set stringを次のように修正する:

実装では、§ 1.2 処理モデルの修正により、prerender候補をprefetchとして扱うこともできる。

parse a speculation ruleに次の手順を追加:
  1. targetHintをnullにする。

  2. input["target_hint"]が存在する場合:

    1. input["target_hint"]が有効なナビゲーブル名またはキーワードでない場合:

      1. ユーザーエージェントは、与えられたtarget hintが無効であることをコンソールに警告できる。

      2. nullを返す。

    2. targetHintinput["target_hint"]に設定する。

そして最後の段階でspeculation ruleを返す際にtarget navigable name hinttargetHintをセットするよう更新。

1.2. 処理モデル

prerender candidateは、次の要素を追加で持つspeculative load candidateである:

consider speculative loadsアルゴリズムを次のように早期離脱するよう修正: documentnode navigableprerendering navigableの場合。 (推測的にロードされたページ内で更なる推測的ロードを行うのは無駄が大きいため、という説明を付記する。)
inner consider speculative loads stepsアルゴリズムを、prefetchCandidates構築後の冒頭に以下を追加:
  1. prerenderCandidatesを空のリストとする。

  2. documentspeculation rule setsruleSetについて:

    1. (rules, shouldBlockScripts) in « (ruleSetprerender rules, false), (ruleSetprerender_until_script rules, true) »:

      1. rule in rules:

        1. url in ruleURLsに対して:

          1. referrerPolicy推測的ロードreferrer policyの計算rule、null)で得る。

          2. 追加:新規prerender candidate(以下を付与)をprerenderCandidates

            URL

            url

            No-Vary-Search hint

            ruleNo-Vary-Search hint

            eagerness

            ruleeagerness

            referrer policy

            referrerPolicy

            tags

            ruletags

            target navigable name hint

            ruletarget navigable name hint

            should block scripts

            shouldBlockScripts

        2. rulepredicateがnullでなければ:

          1. links = matching linksの検索documentrulepredicate

          2. link in linksについて:

            1. target = ruletarget navigable name hint

            2. targetがnullなら、要素のtarget取得link)でセット。

            3. referrerPolicy = 推測的ロードreferrer policyの計算rulelink

            4. 追加prerender candidate(下記)をprerenderCandidatesに追加:

              URL

              linkurl

              No-Vary-Search hint

              ruleNo-Vary-Search hint

              eagerness

              ruleeagerness

              referrer policy

              referrerPolicy

              tags

              ruletags

              target navigable name hint

              target

              should block scripts

              shouldBlockScripts

  3. speculativeLoadCandidatesprefetchCandidatesprerenderCandidatesの和集合とする。

後続の、「もはや推測中でないprefetch record」をキャンセルする処理はspeculativeLoadCandidatesに対して行うこと。

prerenderCandidateGroupsリストをprefetchCandidateGroupsと同様に(ただしprefetchCandidatesの代わりにprerenderCandidatesを使って)作成。

実際のprefetch処理(従来はprefetchCandidateGroupsをループ)の箇所を以下に置換:

  1. speculativeLoadCandidateGroupsprefetchCandidateGroupsprerenderCandidateGroupsの和集合とする。

  2. group in speculativeLoadCandidateGroupsについて:

    1. ユーザーエージェントは次の手順を行ってもよい:

      1. candidate = group[0]

      2. tagsToSend = speculative load candidateたちからタグを集めるgroupで実行

      3. prefetchRecord = 新規prefetch record(以下設定)

        source

        "speculation rules"

        URL

        candidateURL

        No-Vary-Search hint

        candidateNo-Vary-Search hint

        referrer policy

        candidatereferrer policy

        tags

        tagsToSend

      4. candidateprefetch candidateなら、 prefetchRecordanonymization policycandidateanonymization policyをセット

      5. candidateprerender candidateなら、次を実行してもよい:

        1. prefetchRecordprerendering traversable に "to be created" をセット

        2. prefetchRecordprerendering target navigable name hintcandidatetarget navigable name hintをセット

        3. referrer起点のナビゲーションプリレンダ開始document, prefetchRecord, candidateshould block scripts)を実行

      6. 前段を実行しなかった場合はreferrer起点のナビゲーションプレフェッチ開始documentprefetchRecord)を実行。

      (以降、その"may"実行タイミングに関する説明文は維持)

1.3. トリガー

属性変更手順を、 a および area 要素について target 属性も監視し、この属性が変更された場合 推測的ロードの考慮 を実行するようにする。

2. プリレンダリング基盤

2.1. Document インタフェースへの拡張

[HTML]で定義される Document を次のように変更する:

partial interface Document {
    readonly attribute boolean prerendering;

    // "Document" オブジェクトにのみ適用される特殊イベントハンドラーIDL属性の下
    attribute EventHandler onprerenderingchange;
};

onprerenderingchange 属性は、 イベントハンドラーIDL属性であり、prerenderingchange イベントハンドラーイベントタイプに対応する。(HTMLの該当テーブル—現状 onreadystatechange のみ—を追記する。)

[HTML]の流儀に従い prerendering の定義本体は別セクションに配置。これを以下新設セクションに置く:

2.2. プリレンダリングナビゲーブル

このセクションはHTMLの [HTML]Navigables 節に新規追加

すべてのnavigableは、 loading mode(以下のいずれか)を持つ:

"default"

この navigable にロードされたコンテンツには特別な扱いなし

"prerender"

この navigable はプリレンダ済みのコンテンツを表示している

デフォルトではnavigableloading modeは"default"。 loading modeが"prerender"のnavigableは、prerendering navigableと呼ぶ。 prerendering navigableかつ top-level traversableなものをprerendering traversableと呼ぶ。

prerendering navigableアクティブブラウジングコンテキスト補助ブラウジングコンテキストとなることはない。

loading modeの値は2つのみだが、将来fenced frameやportals、uncredentialed(クロスサイト)prerendering等で拡張しやすい構造で設計済。機能標準化が進み不要ならboolに単純化予定。

すべてのnavigablescripting mode(以下のいずれか)も持つ:

"enabled"

スクリプトは通常どおり実行される

"blocked-until-activation"

navigableが活性化されるまでスクリプトはブロックされる

デフォルトでnavigablescripting modeは"enabled"。

scripting modeはnavigableのプロパティでありdocumentには属さない。これにより同じnavigable内でのナビゲーションでも属性が保存される。about:blankの初期documentや活性化前リダイレクトに重要。

すべてのprerendering traversableprerender初期応答search varianceを持つ。これはURL search varianceかnull(初期値はnull)。

document.prerendering

そのページが非対話的プリレンダリング文脈で表示されていればtrueを返す。

この値はtrue→falseとなりうる。その際Documentprerenderingchange イベントが発火する(再びtrueになることはない)。

prerenderingのgetter手順は、thisが非nullの node navigableを持ち、それがprerendering navigableであればtrue、さもなくばfalseを返す。


すべてのDocumentpost-prerendering activation steps list を持ち、その内容はリスト であり、各要素はアルゴリズム手順列。任意のプラットフォームオブジェクトplatformObjectpost-prerendering activation steps listは次とする:

もしplatformObjectノード
  1. platformObjectノードドキュメントpost-prerendering activation steps listを返す。

その他
  1. アサート:platformObjectrelevant global objectWindow オブジェクトである。

  1. platformObjectrelevant global object関連付けられたDocumentpost-prerendering activation steps listを返す。

すべてのDocumentactivation start timeを持つ。初期値は時刻0の DOMHighResTimeStamp である。

すべてのDocumentallow cross origin iframes navigation while prerenderingを持ち、これはboolean で初期値は false。

2.3. プリレンダリングアルゴリズム

ユーザーエージェントは、リファラードキュメントなしでプリレンダリングを開始してもよい。例えばアドレスバーや他のブラウザー操作の結果として実施される場合がある。

次の手順で ユーザーエージェント主導プリレンダリングの開始 を行う:URL startingURLを与える。

  1. アサート: startingURLスキームHTTP(S) schemeである。

  2. prerenderingTraversable新規トップレベルtraversableの作成(引数nullと空文字列)で得る。

  3. prerenderingTraversableloading modeを"prerender"にセットする。

  4. prefetchRecordを新規prefetch recordとして、URLstartingURLanonymization policyをnull、 referrer policyを空文字列、 No-Vary-Search hintdefault URL search variancesourceを"browser UI"、 prerendering traversableprerenderingTraversable とする。

  5. referrer起点ナビゲーションプレフェッチ開始prerenderingTraversableactive documentprefetchRecordで呼び出す。

  6. navigate prerenderingTraversable to startingURL using prerenderingTraversableactive document

    この最初のナビゲーションはprerenderingTraversable自身によって実行され、関連する全てのセキュリティチェックが実行されることを保証する。

  7. ユーザーがactivationURLへのナビゲーションコミットを希望した場合、そのactivationURLについて prefetchRecordが該当URLとして一致する場合:

    1. ユーザーが新しいユーザー可視なトップレベルtraversableを作成希望の場合 (例:アドレスバー入力後にShift+Enter

      1. 後継の活性化更新prerenderingTraversablestartingURLactivationURL)を呼ぶ

      2. UIをprerenderingTraversableを表示するUIに更新(例:新しいタブ/ウィンドウ作成)

      3. 活性化の完了 (prerenderingTraversable, startingURLorigin)

    2. ユーザーが既存のtop-level traversable predecessorTraversableへコミット希望の場合(例:アドレスバー入力後にEnter

      1. 活性化 prerenderingTraversablepredecessorTraversableの場所で "push", startingURL, activationURL 与えて実行

ユーザーがこのようなコミット指示を出さない場合や遅れる場合、ユーザーエージェントがプリレンダリソースを即時タスク等で回収できる。 その場合prerenderingTraversabledestroyされうる。

referrer起点ナビゲーションプリレンダ開始 (Document referrerDoc, prefetchRecord prefetchRecord, boolean blockScripts):
  1. アサート: prefetchRecordURLschemeHTTP(S) schemeである。

  2. もしreferrerDocnode navigabletop-level traversableでなければreturn。

    現在、子ナビゲーブル内でのプリレンダリングは未仕様・未実装。

  3. もしreferrerDocbrowsing context補助ブラウジングコンテキストならreturn

    これによりプリレンダとreferrerDocのopener関係問題を回避。

  4. もしreferrerDocoriginprefetchRecordURLoriginsame site でなければreturn

    現時点でクロスサイトプリレンダは仕様化もされていない。

  5. もしreferrerDocprefetchRecordについて checkPrerender有効で 一致するprefetch recordを持つならreturn

  6. アサート: prefetchRecordprerendering traversableは"to be created"

  7. prerenderingTraversable新規トップレベルtraversable作成の結果とする。

    ユーザーエージェントはprefetchRecordprerendering target navigable name hintをヒントとして利用可。

    これはただのヒントであり規範的意味はない。

  8. prerenderingTraversableloading modeを"prerender"にセット

  9. blockScriptsがtrueならprerenderingTraversablescripting modeを "blocked-until-activation"にセット

  10. prefetchRecordprerendering traversableprerenderingTraversableにセット

  11. prerenderingTraversableremove from referrerprefetchRecordprerendering traversableをnullにするアルゴリズムにセット。

    top-level traversable同様、prerendering traversableは いつでもdestroyされ得る。destroyされた場合でもprefetch record自体は残り将来ナビゲーション転用可能。

  12. referrer起点ナビゲーションプレフェッチ開始referrerDoc, prefetchRecord

  13. navigate prerenderingTraversable to prefetchRecordURL using referrerDoc referrerPolicyprefetchRecordreferrer policy

活性化のため後継更新 を行う(prerendering traversable successorTraversableURL startingURLURL activationURLを与える):

  1. successorDocument = successorTraversableactive document

  2. もしstartingURL = successorDocumentURLかつ startingURLactivationURL なら:

    1. アサートsuccessorDocumentURLの書き換え可能である

    2. navigation = successorDocumentrelevant global objectnavigation API

    3. continue = push/replace/reload navigateイベント発火 (navigation, "replace", activationURL, true)

    4. もしcontinueがtrueならURLと履歴更新 (successorDocument, activationURL)を実行

    No-Vary-Search等によるURL不正確一致の場合に、プリレンダURLと実際ナビゲーション先URLを一致させる。

活性化prerendering traversable successorTraversabletop-level traversable predecessorTraversableの場所で、history handling behavior historyHandlingURL startingURLURL activationURL、 オプションでnavigation ID navigationIdも可)

  1. アサートsuccessorTraversableactive documentinitial about:blankかはfalse。

  2. navigationId未指定ならランダムUUID生成でセット

  3. referrerOrigin = predecessorTraversableactive documentorigin

  4. predecessorTraversableongoing navigationnavigationIdにセット

    これにより他のナビゲーションをabortする効果がある

  5. 並列で次を実行:

    1. unloadPromptCanceled = アンロードがユーザーにキャンセルされたか確認predecessorTraversableactive document包含descendant navigablesについて)

    2. もしunloadPromptCanceledがtrue、あるいはpredecessorTraversableongoing navigationnavigationIdでなくなったら中断。

    3. グローバルタスクをキューnavigation and traversal task sourcepredecessorTraversableactive window)で abort predecessorTraversableactive documentを実行

    4. 活性化のため後継更新を(successorTraversablestartingURLactivationURL)で実行

    5. セッション履歴トラバース手順の追加predecessorTraversableに対し、以下実行:

      1. アサートsuccessorTraversablecurrent session history stepは0

      2. アサートsuccessorTraversablesession history entriessizeは1

      3. successorEntry = successorTraversablesession history entries[0]

      4. 削除 successorEntrysuccessorTraversablesession history entriesから。

        この時点でsuccessorTraversableは空になり観測不能なdestroyが可能。 (ただしsuccessorEntryやそのdocument/browsing context等は以降用に生存させてよい)

      5. クロスドキュメントナビゲーション完了 (predecessorTraversable, historyHandling, successorEntry)

        session history entryまるごと移動するので履歴トラバース時にブラウジングコンテキストグループも切り替わる。 opener関係もCOOPと同様切断される。

      6. UIもタブ/ウィンドウ内容やchrome等の変更を反映

      7. 活性化完了successorTraversablereferrerOrigin

      8. WebDriver BiDiとの連携は現状未仕様。ブラウザ実装時注意

活性化の完了 (トップレベルtraversable traversableorigin originを与える):
  1. navigable in traversableactive document包含descendant navigablesについて グローバルタスクをキューnavigation and traversal task sourcenavigableactive windowを与えて実行:

    1. originhintSet in navigableprerender-scoped Accept-CH cache:

      1. セット Accept-CH cache[origin]=hintSet

    2. もしnavigablescripting modeが "blocked-until-activation" なら:

      1. navigablescripting modeを "enabled"に

      2. navigableactive documentのスクリプト実行を解除

      スクリプト再開およびキュー済タスク再処理仕様詳細は要記述。

    3. doc = navigableactive document

    4. ここでloading mode遷移の伝搬が必要。現状traversable上にあるがdocumentにもたせてイベント発火等要検討。

    5. もしdocoriginoriginと同じなら docactivation start timedocrelevant global objectcurrent high resolution timeにセット

    6. イベント発火 prerenderingchangedoc宛に発火

    7. steps in docpost-prerendering activation steps list:

      1. stepsを実行

        Promise等何かを返しても無視可能

      2. アサート:steps実行で例外投げていない

      同一イベントループのDocument間では順序観測可能だが、異なる場合は順序化不能。

prerendering traversableには remove from referrer が紐付く(nullまたは引数なしアルゴリズム、初期値null)。

prerendering traversabledestroyされた際、参照を確実にクリアするため、destroy a top-level traversableの末尾に以下を追加:

  1. traversableprerendering traversableかつ traversableremove from referrerがnullでないなら、それを呼ぶ。

2.4. ナビゲーブル作成の修正

子ナビゲーブルがchild navigablesで、loading modeを継承することを保証するため、create a new child navigableの最後に次のステップを追加:
  1. navigableloading modeelementnode navigableloading modeに設定する。

一致するプリレンダ済みプレフェッチレコードの検索Document predecessorDocumentURL urlについて行うアルゴリズム:
  1. recordToUseをnullにする。

  2. record in predecessorDocumentprefetch recordsに対して:

    1. recordprerendering traversableprerendering traversableでなければcontinue

    2. recordprerendering traversableactive documentis initial about:blankがtrueならcontinue

    3. recordURLurlと等しい場合:

      1. recordToUse = record

      2. Break

    4. recordToUseがnullでrecordurlis expected to match a URLなら:

      1. recordToUse = record

  3. recordToUseがnullでなければ:

    1. Remove recordToUse from predecessorDocumentprefetch records

  4. recordToUseを返す。

一致するプリレンダ済みプレフェッチレコードの待機 (navigable navigable, URL url, string cspNavigationType, POST resource/string/null documentResource):
  1. アサート:これは並列で動作している。

  2. 次のいずれかに該当すれば:

    ならnullを返す

  3. predecessorDocumentnavigableactive documentとする。

  4. cutoffTimeをnullにする。

  5. 繰り返し:

    1. completeRecord = 一致するプリレンダ済みプレフェッチレコードの検索 (predecessorDocument, url)

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

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

    4. record in predecessorDocumentprefetch recordsについて:

      1. 全て次を満たせばpotentialRecordsrecordappend

    5. potentialRecordsならnullを返す

    6. predecessorDocumentprefetch recordsの任意の要素の prerendering traversableongoing navigationが 変化するまで待機

    7. cutoffTimeがnullでpotentialRecordsprerendering traversableactive documentis initial about:blankがfalseな要素があれば、 cutoffTimepredecessorDocumentrelevant global objectcurrent high resolution time で設定

navigateアルゴリズムを修正し、通常ナビゲーションの場所でprerendering traversableの活性化 を許可:以下の手順を並列に入った直後に追加:

navigateの中で、次の手順を並列ブロック直後に挿入:
  1. record = 一致するプリレンダ済みプレフェッチレコードの待機 (navigable, url, cspNavigationType, documentResource)

  2. recordがnullでなければ:

    1. matchingPrerenderedNavigable = recordprerendering traversable

    2. startingURL = recordURL

    3. 活性化(matchingPrerenderedNavigable, navigable, historyHandling, startingURL, url, navigationId)

    4. この手順を中止。

create navigation params by fetchingの冒頭付近に次を追加:
  1. initiatorOriginentrydocument stateinitiator originとする。

アルゴリズムの"While true:"の最初のサブステップ直後に次も追加:

  1. もしnavigableprerendering navigableかつcurrentURLorigininitiatorOriginsame siteでなければ:

    1. もしnavigabletop-level traversableならnullを返す。

    2. そうでなければ、navigabletop-level traversableactive documentallow cross origin iframes navigation while prerenderingが falseなら、ユーザーエージェントはnavigableloading mode が"normal"になるまで待つ。 (この待ち中、または直ちにdestroyしてnullを返してもよい)

アルゴリズム終盤、locationURLチェック後に次の手順も追加:

  1. もしnavigableprerendering navigableで、responseOrigininitiatorOriginsame originでなければ:

    1. loadingModes = getting the supported loading modes/response

    2. loadingModesに `credentialed-prerender`が含まれなければnullを返す。

      将来的にはuncredentialed-prerenderも許容し得るが、現状クロスサイト用途でまだ仕様等もないため除外。

create and initialize a Document objectで 「navigationParamsのresponseにRefreshヘッダー」の直後に次追加:
  1. もしnavigationParamsnavigableprerendering navigableなら:

    1. loadingModes = getting the supported loading modes / response

    2. loadingModesが `prerender-cross-origin-frames` を含めばdocumentallow cross origin iframes navigation while prerenderingをtrueにする

attempt to populate the history entry’s documentにて、 failureの値決定直後で、かつその後の処理前に以下追加:
  1. もしnavigableprerendering navigableで以下いずれかなら:

    なら:

    1. Destroy navigabletop-level traversable

    2. return

  2. navigableprerendering traversableかつ navigableprerender initial response search varianceがnullなら:

    1. navigableprerender initial response search varianceobtaining a URL search variance(navigationParamsresponse)でセット

hand-off to external softwareの冒頭に次を追加:
  1. もしnavigableprerendering navigableなら外部ソフト呼び出しをせずreturn

リダイレクト時もプリレンダ活性化を認めることも可能だが、現状複雑化防止・未実装のため割愛。

3.3. 単純なセッション履歴の維持

navigateアルゴリズムを修正し、prerendering navigableのセッション履歴が常に単純であるように、全ての他の手順の前に次のステップを追加する:
  1. もしnavigableprerendering navigableなら、 historyHandlingを"replace"に設定する。

URL and history update stepsを修正し、1ステップ目の直後に次の手順を追加:
  1. もしnavigableprerendering navigableなら、 historyHandlingを"replace"に設定する。

3.4. ワーカーのライフタイムとの相互作用

The worker’s lifetimeにて、active needed workerの定義を修正し、prerendering navigableのownerを持つワーカーをactiveとみなさない:

ワーカーは次のいずれかのownerを持つ場合active needed workerであると言う: Document オブジェクトがfully activeかつ、そのnode navigableprerendering navigableでない場合、または active needed workersである。

このため、ワーカーのスクリプトはロードされるが、documentが活性化されるまで実行は保留される。

3.5. Document破棄時のクリーンアップ

destroyアルゴリズム(Document対象) の末尾に次の処理を追加:

  1. 空にする documentpost-prerendering activation steps list

4. 他の仕様・概念との相互作用

4.1. Page Visibilityとの相互作用

prerendering navigables内のDocumentは必ずvisibility stateが"hidden"となる。

おそらく明示的にこの状態の更新が必要。document.prerenderingの扱いと同様。

4.2. システムフォーカスとの相互作用

prerendering traversablesは決してシステムフォーカスを持たない。

4.3. PerformanceNavigationTiming インタフェースへの拡張

PerformanceNavigationTiming インタフェースを次のように拡張:

partial interface PerformanceNavigationTiming {
    readonly attribute DOMHighResTimeStamp activationStart;
};

activationStart のgetter手順は:

  1. thisrelevant global objectassociated Documentactivation start timeを返す。

4.4. Client Hint Cacheとの相互作用

Accept-CH cacheはユーザーエージェントがグローバルに持つストレージであるが、prerendering中は変更しないようにし、活性化後に正しく反映させる必要がある。以下の修正でこれを保証する。

prerendering navigableprerender-scoped Accept-CH cacheを持ち、これはordered maporiginからclient hints setsへのマップ)である。

これはoriginごとにどのclient hintsをopt-inしたかを格納し、活性化時にグローバルAccept-CH cacheにコピーされる。

update the client hints set from cache アルゴリズムの2番目の手順を次のように置換:
  1. navigablesettingsObjectglobal objectnavigableとする。

  2. originMatchingEntriesAccept-CH cacheのうちsettingsObjectoriginsame originとなるもの群とする。

  3. もしnavigableprerendering navigableなら:

    1. prerenderAcceptClientHintsCachenavigableprerender-scoped Accept-CH cacheとする。

    2. originsettingsObjectoriginとする。

    3. もしprerenderAcceptClientHintsCache[origin]が存在すれば、originMatchingEntriesprerenderAcceptClientHintsCache内のoriginsame originとなるもの群とする。

create or override the cached client hints setの最後の手順を以下で更新:
  1. navigablesettingsObjectglobal objectnavigableとする。

  2. もしnavigableprerendering navigableならセット navigableprerender-scoped Accept-CH cache[origin] = hintSetとする。

  3. それ以外はセット Accept-CH cache[origin] = hintSet

4.5. Clear Site Dataとの相互作用

Clear Site Data § 3.1 The Clear-Site-Data HTTP Response Header Fieldに次のヘッダー値の説明を追加:

"prerenderCache"

"prerenderCache"タイプは、特定originから発生した任意のプリレンダを、responseURLに基づき、サーバが削除希望を指示することを示す。

このタイプは"cache"タイプのサブセットである。

実装詳細は下記参照。

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

clear site data for responseのswitch分岐に "prerenderCache" を処理し、clear prerender cacheoriginに対して呼ぶケースを追加。

prerender cacheのクリアorigin originを取る):
  1. ユーザーエージェントのtop-level traversable set中の top-level traversable traversableについて:

    1. navigablestraversableactive document包含descendant navigablesとする。

    2. navigable in navigablesについて:

      1. activeDocumentnavigableactive documentとする。

      2. もしactiveDocumentoriginoriginsame originでなければcontinue

      3. prefetchRecord in activeDocumentprefetch recordsについて:

        1. prefetchRecordprerendering traversable がnullならcontinue

        2. キャンセル・廃棄 prefetchRecordactiveDocumentを与える)

4.6. Fetchとの相互作用

HTTP-network-or-cache fetchを修正し、既存の `Sec-Purpose`設定処理の後に次のステップを追加:
  1. それ以外で、httpRequestclientenvironment settings objectで、かつ そのglobal objectWindowで、 さらにそのWindownavigableprerendering navigableなら:

    1. purposeListを新規作成し、Token prefetchを格納する。

    2. prefetchトークンに、キー"prerender"、値trueパラメータを追加する。

    3. 構造化フィールド値のセットを (`Sec-Purpose`, purpose)でhttpRequestheader listに実行。

    これはprerendering navigable内のサブリソースや、prerendering navigable自身のナビゲーション双方に適用される。

5. `Supports-Loading-Mode` HTTPレスポンスヘッダー

このセクションは[HTML]Loading web pages節の下位項目として追加。

場合によっては、クロスオリジンのWebページが新しい文脈でロードされる準備ができていないことがある。それらがそのような方法でのロードを許可するために、`Supports-Loading-Mode` HTTPレスポンスヘッダーが利用できる。このヘッダーは構造化ヘッダーであり、設定時には下記リストのtokenの1つ以上でなければならない。

実際のパースはlist of tokenとして行われ、不明なtokenは無視される。

`credentialed-prerender` トークンは、レスポンスがクロスオリジン同一サイトreferrer起点のprerendering navigable作成に利用可能であることを示す。 これがなければ、§ 3.2 ナビゲーション取得の変更にあるように、そのようなプリレンダは失敗する。

`prerender-cross-origin-frames` トークンは、レスポンスが全クロスオリジンiframeのプリレンダに使用可能であることを示す。これがなければ、該当プリレンダは§ 3.2 ナビゲーション取得の変更通り遅延される。

get the supported loading modes for response responseの手順:

  1. もしresponsenetwork errorなら空リストを返す。

  2. slmHeader構造化フィールド値の取得で `Supports-Loading-Mode`, "list"をresponseheader listから得る。

  3. slmHeaderからlistを作成し、そのうち要素がtokenであるもの全てを返す。

6. 望ましくない(侵入的な)挙動の防止

プリレンダ中のprerendering navigableでは、ユーザーにとって侵入的となるため種々の挙動が禁止される。

6.1. スクリプト実行の一時停止

navigablescripting modeが"blocked-until-activation"の場合、ユーザーエージェントはそのnavigableのactive documentに対してスクリプトを実行してはならない。これは<script>要素の実行も含むが、それに限らない。

スクリプト実行のブロック方法や関連タスクのキューイング方法など、詳細仕様は今後明確にする必要あり。

この仕様により、ページが活性化されるまでJavaScript実行が完全に停止される。インラインイベントハンドラーの扱いについては議論中。

6.2. リソースのダウンロード

download the hyperlinkアルゴリズムを修正し、prerendering navigable内でのダウンロードは活性化まで遅延されるよう、並列処理直前に次を挿入:

  1. もしsubjectnode navigableprerendering navigableなら、そのsubjectpost-prerendering activation steps listに処理を追加してreturn。

6.3. ユーザープロンプト

cannot show simple dialogsアルゴリズムをWindow windowに対し、最初の手順として次を追加:
  1. もしwindownavigableprerendering navigableなら、trueを返す。

print() メソッドの手順冒頭に次を追加:
  1. thisnavigableprerendering navigableならreturn。

6.4. 非同期API結果の遅延

多くの仕様は、prerendering navigable内でアルゴリズムが呼ばれた場合、navigableのtop-level traversable活性化されるまで処理の大半を保留するよう修正が必要である。多くの仕様はイベントループの利用設計が未整理であり一律記述は難しいが、以下に指針を示す。

スクリプトモードが"blocked-until-activation"なら、そのアルゴリズムを呼ばせるスクリプト自体が活性化まで実行されないことに注意。

6.4.1. [DelayWhilePrerendering] 拡張属性

非同期メソッドの挙動を活性化まで遅延する定型ロジックを抽象化するため、[DelayWhilePrerendering] Web IDL拡張属性を導入する。 これは、prerendering navigable内でメソッドが呼ばれた場合、pending promiseを即returnし実処理を行わない。活性化時に本来の処理を実行し、戻り値でpromiseをresolve/rejectする。

[DelayWhilePrerendering] 拡張属性は引数なし・ regular operationまたはstatic operation で、return typepromise typeまたはundefinedexposure setWindowのみでなければならない。

[DelayWhilePrerendering] 注釈付きoperationの手順は以下に置換:
  1. realmcurrent realmとする。

  2. もしoperationがregular operationなら、realm = relevant realm of this

  3. もしrealmglobal objectnavigableprerendering navigableなら:

    1. promiserealm新規Promiseとして作成。

    2. thispost-prerendering activation steps listに次ステップ追加:

      1. result = 本来指定されていたoperation手順を同じthisと引数で実行した結果

      2. resolve promise with result

    3. このoperationのreturn typepromise typeならpromiseを返す。

  4. さもなくば本来指定されていた手順をもとのthisと引数で実行した結果を返す。

6.4.2. Service Workers

[DelayWhilePrerendering]update()unregister()register(scriptURL, options)postMessage(message, transfer)postMessage(message, options) に追加する。

これにより、プリレンダページが既存Service Workerの利用はできても、Service Worker登録状態自体は変化しない。

6.4.3. BroadcastChannel

[DelayWhilePrerendering]postMessage() に追加する。

6.4.4. Geolocation API

getCurrentPosition() メソッドの手順の先頭に次のステップを追加:
  1. もしthisrelevant global objectnavigableprerendering navigableであれば、thispost-prerendering activation steps listに以下の手順を追加し、return する。

watchPosition() メソッドの手順の先頭に次のステップを追加:
  1. もしthisrelevant global objectnavigableprerendering navigableであれば:

    1. watchId実装依存unsigned long とし、post-prerendering activation geolocation watch process IDとして記録する。

    2. thispost-prerendering activation steps listに以下の手順を追加し、その際生成されたwatchIdをIDとして使用し、watchIdを返す。

clearWatch(watchId) メソッドの手順の先頭に次のステップを追加:
  1. もしthisrelevant global objectnavigableprerendering navigableであれば:

    1. もしwatchIdpost-prerendering activation geolocation watch process IDであれば、対応する手順をthispost-prerendering activation steps listから削除する。

    2. return。

6.4.5. Web Serial API

[DelayWhilePrerendering]requestPort() に追加する。

TODO: 以下は [DelayWhilePrerendering] を dedicated worker 内で owner document を使うよう一般化すれば実装可能。

getPorts() メソッドの手順で、promise生成直後に次の手順を挿入:
  1. documentthisrelevant global objectassociated Document (もしthisrelevant global objectWindowであれば)、または thisrelevant global objectのowner document(DedicatedWorkerGlobalScopeなら)とする。

  2. もし document が null なら、promise rejected with "SecurityError" DOMException を返す。

  3. もし documentnode navigableprerendering navigableであれば、documentpost-prerendering activation steps listに手順を追加し、promiseを返す。

6.4.6. Notifications API

[DelayWhilePrerendering]requestPermission() に追加する。

Notification() コンストラクタの手順で、in parallelとなっていた手順を次のように置換:
  1. もしthisrelevant global objectnavigableprerendering navigableならthispost-prerendering activation steps listにこれら手順を追加。さもなくば元通りin parallelとして実行。

permission 静的getterの手順を次で置換:
  1. もしcurrent global objectnavigableprerendering navigableなら、"default" を返す。

    これにより実際の許可状態の同期取得を回避できる。活性化後に Notification.requestPermission()を呼ぶことで、上記修正により初めて実処理がなされる。その時点で"granted"や"denied"となる可能性もあるが、ユーザーへのUIは表示されないかもしれない。しかしこれはWeb開発者のコードからは観測不能で問題ない。

  2. さもなくば get the notifications permission state を実行してその値を返す。

6.4.7. Web MIDI API

[DelayWhilePrerendering]requestMIDIAccess() に追加する。

6.4.8. Idle Detection API

[DelayWhilePrerendering]start() に追加する。

もう1つの重要なメソッドIdleDetector.requestPermission()transient activationでゲートされている。ただしすでにoriginの許可があっても、prerendering中はidle detectorの開始は遅延される。

6.4.9. Generic Sensor API

start() メソッドの手順で、状態を"activating"にセットした直後に次を挿入:
  1. もしthisrelevant global objectnavigableprerendering navigableであれば、thispost-prerendering activation steps listに手順を追加し、return。

  2. もしthis.[[state]] が"idle"ならreturn。

    prerendering遅延中にstop()が実行されていれば、活性化時に何もしないことを保証。

  3. Assert: this.[[state]] は"activating"である。

6.4.10. Web NFC

[DelayWhilePrerendering]write() およびscan() に追加する。

6.4.11. Battery Status API

getBattery()メソッドの手順の先頭に次の手順を追加:
  1. もしthisrelevant global objectnavigableprerendering navigableであれば、thispost-prerendering activation steps listに手順を追加し、this.[[BatteryPromise]]を返す。

6.4.12. Screen Orientation API

apply orientation lockアルゴリズムの最初の並列処理前までの手順を次で上書き:
  1. promiseを新しいpromiseとする。

  2. もしthisrelevant global objectnavigableprerendering navigableであれば、thispost-prerendering activation steps listに手順を追加しpromiseを返す。

  3. もしuser agentが画面の向きロックをサポートしないなら、reject promise with "NotSupportedError" DOMExceptionを投げてpromiseを返す

  4. もしdocumentactive sandboxing flag setsandboxed orientation lock browsing context flagを持つか、user agentpre-lock conditionsを満たさないなら、 reject promise with "SecurityError" DOMExceptionを投げてpromiseを返す

  5. documentの[[orientationPendingPromise]]にpromiseをセット

[DelayWhilePrerendering]unlock() に追加する。

この修正により、screen.orientation.lock() の直後に screen.orientation.unlock() が呼ばれた場合にも期待通りの挙動になる。

6.4.13. Gamepad

getGamepads() メソッドの手順の先頭に次を追加:
  1. もしthisrelevant global objectnavigableprerendering navigableであれば空のsequenceを返す。

gamepadconnectedgamepaddisconnected イベントに関する説明を修正し、Windowオブジェクトのnavigableprerendering navigableの場合はユーザーエージェントがこれらのイベントをdispatchしないことを明記する。

gamepadconnected セクションを修正し、各Document documentpost-prerendering activation steps listに以下を追加する:
  1. もしdocumentが"gamepad"機能のallowed to useであり、documentrelevant settings objectsecure contextで、かつgamepadが一つでも接続されていれば、接続されている各gamepadについてgamepadconnectedイベントをdocumentrelevant global objectに対しGamepadEventを用いて発火し、 gamepad 属性は接続中gamepadを示す新規Gamepad オブジェクトで初期化する。

6.4.14. Encrypted Media Extensions

[DelayWhilePrerendering]requestMediaKeySystemAccess() に追加する。

6.4.15. Media Autoplay

playing the media resource セクションを修正し、 HTMLMediaElementcurrent playback positionDocumentprerendering でない場合のみ単調増加することを明記する。

6.4.16. Media Capture and Streams

[DelayWhilePrerendering]getUserMedia()getUserMedia() および enumerateDevices() に追加する。

MediaDevices セクションで、device change notification stepsの先頭に次を追加:
  1. もしthisrelevant global objectnavigableprerendering navigableならreturn。

6.4.17. Web Audio API

allowed to startという概念は仕様内で使われているが詳細は実装依存とされている。 プリレンダ中の自動再生を制限するため、AudioContext インタフェースセクションに以下ルールを追加:

AudioContext はプリレンダ中はallowed to startにならない。

また、AudioContext() コンストラクタの返却直前に以下の手順を追加:

  1. プリレンダによってcontextallowed to startになっていない場合、contextpost-prerendering activation steps listに以下を追加:

    1. context[[control thread state]]runningへセット

    2. control messageをキューcontextをresume

プリレンダ時にresume() を呼ぶ開発者もいることがある。その場合contextはallowed to startにならず、promiseは[[pending resume promises]]に格納される。 このpromiseは活性化時に上記手順でresolveされる。

AudioScheduledSourceNode インタフェースのstart(when)メソッドや AudioBufferSourceNodestart(when, offset, duration)メソッドも [[control thread state]]に影響する可能性があるが、 contextがallowed to startではないため、該当アルゴリズムが [[control thread state]]をセットしない。contextが始動すればnodeも自動始動できるので問題はない。

6.4.18. Audio Output Devices API

[DelayWhilePrerendering]selectAudioOutput() に追加する。

6.4.19. Push API

[DelayWhilePrerendering]subscribe() に追加する。

6.4.20. Background Fetch

[DelayWhilePrerendering]fetch() に追加する。

6.4.21. Background Sync

[DelayWhilePrerendering]register() に追加する。

6.4.22. Storage API

[DelayWhilePrerendering]persist() に追加する。

6.4.23. WebUSB API

[DelayWhilePrerendering]getDevices() および requestDevice() に追加する。

6.4.24. Web Bluetooth

[DelayWhilePrerendering]getDevices() および requestDevice() に追加する。

6.4.25. WebHID API

[DelayWhilePrerendering]getDevices() および requestDevice() に追加する。

6.4.26. WebXR Device API

[DelayWhilePrerendering]requestSession() に追加する。

6.4.27. Credential Management

[DelayWhilePrerendering]get()store()create() に追加する。

6.4.28. Web Speech API

[DelayWhilePrerendering]speak(utterance)cancel()pause()resume() に追加する。

[DelayWhilePrerendering]start()stop()abort() に追加する。

6.4.29. Web Locks API

[DelayWhilePrerendering]request(name, callback)request(name, options, callback)query() に追加する。

6.4.30. カスタムスキームハンドラー

registerProtocolHandler(scheme, url) メソッドの最初の並列前までの手順を次のように上書き:
  1. (normalizedScheme, normalizedURLString)をnormalize protocol handler parametersの(scheme, url, thisrelevant settings object)で取得する。

  2. もしthisrelevant global objectnavigableprerendering navigableなら、thispost-prerendering activation steps listに手順を追加してreturn。

unregisterProtocolHandler(scheme, url) メソッドの最初の並列前までの手順を次のように上書き:
  1. (normalizedScheme, normalizedURLString)をnormalize protocol handler parameters (scheme, url, thisrelevant settings object)で取得する。

  2. もしthisrelevant global objectnavigableprerendering navigableなら、thispost-prerendering activation steps listに手順を追加してreturn。

6.5. 暗黙的に制限されるAPI

いくつかのAPIは修正不要です。なぜならprerendering navigableやそのactive windowactive documentが絶対に持たない特性が必須条件のため、自動的に失敗またはno-opになります。これらの特性には次が含まれます:

どのAPIを検査済みか明示するため、ここに既知APIを一覧します。

一時的アクティベーション または スティッキーアクティベーション 必須API:

システムフォーカス必須API:

"visible"な visibility state が必須なAPI:

より複雑なケース:

7. セキュリティに関する考慮事項

HTML § 7.6.5 Security considerationsを参照。

No-Vary-Search連携については、No-Vary-Search Security considerationsも参照。

プリレンダ固有のセキュリティ考慮事項追記要。 issue #319参照。

8. プライバシーに関する考慮事項

HTML § 7.6.6 Privacy considerationsを参照。

No-Vary-Search連携については、No-Vary-Search Privacy considerationsも参照。

プリレンダ固有のプライバシー考慮事項追記要。 issue #319参照。特に指摘すべき点として、パーティション間(クロスパーティション)プリレンダは、プライバシー上の複雑さを理由に単純に禁止される点が挙げられる。

索引

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

参照で定義された用語

参考文献

規範参考文献

[AUDIO-OUTPUT]
Guido Urdaneta; youenn fablet. Audio Output Devices API. URL: https://w3c.github.io/mediacapture-output/
[BACKGROUND-FETCH]
Background Fetch. Draft Community Group Report. URL: https://wicg.github.io/background-fetch/
[BACKGROUND-SYNC]
Web Background Synchronization. Draft Community Group Report. URL: https://wicg.github.io/background-sync/spec/
[BATTERY-STATUS]
Anssi Kostiainen. Battery Status API. URL: https://w3c.github.io/battery/
[CLEAR-SITE-DATA]
Mike West. Clear Site Data. URL: https://w3c.github.io/webappsec-clear-site-data/
[CLIENT-HINTS-INFRASTRUCTURE]
Client Hints Infrastructure. Draft Community Group Report. URL: https://wicg.github.io/client-hints-infrastructure/
[CLIPBOARD-APIS]
Rakesh Goulikar; Rohan Raja. Clipboard API and events. URL: https://w3c.github.io/clipboard-apis/
[CONSOLE]
Dominic Farolino; Robert Kowalski; Terin Stock. Console Standard. Living Standard. URL: https://console.spec.whatwg.org/
[CREDENTIAL-MANAGEMENT-1]
Nina Satragno; Marcos Caceres. Credential Management Level 1. URL: https://w3c.github.io/webappsec-credential-management/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[ENCRYPTED-MEDIA-2]
Joey Parrish; Greg Freedman. Encrypted Media Extensions. URL: https://w3c.github.io/encrypted-media/
[FETCH]
Anne van Kesteren. Fetch Standard. Living Standard. URL: https://fetch.spec.whatwg.org/
[FILE-SYSTEM-ACCESS]
File System Access. Draft Community Group Report. URL: https://wicg.github.io/file-system-access/
[FULLSCREEN]
Philip Jägenstedt. Fullscreen API Standard. Living Standard. URL: https://fullscreen.spec.whatwg.org/
[GAMEPAD]
Steve Agoston; Matthew Reynolds. Gamepad. URL: https://w3c.github.io/gamepad/
[GENERIC-SENSOR]
Rick Waldron. Generic Sensor API. URL: https://w3c.github.io/sensors/
[GEOLOCATION]
Marcos Caceres; Reilly Grant. Geolocation. URL: https://w3c.github.io/geolocation/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[IDLE-DETECTION]
Reilly Grant. Idle Detection API. CG-DRAFT. URL: https://wicg.github.io/idle-detection/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[KEYBOARD-LOCK]
Keyboard Lock. Draft Community Group Report. URL: https://wicg.github.io/keyboard-lock/
[MEDIACAPTURE-STREAMS]
Cullen Jennings; et al. Media Capture and Streams. URL: https://w3c.github.io/mediacapture-main/
[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
[NOTIFICATIONS]
Anne van Kesteren. Notifications API Standard. Living Standard. URL: https://notifications.spec.whatwg.org/
[PAYMENT-REQUEST]
Marcos Caceres; Ian Jacobs; Stephen McGruer. Payment Request API. URL: https://w3c.github.io/payment-request/
[PICTURE-IN-PICTURE]
Francois Beaufort. Picture-in-Picture. URL: https://w3c.github.io/picture-in-picture/
[POINTERLOCK-2]
Mustaq Ahmed; Vincent Scheib. Pointer Lock 2.0. URL: https://w3c.github.io/pointerlock/
[PREFETCH]
Prefetch. Draft Community Group Report. URL: https://wicg.github.io/nav-speculation/prefetch.html
[PRESENTATION-API]
Mark Foltz. Presentation API. URL: https://w3c.github.io/presentation-api/
[PUSH-API]
Marcos Caceres; Kagami Rosylight. Push API. URL: https://w3c.github.io/push-api/
[RFC8941]
M. Nottingham; P-H. Kamp. Structured Field Values for HTTP. February 2021. Proposed Standard. URL: https://httpwg.org/specs/rfc8941.html
[SCREEN-CAPTURE]
Jan-Ivar Bruaroey; Elad Alon. Screen Capture. URL: https://w3c.github.io/mediacapture-screen-share/
[SCREEN-ORIENTATION]
Marcos Caceres. Screen Orientation. URL: https://w3c.github.io/screen-orientation/
[SCREEN-WAKE-LOCK]
Kenneth Christiansen; Marcos Caceres. Screen Wake Lock API. URL: https://w3c.github.io/screen-wake-lock/
[SECURE-CONTEXTS]
Mike West. Secure Contexts. URL: https://w3c.github.io/webappsec-secure-contexts/
[SERIAL]
Web Serial API. Editor's Draft. URL: https://wicg.github.io/serial/
[SERVICE-WORKERS]
Monica CHINTALA; Yoshisato Yanagisawa. Service Workers Nightly. URL: https://w3c.github.io/ServiceWorker/
[SPEECH-API]
Web Speech API. Draft Community Group Report. URL: https://webaudio.github.io/web-speech-api/
[STORAGE]
Anne van Kesteren. Storage Standard. Living Standard. URL: https://storage.spec.whatwg.org/
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/
[WEB-BLUETOOTH]
Jeffrey Yasskin. Web Bluetooth. URL: https://webbluetoothcg.github.io/web-bluetooth/
[WEB-LOCKS]
Kagami Rosylight. Web Locks API. URL: https://w3c.github.io/web-locks/
[WEB-NFC]
Web NFC API. Draft Community Group Report. URL: https://w3c.github.io/web-nfc/
[WEB-SHARE]
Marcos Caceres; Eric Willigers; Matt Giuca. Web Share API. URL: https://w3c.github.io/web-share/
[WEBAUDIO-1.0]
Paul Adenot; Hongchan Choi. Web Audio API. URL: https://webaudio.github.io/web-audio-api/
[WEBCRYPTO-2]
Daniel Huigens. Web Cryptography Level 2. URL: https://w3c.github.io/webcrypto/
[WEBDRIVER-BIDI]
James Graham; Alex Rudenko; Maksim Sadym. WebDriver BiDi. URL: https://w3c.github.io/webdriver-bidi/
[WEBHID]
WebHID API. Draft Community Group Report. URL: https://wicg.github.io/webhid/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/
[WEBMIDI]
Chris Wilson; Michael Wilson. Web MIDI API. URL: https://webaudio.github.io/web-midi-api/
[WEBUSB]
WebUSB API. Draft Community Group Report. URL: https://wicg.github.io/webusb/
[WEBXR]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR Device API. URL: https://immersive-web.github.io/webxr/

参考情報

[POINTERLOCK]
Vincent Scheib. Pointer Lock. URL: https://w3c.github.io/pointerlock/

IDL索引

partial interface Document {
    readonly attribute boolean prerendering;

    // Under "special event handler IDL attributes that only apply to Document objects"
    attribute EventHandler onprerenderingchange;
};

partial interface PerformanceNavigationTiming {
    readonly attribute DOMHighResTimeStamp activationStart;
};

課題一覧

フェンスドフレームナビゲーブルの概念はまだ定義されていませんが、定義されたらリンクが必要です。
プリレンダリング固有のセキュリティ考慮事項を追記してください。 issue #319を参照。
プリレンダリング固有のプライバシー考慮事項を追記してください。issue #319。特に、クロスパーティションプリレンダはプライバシー上の複雑さにより単純に禁止される点に言及。