/
307.txt
163 lines (144 loc) · 9.41 KB
/
307.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
[23] [[ワーカー]]の[[大域オブジェクト]]の [DFN[[CODE(DOMm)@en[[[importScripts]]]]]]
[[メソッド]]は、指定した [[URL]] の[[スクリプト]]を実行するよう指示するものです。
* 仕様書
[REFS[
- [2] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#dom-workerglobalscope-importscripts>'''
- [28] [CITE@en[Service Workers]] ([TIME[2015-09-03 15:00:35 +09:00]] 版) <https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#service-worker-global-scope-importscripts-allowed-flag>
- [22] [CITE@en[Service Workers]] ([TIME[2015-09-03 15:00:35 +09:00]] 版) <https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#importscripts>
]REFS]
* 処理
[3] [CODE(DOMi)@en[[[WorkerGlobalScope]]]] [[インターフェイス]]の
[DFN[[CODE(DOMm)@en[[[importScripts]]]]]] [[メソッド]]は、
次のようにしなければ[['''なりません''']] [SRC[>>2]]。
[FIG(steps)[
= [4] 任意の個数の [CODE(DOMi)@en[[[DOMString]]]] が[[引数]]として指定されたと解釈します。
= [24] [[状態を検証]]します。
= [5] [[引数]]がなければ、ここで停止します。
= [6] 各[[引数]]を[[現職設定群オブジェクト]]の[[API基底URL]]により
[[URLの解決]]を行います。
= [7] 失敗があれば、 [CODE(DOMe)@en[[[SyntaxError]]]] [[例外]]を[[投げ]]て停止します。
= [9] 各[[引数]]の[[解決]]結果について順番に、
== [10] [VAR[URL]]を[[解決]]結果、[VAR[設定群オブジェクト]]を[[現職設定群オブジェクト]]として[[fetch結果を取得]]します。その結果[VAR[応答]]を得ます。
== [25] [VAR[応答]]について[[fetch結果を後処理]]します。
== [15] [VAR[応答]]の[[非安全応答]]の[[本体]]を [[UTF-8復号]]します。
== [16] その結果を、
[[現職設定群オブジェクト]]の [[JavaScript]] [[スクリプト実行環境]]により、
[[構文解析]]、[[コンパイル]]、[[初期化]]します。
== [13] 失敗なら、
=== [58] [VAR[応答]]が[[CORS-cross-origin]]なら、[CODE(JS)@en[[[NetworkError]]]]
を[[投げ]]、ここで停止します。
=== [57] それ以外なら、[[JavaScript]] [CODE(JS)@en[[[SyntaxError]]]] を[[例外]]として[[投げ]]、ここで停止します。
== [17] [[スクリプト]]を作成します。
[FIG(list members)[
[FIGCAPTION[
[[スクリプト]]
]FIGCAPTION]
:[[コード入口点]]: [[コンパイル]]で得られた値とします。
:[[設定群オブジェクト]]:[[現職設定群オブジェクト]]
:[[muted errors]]:[[応答]]が[[CORS-cross-origin]]なら、[[真]]
]FIG]
== [14] 作成した[[スクリプト]]の[[コード入口点に飛ぶ]]こととします。
[[返る]]か、[[捕獲]]されない[[例外]]が投げられるか、
[[kill a worker]]/[[terminate a worker]] により中断されるまで実行します。
== [56] [[例外]]が投げられた場合で[VAR[応答]]が [[CORS-cross-origin]] なら、 [CODE(JS)@en[[[NetworkError]]]]
を[[投げ]]、ここで停止します。
== [18] それ以外の[[例外]]や中断は、[[メソッド]]の呼び出し元へと[[伝播]]させ、ここで停止します。
]FIG]
;; [19] 本[[メソッド]]は [[fetch]] の結果を[[同期的]]に待っています。ただし
[[fetch]] の開始は同時なので、[[スクリプト]]実行中に[[ネットワーク]]から取得されることを期待できます。
後の[[スクリプト]]は、前の[[スクリプト]]が実行完了していることを前提にできます。
[26] [DFN[[RUBYB[状態の検証]@en[validate the state]]]] [SRC[>>2]] は、
[[現職設定群オブジェクト]]の[[大域オブジェクト]]が
[CODE(DOMi)@en[[[ServiceWorkerGlobalScope]]]] で、
その [[importscripts allowed flag]] が未設定なら、
[CODE(DOMe)@en[[[InvalidStateError]]]] [[例外]]を[[投げます]] [SRC[>>22]]。
[27] [CODE(DOMi)@en[[[ServiceWorkerGlobalScope]]]] [[オブジェクト]]は
[[importscripts allowed flag]] を持ちます。初期状態では未設定です [SRC[>>28]]。
[8] [VAR[URL]]と[VAR[設定群オブジェクト]]についての[DFN[[RUBYB[fetch結果の取得]@en[get a fetch result]]]]は、次のようにします。
[FIG(steps)[
= [29] [VAR[設定群オブジェクト]]の[[大域オブジェクト]]が
[CODE(DOMi)@en[[[ServiceWorkerGlobalScope]]]] なら、 [SRC[>>22]]
== [32] [VAR[設定群オブジェクト]]の[[大域オブジェクト]]の[[サービスワーカー]]の
[[imported scripts updated flag]] が未設定なら、
=== [33] 新しい[[要求]]を [[fetch]] します。
[FIG(list members middle)[
[FIGCAPTION[
[[要求]]
]FIGCAPTION]
:[[URL]]: [VAR[URL]]
:[[クライアント]]: [VAR[設定群オブジェクト]]
:[[型]]: [CODE[[[script]]]]
:[[終点]]: [CODE[[[subresource]]]]
:[[同期フラグ]]: 設定する
:[[credentials mode]]: [CODE[[[include]]]]
:[[URL credentials利用フラグ]]: 設定する
]FIG]
== [34] それ以外なら、
=== [35] [VAR[設定群オブジェクト]]の[[大域オブジェクト]]の[[サービスワーカー]]の[[スクリプト資源写像]]に [VAR[URL]] についての[[記録]]があれば、
==== [36] その[[記録]]の[[値]]を使います。
=== [37] それ以外なら、
==== [38] [[null]] を使います。
= [30] それ以外なら、
== [31] 新しい[[要求]]を [[fetch]] します [SRC[>>2]]。
[FIG(list members middle)[
[FIGCAPTION[
[[要求]]
]FIGCAPTION]
:[[URL]]: [VAR[URL]]
:[[クライアント]]: [VAR[設定群オブジェクト]]
:[[型]]: [CODE[[[script]]]]
:[[終点]]: [CODE[[[subresource]]]]
:[[同期フラグ]]: 設定する
:[[credentials mode]]: [CODE[[[include]]]]
:[[URL credentials利用フラグ]]: 設定する
]FIG]
]FIG]
[11] [VAR[応答]]について[DFN[[RUBYB[fetch結果の前処理]@en[postprocess the fetch result]]]]は、
次のようにします。
[FIG(steps)[
= [39] [[現職設定群オブジェクト]]の[[大域オブジェクト]]が
[CODE(DOMi)@en[[[ServiceWorkerGlobalScope]]]] なら、 [SRC[>>22]]
== [42] [[現職設定群オブジェクト]]の[[大域オブジェクト]]の[[サービスワーカー]]の
[[imported scripts updated flag]] が未設定なら、
=== [43] [VAR[応答]]の[[非安全応答]]の[[状態]]が[[OK状態]]でなければ、
==== [44] [CODE(DOMe)@en[[[NetworkError]]]] [[例外]]を[[投げ]]、停止します。 [SRC[>>2]]
=== [45] それ以外なら、
==== [49] [[現職設定群オブジェクト]]の[[大域オブジェクト]]の[[サービスワーカー]]の[[スクリプト資源写像]]に[[解決]]結果の [[URL]] についての[[記録]]があれば、
===== [50] その[[記録]]の[[値]]を、 [[fetch]] で得られた[[資源]]とします。
==== [51] それ以外なら、
===== [52] [[現職設定群オブジェクト]]の[[大域オブジェクト]]の[[サービスワーカー]]の[[スクリプト資源写像]]に[[記録]]を追加します。
[FIG(list members)[
[FIGCAPTION[
[[記録]]
]FIGCAPTION]
:[[鍵]]:[[解決]]結果の [[URL]]
:[[値]]:[[fetch]] で得られた[[資源]]
]FIG]
== [46] それ以外なら、
=== [47] [[null]] を使う場合 (>>38)、
==== [48] [CODE(DOMe)@en[[[NetworkError]]]] [[例外]]を[[投げ]]、停止します。
= [40] それ以外なら、
== [41] [VAR[応答]]の[[非安全応答]]の[[状態]]が[[OK状態]]でなければ、
=== [12] [CODE(DOMe)@en[[[NetworkError]]]] [[例外]]を[[投げ]]、停止します。 [SRC[>>2]]
]FIG]
;; [53] [[サービスワーカー]]への保存時には、[[リダイレクト]]があっても元の [[URL]]
で[[記録]]が作られるようです。
;; [20] [[HTML Standard]] 仕様上は[[スクリプトの作成]]を使って規定されていますが、
[[スクリプトの作成]]と本[[メソッド]]のエラー処理の規定が矛盾しており、
[[スクリプトの作成]]を使わないで[[スクリプト]]を作って実行するのが想定された動きと思われます。
* 歴史
[1] [CITE[importScripts() no longer checking for cross-origin loads]] ([[Ian Hickson <ian@...>]] 著, [TIME[2008-11-26 23:40:05 +09:00]] 版) <http://permalink.gmane.org/gmane.org.w3c.whatwg.discuss/16885>
[21] [CITE@en[Refactor importScripts(urls) · whatwg/html@509578d]] ([TIME[2015-09-03 21:07:19 +09:00]] 版) <https://github.com/whatwg/html/commit/509578d97bd12374e50a409bd4f1ec63cd36a543>
[54] [CITE@en[Give importScripts() a base URL · whatwg/html@fc4168b]]
([TIME[2015-09-16 11:41:13 +09:00]] 版)
<https://github.com/whatwg/html/commit/fc4168b1ccde276fbf936bbc592353f585d83d5c>
[55] [CITE@en[Integrate Fetch into HTML · whatwg/html@7c5555a]]
([TIME[2015-09-18 20:00:20 +09:00]] 版)
<https://github.com/whatwg/html/commit/7c5555a16f2920c02244c10756bb2f1a11e87a22>
[59] [CITE@en[Throw NetworkError for cross-origin importScripts() exceptions · whatwg/html@1e865ed]] ([TIME[2015-10-28 00:00:43 +09:00]] 版) <https://github.com/whatwg/html/commit/1e865ed22daf02d331966765b948bcece800678f>
[60] [CITE@en[Rewrite script execution on top of ES · whatwg/html@4891d18]]
([TIME[2015-12-23 01:36:20 +09:00]] 版)
<https://github.com/whatwg/html/commit/4891d18aaf2df1d40aa61f467a5a10cfc19dd85d>
[61] [CITE@en[Fix importScripts() script execution · whatwg/html@704907d]]
([TIME[2015-12-23 23:19:26 +09:00]] 版)
<https://github.com/whatwg/html/commit/704907dc195e77759fb7b48e51932094d150b7fc>