-
Notifications
You must be signed in to change notification settings - Fork 4
/
574.txt
278 lines (219 loc) · 15.5 KB
/
574.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
[2] [DFN[[RUBYB[タスクキュー]@en[task queue]]]]は、[[イベントループ]]における[[タスク]]の[[順序付き]]の[[リスト]]
([[キュー]]) です。
[[Webブラウザー]]内に常にいくつか存在します。
* 仕様書
[REFS[
- [1] '''[CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-03-28 21:58:58 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#task-queue>'''
- [19] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-03-28 21:58:58 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#the-event-loop>
- [10] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#worker-event-loop>
- [44] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-03-28 21:58:58 +09:00]] 版) <https://www.whatwg.org/specs/web-apps/current-work/#task-source>
- [45] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2013-02-09 02:07:40 +09:00]] 版) <https://www.whatwg.org/specs/web-apps/current-work/#unshipped-port-message-queue>
]REFS]
* 意味
[4] [[タスクキュー]]は、[[タスク]]の[[キュー]]です [SRC[>>1]]。
0個以上の[[タスク]]を入れたり出したりできます。
[[キュー]]ですから原則として [[FIFO]] ですが、それ以外の特別な操作もあります。
[5] 一つの[[タスク]]が複数の[[タスクキュー]]に同時に含まれることはありません。
* 文脈
[18] [[イベントループ]]は、1つ[[以上]]の[[タスクキュー]]を持ちます [SRC[>>1]]。
;;
[7] 同じく[[タスク]]の[[キュー]]であっても、
[FIG(list middle)[
- [[セッション履歴探索キュー]]
- [[マイクロタスクキュー]]
- [[ポートメッセージキュー]]
- [[未出荷済みポートメッセージキュー]]
- [[pending application cache download process tasks]]
]FIG]
... は定義上[[タスクキュー]]とは異なるものです。
([[タスクキュー]]は[[データ型]]ではなく、[[イベントループ]]のフィールド名と捉えるべきもののようです。)
* 追加
[11] [[仕様書]]の[[アルゴリズム]]上で新たな[[タスク]]の実行を予約する操作を、
[DFN[[RUBYB[[[タスクをキューに追加]]]@en[queue a task]]]] [SRC[>>1]] といいます。
[43] [[タスク]]は、その処理に関係する[[イベントループ]]に追加されます。
[[Webブラウザー]]が複数の[[イベントループ]]を持つ場合、
処理対象の[[文書]]や[[ワーカー]]を担当している[[イベントループ]]の[[タスクキュー]]に追加されることになります。
同じ[[タスク源]]からの[[タスク]]は常に同じ[[タスクキュー]]に追加しなければ[['''なりません''']]。
違う[[タスク源]]からの[[タスク]]は別の[[タスクキュー]]に追加して[['''構いません''']]。
[SRC[>>1]]
[EG[
[12] 例えば、[[マウス]]や[[鍵盤]]の[[イベント]]のための[[タスク・キュー]]
([[利用者対話タスク源]]用[[タスク・キュー]]) とそれ以外用の[[タスク・キュー]]の2つを用意し、
[[マウス]]や[[鍵盤]]の方の[[タスク・キュー]]を優先的に処理することにすれば、
[[利用者]]の操作には反応を返すようにしつつ、それが無い時に他の処理を実行する、
というようにできます。 [SRC[>>1]]
]EG]
[47] 同じ[[タスク源]]の[[タスク]]は、同じ[[タスクキュー]]に追加され[['''なければなりません''']]。
[SRC[>>44]]
;; [48] [[利用者エージェント]]は1つの[[イベントループ]]に複数の[[タスクキュー]]を持つことができ、
好きな[[タスクキュー]]に好きな[[タスク]]を入れて[[優先度付きキュー]]として処理できます。
ただし、 >>47 の制約があり、同じ[[タスク源]]にある[[タスク]]については実行順序が入れ替わらないことが保証されています。
[32] [[タスク]]は原則として追加された順番に実行されていきますが、
未実行の[[タスク]]が入っていて実行待ちをしているのがこの[[タスクキュー]]です。
[[タスクキュー]]の個数は実装依存で、 [[Webブラウザー]]によって単一だったり、複数だったりします。
[[タスクキュー]]が複数あっても、同じ[[タスク源]]の[[タスク]]は同じ[[タスクキュー]]に入るので、
順序が保存されます。異なる[[タスク源]]の[[タスク]]の順序が保存されるかは実装依存です。
[14] [CODE(DOMi)@en[[[WorkerGlobalScope]]]] は [DFN[[[closing]]]]
フラグを持ちます [SRC[>>10]]。
;; [[閲覧文脈]]にはありません。
[20] [[closing]] [[フラグ]]が[[真]]に設定されている時は、
[[タスク]]が追加されようとしても捨てなければ[['''なりません''']]。 [SRC[>>19, >>10]]
;; [21] [[ワーカー]]が終了しようとしている時に発生した[[タイマー]]その他の[[タスク]]が捨てられることになります。
[9] [[タスクキュー]]に[[タスク]]に追加するときは、呼び出し元の[[タスク]]の
[[allowed to show a popup]] に関するフラグを新しい[[タスク]]にも伝播させる必要があるかもしれません。
;; [[trusted]] 参照。
[37] [[タスクをキューに追加]]する処理は、次の引数を受け取ります。
[FIG(list members)[
: [VAR[イベントループ]] :
[[タスクをキューに追加]]する処理を現に実行している[[イベントループ]]。
: [VAR[処理]] : [[アルゴリズム]]。
[[タスクをキューに追加]]する処理の呼び出し元の[[変数]]を参照する処理 ([[クロージャー]]的なもの)
かもしれません。
: [VAR[文脈]] :
[[要素]]、[[閲覧文脈]]、[[スクリプト]]のいずれか。
]FIG]
[38] 次のようにしなければ[MUST[なりません]]。
[FIG(steps)[
= [42] [VAR[文書]]を、[VAR[文脈]]により、次の値に設定します [SRC[>>1]]。
[FIG(switch)[
: [[要素]] : [VAR[文脈]]の[F[節点文書]]
: [[閲覧文脈]] : [VAR[文脈]]の[F[活性文書]]
: [[スクリプト]] : [VAR[文脈]]の[F[設定群オブジェクト]]の[F[有責文書]]
]FIG]
= [39] [VAR[タスク]]を、[[タスク]]に設定します。
[FIG(list members)[ [40] [[タスク]]
: [F[処理]] : [VAR[処理]]
: [F[文書]] : [VAR[文書]]
]FIG]
= [13] [VAR[タスクキュー]]を、[VAR[イベントループ]]の[[タスクキュー]]のいずれかに設定します [SRC[>>1]]。
= [41] [VAR[タスク]]を[VAR[タスクキュー]]の末尾に追加します。
]FIG]
* 存在
[28] [CODE(DOMi)@en[[[EventSource]]]], [CODE(DOMi)@en[[[MessagePort]]]] の[[ごみ収集]]のタイミングは、
[[タスク]]が[[タスク・キュー]]に残っているかによって決まります。
;; [29] これは[[タスク]]から [CODE(DOMi)@en[[[EventSource]]]],
[CODE(DOMi)@en[[[MessagePort]]]] へ[[強い参照]]があると解釈できるかもしれません。
;; [30] [[XHR]] は逆に[[ごみ収集]]によって[[タスク]]を破棄します。
[8] [[the [CODE(HTMLe)@en[embed]] element setup steps]] は、
同[[要素]]に関する[[タスク]]が他に追加されている場合、何も実行しません。
(実行中かどうかではなく追加されたかどうかの検査です。)
この検査は自[[タスク]]のみならず、そこから追加された他の[[タスクキュー]]からも行われます。
* 取得
[15] [[タスクキュー]]は [[FIFO]] っぽいもので、基本的には最古のものから取得 (実行)、
削除されます。しかし条件を満たさない[[タスク]]は[[イベントループ]]に無視されることになっていますから、
厳密には [[FIFO]] とは言えません。
;; [[イベントループ]]参照。
* 削除
[22] [[タスク]]は実行される際に[[キュー]]から削除されますが、それ以外にも削除されることがあります。
[FIG(list)[
- [23] 特定の [CODE(DOMi)@en[[[Document]]]] に関連付けられた[[タスク]]がすべて削除されることがあります。
-- [CODE(JS)@en[[[window.open]]]]
-- [[discard a [CODE(DOMi)@en[Document]]]]
- [24] 特定の[[タスク源]]の[[タスク]]がすべて削除されることがあります。
-- [[media element load algorithm]]
- [27] 特定の[[文書族]]・[[タスク源]]の[[タスク]]がすべて削除されることがあります。
-- [CODE(JS)@en[[[window.open]]]]
-- [[セッション履歴エントリーの挿入]]
- [26] 特定のものに関する [[fetch]] [[算法]]が生成した[[タスク]]がすべて削除されることがあります。
-- [[update the image data]]
-- [[媒体要素]]
-- [[text track]]
-- [[abort a document]]
-- [[XHR]] の[[ごみ収集]]
- [25] すべての[[タスク]]が削除されることがあります。
-- [CODE(DOMi)@en[[[WorkerGlobalScope]]]] の [CODE(DOMm)@en[[[close]]]]
-- [[kill a worker]]
-- [[XHR]]
-- [CODE(DOMi)@en[[[FileReader]]]] の [CODE(DOMm)@en[[[abort]]]]
-- [CODE(DOMi)@en[[[FileSaver]]]] の [CODE(DOMm)@en[[[abort]]]]
- [33] 特定の[[タスク]]が削除されることがあります。
-- [[planned navigation]]
]FIG]
[17] [[ポートメッセージキュー]]においては、[[タスク]]が (関連付けられた[F[文書]]を書き換えつつ)
他の[[ポートメッセージキュー]]へと移動されることがあります。
;; [[ポートメッセージキュー]]、[CODE(DOMi)@en[MessagePort]] 参照。
* タスク源
[46] 各[[タスク]]は、何らかの[DFN[[RUBYB[タスク源]@en[task source]]]]から[RUBYB[来る]@en[come]]ものと定義されます
[SRC[>>44]]。
[61] [[タスクキュー]]は[[タスク源]]によって分けられており、
同じ[[タスク源]]の[[タスク]]同士の実行順序は[[タスクキュー]]への追加順序となることが保証されます。
[62] [[タスク源]]は、追加時に[[タスクキュー]]の決定に使われる他、
何らかの理由で[[タスクキュー]]から[[タスク]]を削除する条件として使われることもあります。
[49] [[タスク源]]としては次のものがあります。
[FIG(list middle)[
- [[DOM操作タスク源]]
- [[利用者対話タスク源]]
- [[ネットワーク処理タスク源]]
- [[履歴探索タスク源]]
- [[媒体要素イベントタスク源]]
- [[画布blob直列化タスク源]]
- [[画布更新タスク源]]
- [[タイマー・タスク源]]
- [[遠隔イベント・タスク源]]
- [[WebSocketタスク源]]
- [[投稿済みメッセージタスク源]]
- [[ポート・メッセージ・キュー]]
- [[未出荷ポート・メッセージ・キュー]]
- [[[CODE(DOMi)@en[XMLHttpRequest]]タスク源]]
- [[[CODE(DOMi)@en[FileReader]]タスク源]]
- [[データベース・アクセス・タスク源]]
- [[埋め込みタスク源]]
- [[WebGLタスク源]]
- [[マイクロタスクタスク源]]
- [[フォント読み込みタスク源]]
- [[application life-cycle task source]]
[HISTORY[
- [[雛形タスク源]]
- [[[CODE(DOMi)@en[FileSaver]]タスク源]]
- [[装置タスク源]]
- [[[CODE(DOMi)@en[PendingOp]]タスク源]]
]HISTORY]
]FIG]
[50] ほとんどの[[タスク源]]は[[イベントループ]]に1つずつ存在していますが、
[[ポートメッセージキュー]]は[[著者]]が [CODE(DOMi)@en[[[MessagePort]]]]
[[オブジェクト]]を作成することによって任意個作成されます。
[[媒体要素イベントタスク源]]と
[[[CODE(DOMi)@en[XMLHttpRequest]]タスク源]] もオブジェクトごとに存在します。
[[[CODE(DOMi)@en[FileReader]]タスク源]]、[[[CODE(DOMi)@en[FileSaver]]タスク源]]もオブジェクトごとに存在するようです。
[51] [[ポートメッセージキュー]]と[[未出荷ポートメッセージキュー]]は特別な関係にあります。
[CODE(DOMi)@en[[[MessagePort]]]] は他の[[閲覧文脈]]に転送することができますが、
それまでは[[未出荷ポートメッセージキュー]]にも属します。また[[タスク]]の削除は、どちらからも削除します。
なお[[未出荷ポートメッセージキュー]]は[[イベントループ]]ごとに1つだけあります。
[SRC[>>45]]
[[仕様書]]ではこれらは[[タスク源]]である[[キュー]]とされていますが、
実質的に[[タスクキュー]]の特殊形というべきものです。[[タスクキュー]]も参照。
;; [52] 転送していない [CODE(DOMi)@en[[[MessagePort]]]] では必ず同じ順序で[[タスク]]が実行されることを保証し、
転送してしまった [CODE(DOMi)@en[[[MessagePort]]]] では任意の実行順序となることを認めるためにこのような複雑な構造になっています。
[53] [[タスク源]]の一覧は >>54 にあります。
[REFS[
- [54] [CITE[data-web-defs/data/browsers.json at master · manakai/data-web-defs]] ([TIME[2014-04-09 13:08:57 +09:00]] 版) <https://github.com/manakai/data-web-defs/blob/master/data/browsers.json>
]REFS]
** マイクロタスクとの関係
[58] [[マイクロタスク]]の[[タスク源]]はすべて[[マイクロタスクタスク源]]と定義されています。
[59] [[マイクロタスク]]には[[タスクキュー]]とは別の[[マイクロタスクキュー]]が存在しています。
これは[[マイクロタスク源]]の[[タスク]] ([[マイクロタスク]]) を実行する[[タスクキュー]]とは別のものです。
* イベント順との関係
[55] [[DOM3イベント]]は[[イベント]]同士の関係を[[イベント順]]により規定しています。
[[DOM3イベント]]は[[イベント・ループ]]や[[タスク]]という概念を使っておらず、
この[[イベント順]]は適宜[[タスク源]]として使うことによって[[イベント・ループ]]と互換性がある形で実装できる、
としています。
[REFS[
- [56] [CITE@en-US[Document Object Model (DOM) Level 3 Events Specification]] ([TIME[2012-03-21 00:00:37 +09:00]] 版) <http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#event-order-and-loops>
]REFS]
;; [57] 具体的にどう対応付けるのかは説明を読んでもあんまりよくわかりません。 [[HTML]]
は[[マウス]]も[[鍵盤]]も同じ[[利用者対話タスク源]]で扱っていますが、
[[DOM3イベント]]は独立してるからそれぞれ別の[[タスク源]]だ、とか言っていますし、
[[焦点]]の変更など独立した操作がそれぞれ[[タスク源]]だ、とか訳のわからないことも言ってます。
* 歴史
[REFS[
- [6] [CITE@en[Web Applications 1.0 r2074 Define event loops, task queues, etc; Make 'fetching' use this mechanism (everything will in due course); Fix some cross-references around 'interactive content'.]]
([TIME[2008-08-16 09:52:00 +09:00]] 版)
<https://html5.org/r/2074>
- [60] [CITE[IRC logs: freenode / #whatwg / 20100824]]
([TIME[2010-09-02 21:15:06 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20100824>
- [16] [CITE@en[Web Applications 1.0 r7992 Make <form> submission more like reality.]] ([TIME[2013-06-20 06:37:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=7991&to=7992>
- [19] [CITE@en[Fix #19: Remove majority of "DOM Event Architecture" section · w3c/uievents@6cb42db]]
([TIME[2016-03-08 18:11:43 +09:00]] 版)
<https://github.com/w3c/uievents/commit/6cb42db4054c5502d28c3f53c6ae64da5e475747>
]REFS]