[121] [CODE(HTMLe)@en[script]] [[要素]]や[[ワーカー]]の処理では、
[[外部スクリプト]]の [[fetch]] を行うことがあります。

[122] [[スクリプト]]の種類によって処理はかなり違っています。

* 仕様書

[REFS[
- [164] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-08-08 13:14:17 +09:00]]) <https://html.spec.whatwg.org/#module-script>
- [4] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-16 01:30:20 +09:00]] 版) <https://html.spec.whatwg.org/#fetching-scripts>'''
- [119] [CITE@en[Service Workers Nightly]] ([TIME[2016-03-02 17:37:28 +09:00]] 版) <https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#update-algorithm>
]REFS]

* 古典スクリプト

** 古典 [CODE(HTMLe)@en[script]] 要素

[12] [DFN[[RUBYB[古典スクリプトのfetch]@en[fetch a classic script]]]] [SRC[>>4]] は、
次の[[引数]]を受け取ります。

[FIG(list members middle)[
: [VAR[URL]] : [[URL]]。
: [VAR[CORS設定]] : [[CORS設定群属性]]の指示。
: [VAR[設定群オブジェクト]] : [[環境設定群オブジェクト]]。
: [VAR[文字符号化]] : [[文字符号化]]。
: [VAR[オプション群]] : [[スクリプトfetchオプション群]]。
: [VAR[fetchの実行]] : [[fetchの実行]]。
: [VAR[続きの処理]] : 処理。
]FIG]

[124] [[古典スクリプト]]の場合、歴史的理由により、[[文字コード]]を指定できます
([CODE(HTML)@en[<script charset>]])。 (他の種類の[[スクリプト]]では [[UTF-8]]
に固定されています。)

[13] 次のようにします [SRC[>>4]]。

[FIG(steps)[
= [14] [VAR[要求]]を、[[潜在的CORS要求の作成]]の結果に設定します。
[FIG(list members)[

: [VAR[URL]] : [VAR[URL]]
: [VAR[CORS設定]] : [VAR[CORS設定]]
: [VAR[終点]] : [CODE[script]]

]FIG]
= [345] [VAR[要求]]の[F[クライアント][要求クライアント]]を、[VAR[設定群オブジェクト]]に設定します。
= [344] [VAR[要求]]と[VAR[オプション群]]について[[古典スクリプト要求を設定]]します。
= [17] [VAR[fetchの実行]]をします。
[FIG(list members middle)[
: [VAR[要求]] : [VAR[要求]]
: [VAR[最上位]] : [[真]]
: [VAR[続きの処理]] : >>18
]FIG]
]FIG]

[18] [[fetchの実行]]の結果を受けて、[VAR[fetchの応答]]を次のようにします [SRC[>>4]]。
[FIG(steps)[
= [102] [VAR[応答]]を、[VAR[fetchの応答]]の[F[非安全応答]]に設定します。
= [19] [VAR[応答]]の[F[[[型]]]]が [CODE[[[error]]]] か、
[VAR[応答]]の[F[[[状態]]]]が [[OK状態]]''以外''なら、
== [21] [VAR[スクリプト]]を、 null に設定します。
= [22] それ以外の場合、
== [23] 
[VAR[応答]]の[F[内容型メタデータ]]が [CODE[null]] 以外で、
[VAR[応答]]の[F[内容型メタデータ]]の[F[文字符号化]]が [CODE[null]] 以外の場合、
=== [27] [VAR[文字符号化]]を、[VAR[応答]]の[F[内容型メタデータ]]の[F[文字符号化]]に設定します。
== [28] [VAR[ソーステキスト]]を、[[復号][復号 (符号化)]]の結果に設定します。
[FIG(list members)[
: [VAR[符号化]] : [VAR[文字符号化]]
: [VAR[ストリーム]] : [VAR[応答]]の[F[[[本体]]]]
]FIG]
== [31] [VAR[エラーミュートフラグ]]を、[VAR[応答]]が[[CORS交差起源]]かどうかに設定します。
== [29] [VAR[スクリプト]]を、[[古典スクリプトを作成]]した結果に設定します。
[FIG(list members)[

: [VAR[ソーステキスト]] : [VAR[ソーステキスト]]
: [VAR[設定群オブジェクト]] : [VAR[設定群オブジェクト]]
: [VAR[基底URL]] : [VAR[応答]]の[F[URL][応答URL]]
: [VAR[エラーミュートフラグ]] : [VAR[エラーミュートフラグ]]
: [VAR[オプション群]] : [VAR[オプション群]]

]FIG]
= [20] [VAR[スクリプト]]について[VAR[続きの処理]]を実行します。
]FIG]

[34] [VAR[ソーステキスト]]の[[復号]]に使う[[文字コード]]は、

= [[BOM]]
=- [[復号][復号 (符号化)]]操作内で検査される
= [CODE(HTTP)@en[Content-Type]] [[ヘッダー]]の [CODE(MIME)@en[charset]]
[[引数]]で指定された値
=- [VAR[応答]]の[F[内容型メタデータ]]の[F[文字符号化]]
= [CODE(HTML)@en[<script charset>]] で指定された値
=- [[古典スクリプトのfetch]]への引数として与えられた[VAR[文字符号化]]
= [[文書の[F[文字符号化]]]]
=- [[古典スクリプトのfetch]]への引数として与えられた[VAR[文字符号化]]

... の優先順で決まります。

[94] この[[手続き]]は、旧来の [CODE(HTMLe)@en[[[script]]]] [[要素]]の処理から呼び出されます。

** 古典ワーカースクリプト

[6] [DFN[[RUBYB[古典ワーカースクリプトのfetch]@en[fetch a classic worker script]]]]
[SRC[>>4]] は、次の[[引数]]を受け取ります。

[FIG(list members middle)[
: [VAR[URL]] : [[URL]]。
: [VAR[fetchクライアント設定群オブジェクト]] : [[環境設定群オブジェクト]]。
: [VAR[スクリプト設定群オブジェクト]] : [[環境設定群オブジェクト]]。
: [VAR[終点]] : [[要求終点]]。[[ワーカー]]の種別を表します。
: [VAR[fetchの実行]] : [[fetchの実行]]。
: [VAR[続きの処理]] : 処理。
]FIG]

[7] 次のようにします。

[FIG(steps)[
= [54] [VAR[要求]]を、新しい[[要求]]に設定します。
[FIG(list members middle)[
[FIGCAPTION[
[[要求]]
]FIGCAPTION]
:[F[[[URL]]]]: [VAR[URL]]
:[F[[[クライアント]]]]: [VAR[fetchクライアント設定群オブジェクト]]
:[F[[[型]]]]: [CODE[[[script]]]]
:[F[[[終点]]]]: [VAR[終点]]
:[F[[[同期フラグ]]]]: 設定する
:[F[[[モード]]]]: [CODE[[[same-origin]]]]
:[F[[[credentialsモード]]]]: [CODE[[[same-origin]]]]
:[F[[[URL credentials利用フラグ]]]]: 設定する
: [F[構文解析器メタデータ]] : [CODE[not-parser-inserted]]
]FIG]
= [107] [VAR[要求]]について[VAR[fetchの実行]]をします。
[FIG(list members middle)[
: [VAR[最上位]] : [[真]]
: [VAR[続きの処理]] : >>56
]FIG]
]FIG]

[56] [[fetch]] の結果を受けて、[VAR[fetchの応答]]を次のように処理します。
[FIG(steps)[
= [103] [VAR[応答]]を、[VAR[fetchの応答]]の[F[非安全応答]]に設定します。
= [5] [VAR[応答]]の[F[[[型]]]]が [CODE[[[error]]]] であるか、
[VAR[応答]]の[F[[[状態]]]]が[[OK状態]]''以外''なら、
== [8] [VAR[スクリプト]]を、 null に設定します。
= [9] それ以外なら、
== [63] [VAR[スクリプト]]を、[[古典スクリプトを作成]]した結果に設定します。
[FIG(list members)[

: [VAR[ソーステキスト]] :  [VAR[応答]]の[F[[[本体]]]]を 
[[UTF-8復号]]した結果
: [VAR[設定群オブジェクト]] : [VAR[スクリプト設定群オブジェクト]]
: [VAR[基底URL]] : [VAR[応答]]の[F[URL][応答URL]]
: [VAR[オプション群]] : [[既定古典スクリプトfetchオプション群]]

]FIG]
= [10] [VAR[スクリプト]]について[VAR[続きの処理]]を実行します。
]FIG]

;; [35] 通常の[[スクリプト]]の場合 (>>18) と違って、[[文字符号化]]は [[UTF-8]]
に固定されています。

[95] この[[手続き]]は、[[ワーカーを走らせる]]処理
([[専用ワーカー]]、[[共有ワーカー]]) と[[更新][更新ジョブ]]
([[サービスワーカー]]) から呼び出されます。

** 古典ワーカー輸入スクリプト

[115] [DFN[[RUBYB[古典ワーカーで輸入されたスクリプトをfetch]@en[fetch a classic worker-imported script]]]]
[SRC[>>4]] は、次の引数を受け取ります。
[FIG(list members middle)[
: [VAR[URL]] : [[URL記録]]
: [VAR[設定群オブジェクト]] : [[環境設定群オブジェクト]]
]FIG]

