Web バンドルによるサブリソースの読み込み

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

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

概要

UAがWebバンドルからサブリソースを読み込む方法。

この文書のステータス

この仕様はWeb Platform Incubator Community Groupによって公開されました。 これはW3C標準ではなく、W3C標準化プロセスにも含まれていません。 W3C Community Contributor License Agreement (CLA)には、限定的なオプトアウトや他の条件が適用されることに注意してください。 W3Cコミュニティ&ビジネスグループについてさらに学ぶことができます。

1. イントロダクション

このセクションは規範的ではありません。

Web Bundles によるサブリソースの読み込み仕様は、 複数のリソースをまとめて効率よく読み込むためのフォーマット Web Bundles を用いる方法について説明します。 この仕様は、ウェブブラウザがそれらのリソースをどのように読み込むかを記述しています。 また、[HTML]、 [FETCH]、 [CSP] 仕様に対するいくつかのモンキーパッチとして表現され、 ここで定義するアルゴリズムを呼び出します。

注意: この仕様は作成中です。#708 を参照してください。

2. 構造体

フェッチされたウェブバンドル は [draft-ietf-wpack-bundled-responses-latest] で定義される ウェブバンドルフォーマットの表現です。

ウェブバンドルフェッチエントリ とは、以下の項目を持つ 構造体です:

ウェブバンドルフェッチエントリ の より良い名称?

ウェブバンドルフェッチエントリ entry は、Document document の ウェブバンドル登録リストが、 その ウェブバンドル登録の fetch entryとして entry を 含むとき、 登録で使用中とみなされます。

バンドルルールは、以下の 項目を持つ 構造体です:

ウェブバンドル登録は、以下の 項目を持つ 構造体です:

ウェブバンドル解析結果は、以下の 項目を持つ 構造体です:

すべての環境設定オブジェクトは、 ウェブバンドル登録リスト アルゴリズムを持ち、 これは リストとして ウェブバンドル登録を返します。

Document は ウェブバンドル登録リストを持ち、 ウェブバンドル登録のリスト (初期値は空)。

ウィンドウ環境設定オブジェクトのセットアップ では、settings object の ウェブバンドル登録リスト は windowの関連付けられたDocumentの ウェブバンドル登録リストを返します。

ワーカー環境設定オブジェクトのセットアップ では、settings object の ウェブバンドル登録リスト は 空のリストを返します。

Document は ウェブバンドルフェッチエントリリストを持ち、 ウェブバンドルフェッチエントリのリスト (初期値は空) となります。

リストが ウェブバンドルフェッチエントリリスト に 使われているが、順序は重要でないはずです。

ワーカーは未対応。

3. HTML へのモンキーパッチ

ウェブバンドルをスクリプト要素の準備アルゴリズムで 既存スクリプトタイプ (classicやmodule) と同様に処理するため、次の変更を行います:

注意: ウェブバンドル結果を script の 新しいサブクラスにせず、 他のスクリプト実行系の仕様への影響はありません。

3.1. スクリプト要素の準備

スクリプト要素の準備 アルゴリズム内で、次の変更を行う:

注: CSP はインラインWebバンドルにもスクリプト要素を準備する手順のステップ15で適用され、Classic/Moduleスクリプトと同様である。

ウェブバンドルの準備とは、HTMLScriptElement element、string sourceText、および URL baseURL を与えられたときに行う:

  1. parse result を、ウェブバンドル文字列の解析に sourceText、baseURL を与えて得る。

  2. 例外がスローされた場合:

    1. スクリプトの result を、ウェブバンドル結果( registration は null、 error to rethrow がスローされた例外)の新規インスタンスに設定する。

    2. ready にマークする。

    3. リターン。

  3. document を element の ノードドキュメントとする。

  4. fetch entry を null に設定する。

  5. document の ウェブバンドルフェッチエントリリスト の各 r について:

    1. r の source が parse result の source かつ、r の credentials が parse result の credentials である場合:

      1. r が document 内で 登録で使用中でないなら、 fetch entry に rを設定する。

        注: これは、スクリプト結果の registration の fetch entry が r であった他のスクリプト要素が削除されたことを意味する。 これは、同じ source と credentials を持つ HTMLScriptElement のフェッチエントリが、削除されて追加された場合に 再取得・生成されないことを保証する。

  6. fetch entry が null である場合:

    1. fetch entry を新しい ウェブバンドルフェッチエントリ(source に parse result の source、 credentials に parse result の credentials、 state に "fetching"、fetched bundle に null)に設定する。

    2. append fetch entry を document の ウェブバンドルフェッチエントリリスト に追加する。

    3. 並列で、ウェブバンドルのフェッチを fetch entry で行う。

  7. registration を新しい ウェブバンドル登録(fetch entry は fetch entry、 rule は parse result の rule)にする。

  8. append registration を document の ウェブバンドル登録リストに追加する。

  9. スクリプトの result を新しい ウェブバンドル結果 (registration は registration、error to rethrow は null)に設定する。

  10. ready にマークする。

