[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]]。
個数と使い分けは実装に依存します。
: [F[マイクロタスクキュー]] :
:[F[[[閲覧文脈]]群]]または[F[[[ワーカー]]]]:
[10] [[ワーカー]]以外の[[イベントループ]]は、最低1つ[[閲覧文脈]]を持ちます [SRC[>>5]]。
[42] [[ワーカー]] ([CODE(DOMi)@en[[[WorkerGlobalScope]]]]) は、
それぞれ別個の[[イベントループ]]を有します [SRC[>>40, >>204]]。
: [F[[[文書]]群]] :
[[レンダリングの更新]]、[[アイドル期間]]の開始、
[[アイドルコールバック群呼び出しアルゴリズム]]で参照されます。
: [F[現在走っているタスク]] :
動作中の[[タスク]]または[[マイクロタスク]]が高々1つ存在します。
: [F[[[一時停止]]中]] :
:[[termination nesting level]] [SRC[>>90]]:[[モーダルダイアログ]]の表示を制御するものです。
: [F[マイクロタスクチェックポイントを行っている]] :
:[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[[F[[RUBYB[[[現在走っているタスク]]]@en[currently running task]]]]]]と呼ばれます。
[[現在走っているタスク]]の初期値は [CODE[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]]してここで停止します。

]FIG]

;; [16] [[イベントループ]]とは別に、[[算法]]の一部分が[[非同期]]的に実行されると規定されているものがあります。
そのような[[算法]]についても、結果を何らかの形で [[DOM]] に反映させる必要があり、
[[イベントループ]]が[[安定状態を提供]]することによってそのような[[算法]]の[[同期区間]]が実行される、
あるいは[[タスクキュー]]に[[タスク]]を追加する、といった形で[[イベントループ]]と統合されています。
[[マルチスレッド]]な実装なら[[同期区間]]の前後の[[非同期]]な部分は[[イベントループ]]とは別の[[スレッド]]で実装してもよいでしょうし、単一[[スレッド]]なら仕様上の[[イベントループ]]を含むより大きな[[イベントループ]]の中で交互に処理を行うことになるのでしょう。
[WEAK[(単一[[スレッド]]の [[Webブラウザー]]があるのか知りませんが...)]]

[53] [[イベントループ]]の手順中で[[タスク]]と[[マイクロタスク]]の実行では[[著者]]による[[スクリプト]]が実行される可能性があります。
また[[レンダリングの更新]]でも[[アニメーションフレームコールバック]]などとして[[著者]]による[[スクリプト]]が実行されることがあります。

[130] [[アイドル状態]]になったと判定すると、 [CODE(DOMm)@en[requestIdleCallback]]
の[[コールバック関数]]の実行のための[[タスクをキューに追加]]することになっています。

;; [[アイドル状態]]を参照。

** タスクの実行

[75] [VAR[イベントループ]]の[[タスク]]の処理は、次のようにします。

[FIG(steps)[
= [162] 「手順1」 (>>48) の処理を行います。
= [238] [VAR[タスク]]を、[VAR[イベントループ]]について[[タスクキューからタスクを選択]]した結果に設定します。
= [239] [VAR[タスク]]が [CODE[null]] で''ない''場合、
== [230] [VAR[タスク開始時刻]]を、
[[現在高精度時刻]]に設定します。
== [179] [VAR[イベントループ]]の[F[[[現在走っているタスク]]]]を、
[VAR[タスク]]に設定します [SRC[>>5]]。
== [180] [VAR[タスク]]の[F[手順群]]を実行します [SRC[>>5]]。
== [181] [VAR[イベントループ]]の[F[[[現在走っているタスク]]]]を、 null に設定します
[SRC[>>5]]。
== [256] [VAR[タスク]]を返します。
]FIG]

;; [76] [[イベントループ]]の一巡の間に[[タスク]]は高々1つだけ実行されます。
それに対して[[マイクロタスク]]や[[アニメーションフレームコールバック]]は、
実行できる状態のものがすべて実行されます。これが[[タスク]]に対して[[マイクロタスク]]が
「マイクロ」である所以です。

