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 elementstring sourceText、および URL baseURL を与えられたときに行う:

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

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

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

    2. ready にマークする。

    3. リターン。

  3. documentelementノードドキュメントとする。

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

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

    1. rsourceparse resultsource かつ、rcredentialsparse resultcredentials である場合:

      1. rdocument 内で 登録で使用中でないなら、 fetch entryrを設定する。

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

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

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

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

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

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

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

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

  10. ready にマークする。

3.2. イベントの発火

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

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

  1. resultelement のスクリプトの 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. アサーション:resultregistration は null でない。

  9. resultregistrationfetch entrystate が "failed" の場合:

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

    2. return。

  10. アサーション:resultregistrationfetch entrystate は "fetched"。

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

3.3. 削除

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

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

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

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

  4. registrationスクリプト resultregistration とする。

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

  6. registration が null の場合、return。

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

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

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

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

    1. fetch entryregistrationfetch entryとする。

    2. fetch entrydocument登録で使用中なら、return。

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

      注意: 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 registrationrequest で呼んだ結果が null なら、requestservice-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. urlrequestcurrent url とする。

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

    1. registrationfind a matching web bundle registrationrequest を与えて実行した結果とする。

    2. registration が null でない場合、urlregistrationfetch entrysource に設定する。

  3. urlsource listpolicyself-origin、 及び requestredirect countDoes 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. urlresponseurl とする。

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

    1. registrationfind a matching web bundle registrationrequest を与えて実行した結果とする。

    2. registration が null でない場合、urlregistrationfetch entrysource に設定する。

  3. urlsource listpolicyself-origin、 及び requestredirect countDoes url match source list in origin with redirect count? を実行した結果を返す。

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

6. アルゴリズム

6.1. 構文解析

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

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

  2. もし parsedmap でなければ、 トップレベルの値は 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バンドルルールとし、resourcesresourcesscopesscopes にする。

  15. web bundle parse result を返す。sourcesourcecredentialscredentialsrulerule

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

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

  2. originalListitem について、

    1. item文字列なら、

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

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

  3. parsed URL list を返す。

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

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

  1. アサーション:fetch entrystate は "fetching"。

  2. requestfetch paramsrequest とする。

  3. requesturlfetch entrysource に設定する。

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

  4. requestdestination を "webbundle" に設定。

  5. requestmode を "cors" に設定。

  6. requestcredentials modefetch entrycredentials に設定。

  7. requestservice-workers mode を "none" に設定。

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

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

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

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

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

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

  1. responsestatusok status の場合、

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

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

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

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

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

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

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

  1. registrationfind a matching web bundle registrationhttpRequest を与えた結果とする。

  2. registration が null でなければ:

    1. responseget response from web bundle fetch entryhttpRequesturlregistrationfetch entry を与えた結果とする。

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

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

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

  3. null を返す。

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

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

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

  2. fetch entrystate が "failed" なら null を返す。

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

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

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

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

  1. urlhttpRequesturlとする。

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

    1. ruleregistrationrule とする。

    2. urlscheme が "uuid-in-package" でない場合、

      1. urloriginregistrationfetch entrysourceoriginsame origin でなければ continue

      2. allowed pathregistrationfetch entrysourcepathshorten した結果とする。

      3. urlpathallowed pathで始まらないなら continue

    3. ruleresourcesurl含むなら、registration を返す。

    4. urlrulescopes のいずれかで始まるなら 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 resultscript ではないためです。 これは whatwg/html#958 が修正されるまで対応できません。