3.2. イベントの発火

スクリプト要素の実行 で、ステップ6に次のケースを追加:

ウェブバンドルのイベント処理とは、HTMLScriptElement element を与えられたとき:

  1. result を element のスクリプトの result とする。

  2. アサーション:element の スクリプトの type は "webbundle" である。

  3. アサーション:result は ウェブバンドル結果 である。

  4. 次のいずれかの条件が満たされるまで、非同期的に待機する:

    注意: 他のスクリプトタイプと異なり、ここでは ウェブバンドルのフェッチ を待機してから load イベントを HTMLScriptElement に発火する。ここでは loadイベントの遅延は行わない。これは ready にマーク を スクリプト要素の準備 内で同期的に実施しているため。 ウェブバンドルのフェッチ はプリロードに近い動作となるため意図した挙動である。

  5. element のスクリプト result が null の場合、return。

    注意: これは前段階で element が ドキュメントから削除されたときに起こりうる。

    注意: これは whatwg/html#2673 に合わせて記述されている。 現状ではこのケースで error イベントは発火しないが、 もし whatwg/html#2673 で発火するよう変更された場合は この手順もそれに合わせて変更すること。

  6. アサーション:element の ノードドキュメント は element の 準備時のドキュメント と等しい。

  7. result の 再スローするエラー が null でない場合:

    1. 例外の報告を result の 再スローするエラー で実行する。

      関連する script が存在しない。なぜなら ウェブバンドル結果 は script ではないため。whatwg/html#958 の対応を待つ必要がある。

    2. return。

  8. アサーション:result の registration は null でない。

  9. result の registration の fetch entry の state が "failed" の場合:

    1. error イベントを element で発火する。

    2. return。

  10. アサーション:result の registration の fetch entry の state は "fetched"。

  11. load イベントを element で発火する。

3.3. 削除

script 要素が ドキュメントから削除された場合、ユーザーエージェントは次のアルゴリズムを実行する:

  1. スクリプトの type が "webbundle" でない場合、return。

  2. スクリプトの result が null の場合、return。

  3. アサーション:スクリプト result は ウェブバンドル結果 である。

  4. registration を スクリプト result の registration とする。

  5. スクリプト result を null に設定する。

  6. registration が null の場合、return。

  7. document を ノードドキュメントとする。

  8. アサーション:document の ウェブバンドル登録リスト が registration を含む。

  9. registration を document の ウェブバンドル登録リスト から削除する。

  10. 次のステップを実行するマイクロタスクをキューに追加する:

    1. fetch entry を registration の fetch entryとする。

    2. fetch entry が document で 登録で使用中なら、return。

    3. fetch entry を documentの ウェブバンドルフェッチエントリリスト から削除する。

      注意: fetch entry が、document の ウェブバンドルフェッチエントリリスト に既に含まれていない場合がありうる。 これは、fetch entry が複数の script 要素の ウェブバンドル登録 に使われており、そのscript elementsが削除された場合に起こる。

      注意: この時点で fetch entry は 以後のサブリソースフェッチや ウェブバンドルの準備では使われないが、 そのフェッチ結果は 進行中のフェッチ処理で引き続き使われる可能性がある。

4. Fetchへのモンキーパッチ

4.1. fetchへのモンキーパッチ

fetch にて、

  1. taskDestination を null とする。

の前に次の手順を追加:

  1. find a matching web bundle registration を request で呼んだ結果が null なら、request の service-workers mode を "none" に設定する。

注意: これは webbundle から読み込まれたサブリソースに対して service worker のイベントが発火しなくなることを意味する。

4.2. fetch schemeへのモンキーパッチ

fetch scheme に "uuid-in-package" を追加する。

注意: これにより navigate アルゴリズムが uuid-in-package: URL には process a navigate fetch アルゴリズムを使うことが保証される。

注意: origin が "uuid-in-package" スキームのURLは不透明なoriginとなる。

4.3. HTTP-network-or-cache fetchへのモンキーパッチ

HTTP-network-or-cache fetch で、

8.22. httpCache を、httpRequest で HTTP キャッシュパーティションを決定した結果に設定する。

の前に次の手順を追加:

  1. response を ウェブバンドルからサブリソースのフェッチ の httpRequest を与えた結果に設定する。

    1. response が ネットワークエラーの場合、 ネットワークエラーを返す。

    2. response が null でない場合、ステップ8.22~8.24をスキップしてステップ9へ進む。

      注意: これにより webbundle のサブリソースは HttpCache と一切やりとりしない。 今後 HttpCache 対応は機能拡張として予定されている。