[118] 次のようにします [SRC[>>4]]。
[FIG(steps)[
= [123] [VAR[要求]]を、[[要求]]に設定します。
[FIG(list members middle)[
[FIGCAPTION[
[[要求]]
]FIGCAPTION]
:[F[[[URL]]]]: [VAR[URL]]
:[F[[[クライアント]]]]: [VAR[設定群オブジェクト]]
:[F[[[型]]]]: [CODE[[[script]]]]
:[F[[[終点]]]]: [CODE[[[script]]]]
: [F[構文解析器メタデータ]] : [CODE[not parser-inserted]]
:[F[[[同期フラグ]]]]: 設定する
:[F[[[credentials mode]]]]: [CODE[[[include]]]]
:[F[[[URL credentials利用フラグ]]]]: 設定する
]FIG]
= [130] [VAR[要求]]について[VAR[fetchの実行]]をします。
[VAR[最上位]]フラグを設定します。[VAR[続きの処理]]は、 >>135 とします。
= [147] >>135 の処理の完了を待ちます。完了したら、その結果に従い、
値を返すか[[例外]]を[[投げ]]ます。
]FIG]

[135] [[fetchの実行]]の結果を踏まえて、[VAR[fetchの応答]]について次のようにします。
[FIG(steps)[
= [139] [VAR[応答]]を、[VAR[fetchの応答]]の[F[非安全応答]]に設定します。
= [144] [VAR[応答]]の[F[型][応答の型]]が [CODE[error][ネットワークエラー]]、
[VAR[応答]]の[F[状態][状態符号]]が[[OK状態]]''以外''、
[VAR[応答]]の[F[ヘッダーリスト]]に [[extract a MIME type]]
を適用した結果が
[[JavaScript MIME型]]で''ない''、
のいずれかの場合、
== [143] [CODE(DOMe)@en[[[NetworkError]]]] [CODE[DOMException]]
を[[投げ]]、ここで停止します。
= [145] [VAR[スクリプト]]を、[[古典スクリプトを作成]]した結果に設定します。
[FIG(list members)[

: [VAR[ソーステキスト]] : [VAR[応答]]の[F[本体][応答本体]]を[[UTF-8復号]]した結果
: [VAR[設定群オブジェクト]] : [VAR[設定群オブジェクト]]
: [VAR[エラーミュート]]フラグ: [VAR[応答]]が [F[[[CORS-cross-origin]]]] か否か
: [VAR[基底URL]] : [VAR[応答]]の[F[URL][応答URL]]
: [VAR[オプション群]] : [[既定古典スクリプトfetchオプション群]]

]FIG]
= [146] [VAR[スクリプト]]を返します。
]FIG]

;; [114] [CODE(DOMm)@en[importScripts]] から呼び出されます。
この場合のみ、他の [[fetch]] とは異なり、[[同期的]]に [[fetch]] を待ちます。

* モジュールスクリプト

[151] [[モジュールスクリプト]]の場合、直接指定された[[モジュールスクリプト]]に加えて、
[CODE(JS)@en[import]] で直接または間接に参照されている[[モジュールスクリプト]]も
[[fetch]] します。ただし、重複読み込みは実行環境ごとに記録されていて、
(今回の[[スクリプトのfetch]]に限らず) [[fetch]] 済みなら、飛ばされます。
他で既に [[fetch]] 中なら、それが完了するのを待ちます。
すべての [[fetch]] が完了したら、次の処理へと進めます。

[162] この状態管理を行うため、また [[Webブラウザー]]の処理と [[JavaScriptエンジン]]の処理が絡み合うため、
更には [CODE(DOMi)@en[ServiceWorker]] で特殊な処理を挟むため、
[[モジュールスクリプト]]の読み込み処理はかなり複雑になっています。

** モジュール [CODE(HTMLe)@en[script]] 要素

[36] [DFN[[RUBYB[モジュールスクリプトグラフのfetch]@en[fetch a module script graph]]]] [SRC[>>4]]
は、次の[[引数]]を受け取ります。

[FIG(list members middle)[
: [VAR[URL]] : [[URL]]。
: [VAR[終点]] : [[要求終点]]。
: [VAR[設定群オブジェクト]] : [[環境設定群オブジェクト]]。
: [VAR[オプション群]] : [[スクリプトfetchオプション群]]。
: [VAR[fetchの実行]] : [[fetchの実行]]。
: [VAR[続きの処理]] : 処理。
]FIG]

[104] 次のようにします [SRC[>>4]]。

[FIG(steps)[
= [338] [VAR[既訪集合]]を、新しい[[空集合]]に設定します。
= [339] [VAR[既訪集合]]に、[VAR[URL]] を追加します。
= [30] [[内部モジュールスクリプトグラフfetch手続き]]を実行します。
[FIG(list members middle)[
: [VAR[URL]] : [VAR[URL]]
: [VAR[終点]] : [VAR[終点]]
: [VAR[オプション群]] : [VAR[オプション群]]
: [VAR[fetchクライアント設定群オブジェクト]] : [VAR[設定群オブジェクト]]
: [VAR[モジュール写像クライアント設定群オブジェクト]] : [VAR[設定群オブジェクト]]
: [VAR[既訪集合]] : [VAR[既訪集合]]
: [VAR[参照元]] : [CODE[client]]
: [VAR[最上位モジュールfetchフラグ]] : [[真]]
: [VAR[fetchの実行]] : [VAR[fetchの実行]]
: [VAR[続きの処理]] : [VAR[続きの処理]]
]FIG]
]FIG]

;; [96] [[prepare a script]] ([CODE(HTMLe)@en[[[script]]]] [[要素]]) や
[CODE[HostImportModuleDynamically]] ([CODE[import()]]) から呼び出されます。

** モジュールワーカースクリプト

[33] [DFN[[RUBYB[モジュールワーカースクリプトグラフのfetch]@en[fetch a module worker script graph]]]] [SRC[>>4]]
は、次の[[引数]]を受け取ります。

[FIG(list members middle)[
: [VAR[URL]] : [[URL]]。
: [VAR[credentialsモード]] : [[credentialsモード]]の値。
: [VAR[終点]] : [[要求終点]]。
: [VAR[fetchクライアント設定群オブジェクト]] : [[環境設定群オブジェクト]]。
: [VAR[モジュール写像設定群オブジェクト]] : [[環境設定群オブジェクト]]。
: [VAR[fetchの実行]] : [[fetchの実行]]。
: [VAR[続きの処理]] : 処理。
]FIG]

[105] 次のようにします [SRC[>>4]]。

[FIG(steps)[
= [336] [VAR[既訪集合]]を、新しい[[空集合]]に設定します。
= [337] [VAR[既訪集合]]に、[VAR[URL]] を追加します。
= [108] [[内部モジュールスクリプトグラフfetch手続き]]を実行します。
[FIG(list members)[
: [VAR[URL]] : [VAR[URL]]
: [VAR[終点]] : [VAR[終点]]
: [VAR[オプション群]] :
新しい[[スクリプトfetchオプション群]]
[FIG(list members)[ [15] [[スクリプトfetchオプション群]]

: [F[暗号学的nonce]] : [[空文字列]]
: [F[一貫性メタデータ]] : [[空文字列]]
: [F[構文解析器メタデータ]] : [CODE[not-parser-inserted]]
: [F[credentialsモード]] : [VAR[credentialsモード]]

]FIG]
: [VAR[fetchクライアント設定群オブジェクト]] : [VAR[fetchクライアント設定群オブジェクト]]
: [VAR[モジュール写像クライアント設定群オブジェクト]] : [VAR[モジュール写像設定群オブジェクト]]
: [VAR[既訪集合]] : [VAR[既訪集合]]
: [VAR[参照元]] : [CODE[client]]
: [VAR[最上位モジュールfetchフラグ]] : [[真]]
: [VAR[fetchの実行]] : [VAR[fetchの実行]]
: [VAR[続きの処理]] : [VAR[続きの処理]]
]FIG]
]FIG]

[32] [[モジュールワーカースクリプトグラフのfetch]]は、[[ワーカーを走らせる]]処理
([[専用ワーカー]]、[[共有ワーカー]]) と[[更新][更新ジョブ]]
([[サービスワーカー]]) から呼び出されます。

** 輸入モジュールスクリプト

[148] [[モジュールスクリプト]]内の [CODE[import]] は、
[[モジュールスクリプトの子孫のfetch]]により処理されます。

** モジュールスクリプト共通処理


[262] 
[DFN[[RUBYB[内部モジュールスクリプトグラフfetch手続き]@en[internal module script graph fetching procedure]]]]は、
次のようにします。 [SRC[>>164]]

[[引数]]として、次のものを受け取ります。
[VAR[URL]],
[VAR[fetchクライアント設定群オブジェクト]],
[VAR[終点]],
[VAR[オプション群]],
[VAR[モジュール写像設定群オブジェクト]],
[VAR[既訪集合]],
[VAR[参照子]],
[VAR[最上位モジュールfetchフラグ]],
[VAR[fetchの実行]],
[VAR[続きの処理]]。