[HISTORY[
[182] かつては[[タスク]]の実行後に[[ストレージミューテックス]]の解放も行うこととされていました。
]HISTORY]

[HISTORY[
[183] 
かつては[[タスク]]を実行した後で[[タスクキュー]]から削除すると規定されていました。
[SEE[ [[タスクキューからタスクを選択]] ]]
]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[イベントループ]]が [[window event loop]] であり、
-- [141] [VAR[イベントループ]]の[F[[[タスクキュー]]群]]のどの[[タスクキュー]]にも、
[F[文書]]の[F[完全に活性]]が[[真]]の[[タスク]]が含まれ''ず''、
-- [142] [VAR[イベントループ]]の[F[マイクロタスクキュー]]が[[空][list empty]]であり、
-- [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実行文脈スタック]]]]を空にします。
= [18] [VAR@en[タスク]]を停止させます。
=- [269] [VAR[タスク]]を停止させると呼び出し元である[[イベントループ]]の手順群の次の手順へと進みます。
=- [169] つまり[VAR[イベントループ]]について[[マイクロタスクチェックポイント]]が実行されることになります。
[SEE[ [[イベントループ]] ]]

]FIG]

;; [173] [[スピン]]は[[イベントループ]]から直接呼び出された[[タスク]]から呼び出されることもあれば、
[[マイクロタスク]]や[[複合マイクロタスク部分タスク]]から呼ばれることもあります。

;; [213] [[JavaScript実行文脈]]には[[スクリプト]]の実行環境や[[スクリプト設定群オブジェクト]]その他が含まれていますので、
それら処理に必要な状態すべてが保存された状態で、実行が中断され、
[[イベントループ]]や[[マイクロタスクチェックポイント]]などの次のステップへと進むことになります。

[HISTORY[
[168] かつては [[global script clean-up jobs]] の実行もここで行われていました。
]HISTORY]

[19] [[並列に]]、[VAR[条件]]が成立するのを待ちます。
成立したら、次のようにしなければ[MUST[なりません]]。 [SRC[>>5]]

[FIG(steps)[
= [270] 
[[タスク]]を[[タスクキューに追加]]します。
[FIG(list members)[

: [VAR[源]] : [VAR[源]]
: [VAR[手順群]] :
[FIG(steps)[
= [170] [VAR[イベントループ]]の[F[[[JavaScript実行文脈スタック]]]]を、[VAR[旧スタック]]に設定します。
= [171] [[スピン]]の呼び出し元の続きの手順群を実行します。

]FIG]

]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]]]]、破棄されます。
(その後[[ワーカーを走らせる]]手順の最終段階へと進みます。)

** 実行時間の報告

[286] 
[[イベントループ]]は[[変数]][VAR[タスク開始時刻]]により経過時間を保持しています。

[HISTORY[
[225] 
[[イベントループ]]は、
[DFN[[F[[RUBYB[[[イベントループ開始]]][event loop begin]]]]]]と[DFN[[F[[RUBYB[[[イベントループ終了]]][event loop end]]]]]]を持ちます。
[SRC[>>5]]
ともに初期値は [CODE[null]] です。
]HISTORY]

-*-*-

[250] 
[VAR[タスク開始時刻]]と[VAR[タスク]]と[VAR[今]]について[[タスク]]の時間長を報告するには、
次のようにします。
[SRC[>>5]]

[FIG(steps)[
= [251] 
[VAR[最上位閲覧文脈群]]を、
[[空集合]]に設定します。
= [252] 
[VAR[タスク]]の[F[スクリプト評価環境設定群オブジェクト集合]]中の各[VAR[設定群]]について[[それぞれ][for each]]、
== [253] 
[VAR[最上位閲覧文脈群]]に、
[VAR[設定群]]の[F[最上位閲覧文脈]]を[[末尾に追加]]します。
= [254] 
[VAR[タスク開始時刻]]、
[VAR[今]]、
[VAR[最上位閲覧文脈群]],
[VAR[タスク]]について、
[[report long tasks]]
します。

]FIG]

