/
168.txt
512 lines (440 loc) · 29.3 KB
/
168.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
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
[3] [DFN[[RUBYB[サービスワーカー登録]@en[service worker registration]]]]
* 仕様書
[REFS[
- [1] [CITE@en[Service Workers Nightly]] ([TIME[2017-02-16 20:10:49 +09:00]]) <https://w3c.github.io/ServiceWorker/#dfn-containing-service-worker-registration>
- [2] '''[CITE@en[Service Workers Nightly]] ([TIME[2017-02-16 20:10:49 +09:00]]) <https://w3c.github.io/ServiceWorker/#service-worker-registration-concept>'''
- [12] [CITE@en[Service Workers Nightly]] ([TIME[2017-02-25 12:50:35 +09:00]]) <https://w3c.github.io/ServiceWorker/#selection>
- [25] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#serviceworkercontainer-interface>
-- [21] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#navigator-service-worker-register>
-- [37] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#navigator-service-worker-getRegistration>
-- [54] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#navigator-service-worker-getRegistrations>
- [84] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#dfn-scope-to-registration-map>
- [86] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#dfn-job-type>
- [66] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#start-register>
- [89] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#register-algorithm>
- [113] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#update-algorithm>
- [124] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#soft-update-algorithm>
- [168] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#installation-algorithm>
]REFS]
* 状態
[8] [[サービスワーカー登録]]は、次の状態を持ちます。
[FIG(list members)[
: [F[適用範囲URL]] :
[[サービスワーカー登録]]は[F[適用範囲URL]]ごとに1つ存在します。
: [F[インストール中ワーカー]] :
: [F[待機中ワーカー]] :
: [F[活性ワーカー]] :
: [DFN[[F[last update check time]]]] :
初期値は [CODE[null]] [SRC[>>2]]。
: [F[キャッシュ利用]] : [[ブール型]]。初期値は[[偽]]。
: [DFN[[F[uninstalling flag]]]] :
初期値は[[未設定]]。 [SRC[>>2]]
: [F[タスクキュー群]] :
: [F[[CODE(DOMi)@en[NavigationPreloadManager]]]] :
: [F[navigation preload enabled flag]] :
: [F[navigation preload header value]] :
: [F[ジョブキュー][サービスワーカージョブキュー]] :
]FIG]
* [CODE(DOMi)@en[ServiceWorkerContainer]] インターフェイス [CODE(DOMm)@en[register]] メソッド
[22] [CODE(DOMi)@en[ServiceWorkerContainer]] [[インターフェイス]]の
[DFN[[CODE(DOMm)@en[register]]]] [[メソッド]]は、
次の[[引数]]を持ちます。
[FIG(list members)[
: [VAR[スクリプトURL]] : [CODE(IDL)@en[USVString]] [SRC[>>25]]。
: [VAR[オプション群]] :[[辞書]] [CODE(IDL)@en[RegistrationOptions]] (省略可能) [SRC[>>25]]。
]FIG]
[24] [[辞書]] [DFN[[CODE(IDL)@en[RegistrationOptions]]]]
は、次の[[メンバー][辞書メンバー]]を持ちます [SRC[>>25]]。
[FIG(list members middle)[
- [CODE(DOMa)@en[scope][適用範囲URL]] ([CODE(IDL)@en[USVString]])
- [CODE(DOMa)@en[type][スクリプト型]] ([CODE(IDL)@en[WorkerType]], 既定値 [CODE[classic][古典スクリプト]])
- [CODE(DOMa)@en[useCache]] ([CODE(IDL)@en[boolean]], 既定値[[偽]])
]FIG]
[23] この[[メソッド]]は、 [CODE(IDL xattr)@en[NewObject]] です [SRC[>>25]]。
[26] 次のようにしなければ[MUST[なりません]] [SRC[>>21]]。
[FIG(steps)[
= [28] [VAR[約束]]を、[[約束]]に設定します。
= [29] [VAR[クライアント]]を、[[文脈オブジェクト]]の[F[サービスワーカークライアント]]に設定します。
= [30] [VAR[URL]]を、[VAR[スクリプトURL]]を[[文脈オブジェクト]]の[F[関連設定群オブジェクト]]の[F[API基底URL]]に対して[[構文解析][URL構文解析]]した結果に設定します。
= [31] [VAR[オプション群]]の [CODE(DOMa)@en[scope]] が[[存在]]するなら、
== [32] [VAR[適用範囲URL]]を、[VAR[オプション群]]の [CODE(DOMa)@en[scope]]
を[[文脈オブジェクト]]の[F[関連設定群オブジェクト]]の[F[API基底URL]]に対して[[構文解析][URL構文解析]]した結果に設定します。
= [33] それ以外の場合、
== [27] [VAR[適用範囲URL]]を、 [CODE[null]] に設定します。
= [34] [[登録開始]]します。
[FIG(list members middle)[
: [VAR[適用範囲URL]] : [VAR[適用範囲URL]]
: [VAR[スクリプトURL]]: [VAR[URL]]
: [VAR[約束]] : [VAR[約束]]
: [VAR[クライアント]] : [VAR[クライアント]]
: [VAR[参照元]] : [VAR[クライアント]]の[F[作成URL]]
: [VAR[ワーカー型]] : [VAR[オプション群]]の [CODE(DOMa)@en[type][WorkerType]]
: [VAR[キャッシュ利用]] : [VAR[オプション群]]の [CODE(DOMa)@en[useCache]]
]FIG]
= [35] [VAR[約束]]を返します。
]FIG]
* [CODE(DOMi)@en[ServiceWorkerContainer]] インターフェイス [CODE(DOMm)@en[getRegistration]] メソッド
[36] [CODE(DOMi)@en[ServiceWorkerContainer]] [[インターフェイス]]の
[DFN[[CODE(DOMm)@en[getRegistration]]]] [[メソッド]]は、
次のようにしなければ[MUST[なりません]] [SRC[>>37]]。
[FIG(steps)[
= [38] [VAR[クライアントURL]]を、[[省略可能]]な第1引数を
[CODE(IDL)@en[USVString]] と解釈した結果に設定します。
[[既定値]]は[[空文字列]]とします。 [SRC[>>25]]
= [39] [VAR[クライアント]]を、[[文脈オブジェクト]]の[F[サービスワーカークライアント]]に設定します。
= [40] [VAR[URL]]を、[VAR[クライアントURL]]を[[文脈オブジェクト]]の[F[関連設定群オブジェクト]]の[F[API基底URL]]に対して[[構文解析][URL構文解析]]した結果に設定します。
= [41] [VAR[URL]] が[[失敗]]の場合、
== [42] [CODE(JS)@en[TypeError]] で[[拒絶]]した[[約束]]を返し、ここで停止します。
= [43] [VAR[URL]]の[F[起源][URLの起源]]が[VAR[クライアント]]の[F[起源]]と[[同じ起源]]でない場合、
== [44] [CODE(JS)@en[SecurityError]] [[例外]]で[[拒絶]]した[[約束]]を返し、ここで停止します。
= [45] [VAR[約束]]を、新しい[[約束]]に設定します。
= [46] 並列の処理を開始します。
= [47] [VAR[約束]]を返します。
]FIG]
[48] 並列の処理は、次のようにします [SRC[>>37]]。
[FIG(steps)[
= [49] [VAR[登録]]を、[VAR[URL]] についての[[サービスワーカー登録の一致]]の結果に設定します。
= [50] [VAR[登録]]が [CODE[null]] 以外の場合、
== [51] [VAR[約束]]を、[VAR[登録]]を表す [CODE(DOMi)@en[ServiceWorkerRegistration]]
で[[解決][約束の解決]]します。
= [52] それ以外の場合、
== [53] [VAR[約束]]を、[[未定義]]で[[解決][約束の解決]]します。
]FIG]
* [CODE(DOMi)@en[ServiceWorkerContainer]] インターフェイス [CODE(DOMm)@en[getRegistrations]] メソッド
[55] [CODE(DOMi)@en[ServiceWorkerContainer]] [[インターフェイス]]の
[DFN[[CODE(DOMm)@en[getRegistration''s'']]]] [[メソッド]]は、
次のようにしなければ[MUST[なりません]] [SRC[>>54]]。
[FIG(steps)[
= [56] [VAR[クライアント]]を、[[文脈オブジェクト]]の[F[サービスワーカークライアント]]に設定します。
= [57] [VAR[約束]]を、新しい[[約束]]に設定します。
= [58] 並列の処理を開始します。
= [59] [VAR[約束]]を返します
]FIG]
[60] 並列の処理は、次のようにします [SRC[>>54]]。
[FIG(steps)[
= [61] [VAR[配列]]を、新しい[[配列]]に設定します。
= [62] [[scope to registration map]] の各 ([VAR[キー]], [VAR[値]]) について、
== [63] [VAR[キー]]を[[構文解析][URL構文解析]]した結果の[F[起源][URLの起源]]が[VAR[クライアント]]の[F[起源]]と[[同じ起源]]で、
[VAR[値]]の [F[uninstalling flag]] が[[偽]]なら、
=== [64] [VAR[配列]]に、
@@ [VAR[値]]と関連付けられた [CODE(DOMi)@en[ServiceWorkerRegistration]]
を追加します。
= [65] [VAR[約束]]を、[VAR[配列]]で[[解決][約束の解決]]します。
]FIG]
* 処理
** 作成
[85] [[ジョブ][サービスワーカージョブ]]の[F[ジョブ型]]の[DFN[[RUBYB[[[登録][登録ジョブ]]]@en[register]]]]と[DFN[[RUBYB[[[更新][更新ジョブ]]]@en[update]]]]
[SRC[>>86]] は、[[サービスワーカー]]の作成処理を表しています。
[67] [DFN[[RUBYB[登録開始]@en[Start Register]]]]は、
[VAR[適用範囲URL]]、
[VAR[スクリプトURL]]、
[VAR[約束]]、
[VAR[クライアント]]、
[VAR[参照元]]、
[VAR[ワーカー型]]、
[VAR[キャッシュ利用]]について、
次のようにしなければ[MUST[なりません]] [SRC[>>66]]。
[FIG(steps)[
= [70] 次の'''いずれか'''の場合:
=- [71] [VAR[スクリプトURL]]が[[失敗]]
=- [72] [VAR[スクリプトURL]]の[F[scheme][URL scheme]]が [[HTTP(S) scheme]] では''ない''
=- [73] [VAR[スクリプトURL]]の[F[path][URL path]]が
[[ASCII大文字・小文字不区別]]で [CODE[%2F]] や [CODE[%5C]] を含む
== [68] [VAR[約束]]を、[CODE(JS)@en[TypeError]] で[[拒絶]]します。
== [69] ここで停止します。
= [74] [VAR[適用範囲URL]]が [CODE[null]] の場合、
== [75] [VAR[適用範囲URL]]を、[VAR[スクリプトURL]]の[[ディレクトリーURL]]に設定します。
= [76] 次の'''いずれか'''の場合:
=- [79] [VAR[適用範囲URL]]が[[失敗]]
=- [80] [VAR[適用範囲URL]]の[F[scheme][URL scheme]]が [[HTTP(S) scheme]] では''ない''
=- [81] [VAR[適用範囲URL]]の[F[path][URL path]]が
[[ASCII大文字・小文字不区別]]で [CODE[%2F]] や [CODE[%5C]] を含む
== [83] [VAR[約束]]を、 [CODE(JS)@en[TypeError]] で[[拒絶]]します。
== [77] ここで停止します。
= [82] [VAR[ジョブ]]を、[[ジョブ作成]]の結果に設定します。
[FIG(list members middle)[
: [VAR[ジョブ型]] : [[登録][登録ジョブ]]
: [VAR[適用範囲URL]] : [VAR[適用範囲URL]]
: [VAR[スクリプトURL]] : [VAR[スクリプトURL]]
: [VAR[約束]] : [VAR[約束]]
: [VAR[クライアント]] : [VAR[クライアント]]
]FIG]
= [87] [VAR[ジョブ]]を次の通り設定します。
[FIG(list members middle)[
: [F[ワーカー型]] : [VAR[ワーカー型]]
: [F[キャッシュ利用]] : [VAR[キャッシュ利用]]
: [F[参照元]] : [VAR[参照元]]
]FIG]
= [78] [[Schedule Job]] を実行します。
[FIG(list members)[
: [VAR[ジョブ]] : [VAR[ジョブ]]
: [VAR[ジョブキュー]] : [[利用者エージェント]]の[F[[[適用範囲URL]]から[[ジョブキュー][サービスワーカージョブキュー]]への[[写像]]]]の[VAR[適用範囲URL]]の値
]FIG]
]FIG]
[88] [[登録開始]]により追加された[[ジョブ][サービスワーカージョブ]]は、
適当なタイミングで[[登録][登録ジョブ]]を呼び出します。
[125] [DFN[[RUBYB[ソフト更新]@en[Soft Update]]]]は、
[VAR[登録]]と[VAR[force bypass cache flag]]について次のようにします
[SRC[>>124]]。
[FIG(steps)[
= [162] [VAR[最新ワーカー]]を、[VAR[登録]]についての[[最新ワーカーの取得]]の結果に設定します。
= [157] [VAR[最新ワーカー]]が [CODE[null]] の場合、
== [158] ここで停止します。
= [160] [VAR[ジョブ]]を、[[ジョブ作成]]の結果に設定します。
[FIG(list members)[
: [VAR[[[ジョブ型]]]] : [[更新][更新ジョブ]]
: [VAR[適用範囲URL]] : [VAR[登録]]の[F[適用範囲URL]]
: [VAR[スクリプトURL]] : [VAR[最新ワーカー]]の[F[スクリプトURL][サービスワーカー]]
: [VAR[約束]] : [CODE[null]]
: [VAR[クライアント]] : [CODE[null]]
]FIG]
= [159] [VAR[ジョブ]]の[F[ワーカー型]]を、[VAR[最新ワーカー]]の[F[型][ワーカー型]]に設定します。
= [161] [VAR[ジョブ]]の [F[force bypass cache flag]] を、 [VAR[force bypass cache flag]]
に設定します。
= [165] [VAR[ジョブキュー]]を、[[利用者エージェント]]の[F[[[適用範囲URL]]から[[ジョブキュー]]への[[写像]]]]の[VAR[ジョブ]]の[F[適用範囲URL]]の値に設定します。
= [163] [VAR[ジョブ]]と[VAR[ジョブキュー]]について [[Schedule Job]] を実行します。
]FIG]
[164] [[handle fetch]] と [[handle functional event]] から呼び出されます。
[155] [[利用者エージェント]]は、更新を検査したい時にいつでもこの手順を呼び出すことができます
[SRC[>>124]]。
また、[[開発者ツール]]からの呼び出しなど[[デバッグ]]を補助するために
[VAR[force bypass cache flag]] を使うことができます [SRC[>>124]]。
[167] [[ソフト更新]]により追加された[[ジョブ][サービスワーカージョブ]]は、
適当なタイミングで[[更新][更新ジョブ]]を呼び出します。
** スクリプトの取得と実行
[90] [DFN[[RUBYB[登録]@en[Register]]]]は、
[[ジョブ][サービスワーカージョブ]][VAR[ジョブ]]と[[ジョブキュー][サービスワーカージョブキュー]][VAR[ジョブキュー]]を次のようにします [SRC[>>89]]。
[FIG(steps)[
= [91] 次の''いずれか''の場合:
[FIG(list)[
- [96] [VAR[ジョブ]]の[F[スクリプトURL][サービスワーカー]]の[F[起源][URLの起源]]について
[[potentially trustworthy origin]] を適用した結果が [[Not Trusted]]
- [95] [VAR[ジョブ]]の[F[スクリプトURL][サービスワーカー]]と[VAR[ジョブ]]の[F[参照元]]の[F[起源][URLの起源]]が[[同じ起源]]でない
- [97] [VAR[ジョブ]]の[F[適用範囲URL]]の[F[起源][URLの起源]]と[VAR[ジョブ]]の[F[参照元]]の[F[起源][URLの起源]]が[[同じ起源]]でない
]FIG]
== [92] [VAR[ジョブ]]と [CODE[SecurityError]] [[例外]]について[[ジョブ約束の拒絶]]を呼び出します。
== [93] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]を呼び出します。
== [94] ここで停止します。
= [98] [VAR[登録]]を、[VAR[ジョブ]]の[F[適用範囲URL]]について[[登録を取得]]した結果に設定します。
= [99] [VAR[登録]]が [CODE[null]] 以外の場合、
== [100] [VAR[登録]]の [F[uninstalling flag]] が[[真]]の場合、
=== [101] [VAR[登録]]の [F[uninstalling flag]] を、[[偽]]に設定します。
== [102] [VAR[最新ワーカー]]を、[VAR[登録]]について[[最新ワーカーを取得]]した結果に設定します。
== [103] 次の''すべて''を満たす場合:
[FIG(list)[
- [104] [VAR[最新ワーカー]]が [CODE[null]] 以外
- [105] [VAR[ジョブ]]の[F[スクリプトURL][サービスワーカー]]が[VAR[最新ワーカー]]の[F[スクリプトURL][サービスワーカー]]と[VAR[素片識別子除外フラグ]]を設定して[[等価][URL等価]]
- [106] [VAR[ジョブ]]の[F[キャッシュ利用]]と[VAR[登録]]の[F[キャッシュ利用]]が等しい
]FIG]
=== [107] [VAR[ジョブ]]と[VAR[登録]]の [CODE(DOMi)@en[ServiceWorkerRegistration]]
について[[ジョブ約束の解決]]をします。
=== [108] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]を呼び出します。
=== [109] ここで停止します。
= [110] それ以外の場合、
== [111] [VAR[ジョブ]]の[F[適用範囲URL]]と[VAR[ジョブ]]の[F[キャッシュ利用]]について[[登録の設定]]をします。
= [112] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[更新][更新ジョブ]]します。
]FIG]
[115] [[ジョブを走らせる]]処理から呼び出されます。
-*-*-
[114] [DFN[[RUBYB[更新]@en[Update]]]]は、
[VAR[ジョブ]]と[VAR[ジョブキュー]]を次のようにします [SRC[>>113]]。
[FIG(steps)[
= [116] [VAR[登録]]を、[VAR[ジョブ]]の[F[適用範囲URL]]について[[登録を取得]]した結果に設定します。
= [117] [VAR[登録]]が [CODE[null]] か、
[VAR[登録]]の [F[uninstalling flag]] が[[真]]の場合、
== [118] [VAR[ジョブ]]と [CODE(JS)@en[TypeError]] で[[ジョブ約束を拒絶]]します。
== [119] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]します。
= [120] [VAR[最新ワーカー]]を、[VAR[登録]]について[[最新ワーカーを取得]]した結果に設定します。
= [121] [VAR[ジョブ]]の[F[ジョブ型]]が[[更新][更新ジョブ]]で、
[VAR[最新ワーカー]]の[F[スクリプトURL][サービスワーカー]]が[VAR[ジョブ]]の[F[スクリプトURL][サービスワーカー]]と[VAR[素片識別子除外フラグ]]を設定して[[等価][URL等価]]で''ない''場合、
== [122] [VAR[ジョブ]]と [CODE(JS)@en[TypeError]] で[[ジョブ約束を拒絶]]します。
== [123] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]します。
= [126] [VAR[ジョブ]]の[F[ワーカー型]]により、
[FIG(switch)[
: [CODE[classic][古典スクリプト]] :
[[古典ワーカースクリプトのfetch]]を実行します。
[FIG(list members)[
: [VAR[URL]] : [VAR[ジョブ]]の[F[スクリプトURL]]
: [VAR[fetchクライアント設定群]] :
[VAR[ジョブ]]の[F[クライアント][サービスワーカークライアント]]
: [VAR[[[終点]]]] : [CODE[serviceworker]]
: [VAR[スクリプト設定群オブジェクト]] :
@@ この[[サービスワーカー]]用に作られる[[環境設定群オブジェクト]]
: [VAR[fetchの実行]] : [[サービスワーカー]]用の処理
([VAR[登録]]、[VAR[ジョブ]]、[VAR[最新ワーカー]]を参照します。
[VAR[HTTPS状態]]、[VAR[参照元ポリシー]]を設定することがあります。)
: [VAR[続きの処理]] : >>127
]FIG]
: [CODE[module][モジュールスクリプト]] :
[[モジュールワーカースクリプトグラフのfetch]]を実行します。
[FIG(list members)[
: [VAR[URL]] : [VAR[ジョブ]]の[F[スクリプトURL]]
: [VAR[fetchクライアント設定群オブジェクト]] :
[VAR[ジョブ]]の[F[クライアント][サービスワーカークライアント]]
: [VAR[[[終点]]]] : [CODE[serviceworker]]
: [VAR[credentialsモード]] : [CODE[omit][credentialsモード]]
: [VAR[モジュール写像設定群オブジェクト]] :
@@ この[[サービスワーカー]]用に作られる[[環境設定群オブジェクト]]
: [VAR[fetchの実行]] : [[サービスワーカー]]用の処理
([VAR[登録]]、[VAR[ジョブ]]、[VAR[最新ワーカー]]を参照します。
[VAR[HTTPS状態]]、[VAR[参照元ポリシー]]を設定することがあります。)
: [VAR[続きの処理]] : >>127
]FIG]
]FIG]
]FIG]
[127] [VAR[スクリプト]]についての続きの処理は、次のようにします [SRC[>>113]]。
[FIG(steps)[
= [129] [VAR[スクリプト]]が [CODE[null]] の場合、
== [128] [VAR[ジョブ]]と [CODE(JS)@en[TypeError]] について[[ジョブ約束を拒絶]]します。
== [130] [VAR[最新ワーカー]]が [CODE[null]] の場合、
=== [131] [VAR[登録]]について[[登録を消去]]します。
=== [132] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]します。
=== [133] ここで停止します。
= [134] 次の''すべて''を満たす場合:
[FIG(list)[
- [135] [VAR[最新ワーカー]]が [CODE[null]] 以外
- [136] [VAR[最新ワーカー]]の[F[スクリプトURL][サービスワーカー]]が[VAR[ジョブ]]の[F[スクリプトURL][サービスワーカー]]と[VAR[素片識別子除外フラグ]]を設定して[[等価][URL等価]]
- [137] [VAR[スクリプト]]の[F[ソーステキスト]]と[VAR[最新ワーカー]]の[F[ソーステキスト]]が[[バイト列]]として等しい
- [138] [VAR[スクリプト]]が[[古典スクリプト]]の場合、
-- [139] [VAR[スクリプト]]の[F[モジュール記録]]の [F(ss)[ECMAScriptCode]]
が[VAR[最新ワーカー]]の[F[スクリプト資源]]の[F[モジュール記録]]の [F(ss)[ECMAScriptCode]]
と[[バイト列]]として等しい
]FIG]
== [140] [VAR[ジョブ]]と[VAR[登録]]の [CODE(DOMi)@en[ServiceWorkerRegistration]]
について[[ジョブ約束を解決]]します。
== [141] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]します。
== [142] ここで停止します。
= [143] [VAR[ワーカー]]を、新しい[[サービスワーカー]]に設定します。
[FIG(list members)[ [144] [[サービスワーカー]]
: [F[識別子][サービスワーカー]] : 新しい固有の[[不透明]]文字列
: [F[スクリプトURL][サービスワーカー]] : [VAR[ジョブ]]の[F[スクリプトURL][サービスワーカー]]
: [F[スクリプト資源]] : [VAR[スクリプト]]
: [F[型][ワーカー型]] : [VAR[ジョブ]]の[F[ワーカー型]]
]FIG]
= [145] [VAR[ワーカー]]の[F[スクリプト資源]]の[F[HTTPS状態]]を、[VAR[HTTPS状態]]に設定します。
= [146] [VAR[ワーカー]]の[F[スクリプト資源]]の[F[参照元ポリシー]]を、[VAR[参照元ポリシー]]に設定します。
= [147] [VAR[結果]]を、[[サービスワーカーを走らせる]]処理を実行した結果に設定します。
[FIG(list members)[
: [VAR[ワーカー]] : [VAR[ワーカー]]
: [VAR[force bypass cache for importscripts flag]] : [VAR[ジョブ]]の [F[force bypass cache for importscripts flag]]
]FIG]
= [148] [VAR[結果]]が[[失敗]]の場合、
== [149] [VAR[ジョブ]]と [CODE(JS)@en[TypeError]] について[[ジョブ約束を拒絶]]します。
== [150] [VAR[最新ワーカー]]が [CODE[null]] の場合、
=== [151] [VAR[登録]]について[[登録を消去]]します。
== [152] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]します。
== [153] ここで停止します。
= [154] [VAR[ジョブ]]、[VAR[ワーカー]]、[VAR[登録]]、[VAR[ジョブキュー]]について[[インストール][インストール (サービスワーカー)]]します。
]FIG]
[156] [[更新][更新ジョブ]]は、[[ジョブを走らせる]]処理の他に、
[[登録][登録ジョブ]]からも呼び出されます。
-*-*-
[169] [DFN[[RUBYB[インストール]@en[Install]]]]は、
[VAR[ジョブ]]、[VAR[ワーカー]]、[VAR[登録]]、[VAR[ジョブキュー]]を次のようにします
[SRC[>>168]]。
[FIG(steps)[
= [170] [VAR[失敗]]を、[[偽]]に設定します。
= [171] [VAR[最新ワーカー]]を、[VAR[登録]]の[[最新ワーカーの取得]]の結果に設定します。
= [172] [VAR[登録]]、[CODE[installing]]、[VAR[ワーカー]]について[[登録状態更新]]します。
= [173] [VAR[登録]]の[F[インストール中ワーカー]]と[[インストール中]]について[[ワーカー状態更新]]します。
= [174] [VAR[ジョブ]]と[VAR[登録]]の [CODE(DOMi)@en[ServiceWorkerRegistration]] について[[ジョブ約束の解決]]をします。
= [175] [[タスクをキューに追加]]します。
[FIG(list members)[
: [VAR[処理]] :
[FIG(steps)[
=
@@ [176]
[[サービスワーカークライアント]]であって[F[作成URL]]が[VAR[登録]]の[F[適用範囲URL]]と[[サービスワーカー登録一致]]するものの [CODE(DOMi)@en[ServiceWorkerRegistration]] や、
[[サービスワーカー]]であって[F[containing service worker registration]] が[VAR[登録]]であるものについて、順に、
== [177] [[イベントを発火]]します。
[FIG(list members)[
: [VAR[[[イベント型]]]] : [CODE(DOMe)@en[updatefound]]
]FIG]
]FIG]
: [VAR[[[タスク源]]]] : ?
]FIG]
= [178] [VAR[インストール中ワーカー]]を、[VAR[登録]]の[F[インストール中ワーカー]]に設定します。
= [179] [VAR[インストール中ワーカー]]と[VAR[ジョブ]]の [F[force bypass cache flag]]
について、[[サービスワーカーを走らせる]]処理を実行します。
= [180] [[タスクをキューに追加]]します。
[FIG(list members)[
: [VAR[処理]] : >>197
: [VAR[捨てる処理]] : 失敗の時の処理 (>>182)
: [VAR[[[タスク源]]]] : ?
]FIG]
]FIG]
[197] タスクは、次のようにします [SRC[>>168]]。
[FIG(steps)[
= [181] [[イベントを発火]]します。
[FIG(list members)[
: [VAR[[[インターフェイス][イベントインターフェイス]]]] : [CODE(DOMi)@en[InstallEvent]]
: [VAR[[[イベント型]]]] : [CODE(DOMe)@en[install][InstallEvent]]
: [VAR[[[対象][イベント対象]]]] : [VAR[インストール中ワーカー]]の[F[大域オブジェクト]]
: [VAR[[F[pending promises count]] が [N[0]] になった時の処理]] :
失敗の時の処理 (>>182)
]FIG]
[[サービスワーカーの終端]]で中断された場合、
[[並列に]]、失敗の時の処理 (>>182) をします。
= [189] [VAR[登録]]の[F[インストール中ワーカー]]の[F[imported scripts updated flag]]
を、[[真]]に設定します。
= [190] [VAR[登録]]の[F[待機中ワーカー]]が [CODE[null]] でない場合、
== [191] [VAR[登録]]の[F[待機中ワーカー]]について、[[サービスワーカーの終端]]を実行します。
== [192] [VAR[登録]]の[F[待機中ワーカー]]と「冗長」について、
[[ワーカー状態の更新]]を実行します。
= [193] [VAR[登録]]と[CODE[waiting]]と[VAR[登録]]の[F[インストール中ワーカー]]について、
[[登録状態の更新]]を実行します。
= [194] [VAR[登録]]と[CODE[installing]]と[CODE[null]]について、
[[登録状態の更新]]を実行します。
= [195] [VAR[登録]]の[F[待機中ワーカー]]と「インストール済み」について、
[[ワーカー状態の更新]]を実行します。
= [196] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]を実行します。
=
@@
]FIG]
[182] 失敗の時の処理は、次のようにします [SRC[>>168]]。
[FIG(steps)[
= [183] [VAR[失敗]]を、[[真]]に設定します。
= [184] [VAR[登録]]の[F[インストール中ワーカー]]と「冗長」について、
[[ワーカー状態の更新]]を実行します。
= [185] [CODE[installing]] と [CODE[null]] について[[登録状態の更新]]を実行します。
= [186] [VAR[最新ワーカー]]が [CODE[null]] の場合、
== [187] [VAR[登録]]について[[登録消去]]を実行します。
= [188] [VAR[ジョブ]]と[VAR[ジョブキュー]]について[[ジョブ終了]]を実行します。
]FIG]
** 登録解除
[166] [[ジョブ][サービスワーカージョブ]]の[F[ジョブ型]]の[DFN[[RUBYB[[[登録解除][登録解除ジョブ]]]@en[unregister]]]]
[SRC[>>86]]。
** 管理
[9] [[利用者エージェント]]は、[DFN[[F[scope to registration map]]]] を持ちます。
これは[[順序付き写像]]であって、
[[キー]]は[[適用範囲URL]]で、[[値]]は[[サービスワーカー登録]]です。
[SRC[>>84, >>2]]
;; [10] [[サービスワーカー登録]]の[[寿命]]は、 [CODE(DOMi)@en[ServiceWorkerRegistration]]
[[オブジェクト]]の[[寿命]]より長いです。 [SRC[>>2]]
[5] [F[適用範囲URL]]が同じ[[サービスワーカー登録]]が既にあれば、新しいもので置き換えられます。
[SRC[>>2]]
[4] [[利用者エージェント]]は、[F[適用範囲URL]]が異なる限り、
同じ[[起源]]の複数の[[サービスワーカー登録]]を有効化して構いません。
[SRC[>>2]]
@@ [20] [[scope to registration map]] 追加時に [CODE[ready]] の処理
** 選択
[11] [[サービスワーカークライアント]][VAR[クライアント]]は、
[VAR[要求]]の処理に当たり、
[[サービスワーカー登録]]を次のように[DFN[[RUBYB[選択]@en[select]]]]します [SRC[>>12]]。
[FIG(steps)[
= [13] [VAR[要求]]の[F[URL][要求URL]]が[F[局所][局所URL]]で''ない''なら、
== [14] [VAR[クライアント]]が[[利用者エージェント]]の [F[scope to registration map]] から[[サービスワーカー登録一致]]した結果を返します。
= [15] それ以外の場合、
== [16] [VAR[クライアント]]の[F[有責閲覧文脈]]が[[入れ子閲覧文脈]]の場合、
=== [18] [VAR[クライアント]]の[F[親閲覧文脈]]の環境の[[サービスワーカー登録]]を
(あれば) 返します。
== [19] [VAR[クライアント]]が[[ワーカークライアント]]なら、
=== [17] [VAR[クライアント]]の[F[ワーカーの文書群]]のいずれかの環境の[[サービスワーカー登録]]を
(あれば) 返します。
]FIG]
@@ [DFN[サービスワーカー登録の一致]]
* 文脈
[6] [[サービスワーカー]]は、[DFN[[F[containing service worker registration]]]]
を持ちます。値は[[サービスワーカー登録]]です。 [SRC[>>1]]
[7] [[サービスワーカー]]の[F[containing service worker registration]]は、
その[[サービスワーカー]]を含むものです。 [SRC[>>1]]