5. CSPへのモンキーパッチ

5.1. 「Does request match source list?」へのモンキーパッチ

Does request match source list? を次の手順で書き換える:

  1. url を request の current url とする。

  2. url の scheme が "uuid-in-package" の場合:

    1. registration を find a matching web bundle registration に request を与えて実行した結果とする。

    2. registration が null でない場合、url を registration の fetch entry の source に設定する。

  3. url、source list、policy の self-origin、 及び request の redirect count で Does url match source list in origin with redirect count? を実行した結果を返す。

注意: これにより CSP の制約は uuid-in-package: URL ではなく バンドルのURLに対して評価される。詳細は #651 を参照。

5.2. 「Does response to request match source list?」へのモンキーパッチ

Does response to request match source list? を次の手順で書き換える:

  1. url を response の url とする。

  2. url の scheme が "uuid-in-package" の場合:

    1. registration を find a matching web bundle registration に request を与えて実行した結果とする。

    2. registration が null でない場合、url を registration の fetch entry の source に設定する。

  3. url、source list、policyの self-origin、 及び request の redirect count で Does url match source list in origin with redirect count? を実行した結果を返す。

注意: これにより CSP の制約は uuid-in-package: URL ではなく バンドルのURLに対して評価される。詳細は #651 を参照。

6. アルゴリズム

6.1. 構文解析

ウェブバンドル文字列をパースするために、文字列 sourceText と URL baseURL を与えられたとき:

  1. parsed を JSON を Infra 値へパースした結果にする。引数は sourceText。

  2. もし parsed が map でなければ、 トップレベルの値は JSON オブジェクトでなければならないことを示す TypeError を送出する。

  3. もし parsed["source"] が 存在しなければ、 TypeError を送出する。

  4. もし parsed["source"] が 文字列 でなければ、TypeError を送出する。

  5. source を、パースした parsed["source"] と、base URL として baseURL を用いて得た結果とする。

  6. もし source が null なら、TypeError を送出する。

  7. credentials を "same-origin" にする。

  8. もし parsed["credentials"] が 存在すれば:

    1. もし parsed["credentials"] が "omit" なら、credentials を "omit" に設定する。

    2. それ以外で、parsed["credentials"] が "include" なら、credentials を "include" に設定する。

  9. resources を空の リストとする。

  10. もし parsed["resources"] が 存在すれば:

    1. もし parsed["resources"] が リスト でなければ、TypeError を送出する。

    2. resources を、URL リストをパースするの parsed["resources"] と source を引数にした結果に設定する。

  11. scopes を空の リストとする。

  12. もし parsed["scopes"] が 存在すれば:

    1. もし parsed["scopes"] が リスト でなければ、TypeError を送出する。

    2. scopes を、URL リストをパースするの parsed["scopes"] と source を引数にした結果に設定する。

  13. もし parsed の キーが "source"、"credentials"、"resources"、"scopes" 以外を 含む場合、 ウェブバンドル文字列に不正なトップレベルキーが存在したことを コンソールに警告する。

    注: これはタイポ検出の助けになります。これはエラーではなく、将来の拡張を後方互換で追加できるようにするためです。

  14. rule を バンドルルールとし、resources は resources、scopes は scopes にする。

  15. web bundle parse result を返す。source は source、credentials は credentials、rule は rule。

URLリストの解析は、 リスト originalList、および URL baseURL を与えて実行する:

  1. parsed URL list を空の リストとする。

  2. 各 originalList の item について、

    1. item が 文字列なら、

      1. URL を パース(item, baseURL)した結果とする。

      2. URL が nullでなければ、parsed URL list に append する。

  3. parsed URL list を返す。

6.2. ウェブバンドルの取得

ウェブバンドルの取得は、ウェブバンドルフェッチエントリ fetch entry と fetch params fetch params を受けて実行する:

  1. アサーション:fetch entry の state は "fetching"。

  2. request を fetch params の request とする。

  3. request の url を fetch entry の source に設定する。

    注意: source URL は document の base URL で解決される。

  4. request の destination を "webbundle" に設定。

  5. request の mode を "cors" に設定。

  6. request の credentials mode を fetch entry の credentials に設定。

  7. request の service-workers mode を "none" に設定。

  8. ヘッダー ("Accept", "application/webbundle;v=b2") の組を request の header list に追加する。

    注意:最終的な [draft-ietf-wpack-bundled-responses-latest] ではバージョン1を使う予定だが、この仕様はブラウザが実装しているドラフト版に合わせている。

  9. Fetch を request に対し processResponse アルゴリズム(ウェブバンドルレスポンス処理 を fetch entry で部分適用したもの)で呼び出す。

    注意: Chromiumの現実装ではネストされたバンドルは許可されず、ウェブバンドルは他のウェブバンドルからフェッチされることはない。