[255] 
この手順は、[[タスク]]とその直後の[[マイクロタスク]]の実行
(>>74)
の後に呼び出されます。

@@ [272] 仕様書では[VAR[タスク]]が [CODE[null]] でもこれが呼び出されるケースがあります。

-*-*-

[257] 
[VAR[イベントループ]]と[VAR[文書群]]と[VAR[今]]について[[レンダリングの更新]]の時間長を報告するには、
次のようにします。
[SRC[>>5]]

[FIG(steps)[
= [259] 
[VAR[レンダリング終了時刻]]を、
[[現在高精度時刻]]に設定します。
= [260] 
[VAR[最上位閲覧文脈群]]を、
[VAR[文書群]]中の[[文書]]のうち[F[完全に活性]]なものすべての[F[最上位閲覧文脈群]]すべての[[集合]]に設定します。
= [261] 
[VAR[今]],
[VAR[レンダリング終了時刻]],
[VAR[最上位閲覧文脈群]]について、
[[report long tasks]]
します。

]FIG]

[258] 
この手順は、[[レンダリングの更新]]の実行後に呼び出されます。

-*-*-

[HISTORY[
[283] 
一時は次のような規定もありましたが、
[TIME[令和元(2019)年][2019]]の改定で削除されました。
[SRC[>>280]]

[234] 
[[利用者エージェント]]が[VAR[イベントループ]]を実行しなかった[[時間長]]を報告するには、
次のようにします。
[SRC[>>5]]

[FIG(steps)[
= [244] 
[VAR[イベントループ]]の[F[イベントループ開始]]を、
[[現在高精度時刻]]に設定します。
= [245] 
[VAR[イベントループ]]の[F[イベントループ終了]]が [CODE[null]] で''ない''場合、
== [246] 
[VAR[最上位閲覧文脈群]]を、
[VAR[イベントループ]]に関連付けられた[F[文書]]すべての[F[最上位閲覧文脈]]すべての[[集合]]に設定します。
== [247] 
[VAR[イベントループ]]の[F[イベントループ開始]]、
[VAR[イベントループ]]の[F[イベントループ終了]]、
[VAR[最上位閲覧文脈群]]について、
[[report long tasks]]
します。

]FIG]


[240] 
この手順は、[[イベントループ]]が[[タスク]]を実行する直前に呼び出されます。

[284] 
[[イベントループ]]を実行しなかった時間とは [[GC]] 等に掛かった時間を表していたようです
[SRC[>>280]]。

]HISTORY]

* 構文解析器との関係