[FIG(steps)[
= [263] [[単一モジュールスクリプトのfetch]]を実行します。
[VAR[URL]],
[VAR[fetchクライアント設定群オブジェクト]],
[VAR[終点]],
[VAR[オプション群]],
[VAR[モジュール写像設定群オブジェクト]],
[VAR[参照子]],
[VAR[最上位モジュールfetchフラグ]],
[VAR[fetchの実行]]を引き渡します。
[VAR[続きの処理]]は、 >>264 とします。
]FIG]

[264] その続きの処理は、[VAR[結果]]について、次のようにします [SRC[>>164]]。

[FIG(steps)[
= [265] [VAR[結果]]が [CODE[null]] の場合、
== [266] [VAR[結果]]について、[VAR[続きの処理]]を実行します。
= [267] それ以外の場合、
== [268] [VAR[最上位モジュールfetchフラグ]]が設定されている場合、
=== [269] [VAR[fetchクライアント設定群]]、
[VAR[結果]]と[VAR[既訪集合]]について、
[[モジュールスクリプトの子孫のfetchと実現値化]]を実行します。
[VAR[続きの処理]]を引き渡します。
== [270] それ以外の場合、
=== [271] [VAR[結果]]と[VAR[既訪集合]]について、
[[モジュールスクリプトの子孫のfetch]]を実行します。
[VAR[続きの処理]]を引き渡します。

]FIG]

[273] 
[DFN[[RUBYB[単一モジュールスクリプトのfetch]@en[fetch a single module script]]]]は、
次のようにします。 [SRC[>>164]]

[[引数]]として、次のものを受け取ります。
[VAR[URL]],
[VAR[fetchクライアント設定群オブジェクト]],
[VAR[終点]],
[VAR[オプション群]],
[VAR[モジュール写像設定群オブジェクト]],
[VAR[参照子]],
[VAR[最上位モジュールfetchフラグ]],
[VAR[fetchの実行]],
[VAR[続きの処理]]。

[FIG(steps)[
= [274] [VAR[モジュール写像]]を、[VAR[モジュール写像設定群オブジェクト]]の[F[モジュール写像]]に設定します。
= [276] [VAR[モジュール写像]] [ [VAR[URL]] ] が存在する場合、
== [275] [VAR[モジュール写像]] [ [VAR[URL]] ] が [CODE[fetching]] の場合、
=== [292] [VAR[モジュール写像]] [ [VAR[URL]] ] に、 [VAR[続きの処理]]を追加します。
== [291] それ以外の場合、
=== [277] [VAR[モジュール写像]] [ [VAR[URL]] ] について、[VAR[続きの処理]]を実行します。
= [278] それ以外の場合、
== [279] [VAR[モジュール写像]] [ [VAR[URL]] ] を、 [CODE[fetching]] に設定します。
== [280] [VAR[要求]]を、新しい[[要求]]に設定します。
[FIG(list members)[ [281] [[要求]]

: [F[URL][要求URL]] : [VAR[URL]]
: [F[終点][要求終点]] : [VAR[終点]]
: [F[モード][要求モード]] : [CODE[cors]]
: [F[参照子]] : [VAR[参照子]]
: [F[クライアント][要求クライアント]] : [VAR[fetchクライアント設定群オブジェクト]]

]FIG]
== [346] [VAR[要求]]と[VAR[オプション群]]について[[モジュールスクリプト要求を設定]]します。
== [282] [VAR[fetchの実行]]をします。
[FIG(list members)[
: [VAR[要求]] : [VAR[要求]]
: [VAR[最上位である]]フラグ : [VAR[最上位モジュールfetchフラグ]]
: [VAR[続きの処理]] : >>283
]FIG]

]FIG]

[283] その続きの処理は、[VAR[応答]]について、次のようにします。 [SRC[>>164]]

[FIG(steps)[
= [284] [VAR[応答]]の[F[型][応答型]]が [CODE[error]]、
[VAR[応答]]の[F[状態][応答符号]]が [[OK状態]]で''ない''、
[VAR[応答]]の[F[ヘッダーリスト]]について[[extract a MIME type]]して[[引数]]を無視すると
[[JavaScript MIME型]]と''ならない''、の''いずれか''が[[真]]の場合、
== [285] [CODE[null]] について、[VAR[続きの処理]]を実行します。
= [286] それ以外の場合、
== [287] [VAR[ソーステキスト]]を、[VAR[応答]]の[F[本体][応答本体]]を [[UTF-8復号]]した結果に設定します。
== [288] [VAR[モジュールスクリプト]]を、
[[モジュールスクリプトの作成]]の結果に設定します。
[FIG(list members)[

: [VAR[ソース]] : [VAR[ソーステキスト]]
: [VAR[環境設定群オブジェクト]] : [VAR[モジュール写像設定群オブジェクト]]
: [VAR[スクリプト基底URL]] : [VAR[応答]]の[F[URL][応答URL]]
: [VAR[オプション群]] : [VAR[オプション群]]

]FIG]
== [293] [VAR[モジュール写像]] [ [VAR[URL]] ] の各[VAR[処理]]について、
=== [294] [[タスクをキューに追加]]します。
[FIG(list members)[
: [VAR[処理]] : 
[FIG(steps)[
= [295] [VAR[モジュールスクリプト]]について、[VAR[処理]]を実行します。
]FIG]
: [VAR[タスク源]] : [[ネットワークタスク源]]
]FIG]
== [289] [VAR[モジュール写像]] [ [VAR[URL]] ] を、[VAR[モジュールスクリプト]]に設定します。
== [290] [VAR[モジュールスクリプト]]について、[VAR[続きの処理]]を実行します。
]FIG]

[296] [DFN[[RUBYB[モジュールスクリプトの子孫のfetch]@en[fetch the descendants of a module script]]]]は、
[VAR[モジュールスクリプト]]、
[VAR[fetchクライアント設定群オブジェクト]]、
[VAR[終点]]、[VAR[既訪集合]]、
[VAR[fetchの実行]]、[VAR[続きの処理]]について、
次のようにします。 [SRC[>>164]]

[FIG(steps)[
= [297] [VAR[モジュールスクリプト]]の[F[記録][スクリプトの記録]]が [CODE[null]] の場合、
== [298] [VAR[モジュールスクリプト]]について、[VAR[続きの処理]]を実行します。
= [302] それ以外の場合、
== [299] [VAR[記録]]を、[VAR[モジュールスクリプト]]の[F[モジュール記録]]に設定します。
== [300] [VAR[記録]]の [F(ss)[RequestedModules]] が[[空][空リスト]]の場合、
=== [301] [VAR[モジュールスクリプト]]について、[VAR[続きの処理]]を実行します。
== [303] それ以外の場合、
=== [304] [VAR[URL群]]を、新しい[[空リスト]]に設定します。
=== [305] [VAR[記録]]の [F(ss)[RequestedModules]] の各[VAR[被要求]]について、順に、
==== [306] [VAR[URL]] を、
[VAR[モジュールスクリプト]]の[F[基底URL]]
と[VAR[被要求]]について[[モジュール指定子の解決]]を実行した結果に設定します。
==== [307] [VAR[祖先リスト]]に [VAR[URL]] が含まれない場合、
===== [308] [VAR[URL群]]の末尾に、[VAR[URL]] を追加します。
===== [272] [VAR[既訪集合]]に、 [VAR[URL]] を追加します。
=== [311] [VAR[結果群]]を、[VAR[URL群]]と同じ[F[長さ]]の[[リスト]]に設定します。
各値は、[[未定義]]とします。
=== [314] [VAR[URL群]]が[[空]]の場合、
==== [315] [VAR[モジュールスクリプト]]について、[VAR[続きの処理]]を実行します。
=== [316] それ以外の場合、
==== [347] [VAR[子孫オプション群]]を、
[VAR[オプション群]]の[[子孫スクリプトfetchオプション群]]に設定します。
==== [309] [VAR[URL群]]の各 [VAR[URL]] (位置[VAR[索引]]) について、順に、
===== [310] [[並列に]] ([SHOULD[SHOULD]])、
[[内部モジュールスクリプトグラフfetch手続き]]を実行します。
[FIG(list members)[

: [VAR[URL]] : [VAR[URL]]
: [VAR[fetchクライアント設定群オブジェクト]] : [VAR[fetchクライアント設定群オブジェクト]]
: [VAR[終点]] : [VAR[終点]]
: [VAR[オプション群]] : [VAR[子孫オプション群]]
: [VAR[モジュール写像設定群オブジェクト]] : [VAR[モジュールスクリプト]]の[F[設定群オブジェクト]]
: [VAR[既訪集合]] : [VAR[既訪集合]]
: [VAR[参照子]] : [VAR[モジュールスクリプト]]の[F[基底URL]]
: [VAR[最上位モジュールfetchフラグ]] : [[偽]]
: [VAR[fetchの実行]] : [VAR[fetchの実行]]
: [VAR[続きの処理]] : >>324

]FIG]

]FIG]

[324] 個々の続きの処理は[VAR[結果]]について、次のようにします。 [SRC[>>164]]

[FIG(steps)[
= [318] [VAR[結果]]が [CODE[null]] の場合、
== [313] [VAR[失敗済み]]を、[[真]]に設定します。
== [319] [VAR[結果]]について[VAR[続きの処理]]を実行します。
= [320] それ以外で、[VAR[失敗済み]]の場合、
== [321] ここで停止します。
= [317] それ以外の場合、
== [312] [VAR[結果群]] [ [VAR[索引]] ] を、[VAR[結果]]に設定します。
== [323] [VAR[モジュールスクリプト]]について[VAR[続きの処理]]を実行します。
]FIG]

