-
Notifications
You must be signed in to change notification settings - Fork 4
/
131.txt
1127 lines (941 loc) · 57.9 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
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
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
[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状態]]以外なら、
== [143] [CODE(DOMe)@en[[[NetworkError]]]] [[例外]]を[[投げ]]、ここで停止します。
= [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]]]] [[要素]]) から呼び出されます。
** モジュールワーカースクリプト
[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]]により処理されます。
** モジュールスクリプト共通処理
[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]]
-*-*-
[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]] か、
[VAR[結果]]の[F[エラーである][モジュールスクリプトがエラーである]]が[[真]]か、
[VAR[結果]]の[F[実現値化されている][モジュールスクリプトが実現値化されている]]が[[真]]の場合、
== [266] [VAR[結果]]について、[VAR[続きの処理]]を実行します。
= [267] それ以外の場合、
== [268] [VAR[最上位モジュールfetchフラグ]]が設定されている場合、
=== [269] [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[終点]]、[VAR[既訪集合]]、
[VAR[fetchの実行]]、[VAR[続きの処理]]について、
次のようにします。 [SRC[>>164]]
[FIG(steps)[
= [297] [VAR[モジュールスクリプト]]が[F[エラーである][モジュールスクリプトがエラーである]]か、
[VAR[モジュールスクリプト]]が[F[実現値化されている][モジュールスクリプトが実現値化されている]]場合、
== [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[モジュールスクリプト]]と[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[モジュールスクリプト]]の[F[設定群オブジェクト]]
: [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)[
= [312] [VAR[結果群]] [ [VAR[索引]] ] を、[VAR[結果]]に設定します。
= [313] [VAR[結果群]]に[[未定義]]が含まれない場合、
== [317] [VAR[結果群]]の[VAR[結果]]について、順に、
=== [318] [VAR[結果]]が [CODE[null]] の場合、
==== [319] [VAR[結果]]について[VAR[続きの処理]]を実行し、ここで停止します。
=== [320] [VAR[結果]]が[[エラーである][モジュールスクリプトがエラーである]]場合、
==== [321] [VAR[結果]]の[F[エラー]]について[[実現値化前エラーを設定]]します。
==== [322] [VAR[モジュールスクリプト]]について[VAR[続きの処理]]を実行し、ここで停止します。
== [323] [VAR[モジュールスクリプト]]について[VAR[続きの処理]]を実行します。
]FIG]
[325]
[DFN[[RUBYB[モジュールスクリプトの子孫のfetchと実現値化]@en[fetch the descendants of and instantiate a module script]]]]は、
[VAR[モジュールスクリプト]]、
[VAR[終点]]、
[VAR[既訪集合]] ([[既定値]]は[[空集合]])、
[VAR[続きの処理]]について、次のようにします。 [SRC[>>164]]
[FIG(steps)[
= [326] [VAR[終点]]、[VAR[既訪集合]]について、
[[モジュールスクリプトの子孫のfetch]]を実行します。
[VAR[続きの処理]]は、 >>327 とします。
]FIG]
[327] その続きの処理は、[VAR[結果]]について、次のようにします [SRC[>>164]]。
[FIG(steps)[
= [328] [VAR[結果]]が [CODE[null]] か、
[VAR[結果]]が[F[エラーである][モジュールスクリプトがエラーである]]場合、
== [329] [VAR[結果]]について、[VAR[続きの処理]]を実行します。
= [330] それ以外の場合、
== [331] [VAR[記録]]を、[VAR[結果]]の[F[モジュール記録]]に設定します。
== [332] [VAR[記録]]の [[Instantiate]] を実行します。
[[例外]]を[[投げ]]ても、無視します ([VAR[結果]]の[F[エラー]]に格納されます)。
== [333] [VAR[結果]]について、[VAR[続きの処理]]を実行します。
]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[値]]の[[集合]]に設定します。