[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>

[264] [CITE@en[Remove parameter from "Report long tasks" call]]
([[npm1]], [TIME[2018-11-21 08:13:09 +09:00]], [TIME[2021-03-25T07:23:28.000Z]])
<https://github.com/whatwg/html/commit/e48c42f60788f318f1d848c33869bb2461673c00>

[265] [CITE@en[Remove "browser" and "rendering" task types by npm1 · Pull Request #50 · w3c/longtasks]]
([TIME[2021-03-25T07:25:23.000Z]])
<https://github.com/w3c/longtasks/pull/50>

[266] [CITE@en[Remove param from Report long tasks by npm1 · Pull Request #4186 · whatwg/html]]
([TIME[2021-03-25T07:26:12.000Z]])
<https://github.com/whatwg/html/pull/4186>

[267] [CITE@en[Editorial: refactor spin the event loop by annevk · Pull Request #4463 · whatwg/html]]
([TIME[2021-03-25T07:42:06.000Z]])
<https://github.com/whatwg/html/pull/4463>

[268] [CITE@en[Editorial: refactor and explain spin the event loop]]
([[annevk]], [TIME[2019-05-08 00:53:15 +09:00]], [TIME[2021-03-25T07:42:20.000Z]])
<https://github.com/whatwg/html/commit/38c50c4ea111bd8f3ff60d2a49110a62a293c7ac>

[271] [CITE@en[Editorial: rigorize tasks and task queuing]]
([[domenic]], [TIME[2019-05-01 01:36:30 +09:00]], [TIME[2021-03-25T08:52:45.000Z]])
<https://github.com/whatwg/html/commit/f4e29076caad1779336adea40ac2125d6d1c9496>

[273] [CITE@en[Script event-loop: ignoring tasks for documents that are not fully active · Issue #4242 · whatwg/html]]
([TIME[2021-03-25T11:52:35.000Z]])
<https://github.com/whatwg/html/issues/4242>

[274] [CITE@en[Editorial: rigorize tasks and task queuing by domenic · Pull Request #4465 · whatwg/html]]
([TIME[2021-03-25T11:54:02.000Z]])
<https://github.com/whatwg/html/pull/4465>

[275] [CITE@en[Remove compound microtasks]]
([[annevk]], [TIME[2019-03-30 00:53:50 +09:00]], [TIME[2021-03-26T11:42:46.000Z]])
<https://github.com/whatwg/html/commit/77240a20c840ac60f0b1102ec4ac8be7df717172>

[276] [CITE@en[Remove compound microtasks by annevk · Pull Request #4437 · whatwg/html]]
([TIME[2021-03-26T11:43:16.000Z]])
<https://github.com/whatwg/html/pull/4437>

[277] [CITE@en[Editorial: remove now-redundant removal of event loop task]]
([[domenic]], [TIME[2019-09-13 14:26:06 +09:00]], [TIME[2021-04-12T05:24:12.000Z]])
<https://github.com/whatwg/html/commit/edcf2eff7570fd142188e45350eb9c69bad9b9fc>

[278] [CITE@en[Editorial: remove now-redundant removal of event loop task by domenic · Pull Request #4897 · whatwg/html]]
([TIME[2021-04-12T05:26:19.000Z]])
<https://github.com/whatwg/html/pull/4897>

[279] [CITE@en[Duplicated removal from queue in the Event Processing Model · Issue #4888 · whatwg/html]]
([TIME[2021-04-12T05:26:51.000Z]])
<https://github.com/whatwg/html/issues/4888>

[280] [CITE@en[Do not report long tasks outside of the event loop]]
([[npm1]], [TIME[2019-12-05 03:48:39 +09:00]], [TIME[2022-01-18T11:58:57.000Z]])
<https://github.com/whatwg/html/commit/d5a8e4d14d5ab07d3472f7d06077333cefa508b0>

[281] [CITE@en[Reporting work outside of event loop can cause leaks · Issue #77 · w3c/longtasks]]
([TIME[2022-01-18T12:03:56.000Z]])
<https://github.com/w3c/longtasks/issues/77>

[282] [CITE@en[Do not report work outside of event loop by npm1 · Pull Request #5123 · whatwg/html]]
([TIME[2022-01-18T12:06:14.000Z]])
<https://github.com/whatwg/html/pull/5123>

[285] [CITE@en[Editorial: inline event loop start and remove event loop end]]
([[npm1]], [TIME[2019-12-06 02:32:44 +09:00]], [TIME[2022-01-26T11:59:29.000Z]])
<https://github.com/whatwg/html/commit/1ca48214c66aa20fc586773ea9c572e0ef8cab11>

[262] [CITE@en[Do not report work outside of event loop by npm1 · Pull Request #5123 · whatwg/html]]
([TIME[2022-01-26T12:08:46.000Z]])
<https://github.com/whatwg/html/pull/5123>

[287] [CITE@en[Remove event loop end by npm1 · Pull Request #5130 · whatwg/html]]
([TIME[2022-01-26T12:09:32.000Z]])
<https://github.com/whatwg/html/pull/5130>