6.3. ウェブバンドルレスポンス処理

ウェブバンドルレスポンス処理は、 ウェブバンドルフェッチエントリ fetch entry と response response を受けて実行する:

  1. response の status が ok status の場合、

    1. response の body を [draft-ietf-wpack-bundled-responses-latest] に従いウェブバンドルとしてパースする。

      注意: response の body はこの時点で完全には利用できない場合がある。 UA はサブリソースを早く提供するために 非同期で断片的に読むことで bundle を解析することがある。

      注意: 現状の Chromium 実装のパースでは web bundle フォーマットのバージョンは "b2" のみ受け付ける。

    2. パースアルゴリズムが非同期で完了したとき、fetch entry の fetched bundle にパース結果を設定し、 fetch entry の state を "fetched"にする。もしパース失敗や他の準拠違反があれば fetched bundle を null、state を "failed"にする。

  2. それ以外なら fetch entry の state を "failed"にする。

6.4. ウェブバンドルからのサブリソースの取得

ウェブバンドルからサブリソースの取得は、 request httpRequest を受け取って行う:

  1. registration を find a matching web bundle registration に httpRequest を与えた結果とする。

  2. registration が null でなければ:

    1. response を get response from web bundle fetch entryに httpRequest の url と registration の fetch entry を与えた結果とする。

    2. response が null なら ネットワークエラー を返す。

      注意: この場合、ブラウザはサブリソースをネットワークからフェッチするフォールバックを行わない。

    3. それ以外であれば response を返す。

  3. null を返す。

注意: ここでnullを返すとHTTPキャッシュや通常のネットワークフェッチへのフォールバックが可能となる。上記のネットワークエラーとは区別される。

get response from web bundle fetch entryは、 url url と ウェブバンドルフェッチエントリ fetch entry を受けて行う:

  1. fetch entry の state が "fetching" なら、 state が "fetched" か "failed" になるまで非同期的にawaitする。

  2. fetch entry の state が "failed" なら null を返す。

  3. アサーション:fetch entry の fetched bundle はnullでない。

  4. fetch entry の fetched bundle から url に該当するresponse を返す([draft-ietf-wpack-bundled-responses-latest])。url に該当する内容が fetched bundle 内になければnullを返す。

6.5. マッチする登録の探索

find a matching web bundle registrationは、 request httpRequest を受け取って呼び出す:

  1. url を httpRequest の urlとする。

  2. httpRequest の client の ウェブバンドル登録リスト の各 registration について:

    1. rule を registration の rule とする。

    2. url の scheme が "uuid-in-package" でない場合、

      1. url の origin と registration の fetch entry の source の origin が same origin でなければ continue。

      2. allowed path を registration の fetch entry の source の path を shorten した結果とする。

      3. url の path が allowed pathで始まらないなら continue。

    3. rule の resources が url を 含むなら、registration を返す。

    4. url が rule の scopes のいずれかで始まるなら registration を返す。

  3. null を返す。

適合性

ドキュメント規約

適合性要件は、記述的な規定とRFC 2119の用語の組み合わせによって示されます。 この文書の規範的な部分において「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」というキーワードは、RFC 2119で説明されているとおりに解釈されます。 ただし、可読性のため、本仕様書ではこれらの単語はすべて大文字では表記されていません。

本仕様の本文は、明示的に非規範的と記載されたセクション、例、注釈を除き、すべて規範的です。[RFC2119]

本仕様内の例は、「例えば」という語で始まるか、class="example"として規範的な本文とは区別されて示されます。例えば、次のようになります:

これは情報提供用の例です。

情報提供用の注釈は「注」として始まり、class="note"で規範的な本文と区別されて示されます。例えば、次のようになります:

注:これは情報提供用の注釈です。

索引

本仕様で定義されている用語

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

参考文献

規範的参考文献

[CONSOLE]
Dominic Farolino; Robert Kowalski; Terin Stock. Console Standard. Living Standard. URL: https://console.spec.whatwg.org/
[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/
[HTML]
Anne van Kesteren; et al. 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/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

参考情報

[DRAFT-IETF-WPACK-BUNDLED-RESPONSES-LATEST]
Web Bundles. URL: https://wpack-wg.github.io/bundled-responses/draft-ietf-wpack-bundled-responses.html

課題一覧

web bundle fetch entry のより良い名称は? ↵
web bundle fetch entry list には list が使用されているが、順序は重要であるべきでない。 ↵
ワーカーではサポートされていません。↵
適切な script はありません、 なぜなら web bundle result は script ではないためです。 これは whatwg/html#958 が修正されるまで対応できません。 ↵