[325] 
[DFN[[RUBYB[モジュールスクリプトの子孫のfetchと実現値化]@en[fetch the descendants of and instantiate a module script]]]]は、
[VAR[モジュールスクリプト]]、
[VAR[fetchクライアント設定群オブジェクト]]、
[VAR[終点]]、
[VAR[既訪集合]] ([[既定値]]は[[空集合]])、
[VAR[続きの処理]]について、次のようにします。 [SRC[>>164]]

[FIG(steps)[
= [326] 
[VAR[fetchクライアント設定群オブジェクト]]、
[VAR[終点]]、[VAR[既訪集合]]について、
[[モジュールスクリプトの子孫のfetch]]を実行します。
[VAR[続きの処理]]は、 >>327 とします。
]FIG]

[327] その続きの処理は、[VAR[結果]]について、次のようにします [SRC[>>164]]。

[FIG(steps)[
= [328] [VAR[結果]]が [CODE[null]] の場合、
== [329] [VAR[結果]]について、[VAR[続きの処理]]を実行します。
= [330] それ以外の場合、
== [322] [VAR[構文解析エラー]]を、
[VAR[結果]]について[[最初の構文解析エラーを探す]]処理を実行した結果に設定します。
== [351] [VAR[構文解析エラー]]が [CODE[null]] の場合、
=== [331] [VAR[記録]]を、[VAR[結果]]の[F[記録][スクリプトの記録]]に設定します。
=== [332] [VAR[記録]]の [[Instantiate]] を実行します。
[[例外]]が[[投げ]]られた場合、
[VAR[結果]]の[F[再び投げるエラー]]を、その[[例外]]に設定します。
== [350] それ以外の場合、
=== [352] [VAR[結果]]の[F[再び投げるエラー]]を、
[VAR[構文解析エラー]]に設定します。
== [333] [VAR[結果]]について、[VAR[続きの処理]]を実行します。
]FIG]

[353] 
[DFN[[RUBYB[最初の構文解析エラーを探す]@en[find the first parse error]]]]処理は、
[VAR[モジュールスクリプト]]と[VAR[見つけた集合]] (既定値は[[空集合]]) について、
次のようにすることをいいます [SRC[>>164]]。

[FIG(steps)[
= [354] [VAR[モジュール写像]]を、[VAR[モジュールスクリプト]]の[F[設定群オブジェクト]]の[F[モジュール写像]]に設定します。
= [355] [VAR[見つけた集合]]へ[VAR[モジュールスクリプト]]を[[末尾に追加]]します。
= [356] [VAR[モジュールスクリプト]]の[F[記録][スクリプトの記録]]が [CODE[null]] の場合、
== [357] [VAR[モジュールスクリプト]]の[F[構文解析エラー]]を返します。
= [358] それ以外の場合、
== [359] [VAR[モジュールスクリプト]]の[F[記録][スクリプトの記録]]の
[F(ss)[RequestedModules]] の各[VAR[子供指定子]]について、[[順に][for each]]、
=== [362] [VAR[子供URL]]を、
[VAR[子供指定子]]と[VAR[モジュールスクリプト]]について[[モジュール指定子の解決]]を適用した結果に設定します。
=== [363] [VAR[子供モジュール]]を、
[VAR[モジュール写像]] [ [VAR[子供URL]] ] に設定します。
==== [360] [VAR[見つけた写像]]に[VAR[子供モジュール]]が[[含まれ][list contains]]てい''ない''場合、
===== [361] [VAR[子供構文解析エラー]]を、
[VAR[子供モジュール]]と[VAR[見つけた集合]]についての[VAR[最初の構文解析エラーを探す]]処理の結果に設定します。
===== [364] [VAR[子供構文解析エラー]]が [CODE[null]] で''ない''場合、
====== [365] [VAR[子供構文解析エラー]]を返し、ここで停止します。
== [366] [CODE[null]] を返します。
]FIG]


* fetchの実行

[117] [[スクリプトのfetch]] の各手順の呼び出し元は、
[DFN[[RUBYB[fetchの実行]@en[perform the fetch]]]]の手続きを定義できます [SRC[>>4]]。
これは[VAR[要求]]、[VAR[最上位]]フラグ、[VAR[続きの処理]]についての処理です。

[111] [CODE(HTMLe)@en[script]] [[要素]]と [CODE(DOMm)@en[importScripts]]
の場合、次のようにします [SRC[>>4]]。
[FIG(steps)[
= [112] [VAR[要求]]について [[fetch]] します。[VAR[[[process response]]]] は、
[VAR[続きの処理]]とします。
]FIG]

[109] [CODE(DOMi)@en[Worker]] と [CODE(DOMi)@en[SharedWorker]] の場合、
呼び出し元である[[ワーカーを走らせる手順]]の[VAR[内側設定群]]と[VAR[ワーカー大域適用範囲]]を使って、
次のようにします [SRC[>>4]]。

[FIG(steps)[
= [181] [VAR[要求]]の[F[予約クライアント]]を、[VAR[内側設定群]]に設定します。
= [140] [VAR[要求]]について [[fetch]] を実行します。
[VAR[process response]] は、 >>110 とします。
]FIG]

[110] [[fetch]] の結果を受けて、[VAR[応答]]を次のようにします [SRC[>>4]]。

[FIG(steps)[
= [131] [VAR[ワーカー大域適用範囲]]の[F[URL][ワーカーのURL]]を、
[VAR[応答]]の[F[URL][応答のURL]]に設定します。
= [132] [VAR[ワーカー大域適用範囲]]の[F[HTTPS状態]]を、
[VAR[応答]]の[F[HTTPS状態]]に設定します。
= [128] [VAR[ワーカー大域適用範囲]]の[F[参照元ポリシー]]を、
[VAR[応答]]について [CODE(HTTP)@en[Referrer-Policy:]] [[ヘッダー]]を[[構文解析]]して得た[[参照元ポリシー]]に設定します。
= [133] [VAR[ワーカー大域適用範囲]]と[VAR[応答]]について、
[[大域オブジェクトのCSPリストの初期化]]を実行します。
= [134] [VAR[応答]]について[VAR[続きの処理]]を実行します。
]FIG]

[120] [[サービスワーカー]]の[DFN[[RUBYB[[[更新][更新ジョブ]]]@en[Update]]]]では、
次のようにします [SRC[>>119]]。

[FIG(steps)[
= [188] [VAR[要求]]の[F[ヘッダーリスト]]に、
[CODE[[[Service-Worker]]: [[script]]]] を追加します。
= [190] 次の''いずれか''の場合:
[FIG(list)[
- [191] [VAR[登録]]の[F[キャッシュ利用]]が[[偽]]
- [192] [VAR[ジョブ]]の [F[force bypass cache flag]] が[[真]]
- [193] [VAR[最新ワーカー]]が [CODE[null]] でなく、
[VAR[登録]]の [F[last update check time]] が [CODE[null]] でなく、
[[現在時刻]] - [VAR[登録]]の [F[last update check time]] > [N[86400]]
]FIG]
== [189] [VAR[要求]]の[F[キャッシュモード]]を、[CODE[no-cache]] に設定します。
= [194] [VAR[要求]]の[F[サービスワーカーモード]]を、 [CODE[none][サービスワーカーモード]]
に設定します。
= [195] [VAR[最上位]]が[[偽]]の場合、
== [196] [VAR[要求]]を[VAR[続きの処理]]について [[fetch]] し、ここで停止します。
= [197] [VAR[要求]]の[F[リダイレクトモード]]を、 [CODE[error][リダイレクトモード]]
に設定します。
= [198] [VAR[要求]]を [[fetch]] します。[VAR[[[process response]]]] は >>199 とします。
]FIG]

[199] [[process response]] は、[VAR[応答]]について次のようにします [SRC[>>119]]。

