-
Notifications
You must be signed in to change notification settings - Fork 4
/
131.txt
363 lines (303 loc) · 19.5 KB
/
131.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
[121] [CODE(HTMLe)@en[script]] [[要素]]や[[ワーカー]]の処理では、
[[外部スクリプト]]の [[fetch]] を行うことがあります。
[122] [[スクリプト]]の種類によって処理はかなり違っています。
* 仕様書
[REFS[
- [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]
* 古典スクリプト
[12] [DFN[[RUBYB[古典スクリプトのfetch]@en[fetch a classic script]]]] [SRC[>>4]] は、
次の[[引数]]を受け取ります。
[FIG(list members middle)[
: [VAR[URL]] : [[URL]]。
: [VAR[CORS設定]] : [[CORS設定群属性]]の指示。
: [VAR[設定群オブジェクト]] : [[環境設定群オブジェクト]]。
: [VAR[文字符号化]] : [[文字符号化]]。
: [VAR[暗号学的nonce]] : [[文字列]]。
: [VAR[要求の準備]] : [[set up the request]]、すなわち引数[VAR[要求]]についての処理。
与えられなかった場合、何もしません。
: [VAR[応答の処理]] : [[応答の処理]]、すなわち引数[VAR[応答]]について[[真偽値]]を返す処理。
与えられなかった場合、[[真]]を返します。
: [VAR[続きの処理]] : 処理。
]FIG]
[124] [[古典スクリプト]]の場合、歴史的理由により、[[文字コード]]を指定できます
([CODE(HTML)@en[<script charset>]])。 (他の種類の[[スクリプト]]では [[UTF-8]]
に固定されています。)
[13] 次のようにします [SRC[>>4]]。
[FIG(steps)[
= [14] [VAR[要求]]を、 [VAR[URL]] と [VAR[CORS設定]]に関する[[潜在的CORS要求の作成]]の結果に設定します。
= [15] [VAR[要求]]の[F[[[クライアント]]]]を、[VAR[設定群オブジェクト]]に設定します。
= [16] [VAR[要求]]の[F[[[型]]]]を、 [CODE[[[script]]]] に設定します。
= [100] [VAR[要求]]の[F[[[終点]]]]を、 [CODE[[[script]]]] に設定します。
= [128] [VAR[要求]]の[F[暗号学的nonceメタデータ]]を、[VAR[暗号学的nonce]]に設定します。
= [102] [VAR[要求]]について、[VAR[要求の準備]]を行います。
= [17] [VAR[要求]]を [[fetch]] します。 [[process response]] は、 >>18 とします。
]FIG]
[18] [[fetch]] の [[process response]] は、[VAR[応答]]について次のようにします [SRC[>>4]]。
[FIG(steps)[
= [19] [VAR[応答]]の[F[[[型]]]]が [CODE[[[error]]]] か、
[VAR[応答]]の[F[[[状態]]]]が [[OK状態]]''以外''なら、
== [21] [VAR[スクリプト]]を、 null に設定します。
= [22] それ以外の場合、
== [103] [VAR[結果]]を、[VAR[応答]]について[VAR[応答の処理]]を行った結果に設定します。
== [104] [VAR[結果]]が[[偽]]なら、
=== [105] [VAR[スクリプト]]を、 null に設定します。
== [106] それ以外の場合、
=== [23]
[FIG(list)[
- [24] [VAR[応答]]に[F[[[内容型メタデータ]]]]があり、
- [25] [VAR[応答]]の[F[[[内容型メタデータ]]]]に[F[[[文字符号化]]]]が指定されており、
- [26] [[利用者エージェント]]が[VAR[応答]]の[F[[[内容型メタデータ]]]]の[F[[[文字符号化]]]]に対応している
]FIG]
... なら、
==== [27] [VAR[文字符号化]]を、[VAR[応答]]の[F[[[内容型メタデータ]]]]の[F[[[文字符号化]]]]に設定します。
=== [28] [VAR[ソーステキスト]]を、[VAR[[[フォールバック符号化]]]]を[VAR[文字符号化]]として[VAR[応答]]の[F[[[本体]]]]を[[復号]]した結果に設定します。
=== [30] [VAR[応答]]が[[CORS交差起源]]なら、
==== [31] [VAR[エラーミュートフラグ]]を設定します。
=== [32] それ以外なら、
==== [33] [VAR[エラーミュートフラグ]]を未設定とします。
=== [29] [VAR[スクリプト]]を、[VAR[ソーステキスト]]と[VAR[設定群オブジェクト]]、
[VAR[エラーミュートフラグ]]について[[古典スクリプトを作成]]した結果に設定します。
= [20] [VAR[スクリプト]]について[VAR[続きの処理]]を実行します。
]FIG]
;; [34] [[復号]]は[VAR[[[フォールバック符号化]]]]よりも [[BOM]] を優先します。
[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[リファラー]] : [[URL]]。
: [VAR[設定群オブジェクト]] : [[環境設定群オブジェクト]]。
: [VAR[終点]] : [[要求終点]]。[[ワーカー]]の種別を表します。
: [VAR[要求の準備]] : [[set up the request]]、すなわち引数[VAR[要求]]についての処理。
与えられなかった場合、何もしません。
: [VAR[応答の処理]] : [[応答の処理]]、すなわち引数[VAR[応答]]について[[真偽値]]を返す処理。
与えられなかった場合、[[真]]を返します。
: [VAR[続きの処理]] : 処理。
]FIG]
[7] 次のようにします。
[FIG(steps)[
= [54] [VAR[要求]]を、新しい[[要求]]に設定します。
[FIG(list members middle)[
[FIGCAPTION[
[[要求]]
]FIGCAPTION]
:[F[[[URL]]]]: [VAR[URL]]
:[F[[[クライアント]]]]: [VAR[設定群オブジェクト]]
:[F[[[型]]]]: [CODE[[[script]]]]
:[F[[[終点]]]]: [VAR[終点]]
:[F[[[リファラー]]]]: [VAR[リファラー]]
:[F[[[同期フラグ]]]]: 設定する
:[F[[[モード]]]]: [CODE[[[same-origin]]]]
:[F[[[credentialsモード]]]]: [CODE[[[same-origin]]]]
:[F[[[URL credentials利用フラグ]]]]: 設定する
]FIG]
= [108] [VAR[要求]]について[VAR[要求の準備]]を行います。
= [107] [VAR[要求]]を [[fetch]] します。
[[process response]] は、 >>56 とします。
]FIG]
[56] [[process response]] は、[VAR[応答]]を次のように処理します。
[FIG(steps)[
= [5] [VAR[応答]]の[F[[[型]]]]が [CODE[[[error]]]] であるか、
[VAR[応答]]の[F[[[状態]]]]が[[OK状態]]''以外''なら、
== [8] [VAR[スクリプト]]を、 null に設定します。
= [9] それ以外なら、
== [109] [VAR[結果]]を、[VAR[応答]]について[VAR[応答の処理]]を実行した結果に設定します。
== [110] [VAR[結果]]が[[偽]]なら、
=== [111] [VAR[スクリプト]]を、 null に設定します。
== [112] それ以外なら、
=== [63] [VAR[スクリプト]]を、 [VAR[応答]]の[F[[[本体]]]]を [[UTF-8復号]]した結果と[VAR[設定群オブジェクト]]について[[古典スクリプトを作成]]した結果に設定します。
= [10] [VAR[スクリプト]]について[VAR[続きの処理]]を実行します。
]FIG]
;; [35] 通常の[[スクリプト]]の場合 (>>18) と違って、[[文字符号化]]は [[UTF-8]]
に固定されています。
[95] この[[手続き]]は、[[run a worker]] から呼び出されます。
* モジュールスクリプト
[123] [[モジュールスクリプト]]の場合、[CODE(HTMLe)@en[script]] [[要素]]と[[ワーカー]]で
[[fetch]] の処理は共通となっています。
[36] [DFN[[RUBYB[モジュールスクリプト木のfetch]@en[fetch a module script tree]]]] [SRC[>>4]]
は、次の[[引数]]を受け取ります。
[FIG(list members middle)[
: [VAR[URL]] : [[URL]]。
: [VAR[credentialsモード]] : [[credentialsモード]]の値。
: [VAR[終点]] : [[要求終点]]。
: [VAR[設定群オブジェクト]] : [[環境設定群オブジェクト]]。
: [VAR[暗号学的nonce]] : [[文字列]]。
: [VAR[続きの処理]] : 処理。
: [VAR[要求の準備]] : [[set up the request]]、すなわち引数[VAR[要求]]についての処理。
与えられなかった場合、何もしません。
: [VAR[応答の処理]] : [[応答の処理]]、すなわち引数[VAR[応答]]について[[真偽値]]を返す処理。
与えられなかった場合、[[真]]を返します。
: [VAR[祖先リスト]] : リスト。明示的に指定されなければ、[[空リスト]]。
]FIG]
[37] 次のようにします [SRC[>>4]]。
[FIG(steps)[
= [38] [VAR[URL]]、[VAR[credentialsモード]]、[VAR[暗号学的nonce]]、[VAR[終点]]、
[VAR[設定群オブジェクト]]、[VAR[要求の準備]]、[VAR[応答の処理]]について[[単一モジュールスクリプトのfetch]]を実行します。
[VAR[続きの処理]]は、 >>39 とします。
]FIG]
[96] この処理は [[prepare a script]] ([CODE(HTMLe)@en[[[script]]]] [[要素]])
と [[run a worker]] から呼び出されます。 (他に、以降の通り再帰的に呼び出されることもあります。)
[39] [[単一モジュールスクリプトのfetch]]の完了時の処理は、
[VAR[結果]]について次のようにします [SRC[>>4]]。
[FIG(steps)[
= [40] [VAR[結果]]が null なら、
== [41] null に関して[VAR[続きの処理]]を実行します。
= [42] それ以外なら、
== [43] [[モジュールスクリプトの子孫をfetch]]します。
[VAR[祖先リスト]]は、[VAR[祖先リスト]]の末尾に [VAR[URL]] を追加した[[リスト]]とします。
[VAR[終点]]、[VAR[要求の準備]]、[VAR[応答の処理]]、[VAR[続きの処理]]を引き渡します。
]FIG]
[44] [DFN[[RUBYB[モジュールスクリプトの子孫のfetch]@en[fetch the descendants of a module script]]]]は、
[VAR[スクリプト]]と[VAR[終点]]と[VAR[祖先リスト]]と[VAR[要求の準備]]と[VAR[応答の処理]]と[VAR[続きの処理]]を受け取り、次のようにします [SRC[>>4]]。
[FIG(steps)[
= [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]] が[[誤り]]なら、
=== [53] [VAR[スクリプト]]について新しい [CODE(JS)@en[TypeError]] を[[例外を報告]]します。
=== [55] [VAR[スクリプト]]に関して[VAR[続きの処理]]を実行し、ここで停止します。
== [98] [VAR[URL]] が[VAR[祖先リスト]]に含まれなければ、
=== [57] [VAR[URL]] を [VAR[URL群]]に追加します。
= [58] [VAR[URL群]]の各値 [VAR[URL]] について順に、
== [59] [VAR[URL]]、[VAR[スクリプト]]の[F[[[credentialsモード]]]]、
[VAR[終点]]、
[VAR[スクリプト]]の[F[設定群オブジェクト]]、
[VAR[スクリプト]]の[F[暗号学的nonce]]、
[VAR[祖先リスト]]について[[モジュールスクリプト木のfetch]]を実行します。
[VAR[続きの処理]]は、 >>60 とします。
==- [116] [VAR[要求の準備]]と[VAR[応答の処理]]は、引き渡し''ません''。
]FIG]
[45] この処理は[[モジュールスクリプト木のfetch]]の他、 [CODE(HTMLe)@en[[[script]]]]
[[要素]]の処理から呼び出されることもあります。
[60] [[モジュールスクリプト木のfetch]]の処理の続きは、
[VAR[結果]]について次のようにします [SRC[>>4]]。
[FIG(steps)[
= [67] >>62 によって終端させられた場合は、ここで停止します。
= [61] [VAR[結果]]が null なら、
== [62] 他の [[fetch]] の一部または全部について[[fetchを終端]]して構いません。
== [64] null に関して[VAR[続きの処理]]を実行します。
== [66] ここで停止します。
= [65] これが最後の [[fetch]] なら、
== [68] [VAR[スクリプト]]に関して[VAR[続きの処理]]を実行します。
]FIG]
[69] [DFN[[RUBYB[単一モジュールスクリプトのfetch]@en[fetch a single module script]]]]は、
[VAR[URL]]、[VAR[credentialsモード]]、[VAR[暗号学的nonce]]、
[VAR[終点]]、[VAR[設定群オブジェクト]]、
[VAR[要求の準備]]、[VAR[応答の処理]]、[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)[
= [76] [VAR[モジュール写像]]に[F[キー]]が [VAR[URL]] のエントリーが含まれていれば、
== [77] 当該エントリーの[F[値]]について[VAR[続きの処理]]を実行し、ここで停止します。
= [78] [VAR[モジュール写像]]に[F[キー]]が [VAR[URL]] で値が [CODE[[[fetching]]]]
のエントリーを追加します。
= [79] [VAR[要求]]を、新しい[[要求]]に設定します。
[FIG(list members middle)[
[FIGCAPTION[
[[要求]]
]FIGCAPTION]
: [F[[[URL]]]] : [VAR[URL]]
: [F[[[終点]]]] : [VAR[終点]]
: [F[[[型]]]] : [CODE[[[script]]]]
: [F[[[モード]]]] : [CODE[[[cors]]]]
: [F[[[credentialsモード]]]] : [VAR[credentialsモード]]
: [F[暗号学的nonceメタデータ]] : [VAR[暗号学的nonce]]
: [F[[[クライアント]]]] : [VAR[設定群オブジェクト]]
]FIG]
= [114] [VAR[要求]]について[VAR[要求の準備]]をします。
= [113] [VAR[要求]]を [[fetch]] します。
[[process response]] は >>80 とします。
]FIG]
[80] [[fetch]] の [[process response]] は、[VAR[[[応答]]]]について次のようにします [SRC[>>4]]。
[FIG(steps)[
= [81]
[FIG(list)[
- [85] [VAR[応答]]の[F[[[型]]]]が [CODE[[[error]]]]
- [86] [VAR[応答]]の[F[[[状態]]]]が [[OK状態]]で''ない''
- [87] [VAR[応答]]の[F[[[ヘッダーリスト]]]]から[[MIME型を取り出す]]と、
([[引数]]を無視すると) [[JavaScript MIME型]]で''ない''
- [115] [VAR[応答]]について[VAR[応答の処理]]を行った結果が[[偽]]である
]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]]について[[モジュールスクリプトの作成]]を実行した結果に設定します。
= [90] [VAR[モジュール写像]]の[F[キー]]が [VAR[URL]] のエントリーの[F[値]]を、
[VAR[スクリプト]]に設定します。
=- [93] これにより他の fetch の処理 (>>72) が呼び出されることがあります。
= [91] [VAR[スクリプト]]について[VAR[続きの処理]]を実行します。
]FIG]
* 要求の準備と応答の処理
[117] [[スクリプト]]の [[fetch]] の各手順の呼び出し元は、
[DFN[set up the request]] と[DFN[[RUBYB[応答の処理]@en[process the response]]]]の手続きを定義できます [SRC[>>4]]。
これらは [[fetch]] の直前と直後に呼び出されます。
[[仕様書]]中で[[要求]]の[[前処理]]や[[応答]]の[[後処理]]を規定するために使われています。
[118] 通常は、 [[set up the request]] では、特に何も行いません。
[130] [[応答の処理]]は、[VAR[応答]]について、次のようにします [SRC[>>4]]。
[FIG(steps)[
= [131] [VAR[ワーカー大域文脈]]の[F[URL][ワーカーのURL]]を、
[VAR[応答]]の[F[URL][応答のURL]]に設定します。
= [132] [VAR[ワーカー大域文脈]]の[F[HTTPS状態]]を、
[VAR[応答]]の[F[HTTPS状態]]に設定します。
= [133] [VAR[ワーカー大域文脈]]と[VAR[応答]]について、
[[大域オブジェクトのCSPリストの初期化]]を実行します。
= [134] [[真]]を返します。
]FIG]
[135] ここで、本手順の呼び出し元である[VAR[ワーカー大域文脈]]は、[[ワーカーを走らせる手順]]で使われているものです。
[120] [[Service Worker]] では別途処理が規定されています [SRC[>>119]]。
* 歴史
** スクリプト
[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>