/
612.txt
957 lines (718 loc) · 55.2 KB
/
612.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
[3] [[Webブラウザー]]における[[イベント]]、[[fetch]]、[[構文解析]]、[[スクリプト]]実行、
[[レンダリング]]その他の動作の相互作用は、
[DFN[[RUBYB[[[イベントループ]]]@en[event loop]]]]によって説明されています。
[15] 非同期システム、 [[GUI]] システムの同様の概念に倣って[[イベントループ]]と呼ばれていますが、
実際に [[Webブラウザー]]で実行される処理の単位は[[イベント]]ではなく、[[タスク]]と呼ばれています。
[[JavaScript]] で利用される [[DOM]] の[[イベント]]は[[タスク]]であることもあれば、[[タスク]]の処理の一部分であることもあります。
;; [81] 入出力装置やネットワークの入出力のような [[Webブラウザー]]外の“イベント”
は、それを処理する[[タスク]]として [[Webブラウザー]]の[[イベントループ]]における[[タスクキュー]]に追加されることになります。
[207] 1つの[[Webブラウザー]]上では、複数の [[Webサイト]]などが同時に[[レンダリング]]・動作しています。単一の[[Webページ]]も、[[閲覧文脈]]本体の他、複数の[[ワーカー]]が[[並行]]して動作することがあります。そのため[[イベントループ]]も同時に複数存在することがあります。
* 仕様書
[REFS[
- [5] '''[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/#event-loops>'''
- [40] '''[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>'''
- [204] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#worker-event-loop>
- [41] '''[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/#run-a-worker>'''
- [44] [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/#scriptTagXSLT>
- [200] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-05-08 22:12:35 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#serializability-of-script-execution>
- [90] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#termination-nesting-level>
- [92] [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/#perform-a-microtask-checkpoint>
]REFS]
* イベントループ
[6] [[利用者エージェント]]は、[[イベント]]、[[利用者]]との対話、[[スクリプト]]、
[[レンダリング]]、[[ネットワーク]]処理、その他の協調のために[[イベントループ]]を使わなければ[MUST[なりません]]。
[[イベントループ]]は[[利用者エージェント]]毎に少なくても1つなければ[MUST[なりません]]。
[[関係する類似起源閲覧文脈の単位]]毎に高々1つの[[イベントループ]]を有することができます。
[SRC[>>5]]
;; [8] つまり、[[利用者エージェント]]全体で1つの[[イベントループ]]を共有することもできますし、
[[タブ]]毎などの単位で複数の[[イベントループ]]に分けることもできるのですが、
その分け方として、 ([CODE(JS)@en[[[document.domain]]]] を考慮した)
[[起源]]ごとのグループを分離してはいけない、ということです。
;; [9] 仕様上明記されていませんが、おそらくここでいう「[[利用者エージェント]]」
の単位は恣意的に決めることができ、
例えば通常モードと秘密モードがあり、両者で開いている [[Web頁]]同士が同じ[[起源]]であっても [[JavaScript]]
でアクセスできないなら、これは2つの[[利用者エージェント]]であり、
この規定に違反せずに別々の[[イベントループ]]を有することができるはずです。
;; [7] 1つの[[関連する類似起源閲覧文脈の単位]]に対して複数の[[イベントループ]]があると、
そこに属するいずれかの[[閲覧文脈]]が他の[[関連する類似起源閲覧文脈の単位]]に属するような
[[navigate]] が発生した時に複雑なことになります。 HTML 仕様はそれをどう処理するか現在定義していません。
[SRC[>>5]] (複雑なこと、というのは具体的には示されていません。)
[11] [[イベントループ]]のすべての[[閲覧文脈]]が捨てられる時、[[イベントループ]]自体も捨てられます。
逆に[[閲覧文脈]]は1つ[[イベントループ]]を持ちます。
[91] [[ワーカー]]の[[イベントループ]]は[[閲覧文脈]]ではなく、[[ワーカー]]に関連付けられています。
[[ワーカー]]が閉じられた時に[[イベントループ]]も捨てられます。
[93] [[サービスワーカーを走らせる]]処理でも[[イベントループ]]が作られます。
[71] 「[[要素]]の[F[[[イベントループ]]]]」は明確に定義されていませんが[[要素]]の[F[[[節点文書]]]]が属する[[閲覧文脈]]が属する[[イベントループ]]を指すようです。
;; 用例:
[REFS[
- [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#commit-the-scratch-bitmap>
]REFS]
** 状態
[55] [[イベントループ]]は次の状態を持ちます。
[FIG(list members)[
: [F[種別]] : メインの[[イベントループ]]か、[[ワーカー]]の[[イベントループ]]のいずれかです。
: [F[タスクキュー群]] :
[[イベントループ]]は、1つ以上の[[タスクキュー]]を持ちます [SRC[>>5]]。
個数と使い分けは実装に依存します。
:[[マイクロタスクキュー]]:1つの[[マイクロタスクキュー]]を持ちます [SRC[>>5]]。
:[F[[[閲覧文脈]]群]]または[F[[[ワーカー]]]]:
[10] [[ワーカー]]以外の[[イベントループ]]は、最低1つ[[閲覧文脈]]を持ちます [SRC[>>5]]。
[42] [[ワーカー]] ([CODE(DOMi)@en[[[WorkerGlobalScope]]]]) は、
それぞれ別個の[[イベントループ]]を有します [SRC[>>40, >>204]]。
: [F[[[文書]]群]] :
[[レンダリングの更新]]、[[アイドル期間]]の開始、
[[アイドルコールバック群呼び出しアルゴリズム]]で参照されます。
:[[現在走っているタスク]]:動作中の[[タスク]]または[[マイクロタスク]]が高々1つ存在します。
: [F[[[一時停止]]中]] :
:[[termination nesting level]] [SRC[>>90]]:[[モーダルダイアログ]]の表示を制御するものです。
:[[マイクロタスクチェックポイントを行っている]]フラグ:[[マイクロタスク]]参照。
:[F[[[環境設定群オブジェクト]]群]]:
[F[[[有責イベントループ]]]]が本[[環境設定群オブジェクト]]であるような[[イベントループ]]
[SRC[>>92]] の[[弱集合]]。
[[マイクロタスクチェックポイントの実行]]で参照されます。
:[F[[[JavaScript実行文脈スタック]]]]:
(どの仕様書も明言していないようですが、[[イベントループ]]ごとに1つあると思われます。)
: [F[バックアップ現職設定群オブジェクトスタック]] :
: [F[[CODE(DOMi)@en[BroadcastChannel]]群]] :
: [F[最終アイドル期間締切]] :
: [F[活性スクリプト]] :
: [F[イベントループ開始]] :
: [F[イベントループ終了]] :
[HISTORY[
:[12] [[ストレージミューテックス]]:[[ストレージ]]へのアクセスを制御するための[[ミューテックス]]を保持した状態になることがあります。
;; [39] [[ストレージミューテックス]]は[[利用者エージェント]]全体で1つなので、
[[ストレージミューテックス]]の解放待ちのために[[イベントループ]]全体がブロックされることがあります。
]HISTORY]
]FIG]
[161] [[イベントループ]]が実行する処理の単位は[[タスク]]と呼ばれます。
特定の[[イベントループ]]が同時に実行する[[タスク]]は高々1つであり、
[DFN[[RUBYB[[[現在走っているタスク]]]@en[currently running task]]]]と呼ばれます。
[[現在走っているタスク]]の初期値は [[null]] です。 [SRC[>>5]]
;; [163] [[現在走っているタスク]]は[[イベントループ]]全体によって[[タスク]]に設定される場合 (>>13)
の他、[[マイクロタスクチェックポイント]]によって[[マイクロタスク]]に設定される場合もあります。
;; [63] [[レンダリングの更新]]からは[[現在走っているタスク]]は設定されないので、
[[アニメーションフレームコールバック]]の実行中は [[null]] のままです。
;; [195] [[現在走っているタスク]]は、 (仕様書上必ずしも明示はされていませんが)
[[タスク]]内の各[[アルゴリズム]]から、その[[タスク]]の種類を調べるため参照されます。
例えば [[allowed to show a popup]] は、[[クリック]]系の[[イベント]]に由来する[[タスク]]の処理中かどうかで分岐します。
[217]
[[スクリプトを走らせる準備]]は[F[現在走っているタスク]]を参照しています。
** 実行
[13] メインやワーカーの[[イベントループ]][VAR[イベントループ]]は、
次のようにしなければ[['''なりません''']] [SRC[>>5]]。
[FIG(steps)[
= [233] 繰り返し、
== [235] [VAR[イベントループ]]の実行中断中 (>>30, >>218) でなければ、
=== [74] [VAR[タスク]]を、
[VAR[イベントループ]]における[[タスク]]の処理 (>>75) をした結果に設定します。
=== [184] [VAR[イベントループ]]について、
[[マイクロタスクチェックポイントを行います]]。
=== [248] [VAR[今]]を、[[現在高分解能時刻]]に設定します。
=== [249] [VAR[イベントループ]]と[VAR[タスク]]と[VAR[今]]について、
タスクの時間長を報告します
(>>250)。
=== [186] [VAR[文書群]]を、
[VAR[イベントループ]]と[VAR[今]]について、
[[レンダリングの更新]]をした結果に設定します。
=== [133] [VAR[イベントループ]]について、
アイドル時の処理 (>>135) を実行します。
=== [134] [VAR[イベントループ]]と[VAR[文書群]]と[VAR[今]]について、
[[レンダリングの更新]]の時間長を報告します
(>>257)。
=== [187] [VAR[イベントループ]]の終了条件 (>>108) を満たす場合、
==== [188] [VAR[イベントループ]]を[RUBYB[破棄]@en[destroy]]してここで停止します。
=== [262]
[VAR[イベントループ]]の[F[イベントループ終了]]を、
[[現在高精度時刻]]に設定します。
]FIG]
;; [16] [[イベントループ]]とは別に、[[算法]]の一部分が[[非同期]]的に実行されると規定されているものがあります。
そのような[[算法]]についても、結果を何らかの形で [[DOM]] に反映させる必要があり、
[[イベントループ]]が[[安定状態を提供]]することによってそのような[[算法]]の[[同期区間]]が実行される、
あるいは[[タスクキュー]]に[[タスク]]を追加する、といった形で[[イベントループ]]と統合されています。
[[マルチスレッド]]な実装なら[[同期区間]]の前後の[[非同期]]な部分は[[イベントループ]]とは別の[[スレッド]]で実装してもよいでしょうし、単一[[スレッド]]なら仕様上の[[イベントループ]]を含むより大きな[[イベントループ]]の中で交互に処理を行うことになるのでしょう。
[WEAK[(単一[[スレッド]]の [[Webブラウザー]]があるのか知りませんが...)]]
[53] [[イベントループ]]の手順中で[[タスク]]と[[マイクロタスク]]の実行では[[著者]]による[[スクリプト]]が実行される可能性があります。
また[[レンダリングの更新]]でも[[アニメーションフレームコールバック]]などとして[[著者]]による[[スクリプト]]が実行されることがあります。
[130] [[アイドル状態]]になったと判定すると、 [CODE(DOMm)@en[requestIdleCallback]]
の[[コールバック関数]]の実行のための[[タスクをキューに追加]]することになっています。
;; [[アイドル状態]]を参照。
** タスクの実行
[75] [VAR[イベントループ]]の[[タスク]]の処理は、次のようにします。
[FIG(steps)[
= [162] 「手順1」 (>>48) の処理を行います。
= [238] [VAR[タスク]]を、[VAR[イベントループ]]について[[タスクキューからタスクを選択]]した結果に設定します。
= [239] [VAR[タスク]]が null なら、ここで停止します [SRC[>>5]]。
= [230] [[利用者エージェント]]が[VAR[イベントループ]]を実行しなかった[[時間長]]を報告します (>>234)。
= [179] [VAR[イベントループ]]の[F[[[現在走っているタスク]]]]を、
[VAR[タスク]]に設定します [SRC[>>5]]。
= [180] [VAR[タスク]]の[F[処理]]を実行します [SRC[>>5]]。
= [181] [VAR[イベントループ]]の[F[[[現在走っているタスク]]]]を、 null に設定します
[SRC[>>5]]。
= [183] [VAR[タスクキュー]]から、
[VAR[タスク]]を削除します [SRC[>>5]]。
= [256] [VAR[タスク]]を返します。
]FIG]
;; [76] [[イベントループ]]の一巡の間に[[タスク]]は高々1つだけ実行されます。
それに対して[[マイクロタスク]]や[[アニメーションフレームコールバック]]は、
実行できる状態のものがすべて実行されます。これが[[タスク]]に対して[[マイクロタスク]]が
「マイクロ」である所以です。
[HISTORY[
[182] かつては[[タスク]]の実行後に[[ストレージミューテックス]]の解放も行うこととされていました。
]HISTORY]
** 手順1到達時点の状態
[48] 次に示すものは、「[RUBYB[最後に[[イベントループ]]の手順1に到達した時]@en[last time the event loop reached step 1]]」
の状態を定義に含めています。
[FIG(list)[
- [49] [[スクリプトをブロックしているスタイルシート]]
- [50] [CODE(DOMa)@en[[[ended]]]] [[属性]] ([[媒体要素]])
- [57] [CODE(DOMi)@en[[[WebSocket]]]] の [CODE(DOMa)@en[[[bufferedAmount]]]]
- [58] [CODE(DOMi)@en[[[WebSocket]]]] の[[ごみ収集]]
- [65] [CODE(HTMLe)@en[[[embed]]]] [[要素]]の [[potentially active]]
-- [[文書中]]にあるか否か
-- [[レンダリング中]]であるか否か
- [208] 選択状態にある [[video track]] や [[audio track]] の決定
-- [209] [CITE@en[Web Applications 1.0 r8673 Make sure that we say that enabling audio tracks and selecting video tracks is all synchronised with the event loop]] ([TIME[2014-06-12 07:25:00 +09:00]] 版) <http://html5.org/r/8673>
]FIG]
[HISTORY[
[56] かつては
「[RUBYB[最後に[[イベントループ]]が[[タスク]]を実行しはじめた時]@en[last time the event loop started executing a task]]」
とも呼ばれていましたが、 >>48 の表現に統一されました。
]HISTORY]
[158] 次に示すものは、「[RUBYB[次に[[イベントループ]]の手順1に到達する前]@en[before the next time the event loop reaches step 1]]」を定義に含めています。
[FIG(list)[
- [51] [[媒体要素]]が[[文書から削除]]された後、この時点までに再度挿入されない場合、
[[ハードウェア資源]]に制約があればその機会にこれをすべて解放するのがよいとされています
[SRC[<http://www.whatwg.org/specs/web-apps/current-work/#best-practices-for-implementors-of-media-elements>]]。
]FIG]
[68] また、次に示すものは、同じ[[タスク]]内であれば同じ結果になることが求められています。
[FIG(list)[
- [69] [CODE(DOMa)@en[[[canvasResolution]]]] の値や、[[ビットマップ]]作成時に使う[[解像度]]
]FIG]
;; [211] 同じ「[[タスク]]」ということは、[[スピン]]によって[[タスク]]が中断された場合、
再開後に同じ値であるとは限りません。
[66] これらは、次の [[event loop level 1]] に到達する前に実装が保持する値を更新したり、
新たな状態を反映させるための処理を行ったりする必要があります。
[EG[
[124] [CODE(HTMLe)@en[[[embed]]]] [[要素]]では、状態を更新するための[[タスク]]を[[タスクキューに追加]]する必要があるかもしれません。
]EG]
** アイドル時の処理
[135]
[VAR[イベントループ]]の[[レンダリングの更新]]の各処理と[[レンダリングの更新]]の計測の間に、
次のようにします [SRC[>>5]]。
[FIG(steps)[
= [136] 次の''すべて''を満たす場合、
-- [138] [VAR[イベントループ]]が[[閲覧文脈]]に関するものであり、
-- [141] [VAR[イベントループ]]の[F[[[タスクキュー]]群]]に、
[F[文書]]が[F[完全に活性]]である[[タスク]]が含まれ''ず''、
-- [142] [VAR[イベントループ]]の[F[マイクロタスクキュー]]が[[空]]であり、
-- [147] [VAR[イベントループ]]の[[閲覧文脈]]のいずれも[[レンダリング機会]]を有さない
== [148] [VAR[イベントループ]]の各[[閲覧文脈]][VAR[閲覧文脈]]について、
=== [153] [VAR[閲覧文脈]]の [F[[CODE[Window]]]] について、
[[アイドル期間開始アルゴリズム]]を実行します。
]FIG]
[70] [CODE(DOMm)@en[requestIdleCallback]] の[[アイドル期間]]の決定では、
[[レンダリング]]その他の内部処理のスケジューリングが影響を及ぼします。
** スピン
[212] [DFN[[RUBYB[[[イベントループをスピン]]]@en[spin the event loop]]]]は、
一種の[[継続]]で、一旦現在の処理を中断して[[イベントループ]]に制御を戻し、
指定した条件[VAR[条件]]が達成された後に再開するものです。
[17] [[イベントループ]][VAR[イベントループ]]の[[スピン]]は、
次のようにしなければ[['''なりません''']] [SRC[>>5]]。
[FIG(steps)[
= [164] [VAR[タスク]]を、[VAR[イベントループ]]の[F[[[現在走っているタスク]]]]に設定します。
= [165] [VAR[タスク源]]を、[VAR[タスク]]の[F[[[タスク源]]]]に設定します。
= [166] [VAR[旧スタック]]を、[VAR[イベントループ]]の[F[[[JavaScript実行文脈スタック]]]]の複製に設定します。
= [167] [VAR[イベントループ]]の[F[[[JavaScript実行文脈スタック]]]]を空にします。
= [169] [VAR[イベントループ]]について[[マイクロタスクチェックポイント]]を実行します。
= [18] [VAR@en[タスク]]を停止させ、 [VAR@en[タスク]]を呼び出したアルゴリズムの続きへと進ませます。
]FIG]
;; [173] [[スピン]]は[[イベントループ]]から直接呼び出された[[タスク]]から呼び出されることもあれば、
[[マイクロタスク]]や[[複合マイクロタスク部分タスク]]から呼ばれることもあります。
;; [213] [[JavaScript実行文脈]]には[[スクリプト]]の実行環境や[[スクリプト設定群オブジェクト]]その他が含まれていますので、
それら処理に必要な状態すべてが保存された状態で、実行が中断され、
[[イベントループ]]や[[マイクロタスクチェックポイント]]などの次のステップへと進むことになります。
[HISTORY[
[168] かつては [[global script clean-up jobs]] の実行もここで行われていました。
]HISTORY]
[19] その後、[VAR[条件]]が成立したら、
次のような[[タスク]]を[[タスクキューに追加]]しなければ[['''なりません''']] [SRC[>>5]]。
[FIG(list members)[
[FIGCAPTION[
[[タスク]]
]FIGCAPTION]
:[F[[[タスク源]]]]: [VAR[タスク源]]
:処理:
[FIG(steps)[
= [170] [VAR[イベントループ]]の[F[[[JavaScript実行文脈スタック]]]]を、[VAR[旧スタック]]に設定します。
= [171] [[スピン]]の呼び出し元に戻ります。
]FIG]
]FIG]
;; [140] [[スピン]]によって実行中の[[タスク]]は中断されますが、[[イベントループ]]が中断しているわけではないので、
[[スピン]]後に新たに追加された[[タスク]]はそのまま実行されます。
[25] [CODE(JS)@en[[[document.close]]]] は[[スピン]]するまで[[字句化]]を行います。
;; 詳しくは [CODE(JS)@en[[[document.close]]]] 参照。
[HISTORY[
[205] かつては [SRC[>>160]]、[[媒体要素]]が[[文書から削除]]された後、次に[[イベントループ]]が[[スピン]]するより前に再度挿入されない場合、
[[ハードウェア資源]]に制約があればその機会にこれをすべて解放するのがよいとされていました
[SRC[>>159]]。
[REFS[
- [159] <http://www.whatwg.org/specs/web-apps/current-work/#best-practices-for-implementors-of-media-elements>
]REFS]
]HISTORY]
*** スピンする状況
[FIG(list)[ [21] [[スピン]]する状況
- [24] [CODE(HTMLe)@en[[[script]]]] [[要素]]の[[終了タグ]]の処理
- [210] [[stop parsing]] (他の[[スクリプト]]の実行や[[スタイル・シート]]の準備完了や
[[delay the loading]] 待ち)
[HISTORY[
- [22] [[update the session history with the new page]] ([[素片識別子]]の示す場所まで[[スクロール]]するタイミング待ち)
- [23] [CODE(DOMm)@en[[[showModalDialog]]]] ([[ダイアログ]]が閉じられるの待ち)
]HISTORY]
]FIG]
[125] [[stops parsing]] における[[スピン]]は、[[スピン]]を使わない形に読み替えられます。
[SEE[ [[stops parsing]] ]]
[231] [CODE(HTMLe)@en[[[script]]]] [[要素]]の[[終了タグ]]の処理の場合、
[[スピン]]の直前に同じ[[構文解析器]]に処理させる[[タスク]]の実行をブロックし、
直後にブロック解除することになっています。
従って、既に [[fetch]] が続きの部分の[[構文解析]]を求める[[タスク]]を追加していたとしても、
[[スピン]]の時点で保留[[タスク]]となって、
[[スピン]]の[VAR[条件]]達成により追加される継続[[タスク]]が先に実行されることになります。
;; [232] [[タスク]]を実行しない、という処理の詳細が [[HTML Standard]]
では規定されていないので、同じ[[タスク源]]の[[タスク]]なのだから継続[[タスク]]は前の[[タスク]]の完了まで実行されず、
[[デッドロック]]に陥る、と解釈できなくもないのですが、明らかに誤っています。
[172] [[HTML Standard]] では >>17 の通り[[タスク]]の実行を中断して[VAR[条件]]が成立してから再開する形を採っていますが、
実際の [[Webブラウザー]]では [[JavaScriptエンジン]]の仕様上そのように中断させることは難しく、
[[イベントループ]]自体を再帰的に実行しているようです。
[HISTORY[
[REFS[
- [139] [CITE['''['''whatwg''']''' Bug in 12.2.5.4.8 (The "text" insertion mode) when invoking the "spin the event loop" algorithm]] ([TIME[2013-10-01 22:14:47 +09:00]] 版) <http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-October/040949.html>
]REFS]
[80] このうち [[update the session history with the new page]] は[[利用者エージェント]]が[[イベントループ]]上の任意のタイミングで実行できますし、
[[スピン]]前の処理が後の処理に直接的に影響を及ぼしてもいないため、
実質的に次の処理のための[[タスク]]をキューに入れるのと変わらないと思われます。
]HISTORY]
** 字句化器のブロック
[59] [CODE(HTMLe)@en[[[script]]]] [[要素]]の処理で[[スピン]]する場合、その直前に [[HTML]]
[[字句化器]]や[[XML構文解析器]]がブロックされ、直後にブロックが解除されます。
これにより、[[スピン]]中に当該[[字句化器]]・[[構文解析器]]を使うような[[タスク]]は実行されない、
とされています。
;; [60] ブロックすると実行されない、という仕組みは十分に説明されていないように思えますが、
[[構文解析]]を行う[[タスク]]がキューに追加されなくなるので[[イベント・ループ]]が実行しなくなる、
ということでしょうか。既に[[タスク]]が[[タスク・キュー]]に追加されてしまっていれば、
それも実行してはいけないのですが、その場合同じ[[タスク・キュー]]を共有する他の[[タスク源]]の[[タスク]]は同様にブロックされてしまうのでしょうか。
[152] [[HTML字句化器]]や [[XML構文解析器]]を使う[[タスク]]というのは、どうやら実際には、
[[HTML]] や [[XML]] の[[ファイル]]を [[fetch]] した結果としてバイト列を受信する度に追加される[[タスク]]のことを指しているようです。
つまりブロックされている間はそれ以上先に[[字句化]]が進まないという規定であるわけです。
[[文書]]に関連付けられた[[HTML構文解析器]]や[[XML構文解析器]]が利用されるのは、[[文書]]自体の[[構文解析]]を除けば、
[[HTML文書]]における [CODE(JS)@en[[[document.write]]]]/[CODE(JS)@en[[[document.writeln]]]] の呼び出しだけのようです。
そちらは定義上、[[字句化器]]がブロックされるのと同じ条件下で [[HTML構文解析器]]を呼び出さないことになっています。
(なのでいずれにせよ[[字句化器]]は止まって先に進みません。)
[REFS[
- [150] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-01-31 21:26:12 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-incdata>
- [151] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-01-31 21:26:12 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#parsing-xhtml-documents>
]REFS]
** 一時停止
[26] ある条件が満たされるまで[[利用者エージェント]]を[DFN[[RUBYB[一時停止]@en[pause]]]]する場合、
次のようにしなければ[['''なりません''']]。 [SRC[>>5]]
[FIG(steps)[
= [27] [DEL[[[非同期]]に実行されている[[算法]]があって[[安定状態を待つ]]状態なら、[[同期区間]]を実行してから、 (適切であれば) [[非同期]]算法の実行を再開します。]]
=- [199] >>198 により削除されました。
= [28] 必要があれば、 [CODE(DOMi)@en[[[Document]]]] や[[閲覧文脈]]の[[レンダリング]]や[[利用者インターフェイス]]を更新して現在の状態を反映させます ([[レンダリングの更新]])。
= [29] 条件が満たされるまで待ちます。
=- [30] [[イベントループ]]はこの間他の[[タスク]]を走らせては[['''なりません''']]し、
現在走っている[[タスク]]も[[ブロック]]しなければ[['''なりません''']]。
=- [31] [[利用者]]の入力に対しては反応し続ける[['''べき''']]ですが、
[[イベントループ]]が何も実行しないので、低能力で動作する[['''べき''']]です。
]FIG]
[127] [[一時停止]]中の[[レンダリング]]については、[[モーダルダイアログ]]も参照。
[223] [[一時停止]]中でも[[動画]]の[[再生]]や[[アニメーション]]は続行するべきかもしれません。
[32] [[一時停止]]する[[算法]]には次のものがあります。
[FIG(list)[
- [33] [[prompt to unload a document]] ([CODE(DOMe)@en[[[beforeunload]]]] の[[ダイアログ]])
- [34] [DEL[[[obtain the storage mutex]] ([[storage mutex]] 待ち)]]
- [35] [CODE(JS)@en[[[alert]]]]
- [36] [CODE(JS)@en[[[confirm]]]]
- [37] [CODE(JS)@en[[[prompt]]]]
- [38] [[printing steps]] ([[印刷]])
]FIG]
[220] [[pause][pause (event loop)]] 中は他の[[タスク]]を実行できないというのが仕様上の規定ですが、
[[Firefox]] では[[モーダルダイアログ]]の表示中に [[Bookmarklet]]
を実行できる (つまり [[navigate]] から[[スクリプト]]実行の[[タスク]]が実行される)
ようです。 [TIME[2015-09-11T11:19:54.000Z]]
[243] 同じ[[イベントループ]]を共有しているなら、他の[[タブ]]や[[窓]]であっても、
[[タスク]]は実行できなくなります。
[221] 1つの[[利用者エージェント]]が複数の[[イベントループ]]を使う場合、
ある[[イベントループ]]が[[一時停止]]中でも、他の[[イベントループ]]は動作するかもしれません。
[EG[
[222] ある[[起源]]の[[スクリプト]]が[[モーダルダイアログ]]を表示していても、
他の[[起源]]の [[Webページ]]は通常通り表示・操作できるのが好ましいと考えられます。
]EG]
[237] [[HTML Standard]] は、2016年5月以来、[[Web互換性]]に悪影響を及ぼさない限りにできるだけこの“異常”な挙動を除去できないか試みることを
[[Webブラウザー]]の実装者に呼びかけています [SRC[>>5]]。
** 一時中断
[218] [[ワーカー]]は、[RUBYB[[[一時中断]]]@en[suspend]]されることがあります。
[[イベントループ]]の実行も中断されるようです。
;; [[ワーカー]]参照。
[102] [[利用者]]の指示により、または[[バッテリー]]の都合により[[睡眠]]状態に入ったなどの理由で、
[[プラットフォーム]]が強制的に [[Webブラウザー]]の動作を中断させたり、
そこから復帰させたりすることがあります。これを [[Webブラウザー]]が検知できるかは、
[[プラットフォーム]]次第です。しかし検知できるか否かに関わらず、
[[時刻]]や[[タイマー]]の処理などで不整合が生じないように配慮が必要です。
** 破棄
[108] [[イベントループ]]は、存在する間動作する [SRC[[CITE[HTML Standard]]]]
(つまり存在しなくなったら停止する) とされています。
[129] [[文書環境]]の[[イベントループ]]については、
関係する[[閲覧文脈]]がすべて[[破棄][閲覧文脈を捨てる]]された時、
ということになると思われます。
[131] [[ワーカー環境]]についてはより明確に規定されています。
[VAR[イベントループ]]の[F[[[タスクキュー]]群]]の[[タスク]]がなくなり、
[VAR[イベントループ]]の [CODE[WorkerGlobalScope]] の[F[閉じ中]]フラグが[[真]]の場合
[SRC[[CITE[HTML Standard]]]]、破棄されます。
(その後[[ワーカーを走らせる]]手順の最終段階へと進みます。)
** 実行時間の報告
[225]
[[イベントループ]]は、
[DFN[[F[[RUBYB[[[イベントループ開始]]][event loop begin]]]]]]と[DFN[[F[[RUBYB[[[イベントループ終了]]][event loop end]]]]]]を持ちます。
[SRC[>>5]]
ともに初期値は [CODE[null]] です。
-*-*-
[234]
[[利用者エージェント]]が[VAR[イベントループ]]を実行しなかった[[時間長]]を報告するには、
次のようにします。
[SRC[>>5]]
[FIG(steps)[
= [244]
[VAR[イベントループ]]の[F[イベントループ開始]]を、
[[現在高精度時刻]]に設定します。
= [245]
[VAR[イベントループ]]の[F[イベントループ終了]]が [CODE[null]] で''ない''場合、
== [246]
[VAR[最上位閲覧文脈群]]を、
[VAR[イベントループ]]に関連付けられた[F[文書]]すべての[F[最上位閲覧文脈]]すべての[[集合]]に設定します。
== [247]
[VAR[イベントループ]]の[F[イベントループ開始]]、
[VAR[イベントループ]]の[F[イベントループ終了]]、
[CODE[browser]],
[VAR[最上位閲覧文脈群]]について、
[[report long tasks]]
します。
]FIG]
[240]
この手順は、[[イベントループ]]が[[タスク]]を実行する直前に呼び出されます。
-*-*-
[250]
[VAR[イベントループ]]と[VAR[タスク]]と[VAR[今]]について[[タスク]]の時間長を報告するには、
次のようにします。
[SRC[>>5]]
[FIG(steps)[
= [251]
[VAR[最上位閲覧文脈群]]を、
[[空集合]]に設定します。
= [252]
[VAR[タスク]]の[F[スクリプト評価環境設定群オブジェクト集合]]中の各[VAR[設定群]]について[[それぞれ][for each]]、
== [253]
[VAR[最上位閲覧文脈群]]に、
[VAR[設定群]]の[F[最上位閲覧文脈]]を[[末尾に追加]]します。
= [254]
[VAR[イベントループ]]の[F[イベントループ開始]]、
[VAR[今]]、
[CODE[event-loop-task]],
[VAR[最上位閲覧文脈群]],
[VAR[タスク]]について、
[[report long tasks]]
します。
]FIG]
[255]
この手順は、[[タスク]]とその直後の[[マイクロタスク]]の実行後に呼び出されます。
-*-*-
[257]
[VAR[イベントループ]]と[VAR[文書群]]と[VAR[今]]について[[レンダリングの更新]]の時間長を報告するには、
次のようにします。
[SRC[>>5]]
[FIG(steps)[
= [259]
[VAR[レンダリング終了時刻]]を、
[[現在高精度時刻]]に設定します。
= [260]
[VAR[最上位閲覧文脈群]]を、
[VAR[文書群]]中の[[文書]]のうち[F[完全に活性]]なものすべての[F[最上位閲覧文脈群]]すべての[[集合]]に設定します。
= [261]
[VAR[今]],
[VAR[レンダリング終了時刻]],
[CODE[rendering]],
[VAR[最上位閲覧文脈群]]について、
[[report long tasks]]
します。
]FIG]
[258]
この手順は、[[レンダリングの更新]]の実行後に呼び出されます。
* 構文解析器との関係
[61] [[HTML]] の[[構文解析器]] [WEAK[(や、ちゃんと規定した仕様書が存在していませんが、 [[XML]] の[[構文解析器]])]]
は、それ自体は[[タスク]]の一部や全部ではなく、[[イベントループ]]とは概念として独立しています。
[62] [CODE(HTMLa)@en[[[innerHTML]]]] のように完全に[[タスク]]に含まれる処理の一部分として構文解析が実行されることもあれば、
[[fetch]] によって[[ネットワーク]]からデータを取得する度に順次生成されていく一連の[[タスク]]によって断続的に構文解析が進められることもあります。
[149] >>24 や >>59 の通り、[[構文解析]]によって[[イベントループ]]が[[スピン]]したり、[[字句化器]]がブロックされたりすることがあります。
* スクリプトとの関係
[201] [[スクリプト]]は他の[[スクリプト]]が実行されていることを直接観測できません [SRC[>>200]]。
実装上は複数の[[スクリプト]]が並列実行されている可能性はありますが ([[起源]]が異なる場合や[[ワーカー]]など)、
そのような[[スクリプト]]同士が通信する方法は [CODE(DOMm)@en[[[postMessage]]]]
など限られています。
;; [202] [[スクリプト]]の実行時間を計測したり、
サーバー側で何らかの情報交換を行ったりして間接的に他の[[スクリプト]]の動作を推測することはできるかもしれませんが。
[203] これによって[[著者]]は[[スレッド]]間のアクセス制御など複雑な処理を書かなくても済みます。
[[Webブラウザー]]は[[スクリプト]]が同時実行されないことを前提とした最適化を行えます
(がそれが制約となるケースもあるかもしれません)。
* 並列実行との関係
[43] いくつかの[[アルゴリズム]]は[[並列実行]]されます。すなわち、
[[イベントループ]]の動作中に同時に他の[[アルゴリズム]]が実行されていることがあります。
[47] [[並列実行]]されている[[アルゴリズム]]と[[イベントループ]]は、
[[同期区間]]により “[[join]]” されることがあります。
;; [72] 詳しくは[[並列実行]]と[[安定状態]]を参照してください。
* イベント・ループとの相互作用が不明なもの
[46] [[HTML]] 以前に規定されたものや、 [[HTML]] 以後であっても明確な仕様が存在しないものは、
[[イベント・ループ]]とどう相互作用するのか文書化されていません。
[45] [[XSLT]] の処理と[[イベント・ループ]]の関係は定義されていません。 [SRC[>>44]]
[145] [[Geolocation API]] は[[イベントループ]]が定義される前の仕様書なので関係が説明されていません。おそらく
- [CODE(DOMm)@en[[[getCurrentPosition]]]] や [CODE(DOMm)@en[[[watchPosition]]]] のアルゴリズムは非同期的に実行されます
- [[コールバック]]は[[タスク]]として追加されます (どの[[タスクキュー]]?)
- [CODE(DOMm)@en[[[watchPosition]]]] は非同期的に実行されているアルゴリズムを停止させます
[67] [CODE(HTMLe)@en[[[video]]]] や [CODE(HTMLe)@en[[[audio]]]] の再生の具体的なタイミングは規定されていません。
なお [CODE(HTMLe)@en[[[track]]]] の[[レンダリング]]は[[媒体要素]]の[[レンダリング]]に合わせて更新しなければならないと規定されています。
@@ [197] CODE(XMLe)@en[[[video]]]]/[CODE(XMLe)@en[[[audio]]]]
[196] [CODE(CSS)@en[[[aural]]]] や [CODE(CSS)@en[[[speech]]]] の[[レンダリング]]との関係は定義されていません。
[20] [[レンダリング]]に関わるものは、[[レンダリングの更新]]を参照。
* 原子的に実行されるべきもの
[95] いくつかの[[算法]]の一部分は[RUBYB[原子的]@en[atomic]]に実行するよう規定されています。
@@ XXX 一覧
* 実装手法
[79] [[仕様書]]の[[規定]]する[[イベントループ]]を実際にどのような形で実装するべきかは、
[[仕様書]]の範囲外となっています。他の[[アルゴリズム]]同様、
[[著者]]の[[スクリプト]]から観察して[[ブラックボックス]]として等しい結果が得られる限り、
どのような方法で実装しても問題ありません。
[84] 各[[イベントループ]]は、それぞれが[[プラットフォーム]]の別の[[プロセス]]として動作するかもしれませんし、
同じ[[プロセス]]の異なる[[スレッド]]で動作するかもしれません。
[82] [[Webブラウザー]]は[[仕様書]]で規定される処理の他にも、
[[利用者インターフェイス]]の処理や[[プラットフォーム]]とのやり取りなど、
[[Webページ]]の[[相互運用性]]には関わらない様々な処理が必要になります。
[[Webブラウザー]]の実装手法としての“[[イベントループ]]”と、
[[仕様]]上の [WEAK[(= [[著者]]の[[スクリプト]]から見た)]]
[[イベントループ]]は必ずしも一致しません。
* 関連
[54] [CODE(JS)@en[[[window.length]]]] は同じ[[イベントループ]]で動作しているかどうかによって挙動が変わり得ます。
[128] [[最上位閲覧文脈]]はそれぞれ[F[[RUBYB[[[セッション履歴イベントループ]]]@en[session history event loop]]]]を持ちます。
[[セッション履歴イベントループ]]はメインやワーカーの[[イベントループ]]とは異なり履歴管理専用で、とても単純になっています。
;; 用語定義上は[[セッション履歴イベントループ]]は[[イベントループ]]ではありません。
[14] [[待つ]]も参照。
* 歴史
[4] [[イベント・ループ]]の概念は [[Web Applications 1.0]] ([[HTML Living Standard]])
によってはじめて体系的に説明、仕様化されました。
[87] [[イベント・ループ]]は最初に [[Web Workers]] において[[ワーカー]]の挙動を説明するために導入されました。
[REFS[
- [88] [CITE@en-US-x-hixie[Web Workers]] ([TIME[2013-02-09 03:43:01 +09:00]] 版) <http://web.archive.org/web/20080828221023/http://www.whatwg.org/specs/web-workers/current-work/#queue>
]REFS]
[89] 更にその後、[[メイン・スレッド]]についても[[イベント・ループ]]が定義されるようになりました。
[[タスク]]の概念もこの時導入されました。
@@ ...
[REFS[
- [2] [CITE@en[Web Applications 1.0 r6966 Allow browsers to bail early for showModalDialog, alert, confirm, and prompt during pagehide, beforeunload, and unload events.]]
( ([TIME[2012-02-07 07:54:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=6965&to=6966>
]REFS]
[86] [[ワーカー]]の[[イベント・ループ]]はメインの[[イベント・ループ]]と同じように処理されますが、
>>87、>>89 という経緯からか当初は [[run a worker]] [[算法]]に組み込まれており、
[RUBYB[[[閉じ中]]]@en[closing]][[フラグ]]の存在など微妙に定義が違っていました。
しかし >>85 によって両者の定義が統合されました。
[REFS[
- [85] [CITE@en[Web Applications 1.0 r7696 Integrate the 'event loop' mechanism of workers and windows together, and try to specify which is meant when it might be ambiguous.]] ([TIME[2013-02-06 09:24:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=7695&to=7696>
]REFS]
** セッション履歴イベントループ
[137] [[セッション履歴イベントループ]]は[[イベントループ]]が複数ある環境での履歴操作を記述するために2013年9月に導入されました。
;; [[セッション履歴イベントループ]]の項を参照。
** 安定状態
[REFS[
- [198] [CITE@en[Web Applications 1.0 r8620 Remove the 'stable state' logic from the 'pause' algorithm. Also, remove some examples that may soon become irrelevant.]] ([TIME[2014-05-09 03:12:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=8619&to=8620>
]REFS]
**
[106] [CITE@en[Web Applications 1.0 r7980 Lay the groundwork for DOM Core to handle reentrant mutation observers.]]
( ([TIME[2013-06-15 07:32:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7979&to=7980>
[109] [CITE[IRC logs: freenode / #whatwg / 20130701]]
( ([TIME[2013-07-02 23:22:48 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20130701#l-216>
[110] [CITE@en[Bug 22522 – WebIDL, error handling, and promises]]
( ([TIME[2013-07-02 23:40:42 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=22522>
[111] [CITE[IRC logs: freenode / #whatwg / 20130701]]
( ([TIME[2013-07-02 23:22:48 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20130701#l-619>
[126] [CITE[IRC logs: freenode / #whatwg / 20130924]]
( ([TIME[2013-09-25 20:14:10 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20130924>
[143] [CITE[IRC logs: freenode / #whatwg / 20131026]]
( ([TIME[2013-10-28 00:38:17 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20131026>
[144] [CITE[IRC logs: freenode / #whatwg / 20131030]]
( ([TIME[2013-11-01 21:16:51 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20131030#l-662>
[156] [CITE[IRC logs: freenode / #whatwg / 20140204]]
( ([TIME[2014-02-05 20:30:59 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20140204>
[157] [CITE[Add a warning sign for synchronous usage of the XMLHttpRequest API · 575999a · whatwg/xhr]]
( ([TIME[2014-02-13 06:44:19 +09:00]] 版))
<https://github.com/whatwg/xhr/commit/575999ae46afadc8f2ac6376c68fa7a887a88aa6>
[160] [CITE@en[Web Applications 1.0 r8510 Lay the groundwork for interruptible microtasks, mutation-observer style.]] ([TIME[2014-02-25 12:53:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=8509&to=8510>
[175] [CITE@en[Web Applications 1.0 r8553 Make microtasks work in workers too, since eventually we'll want the JavaScript stuff to hook into this]] ([TIME[2014-03-19 03:12:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=8552&to=8553>
[176] >>175 で[[ワーカー]]にも[[マイクロタスク]]が導入されました。
- [206] [CITE@en[Web Applications 1.0 r8630 Refactor 'stable states' to be defined in terms of microtasks]] ([TIME[2014-05-14 04:18:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=8629&to=8630>
[215] [CITE@en[Web Applications 1.0 r8832 Hyperlink to 'step 1' of the event loop]]
( ([TIME[2014-10-10 06:39:00 +09:00]] 版))
<https://html5.org/r/8832>
[216] [CITE[IRC logs: freenode / #whatwg / 20141119]]
( ([TIME[2014-11-21 01:14:19 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20141119#l-819>
[52] 2014年11月には、[[レンダリングの更新]]処理と[[イベントループ]]との関係が明確化されました。
;; [[レンダリングの更新]]を参照。
[REFS[
- [73] [CITE@en[Web Applications 1.0 r8849 Flesh out how rendering happens in the event loop. This also defines requestAnimationFrame() and obsoletes the 'Timing control for script-based animations' spec (by request of that spec's editors)]] ([TIME[2014-11-20 06:56:00 +09:00]] 版) <https://html5.org/r/8849>
- [64] [CITE@en[Web Applications 1.0 r8850 Teach the event loop that it might not have a task to run]] ([TIME[2014-11-20 07:20:00 +09:00]] 版) <https://html5.org/r/8850>
]REFS]
[1] [CITE@en[Timing and Synchronization in JavaScript - Opera Developer Community]] ([TIME[2009-06-07 11:12:38 +09:00]] 版) <http://dev.opera.com/articles/view/timing-and-synchronization-in-javascript/>
@@ [83] [[IndexedDB]]
[77] [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>
[FIG(quote)[
[FIGCAPTION[
[112] [CITE[IRC logs: freenode / #whatwg / 20150612]]
([TIME[2015-06-13 12:21:57 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20150612>
]FIGCAPTION]
> # '''['''17:24''']''' <annevk> ek_: it doesn't necessarily have to be a distinct thread, but you have to be pretty clever to pull that of (Opera used to do that)
]FIG]
[113] [CITE[BlinkOn Scheduler Talk - Google スライド]]
([TIME[2015-06-25 18:40:21 +09:00]] 版)
<https://docs.google.com/presentation/d/1vqqBwDbnwrCz0P5JX_fxVQd0Q5KmVZdB_hk6RLNgO2Q/edit>
[219] [CITE[Surfin' Safari - Blog Archive » Introducing the Rendering Frames Timeline]]
([TIME[2015-09-09 11:13:22 +09:00]] 版)
<https://www.webkit.org/blog/3996/introducing-the-rendering-frames-timeline/>
[224] [CITE[IRC logs: freenode / #whatwg / 20151118]]
([TIME[2015-11-19 16:10:44 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20151118>
[226] [CITE@en[Remove the storage mutex due to lack of implementation · whatwg/html@1b918cf]] ([TIME[2015-12-16 14:38:10 +09:00]] 版) <https://github.com/whatwg/html/commit/1b918cf72fcbba011f83b92ab5d1f483fb1cafa3>
** [CODE(DOMm)@en[showModalDialog]] の廃止
[227] [CITE@en[Remove showModalDialog() · whatwg/html@eec9646]]
([TIME[2015-12-16 14:57:48 +09:00]] 版)
<https://github.com/whatwg/html/commit/eec96462b5bd1c7f904a4880bc04dade6efcd597>
*** 利用者インターフェイスの無効化
[114] [[イベントループ]]とは直接関係ありませんが、[[利用者インターフェイス]]が[RUBYB[無効化]@en[disabled]]されることがあります。
[115] [CODE(DOMm)@en[[[showModalDialog]]]] による[[モーダルダイアログ]]の表示中は、その呼び出し元と同じ[[起源]]の[[閲覧文脈]]
(正確には「[[背景閲覧文脈]]のリストに含まれる[[閲覧文脈]]」) の[[利用者インターフェイス]]を無効化しなければ[['''なりません''']]
[SRC[<http://www.whatwg.org/specs/web-apps/current-work/#dom-showmodaldialog>]]。
[116] これはすなわち [SRC[<http://www.whatwg.org/specs/web-apps/current-work/#dom-showmodaldialog>]]、
[FIG(list)[
- [117] [[利用者]]が [[navigate]] できなくする[['''べきです''']]
- [118] [[利用者]]の操作によって[[イベント]]が送られないようにする[['''べきです''']]
- [119] [[利用者]]が内容を編集できないようにする[['''べきです''']]
- [120] [[利用者]]以外からの[[イベント]]の発生は止めません
- [121] [[スクリプト]]の実行は中断しません
- [122] [[アニメーション]]の実行は止めません
]FIG]
[123] ということで、[[一時停止]]と似ていますが、[[同期区間]]などを実行しないこと、
[[利用者]]からの[[イベント]]を無視することが違っています。
[146] [[inert]] も類似した状況を作り出します。 [[inert]] は [DEL[[CODE(HTMLa)@en[[[inert]]]] [[属性]]や]]
[CODE(HTMLe)@en[[[dialog]]]] [[要素]]によって発生します。
**
[228] [CITE@en[Integrate with the ES job queue · whatwg/html@12db63c]] ([TIME[2015-12-22 14:38:12 +09:00]] 版) <https://github.com/whatwg/html/commit/12db63c7c038b9d8f1d3501d6661d89d495abeac>
[229] [CITE@en[Rewrite script execution on top of ES · whatwg/html@4891d18]]
([TIME[2015-12-22 23:58:44 +09:00]] 版)
<https://github.com/whatwg/html/commit/4891d18aaf2df1d40aa61f467a5a10cfc19dd85d>
[241] [CITE@en[Editorial: make wait a concept for bodies instead of responses · whatwg/fetch@1873eda]]
([TIME[2016-03-26 11:52:33 +09:00]] 版)
<https://github.com/whatwg/fetch/commit/1873edac285df87c495b1966d8fdb2fd7ba733b2>
[242] [CITE@en[Allow for a request to finish after a response starts to arrive · whatwg/fetch@3a41b6f]]
([TIME[2016-03-26 11:54:10 +09:00]] 版)
<https://github.com/whatwg/fetch/commit/3a41b6f04996d4aac13ecad5b38635827dcd0df3>
[236] [CITE@en[Add a warning about the "pause" operation]]
( ([[domenic]]著, [TIME[2016-05-23 15:32:37 +09:00]]))
<https://github.com/whatwg/html/commit/8d564d1b5589906f77589b499e1ebf44671d2ee6>
[78] [CITE@en[Remove global script clean-up jobs]]
([[mkruisselbrink]]著, [TIME[2017-02-03 03:53:33 +09:00]])
<https://github.com/whatwg/html/commit/305aa6705e2ae65ae8a407c53316359dfe286eba>
[94] [CITE@en['''['''worklets''']''' Clarify that the event loop is not run continuously.]]
([[bfgeek]]著, [TIME[2017-04-05 06:22:35 +09:00]])
<https://github.com/w3c/css-houdini-drafts/commit/4b7d4dfaac7acd3ca6c5c5131a2a65874265327d>
[96] [CITE@en[Do we need to mandate agents and event loops being 1:1? · Issue #2526 · whatwg/html]]
([TIME[2017-04-22 15:24:27 +09:00]])
<https://github.com/whatwg/html/issues/2526>
[97] [CITE@en[Editorial: minor event loop processing model cleanup]]
([[annevk]]著, [TIME[2017-05-07 01:11:59 +09:00]])
<https://github.com/whatwg/html/commit/7ddfd096ba815d4bd4e8b3ff7900bef1e95b985c>
[98] [CITE@en[atotic/event-loop: event loop docs]]
([TIME[2017-05-18 23:34:02 +09:00]])
<https://github.com/atotic/event-loop>
[99] [CITE@en[Meta: export some event loop-related definitions]]
([[domenic]]著, [TIME[2017-07-14 04:59:20 +09:00]])
<https://github.com/whatwg/html/commit/b0da8d31269485c5ff794912dff354c5d966900b>
[100] [CITE@en[Meta: export some event loop-related definitions by domenic · Pull Request #2836 · whatwg/html]]
([TIME[2017-07-15 14:18:07 +09:00]])
<https://github.com/whatwg/html/pull/2836>
[101] [CITE@en[Cross-link to update the rendering · Issue #10 · WICG/paint-timing]]
([TIME[2017-07-15 14:19:13 +09:00]])
<https://github.com/WICG/paint-timing/issues/10>
[103] [CITE@en[Clarify that specification text usually starts on the event loop]]
([[domenic]]著, [TIME[2017-07-01 06:00:10 +09:00]])
<https://github.com/whatwg/html/commit/bae35b1a90f723efb1c913438d9e1441fa67461a>
[104] [CITE@en["Do any synchronous setup work, while still on the event loop..." · Issue #2800 · whatwg/html]]
([TIME[2017-10-17 17:24:45 +09:00]])
<https://github.com/whatwg/html/issues/2800>
[105] [CITE@en[Clarify that specification text usually starts on the event loop by domenic · Pull Request #2803 · whatwg/html]]
([TIME[2017-10-17 17:25:02 +09:00]])
<https://github.com/whatwg/html/pull/2803>
[107] [CITE@en[Allow UAs to conditionally block on stylesheet loading]]
([[domfarolino]]著, [TIME[2018-01-12 17:19:01 +09:00]])
<https://github.com/whatwg/html/commit/42dd707cbfc0f5d8f88b04ef270f4fcb121a10ff>
[132] [CITE@en[Integrate with requestIdleCallback]]
([[rmcilroy]]著, [TIME[2018-10-25 23:57:45 +09:00]])
<https://github.com/whatwg/html/commit/01787ee712a7803e64e0da6ac9644a5e6b8d2cca>
[154] [CITE@en[Missing definition for "idle time" · Issue #70 · w3c/requestidlecallback]]
([TIME[2018-11-06 23:02:44 +09:00]])
<https://github.com/w3c/requestidlecallback/issues/70>
[155] [CITE@en[Hook into HTML spec. by rmcilroy · Pull Request #75 · w3c/requestidlecallback]]
([TIME[2018-11-06 23:06:03 +09:00]])
<https://github.com/w3c/requestidlecallback/pull/75>
[174] [CITE@en[Integrate with requestIdleCallback by domenic · Pull Request #3570 · whatwg/html]]
([TIME[2018-11-06 23:06:29 +09:00]])
<https://github.com/whatwg/html/pull/3570>
[177] [CITE@en[Integrate with requestIdleCallback by rmcilroy · Pull Request #4104 · whatwg/html]]
([TIME[2018-11-06 23:09:12 +09:00]])
<https://github.com/whatwg/html/pull/4104>
[178] [CITE@en[Fix argument ordering in call to report long tasks]]
([[npm1]]著, [TIME[2018-11-14 09:17:52 +09:00]])
<https://github.com/whatwg/html/commit/9faa107bf28a2a4100203973e41741be1e8e9b77>
[185] [CITE@en[Arguments ordering in Report long tasks for “user agent does not execute this loop” · Issue #4114 · whatwg/html]]
([TIME[2019-03-10 18:54:42 +09:00]])
<https://github.com/whatwg/html/issues/4114>
[189] [CITE@en[Fix ordering in call to Report long tasks by npm1 · Pull Request #4174 · whatwg/html]]
([TIME[2019-03-10 18:55:11 +09:00]])
<https://github.com/whatwg/html/pull/4174>
[190] [CITE@en[Start an idle period more often]]
([[rmcilroy]]著, [TIME[2018-12-22 04:06:18 +09:00]])
<https://github.com/whatwg/html/commit/4fd4d3df700ecf9d00962fbda760a06014175728>
[191] [CITE@en["start an idle period algorithm" not run enough · Issue #4212 · whatwg/html]]
([TIME[2019-06-05 20:09:51 +09:00]])
<https://github.com/whatwg/html/issues/4212>
[192] [CITE@en[Start an idle period if event loop has tasks for non-fully active docs by rmcilroy · Pull Request #4250 · whatwg/html]]
([TIME[2019-06-05 20:10:00 +09:00]])
<https://github.com/whatwg/html/pull/4250>
[193] [CITE@en[Remove parameter from "Report long tasks" call]]
([[npm1]]著, [TIME[2018-11-21 08:13:09 +09:00]])
<https://github.com/whatwg/html/commit/e48c42f60788f318f1d848c33869bb2461673c00>
[194] [CITE@en[Make fragment loop not depend on spin the event loop]]
([[annevk]]著, [TIME[2019-06-28 16:59:42 +09:00]])
<https://github.com/whatwg/html/commit/e62a7be6f3161993b82e9d8469ba2e64a3c6a2a6>
[214] [CITE@en[Integrate with the Long Tasks spec]]
([[npm1]], [TIME[2018-10-23 07:23:27 +09:00]], [TIME[2021-03-25T06:05:19.000Z]])
<https://github.com/whatwg/html/commit/425a67ba81288305fce86736a0772f84c3f30eed>
[263] [CITE@en[Add modifications to HTML from LongTasks Spec by npm1 · Pull Request #4059 · whatwg/html]]
([TIME[2021-03-25T07:10:15.000Z]])
<https://github.com/whatwg/html/pull/4059>