[FIG(steps)[
= [200] [VAR[応答]]の[F[ヘッダーリスト]]から[[MIME型を抜き取る]]処理の結果得られた[[MIME型]]
([[引数]]以外) が[[サービスワーカーのMIME型]]のいずれかで''ない''場合、
== [201] [VAR[ジョブ]]と [CODE(JS)@en[SecurityError]] について[[ジョブ約束を拒絶]]します。
== [202] [[ネットワークエラー]]について[VAR[続きの処理]]を実行します。
== [203] ここで停止します。
= [204] [VAR[承認]]を、[VAR[応答]]の[F[ヘッダーリスト]]の
[CODE(HTTP)@en[Service-Worker-Allowed]] [[ヘッダー]]の値に設定します。
= [205] [VAR[HTTPS状態]]を、[VAR[応答]]の[F[HTTPS状態]]に設定します。
= [206] [VAR[参照元ポリシー]]を、
[VAR[応答]]について [CODE(HTTP)@en[Referrer-Policy:]] [[ヘッダー]]を[[構文解析]]して得た[[参照元ポリシー]]に設定します。
= [207] [VAR[承認]]が[[失敗]]の場合、
== [208] [[ネットワークエラー]]について[VAR[続きの処理]]を実行します。
== [209] ここで停止します。
= [212] [VAR[承認]]が [CODE[null]] の場合、
== [213] [VAR[最大適用範囲文字列]]を、[VAR[ジョブ]]の[F[スクリプトURL][サービスワーカー]]の[[ディレクトリーURL]]の[F[URL path]]の文字列に設定します。
= [214] それ以外の場合、
== [215] [VAR[最大適用範囲]]を、[VAR[承認]]を[VAR[ジョブ]]の[F[スクリプトURL][サービスワーカー]]に対して[[構文解析][URL構文解析]]した結果に設定します。
== [216] [VAR[最大適用範囲文字列]]を、[VAR[最大適用範囲]]の[F[URL path]]の文字列に設定します。
= [210] [VAR[登録]]の[F[適用範囲URL]]の[F[URL path]]の文字列が[VAR[最大適用範囲文字列]]から始まら''ない''場合、
== [219] [VAR[ジョブ]]と [CODE(JS)@en[SecurityError]] について[[ジョブ約束を拒絶]]します。
== [220] [[ネットワークエラー]]について[VAR[続きの処理]]を実行します。
== [221] ここで停止します。
= [222] [VAR[応答]]の[F[キャッシュ状態]]が [CODE[local][キャッシュ状態]]
で''ない''場合、
== [223] [VAR[登録]]の[F[last update check time]]を、[[現在時刻]]に設定します。
= [224] [VAR[応答]]について[VAR[続きの処理]]を実行します。
]FIG]

[HISTORY[
[106] かつては他に[DFN[[RUBYB[要求の準備]@en[set up the request]]]]と[DFN[[RUBYB[応答の処理]@en[process the response]]]]も定義されていましたが、
[[fetchの実行]]に統合されました。
]HISTORY]

* 歴史

** スクリプト

[11] [CODE(HTMLe)@en[[[script]]]] [[要素]]に関する処理は、 [[HTML5]]
が [CODE(HTMLe)@en[[[script]]]] [[要素]]の処理を明文化した際に初めて規定されました。

;; [CODE(HTMLe)@en[[[script]]]] 参照。

** ワーカー

[1] [[ワーカー]]に関する処理は、[[ワーカー]]導入時に [[run a worker]] 処理の一部として規定されました。

;; [[run a worker]] を参照。

** モジュール

[3] [[モジュール]]の導入により、[[古典スクリプト]]を参照する [CODE(HTMLe)@en[[[script]]]]
[[要素]]の [[fetch]] 部分の処理はや[[古典スクリプト]]を使った[[ワーカー]]の [[fetch]]
部分の処理はそれぞれ単独の[[手続き]]に ([[仕様書]]上) 分離されました。

[REFS[
- [2] [CITE@en[Add module workers · whatwg/html@e3a5bb7]] ([TIME[2016-02-16 00:03:29 +09:00]] 版) <https://github.com/whatwg/html/commit/e3a5bb757f64374c37d8c4528c01298463ef0b2a>
]REFS]

[97] [CITE@en[Fix fetching module scripts with circular imports · whatwg/html@3c047b5]]
([TIME[2016-02-21 12:43:19 +09:00]] 版)
<https://github.com/whatwg/html/commit/3c047b5a35da7af9cffef2a654a944e33be256cc>

[99] [CITE@en[Make script fetching more correct with regard to request destinations · whatwg/html@6dc9c9e]]
([TIME[2016-02-29 17:59:23 +09:00]] 版)
<https://github.com/whatwg/html/commit/6dc9c9e1efcc3122294fb015e4a4eea66456a611>

[101] [CITE@en[Add set up the request/validate the response hooks to script fetching · whatwg/html@33ef23a]]
([TIME[2016-03-03 21:21:10 +09:00]] 版)
<https://github.com/whatwg/html/commit/33ef23a6a046db6469a1eb1a6a76f0fdedba8d55>

