/
307.txt
155 lines (135 loc) · 8.95 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
[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]]]]]] [[メソッド]]は、
[DFN[[RUBYB[ワーカー大域適用範囲にスクリプトを輸入]@en[import scripts into worker global scope]]]]、すなわち次のようにしなければ[['''なりません''']] [SRC[>>2]]。
[FIG(steps)[
= [4] 任意の個数の [CODE(DOMi)@en[[[DOMString]]]] が[[引数]]として指定されたと解釈します。
= [24] [[状態を検証]]します。
= [5] [[引数]]がなければ、ここで停止します。
= [62] [VAR[設定群オブジェクト]]を、[[現職設定群オブジェクト]]に設定します。
= [6] 各[[引数]]を[VAR[設定群オブジェクト]]の[F[[[API基底URL]]]]により
[[URLの解決]]を行います。
= [7] 失敗があれば、 [CODE(DOMe)@en[[[SyntaxError]]]] [[例外]]を[[投げ]]て停止します。
= [9] 各[[引数]]の[[解決]]結果 [VAR[URL]] について順番に、
== [10] [VAR[応答]]を、[VAR[URL]]と[VAR[設定群オブジェクト]]について[[fetch結果を取得]]した結果に設定します。
== [25] [VAR[応答]]について[[fetch結果を後処理]]します。
== [17] [[スクリプトを作成]]します。
[FIG(list members)[
: [VAR[スクリプトのソース]] : [VAR[応答]]の[F[[[非安全応答]]]]の[F[[[本体]]]]を
[[UTF-8復号]]した結果。
: [VAR[スクリプトのソースのURL]] : [VAR[応答]]の取得元の [[URL]]
: [VAR[設定群オブジェクト]] : [VAR[設定群オブジェクト]]
: [VAR[エラーミュート]]フラグ: [VAR[応答]]が [F[[[CORS-cross-origin]]]] なら[[真]]
: [VAR[エラーを再度投げる]]フラグ : [[真]]
]FIG]
==- [13] [[例外]]が投げられるか [[prematurely aborted]] なら、
再度[[投げ]]たり abort したりして、本手順の呼び出し元に処理させ、
本手順はここで停止します。
==- [14] [[kill a worker]]/[[terminate a worker]] により中断されたら、ここで停止します。
]FIG]
;; [19] 本[[メソッド]]は [[fetch]] の結果を[[同期的]]に待っています。ただし
[[fetch]] の開始は同時なので、[[スクリプト]]実行中に[[ネットワーク]]から取得されることを期待できます。
後の[[スクリプト]]は、前の[[スクリプト]]が実行完了していることを前提にできます。
[26] [DFN[[RUBYB[状態の検証]@en[validate the state]]]] [SRC[>>2]] は、
[VAR[設定群オブジェクト]]の[[大域オブジェクト]]が
[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] [VAR[設定群オブジェクト]]の[[大域オブジェクト]]が
[CODE(DOMi)@en[[[ServiceWorkerGlobalScope]]]] なら、 [SRC[>>22]]
== [42] [VAR[設定群オブジェクト]]の[[大域オブジェクト]]の[[サービスワーカー]]の
[[imported scripts updated flag]] が未設定なら、
=== [43] [VAR[応答]]の[[非安全応答]]の[[状態]]が[[OK状態]]でなければ、
==== [44] [CODE(DOMe)@en[[[NetworkError]]]] [[例外]]を[[投げ]]、停止します。 [SRC[>>2]]
=== [45] それ以外なら、
==== [49] [VAR[設定群オブジェクト]]の[[大域オブジェクト]]の[[サービスワーカー]]の[[スクリプト資源写像]]に[[解決]]結果の [[URL]] についての[[記録]]があれば、
===== [50] その[[記録]]の[[値]]を、 [[fetch]] で得られた[[資源]]とします。
==== [51] それ以外なら、
===== [52] [VAR[設定群オブジェクト]]の[[大域オブジェクト]]の[[サービスワーカー]]の[[スクリプト資源写像]]に[[記録]]を追加します。
[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>