[125] [CITE@en[27852 – Consider rejecting script responses whose MIME type isn't sufficiently scripty.]]
([TIME[2016-03-25 11:24:36 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=27852>

[126] [CITE@en[Block `image/*` resources loaded as script · whatwg/fetch@b561a73]]
([TIME[2016-03-25 13:44:03 +09:00]] 版)
<https://github.com/whatwg/fetch/commit/b561a73f23b7139d5f4bb0de322dc37e74af0091>

[127] [CITE@en[Pass cryptographic nonce metadata to Fetch · whatwg/html@5479e07]]
([TIME[2016-04-07 16:09:50 +09:00]] 版)
<https://github.com/whatwg/html/commit/5479e07a6f6e01062b85b5fe6799752b0370336c>

[129] [CITE@en[Get a reference to the response correctly in worker initialization · whatwg/html@536a962]]
([TIME[2016-04-14 13:09:06 +09:00]] 版)
<https://github.com/whatwg/html/commit/536a96229ced274b80f78ad791c34ecfe11b289b>

[136] [CITE@en[Pass parser metadata to Fetch · whatwg/html@e6500b9]]
([TIME[2016-04-16 22:47:15 +09:00]] 版)
<https://github.com/whatwg/html/commit/e6500b90244376c023e7b78642dbc7b86829233f>

[16] [CITE@en[Refactor cryptographic nonce ductwork by mikewest · Pull Request #1032 · whatwg/html]]
([TIME[2016-04-16 23:21:49 +09:00]] 版)
<https://github.com/whatwg/html/pull/1032>

[100] [CITE@en[Use outside settings object to fetch workers]]
( ([[domenic]]著, [TIME[2016-05-11 19:57:24 +09:00]]))
<https://github.com/whatwg/html/commit/4e2b0066cb88fdc7ac65cc6e6a7eb40ac39418bd>

[116] [CITE@en[Make import statements set the importing script as the referrer]]
( ([[@import]]著, [TIME[2016-05-19 16:36:44 +09:00]]))
<https://github.com/whatwg/html/commit/a6c11714b5e64479e945b36f76817c4ed96f3218>

[137] [CITE@en[Integrate with the Referrer Policy spec, part 2 of n]]
( ([[domenic]]著, [TIME[2016-05-18 01:52:35 +09:00]]))
<https://github.com/whatwg/html/commit/176e74243c649b709b9959b7d08b327290c2f403>

[138] [CITE@en[Add a custom "perform the fetch" hook for modules]]
([[domenic]]著, [TIME[2016-07-02 04:07:36 +09:00]])
<https://github.com/whatwg/html/commit/8c43afcbedf0506ac9d62d85a72f1a23fd9f520c>

[141] [CITE@en[Align Fetch's destination concept with changes in Fetch]]
([[sideshowbarker]]著, [TIME[2016-07-05 02:46:14 +09:00]])
<https://github.com/whatwg/html/commit/5e8f96a85d182d36c177db0d6fdde58b4ded86d4>

[142] [CITE@en[Improve all the script-fetching algorithms]]
([[domenic]]著, [TIME[2016-07-08 01:25:53 +09:00]])
<https://github.com/whatwg/html/commit/b4f40e72fcca8a13eefa8a2dd06258378e76fcb7>

[149] [CITE@en[1048535 – Cross-origin info leak: '''[''''''['''get''']'''''']''' calls on global expose text (or CSV) sniffed as JS]]
([TIME[2016-07-26 21:12:08 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=1048535>

[150] [CITE@en[Handle error cases during module script tree fetching/running better]]
([[domenic]]著, [TIME[2016-08-09 12:06:32 +09:00]])
<https://github.com/whatwg/html/commit/e1af86747f591e33fd0f3f21f301dc866868c9d4>

[180] [CITE@en[Block additional "script" MIME types]]
([[evilpie]]著, [TIME[2016-08-30 02:51:43 +09:00]])
<https://github.com/whatwg/fetch/commit/2e85ceffe027fe97d56184c8a4fe6f11b5780193>

[182] [CITE@en[Improve navigate for service worker hooks]]
([[jungkees]]著, [TIME[2016-10-24 20:32:35 +09:00]])
<https://github.com/whatwg/html/commit/2b93f9ec35b152e58d3e181bea8c45d789bac949>

[183] [CITE@en[Upstream SRI's 'integrity' attribute]]
([[mikewest]]著, [TIME[2016-11-03 22:33:16 +09:00]])
<https://github.com/whatwg/html/commit/4c5066c171610e0c8300a58baf4f94816044cedc>

[184] [CITE@en[Talk about module script graphs, not trees]]
([[domenic]]著, [TIME[2016-11-19 09:00:00 +09:00]])
<https://github.com/whatwg/html/commit/57775269ed9681cd07f7b4bb33b998b26f48e4eb>

[185] [CITE@en[Fix classic worker scripts to be created in the correct realm]]
([[domenic]]著, [TIME[2016-11-23 01:50:08 +09:00]])
<https://github.com/whatwg/html/commit/11b6a37f934b528d4e5799b1cd9485e1850e3cf2>

[186] [CITE@en[Properly queue a task when waiting for a module fetch]]
([[domenic]]著, [TIME[2016-12-22 07:06:44 +09:00]])
<https://github.com/whatwg/html/commit/6e055a81c573330a48c3e71121cffee5654aa119>

[211] [CITE@en[Clarify the setting of scripts' '''[''''''['''HostDefined''']'''''']''']]
([[domenic]]著, [TIME[2017-04-18 06:12:20 +09:00]])
<https://github.com/whatwg/html/commit/9b4d858a14bf39aec5624a12f1bb598cb63385aa>

[218] [CITE@en[Fix an algorithm that was treating null as a module script]]
([[domenic]]著, [TIME[2017-04-18 13:40:27 +09:00]])
<https://github.com/whatwg/html/commit/26aa7c3863d741d227652661a5458bc6f07c478f>

[227] [CITE@en[Do not attempt to instantiate modules that have previously failed]]
([[domenic]]著, [TIME[2017-04-26 03:54:55 +09:00]])
<https://github.com/whatwg/html/commit/df58a1c6b10739f12efbd80f7fb6205fda0a59ed>

[24] [CITE@en[Fix error cases of <script type=module>]]
([[domenic]]著, [TIME[2017-05-13 01:50:49 +09:00]])
<https://github.com/whatwg/html/commit/115763124a641e8814665c5014d28155f95ff441>

[65] [CITE@en[Properly instantiate inline module scripts]]
([[domenic]]著, [TIME[2017-04-29 05:52:23 +09:00]])
<https://github.com/whatwg/html/commit/3a3405a42de289ecb08e915b278064a99794731d>

[66] [CITE@en[Properly instantiate inline module scripts]]
([[domenic]]著, [TIME[2017-04-29 05:52:23 +09:00]])
<https://github.com/whatwg/html/commit/3a3405a42de289ecb08e915b278064a99794731d>

[67] [CITE@en[Don't handle impossible errors in HostResolveImportedModule]]
([[domenic]]著, [TIME[2017-05-13 01:59:57 +09:00]])
<https://github.com/whatwg/html/commit/616df18cd9e6c17878db5167909c69ca9f9d2906>

[229] [CITE@en[Fetch removes type in favor of just destination]]
([[annevk]]著, [TIME[2017-08-21 16:37:50 +09:00]])
<https://github.com/whatwg/html/commit/5f59b7a73d450e244a573e5916deb1c2037c1366>

***

[165] [[モジュールスクリプト]]は、
[DFN[[F[[RUBYB[状態]@en[state]]][実現値化状態]]]]
(旧[DFN[[F[[RUBYB[[[実現値化状態]]]@en[instantiation state]]]]]]) を持ちます。
その値は、 [DFN[[CODE[uninstantiated]]][実現値化状態]], [DFN[[CODE[errored]]][実現値化状態]],
[DFN[[CODE[instantiated]]][実現値化状態]] のいずれかです。この状態は、[[実現値化]]に失敗した[[モジュールスクリプト]]の再実行を回避するために使われています。
[SRC[>>164]]

[166] [[モジュールスクリプト]]は、
[DFN[[F[[RUBYB[エラー]@en[error]]][実現値化エラー]]]]
(旧[DFN[[F[[RUBYB[[[実現値化エラー]]]@en[instantiation error]]]]]]) を持ちます。
[F[状態][実現値化状態]]が [CODE[errored][実現値化状態]] の時に、 
[[JavaScript値]]が設定されます。
[SRC[>>164]]

[25] 
[DFN[[RUBYB[モジュールスクリプトをエラーにする]@en[error a module script]]]]には、
[VAR[スクリプト]]と[VAR[エラー]]を次のようにします [SRC[>>164]]。

[FIG(steps)[
= [26] [VAR[スクリプト]]の[F[モジュール記録]]が設定されている場合、
== [152] [VAR[スクリプト]]の[F[モジュール記録]]の[F(ss)[HostDefined]]を、
[[未定義]]に設定します。
== [228] [VAR[スクリプト]]の[F[モジュール記録]]を、[CODE[null]] に設定します。
= [234] [VAR[スクリプト]]の[F[状態][実現値化状態]]を、[CODE[errored][実現値化状態]]
に設定します。
= [235] [VAR[スクリプト]]の[F[エラー][実現値化エラー]]を、
[VAR[エラー]]に設定します。
]FIG]

[37] [DFN[[RUBYB[内部モジュールスクリプトグラフfetch手続き]@en[internal module script graph fetching  procedure]]]]は、
[VAR[URL]]、[VAR[fetchクライアント設定群オブジェクト]]、
[VAR[終点]]、[VAR[暗号学的nonce]]、[VAR[構文解析器状態]]、
[VAR[credentialsモード]]、[VAR[モジュール写像設定群オブジェクト]]、
[VAR[祖先リスト]]、[VAR[参照元]]、[VAR[最上位モジュールfetch]]フラグ、
[VAR[fetchの実行]]、[VAR[続きの処理]]について、次のようにします [SRC[>>4]]。

[FIG(steps)[
= [38] [VAR[URL]]、[VAR[credentialsモード]]、[VAR[暗号学的nonce]]、[VAR[構文解析器状態]]、[VAR[終点]]、
[VAR[fetchクライアント設定群オブジェクト]]、
[VAR[モジュール写像クライアント設定群オブジェクト]]、
[VAR[参照元]]、
[VAR[fetchの実行]]について[[単一モジュールスクリプトのfetch]]を実行します。
[VAR[続きの処理]]は、 >>39 とします。
]FIG]

[39] その続きの処理は、[VAR[結果]]について次のようにします [SRC[>>4]]。
[FIG(steps)[
= [40] [VAR[結果]]が [CODE[null]] の場合、
または[VAR[結果]]の[F[状態][実現値化状態]]が
[CODE[instantiated][実現値化状態]] または [CODE[errored][実現値化状態]] の場合、
== [41] [VAR[結果]]について、[VAR[続きの処理]]を実行します。
= [42] それ以外の場合、
== [236] [[モジュールスクリプトの子孫をfetchして実現値化]]します。
[FIG(list members)[
: [VAR[スクリプト]] : [VAR[結果]]
: [VAR[終点]] : [VAR[終点]]
: [VAR[祖先リスト]] : [VAR[祖先リスト]]の末尾に [VAR[URL]] を追加した[[リスト]]
: [VAR[fetchの実行]] : [VAR[fetchの実行]]
: [VAR[最上位モジュールfetch]]フラグ : [[真]]
: [VAR[続きの処理]] : >>160
]FIG]
]FIG]

[160] その続きの処理は、[VAR[最終結果]]について次のようにします [SRC[>>4]]。

[FIG(steps)[
= [237] [VAR[最終結果]]を返します。
]FIG]

[44] 
[DFN[[RUBYB[モジュールスクリプトの子孫をfetchして実現値化]@en[fetch the descendants of and instantiate a module script]]]]
(旧[DFN[[RUBYB[モジュールスクリプトの子孫のfetch]@en[fetch the descendants of a module script]]]])
は、[VAR[スクリプト]]と[VAR[終点]]と[VAR[祖先リスト]]と[VAR[fetchの実行]]と[VAR[続きの処理]]を受け取り、次のようにします [SRC[>>4]]。

[FIG(steps)[
= [238] [VAR[スクリプト]]の[F[状態][実現値化状態]]が
[CODE[instantiated][実現値化状態]] または [CODE[errored][実現値化状態]] の場合、
== [239] [VAR[スクリプト]]について[VAR[続きの処理]]を実行し、ここで停止します。
= [46] [VAR[記録]]を、[VAR[スクリプト]]の[F[[[モジュール記録]]]]に設定します。
= [47] [CODE[[VAR[記録]].[F(ss)[RequestedModules]]]] が[[空][空リスト]]の場合、
== [48] [VAR[スクリプト]]について[VAR[続きの処理]]を実行し、ここで停止します。
= [49] [VAR[URL群]]を、[[空リスト]]に設定します。
= [50] [CODE[[VAR[記録]].[F(ss)[RequestedModules]]]] の各[VAR[披要求]]について、順に、
== [51] [VAR[URL]] を、[VAR[スクリプト]]と[VAR[被要求]]について[[モジュール指定子を解決]]した結果に設定します。
== [52] [VAR[URL]] が[[失敗]]の場合、
=== [240] [VAR[誤り]]を、新しい [CODE(JS)@en[TypeError]] に設定します。
=== [241] [VAR[スクリプト]]と[VAR[誤り]]について[[モジュールスクリプトをエラーにする]]処理を実行します。
=== [55] [VAR[スクリプト]]について[VAR[続きの処理]]を実行し、ここで停止します。
== [98] [VAR[祖先リスト]]が [VAR[URL]] を[[含ま][含む]]ない場合、
=== [57] [VAR[URL]] を [VAR[URL群]]の[[末尾に追加]]します。
= [53] [VAR[子孫の結果]]を、 [CODE[null]] に設定します。
= [68] [VAR[完了時]]を、[[すべて終わったら実行]]に設定します。
= [58] [VAR[URL群]]の各 [VAR[URL]] について、順に、
== [156] [VAR[完了時]]について実行します。
[FIG(list members)[
: [VAR[処理]] :
[[内部モジュールスクリプトグラフfetch手続き]]を実行します。
[FIG(list members)[
: [VAR[URL]] : [VAR[URL]]
: [VAR[credentialsモード]] : [VAR[スクリプト]]の[F[credentialsモード]]
: [VAR[終点]] : [VAR[終点]]
: [VAR[設定群オブジェクト]] : [VAR[スクリプト]]の[F[設定群オブジェクト]]
: [VAR[暗号学的nonce]] : [VAR[スクリプト]]の[F[暗号学的nonce]]
: [VAR[構文解析器状態]] : [VAR[スクリプト]]の[F[構文解析器状態]]
: [VAR[祖先リスト]] : [VAR[祖先リスト]]
: [VAR[参照元]] : [VAR[スクリプト]]の[F[基底URL]]
: [VAR[最上位モジュールfetch]]フラグ : [[偽]]
: [VAR[fetchの実行]] : [VAR[fetchの実行]]
: [VAR[続きの処理]] : [VAR[処理状態]]について、 >>60
]FIG]
: [VAR[中断処理]] :
@@ この fetch
を中断して構いません。

]FIG]
= [157] [VAR[完了時]]について >>246 を完了時に実行します。
]FIG]

;; [45] [[モジュールスクリプトグラフのfetch]]の他、 [CODE(HTMLe)@en[[[script]]]]
[[要素]]の処理から呼び出されることもあります。

[60] 続きの処理は、[VAR[処理状態]]と[VAR[結果]]について次のようにします [SRC[>>4]]。

[FIG(steps)[
= [43] [VAR[結果]]により、
[FIG(switch)[
: [CODE[null]] :
[FIG(steps)[
= [62] [VAR[完了時]]を中断します。
= [242] [VAR[子孫の結果]]を、 [CODE[null]] に設定します。
]FIG]
: [[モジュールスクリプト]]で[F[状態][実現値化状態]]が [CODE[errored][実現値化状態]] :
[FIG(steps)[
= [244] [VAR[完了時]]を中断します。
= [245] [VAR[子孫の結果]]を、[VAR[モジュールスクリプト]]に設定します。
]FIG]
: それ以外 :
[FIG(steps)[
= [158] [VAR[完了時]]が[F[中断済み]]でない場合、
== [161] [VAR[子孫の結果]]を、[VAR[スクリプト]]に設定します。
]FIG]

]FIG]
= [59] [VAR[処理状態]]の完了を実行します。
]FIG]

[246] 完了時には、次のようにします [SRC[>>4]]。

[FIG(steps)[
= [233] [VAR[実現値化状態]]を、[VAR[記録]]の 
[CODE[ModuleDeclarationInstantiation]] を実行した結果に設定します。
= [153] [VAR[スクリプト]]の[[未実現値化包括的子孫モジュールスクリプト群]]の各[VAR[スクリプト]]について、
== [154] [VAR[実現値化状態]]が [[abrupt completion]] なら、
=== [217] [VAR[スクリプト]]と[VAR[実現値化状態]]について[[モジュールスクリプトをエラーにする]]処理を実行します。
== [243] それ以外の場合、
=== [159] [VAR[スクリプト]]の[F[実現値化状態]]を、 [CODE[instantiated][実現値化状態]]
に設定します。
= [155] [VAR[子孫の結果]]について、[VAR[続きの処理]]を実行します。
]FIG]



[167] [VAR[スクリプト]]の[DFN[[RUBYB[[[未実現値化包括的子孫モジュールスクリプト群]]]@en[uninstantiated inclusive descendant module scripts]]]]は、
次のようにして得ます [SRC[>>4]]。

[FIG(steps)[
= [61] [VAR[スクリプト]]の[F[モジュール記録]]が [CODE[null]] の場合、
== [64] [[空集合]]を返し、ここで停止します。
= [168] [VAR[モジュール写像]]を、[VAR[スクリプト]]の[F[設定群オブジェクト]]の[F[モジュール写像]]に設定します。
= [170] [VAR[包括的子孫]]を、[[空集合]]に設定します。
= [169] [VAR[スタック]]を、[VAR[スクリプト]]を含んだ[[リスト]]に設定します。
= [171] [VAR[スタック]]が[[空]]でない間、繰り返し、
== [172] [VAR[現在]]を、[VAR[スタック]]の最後の項目に設定し、[VAR[スタック]]からこれを削除します。
== [173] [VAR[現在]]が[VAR[包括的子孫]]にも[VAR[スタック]]にも含まれないなら、
=== [174] [VAR[現在]]を、[VAR[包括的子孫]]に追加します。
=== [175] [VAR[子供指定子群]]を、[VAR[現在]]の[F[モジュール記録]]の[F(ss)[RequestedModules]]に設定します。
=== [176] [VAR[子供URL群]]を、[VAR[子供指定子群]]の各項目に[[モジュール指定子の解決]]を適用したものの[[集合]]から[[失敗]]を除去したものに設定します。
=== [177] [VAR[子供モジュール群]]を、[VAR[モジュール写像]]において[F[キー]]が[VAR[子供URL群]]に含まれる[F[値]]の[[集合]]に設定します。
=== [178] [VAR[子供モジュール群]]の各[VAR[項目]]について、
==== [225] [VAR[項目]]が[VAR[包括的子孫群]]に[[含まれ][list contains]]''ず''、
[VAR[項目]]が [CODE[null]] で''ない''場合、
===== [226] [VAR[項目]]を[VAR[スタック]]に追加します。
= [179] [VAR[包括的子孫]]の項目のうち、[F[状態][実現値化状態]]が [CODE[uninstantiated][実現値化状態]]
のものの[[集合]]を返します。
]FIG]



[69] [DFN[[RUBYB[単一モジュールスクリプトのfetch]@en[fetch a single module script]]]]は、
[VAR[URL]]、[VAR[credentialsモード]]、[VAR[暗号学的nonce]]、[VAR[構文解析器状態]]、
[VAR[終点]]、[VAR[fetchクライアント設定群オブジェクト]]、
[VAR[モジュール写像設定群オブジェクト]]、
[VAR[参照元]]、[VAR[最上位モジュールfetch]]、
[VAR[fetchの実行]]、[VAR[続きの処理]]について次のようにします [SRC[>>4]]。

[FIG(steps)[
= [70] [VAR[モジュール写像]]を、[VAR[モジュール写像設定群オブジェクト]]の[F[モジュール写像]]に設定します。
= [71] [VAR[モジュール写像]]に[F[キー]]が [VAR[URL]]、[F[値]]が [CODE[fetching]]
のエントリーが含まれていれば、
== [72] [[並列に]]値が変化するのを待ちます。変化したら >>73 を実行します。
= [74] それ以外なら、
== [75] >>73 を実行します。
]FIG]

[73] [CODE[[[fetching]]]] でなくなった時、次のようにします [SRC[>>4]]。

[FIG(steps)[
= [187] [[タスクをキューに追加]]します。
[FIG(list members)[
: [VAR[処理]] :
[FIG(steps)[
= [76] [VAR[モジュール写像]]に[F[キー]]が [VAR[URL]] のエントリーが含まれていれば、
== [77] 当該エントリーの[F[値]]について[VAR[続きの処理]]を実行し、ここで停止します。
= [78] [VAR[モジュール写像]]に[F[キー]]が [VAR[URL]] で値が [CODE[[[fetching]]]]
のエントリーを追加します。
= [79] [VAR[要求]]を、新しい[[要求]]に設定します。
[FIG(list members middle)[
[FIGCAPTION[
[163] [[要求]]
]FIGCAPTION]
: [F[[[URL]]]] : [VAR[URL]]
: [F[[[終点]]]] : [VAR[終点]]
: [F[[[型]]]] : [CODE[[[script]]]]
: [F[[[モード]]]] : [CODE[[[cors]]]]
: [F[[[credentialsモード]]]] : [VAR[credentialsモード]]
: [F[構文解析器メタデータ]] : [VAR[構文解析器状態]]
: [F[暗号学的nonceメタデータ]] : [VAR[暗号学的nonce]]
: [F[クライアント]] : [VAR[fetchクライアント設定群オブジェクト]]
: [F[参照元]] : [VAR[参照元]]
]FIG]
= [113] [VAR[要求]]について[VAR[fetchの実行]]をします。
[VAR[最上位]]フラグは、[VAR[最上位モジュールfetch]]フラグとします。
[VAR[続きの処理]]は >>80 とします。
]FIG]
: [VAR[タスク源]] : [[ネットワーク処理タスク源]]
]FIG]
]FIG]

[80] [[fetch]] の結果の処理は、[VAR[[[応答]]]]について次のようにします [SRC[>>4]]。

[FIG(steps)[
= [81] 
[FIG(list)[
- [85] [VAR[応答]]の[F[[[型]]]]が [CODE[[[error]]]]
- [86] [VAR[応答]]の[F[[[状態]]]]が [[OK状態]]で''ない''
- [87] [VAR[応答]]の[F[[[ヘッダーリスト]]]]から[[MIME型を取り出す]]と、
([[引数]]を無視すると) [[JavaScript MIME型]]で''ない''
]FIG]
... のいずれかの条件を満たしたら、
== [82] [VAR[モジュール写像]]の[F[キー]]が [VAR[URL]] 
のエントリーの[F[値]]を null に設定します。
==- [92] これにより他の fetch の処理 (>>72) が呼び出されることがあります。
== [84] null について[VAR[続きの処理]]を実行します。
== [83] ここで停止します。
= [88] [VAR[ソーステキスト]]を、[VAR[応答]]の[F[[[本体]]]]を [[UTF-8復号]]した結果に設定します。
= [89] [VAR[スクリプト]]を、[VAR[ソーステキスト]]、
[VAR[モジュール写像設定群オブジェクト]]、[VAR[応答]]の[F[[[URL]]]]、
[VAR[credentialsモード]]、
[VAR[暗号学的nonce]]について[[モジュールスクリプトの作成]]を実行した結果に設定します。
@@ [VAR[構文解析器状態]]
= [90] [VAR[モジュール写像]]の[F[キー]]が [VAR[URL]] のエントリーの[F[値]]を、
[VAR[スクリプト]]に設定します。
=- [93] これにより他の fetch の処理 (>>72) が呼び出されることがあります。
= [91] [VAR[スクリプト]]について[VAR[続きの処理]]を実行します。
]FIG]

***

[261] 2017年、[[JavaScript]] 側の改訂に伴い[[モジュールスクリプト]]の処理に大きな変更が入りました。

[230] [CITE@en[Improve module instantiation/evaluation, especially around errors]]
([[domenic]]著, [TIME[2017-08-04 05:13:45 +09:00]])
<https://github.com/whatwg/html/commit/2b408b65a11fe76b6588b744e0ae74d30ff29b43>

[334] [CITE@en[Editorial: decrease traversals for module graph fetching]]
([[domenic]]著, [TIME[2017-09-07 05:36:56 +09:00]])
<https://github.com/whatwg/html/commit/6b20dfb8143cadc8eed92f663d80530440d59c7d>

[335] [CITE@en[Editorial: decrease traversals for module graph fetching]]
([[domenic]]著, [TIME[2017-09-07 05:36:56 +09:00]])
<https://github.com/whatwg/html/commit/6b20dfb8143cadc8eed92f663d80530440d59c7d>

[340] [CITE@en[Editorial: decrease traversals for module graph fetching by domenic · Pull Request #2971 · whatwg/html]]
([TIME[2017-09-22 19:52:39 +09:00]])
<https://github.com/whatwg/html/pull/2971>

[341] [CITE@en[Editorial: refactor classic and module scripts to be more alike]]
([[domenic]]著, [TIME[2017-09-07 05:40:50 +09:00]])
<https://github.com/whatwg/html/commit/dce999aac4d9deeefa3b338dd2aeb30c17669bc8>

[231] [CITE@en[Editorial: refactor classic and module scripts to be more alike by domenic · Pull Request #2972 · whatwg/html]]
([TIME[2017-09-23 15:18:16 +09:00]])
<https://github.com/whatwg/html/pull/2972>

[342] [CITE@en[Editorial: move base URL from "module script" to "script"]]
([[domenic]]著, [TIME[2017-09-14 20:28:50 +09:00]])
<https://github.com/whatwg/html/commit/5458513792ab00d58e6c91ba48faaa611d034a2e>

[343] [CITE@en[Make integrity="" work on module scripts]]
([[domenic]]著, [TIME[2017-09-14 18:00:24 +09:00]])
<https://github.com/whatwg/html/commit/9275d955dcd604e959cfcc672e0c234b1b8c00db>

[348] [CITE@en[Does integrity="" intentionally not work on module <script>s? · Issue #2382 · whatwg/html]]
([TIME[2017-10-05 14:17:05 +09:00]])
<https://github.com/whatwg/html/issues/2382>

-*-*-

[232] [[モジュールスクリプト]][VAR[スクリプト]]が[DFN[[F[[RUBYB[[[エラーである]]]@en[is errored]]]]]]とは、
[VAR[スクリプト]]の[F[記録][スクリプト]]が [CODE[null]] であるか、
[VAR[スクリプト]]の[F[記録][スクリプト]]の [F(ss)[Status]] が [CODE[errored]]
であることをいいます。 [SRC[>>164]]

[247] [[モジュールスクリプト]][VAR[スクリプト]]の[DFN[[F[[RUBYB[[[エラー]]]@en[error]]]]]]は、
次のものです。 [SRC[>>164]]

[FIG(steps)[
= [248] [VAR[スクリプト]]の[F[モジュール記録]]が [CODE[null]] の場合、
== [249] [VAR[スクリプト]]の[F[実現値化前エラー]]を返します。
= [250] それ以外で、
[VAR[スクリプト]]の[F[記録][スクリプト]]の [F(ss)[Status]] が [CODE[errored]] の場合、
== [251] [VAR[スクリプト]]の[F[記録][スクリプト]]の [F(ss)[ErrorCompletion]]
の [F(ss)[Value]] を返します。
= [252] それ以外の場合、
== [253] [CODE[null]] を返します。
]FIG]

[254] [[モジュールスクリプト]][VAR[スクリプト]]の[DFN[[F[[RUBYB[[[実現値化前エラーを設定]]]@en[set the pre-instantiation error]]]]]]するには、
[VAR[エラー]]について、次のようにします。 [SRC[>>164]]

[FIG(steps)[
= [255] [VAR[記録]]を、[VAR[スクリプト]]の[F[記録][スクリプト]]に設定します。
= [256] [VAR[記録]]が [CODE[null]] でない場合、
== [257] [VAR[記録]]の [F(ss)[HostDefined]] を、[[未定義]]に設定します。
== [258] [VAR[スクリプト]]の[F[記録][スクリプト]]を、 [CODE[null]] に設定します。
= [259] [VAR[スクリプト]]の[F[エラー][スクリプト]]を、[VAR[エラー]]に設定します。
]FIG]

[260] [[モジュールスクリプト]][VAR[スクリプト]]が[DFN[[F[[RUBYB[[[実現値化されている]]]@en[has instantiated]]]]]]とは、
[VAR[スクリプト]]の[F[記録][スクリプト]]が [CODE[null]] でなく
[VAR[スクリプト]]の[F[記録][スクリプト]]の [F(ss)[Status]] が
[CODE[instantiated]] または [CODE[evaluated]] であることをいいます。[SRC[>>164]]

-*-*-

[349] [CITE@en[Fix module script error handling, again]]
([[domenic]]著, [TIME[2017-08-31 06:25:49 +09:00]])
<https://github.com/whatwg/html/commit/165101a955652f715e551917c80ab8140429978f>

[367] [CITE@en[Fix module script error handling, again]]
([[domenic]]著, [TIME[2017-08-31 06:25:49 +09:00]])
<https://github.com/whatwg/html/commit/165101a955652f715e551917c80ab8140429978f>

[368] [CITE@en[Fix module script error handling, again by domenic · Pull Request #2991 · whatwg/html]]
([TIME[2017-12-19 00:44:36 +09:00]])
<https://github.com/whatwg/html/pull/2991>

[369] [CITE@en[Editorial: update usage of the MIME Sniffing Standard]]
([[domenic]]著, [TIME[2018-02-17 03:42:58 +09:00]])
<https://github.com/whatwg/html/commit/fc82f4f8774a2e7e80f6c9477bd881f6c783b186>

[370] [CITE@en[Add <link> rel="modulepreload"]]
([[domenic]]著, [TIME[2017-12-15 05:04:40 +09:00]])
<https://github.com/whatwg/html/commit/7c28027b80208aa6b126fa7b086c44877f584178>

[371] [CITE@en[Editorial: change "resolve a module specifier" to take a URL]]
([[domfarolino]]著, [TIME[2018-07-10 05:10:41 +09:00]])
<https://github.com/whatwg/html/commit/8176d055eaef62cad03327a7cc47c5c7926ffb0c>

[372] [CITE@en[Resolve a module specifier now takes a base URL by domfarolino · Pull Request #3807 · whatwg/html]]
([TIME[2018-07-26 21:39:28 +09:00]])
<https://github.com/whatwg/html/pull/3807>

[373] [CITE@en[Use fetch client settings object for fetching dependency modules]]
([[hiroshige-g]]著, [TIME[2018-06-14 06:44:16 +09:00]])
<https://github.com/whatwg/html/commit/184be2f979a1020972a9735cb3f6f4ca66177ebb>

[374] [CITE@en[Fetch client settings object is used only for top-level module script · Issue #3757 · whatwg/html]]
([TIME[2018-07-26 23:10:37 +09:00]])
<https://github.com/whatwg/html/issues/3757>

[375] [CITE@en[Use fetch client settings object for fetching submodules by hiroshige-g · Pull Request #3758 · whatwg/html]]
([TIME[2018-07-26 23:10:53 +09:00]])
<https://github.com/whatwg/html/pull/3758>

[376] [CITE@en[Add referrerpolicy attribute support to <script>s]]
([[domfarolino]]著, [TIME[2018-05-31 00:06:49 +09:00]])
<https://github.com/whatwg/html/commit/0d28f8fc3a7c272f6d148f647ead29965a56ab60>

[377] [CITE@en[Enforce strict MIME type checks for worker-imported scripts]]
([[mikewest]]著, [TIME[2018-12-19 07:18:59 +09:00]])
<https://github.com/whatwg/html/commit/d1c3679934f52450666750464effb97e14f555e0>

[378] [CITE@en[Nosniffing for Worker Scripts · Issue #3255 · whatwg/html]]
([TIME[2019-05-31 18:27:24 +09:00]])
<https://github.com/whatwg/html/issues/3255>

[379] [CITE@en[Enforce strict MIME type checks for worker-imported scripts. by mikewest · Pull Request #4001 · whatwg/html]]
([TIME[2019-05-31 18:28:34 +09:00]])
<https://github.com/whatwg/html/pull/4001>