[35] [DFN[[RUBYB[[[マイクロタスク]]]@en[microtask]]]]は、 
[[Webブラウザー]]における処理の単位で、
[[変異観測器]]や[[約束]]などの処理で用いられています。

* 仕様書

[REFS[
- [49] '''[CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <https://www.whatwg.org/specs/web-apps/current-work/#microtask>'''
- [7] [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>
- [76] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-12-22 10:28:15 +09:00]] 版) <https://html.spec.whatwg.org/#enqueuejob(queuename,-job,-arguments)>
]REFS]

* マイクロタスク

[133] 
[[マイクロタスク]]は、
[[マイクロタスクをキューに入れる]]手続きで作られた[[タスク]]です。
[SRC[>>49]]
[[マイクロタスク]]は[[タスク]]の分類の1つですが、
[[仕様書]]上はただの[[タスク]]と構造的な違いはありません。

[HISTORY[
[134] 
かつての [CITE[HTML Standard]]
は最初に[[タスクキュー]]ではなく[[マイクロタスクキュー]]に入れられた[[タスク]]、
と説明していました。意味するところはほぼ同じです。
]HISTORY]


[51] [[マイクロタスク]]が通常の[[タスク]]に比べて「マイクロ」であるのは、
[[タスク]]が[[イベントループ]]の全体によって順次処理されていくのに対し、
[[マイクロタスク]]のほとんどがその[[イベントループ]]の一度の繰り返しの内で順次実行されることを指しています。
[[マイクロタスク]]自体も[[タスク]]の一種なのであって、
[[マイクロタスク]]によって[[タスク]]が構成されるような階層構造には''ありません''。

[135] 
たまに[[マイクロタスク]]が通常の[[タスクキューに追加]]されることがあります。

[FIG(list)[ [148] [[マイクロタスク]]
- [[安定状態の提供]] [SRC[[[HTML Standard]]]]
- [[update the image data]] [SRC[[[HTML Standard]]]]
- [CODE(DOMa)@en[[[timeout]]]] [SRC[[[XHR]]]]
- [CODE(JS)@en[[[Promise]]]] の[[コールバック]]の呼び出し [SRC[[[ECMAScript]], [[HTML Standard]]]]
- [[バックアップ要素キュー]]の処理
- [[変異観測器]]の[[コールバック]]の呼び出し [SRC[[[DOM Standard]]]]
]FIG]


[HISTORY[

[147] 
[TIME[平成31(2019)年][2019]]の改訂以前は、
[[マイクロタスク]]は2種類に分類されていました
[SRC[>>146]]。


[50] 
[[マイクロタスク]]には[[孤独コールバックマイクロタスク]]と[[複合マイクロタスク]]の2種類があります。 [SRC[>>49]]

* 孤独コールバックマイクロタスク

[61] [DFN[[RUBYB[[[孤独コールバックマイクロタスク]]]@en[solitary callback microtask]]]]は、
それ自体が実行時の最小単位の[[タスク]]となるような[[マイクロタスク]]です。

[100] ほとんどの[[マイクロタスク]]は、[[孤独コールバックマイクロタスク]]です。

[42] [[孤独コールバックマイクロタスク]]には、次のものがあります。

[FIG(list)[
- [[安定状態の提供]] [SRC[[[HTML Standard]]]]
- [[update the image data]] [SRC[[[HTML Standard]]]]
- [CODE(DOMa)@en[[[timeout]]]] [SRC[[[XHR]]]]
- [CODE(JS)@en[[[Promise]]]] の[[コールバック]]の呼び出し [SRC[[[ECMAScript]], [[HTML Standard]]]]
- [[バックアップ要素キュー]]の処理
]FIG]

[HISTORY[
[113] かつては次のものも予定されていました。

[FIG(list)[
- [CODE(HTMLa)@en[[[sortable]]]] な[[表]]の[[整列]] [SRC[[[HTML Standard]]]]
- [CODE(JS)@en[[[Object.observe]]]] の[[コールバック]]の呼び出し [SRC[[[ECMAScript]]]]
]FIG]

[120] [[カスタム要素コールバック]]も[[マイクロタスク]]を使うことが一時想定されていましたが、
最終的には独自のキューを使う形となっています。
]HISTORY]

* 複合マイクロタスク

[62] [DFN[[RUBYB[[[複合マイクロタスク]]]@en[compound microtask]]]]は、
実行時に最小単位の[[タスク]]複数個に分割され得る[[マイクロタスク]]です。

[78] [[複合マイクロタスク]]の一部として実行される[[タスク]]のことを、
[DFN[[RUBYB[[[複合マイクロタスク部分タスク]]]@en[compound microtask subtask]]]]といいます。

[EG[
[77] 例えば [[mutation observer]] の[[マイクロタスク]]は、複数の [CODE(DOMi)@en[[[MutationObserver]]]]
[[コールバック]]を呼び出す可能性があり、
それぞれが[[複合マイクロタスク部分タスク]]であるような1つの[[複合マイクロタスク]]として定義されています。
]EG]

[66] [[複合マイクロタスク]]は、[[イベントループのスピン]]時の挙動を正しく扱えるように注意する必要があります。
そのために[[複合マイクロタスク部分タスクを実行する]]手順 (>>67) が用意されていて、
[[複合マイクロタスク]]を定義する仕様書はこれを参照することが期待されています。

[101] [[複合マイクロタスク]]には、次のものがあります。
[FIG(list)[
- [[変異観測器]]の[[コールバック]]の呼び出し [SRC[[[DOM Standard]]]]
]FIG]

]HISTORY]

** その他の処理

[97] 定義上[[マイクロタスク]]ではありませんが、
[[マイクロタスク]]の実行のタイミングで実行される処理として、他に、
[[拒絶された約束について通知]]と
[[IndexedDBトランザクションの片付け]]があります。

[98] これらの処理は、[[マイクロタスク]]とは違って、[[マイクロタスクキュー]]を使わず毎回適宜実行されます。

* マイクロタスクキュー

[53] [[イベントループ]]は、
[F[[DFN[[RUBYB[[[マイクロタスクキュー]]]@en[microtask queue]]]]]]を ([F[[[タスクキュー]]]]とは別に) 
持ちます。 
[F[マイクロタスクキュー]]は、
[[マイクロタスク]]の[[キュー]]です。
初期値は[[空]]です。
[SRC[>>49]]

[90] [[ECMAScript]] 仕様書は独自の[[ジョブキュー]] [DFN[[CODE[[[PromiseJobs]]]]]] 
を規定していますが、これは [[Web]] における[[マイクロタスクキュー]]に相当します。

[89] 
[DFN[[RUBYB[マイクロタスクをキューに[RUBY[入][い]]れる]@en[queue a microtask]]]]処理
[SRC[>>49]]
は、
新たな[[マイクロタスク]]を[[マイクロタスクキュー]]に追加するものです。

[152] 
この処理は、
次の引数を有します。

[FIG(list members)[
: [VAR[イベントループ]] :
[[イベントループ]]。
[[仕様書]]は[VAR[イベントループ]]の省略を認めており、
その場合[[暗示イベントループ]]となります [SRC[>>49]]。
: [VAR[文書]] :
[[文書]]。
[[仕様書]]は[VAR[文書]]の省略を認めており、
その場合[VAR[イベントループ]]とこの[[手順群]]を呼び出した文脈についての[[暗示文書]]となります
[SRC[>>49]]。
: [VAR[処理群]] :
[[手順群]]。

]FIG]

[153] 
次のようにします。
[SRC[>>49]]

[FIG(steps)[
= [138] 
[VAR[マイクロタスク]]を、
新しい[[タスク]]に設定します。
[FIG(list members)[ [139] [[タスク]]

: [F[処理群]] : [VAR[処理群]]
: [F[源][タスク源]] : [[マイクロタスクタスク源]]
: [F[文書][タスク]] : [VAR[文書]]

]FIG]
= [141] 
[VAR[イベントループ]]の[F[マイクロタスクキュー]]に、
[VAR[タスク]]を[[キューに追加]]します。

]FIG]

[137] [[Web]] 系の[[仕様書]]は、
[[マイクロタスクをキューに入れる]]操作を直接使っています。

[91] [[抽象演算]] [CODE(JS)@en[[DFN[[[EnqueueJob]]]]([VAR[queueName]], [VAR[job]], [VAR[arguments]])]]
は、次のようにしなければ[MUST[なりません]] [SRC[>>76]]。

[FIG(steps)[
= [93]
@@ [VAR[ジョブ設定群]]を、何らかの[[設定群オブジェクト]]に設定します。
= [125] [VAR[現職設定群]]を、[[現職設定群オブジェクト]]に設定します。
= [114] [VAR[活性スクリプト]]を、[[活性スクリプト]]に設定します。
= [109] [VAR[スクリプト実行文脈]]を、
新しい[[JavaScript実行文脈]]に設定します。
[FIG(list members)[ [110] [[JavaScript実行文脈]]

: [F[Function]] : [CODE[null]]
: [F[Realm]] : [VAR[活性スクリプト]]の[F[設定群オブジェクト]]の [F[Realm]]
: [F[ScriptOrModule]] : [VAR[活性スクリプト]]の[F[記録]]

]FIG]
= [94] [VAR[ジョブ設定群]]の[F[有責イベントループ]]について、
[[マイクロタスクをキューに追加]]します。
[FIG(list members)[
[FIGCAPTION[
[[マイクロタスク]]
]FIGCAPTION]
:[F[処理]]:
[FIG(steps)[
= [128] [VAR[ジョブ設定群]]、[VAR[現職設定群]]、[VAR[job]]、[VAR[arguments]]、
[VAR[スクリプト実行文脈]]について、[[約束コールバックを実行]]します。
]FIG]
]FIG]
]FIG]

[99] [[ECMAScript]] [[仕様書]]は、こちらの操作を使っています。
[VAR[queueNames]] は [CODE[[[PromiseJobs]]]] と [CODE[[[ScriptJobs]]]]
規定されていますが、 [[Web]] では [CODE[[[PromiseJobs]]]] しか使いません。

;; [92] [[Web]] の[[イベントループ]]と統合されたこのアルゴリズムは
[[HTML Standard]] の独自の規定であり、 [[ECMAScript]] 仕様書への[[意図的違反]]
[SRC[>>76]] とされています。

[136] 
[[タスクをキューに入れる]]は、
名前が似ていますが別の処理です。




* マイクロタスクタスク源

[54] [[マイクロタスク]]の[[タスク源]]は[DFN[[RUBYB[[[マイクロタスクタスク源]]]@en[microtask task source]]]]となります。
[SRC[>>49]] [[マイクロタスクキュー]]には[[タスク源]]は関係してこないので、ほとんどの[[マイクロタスク]]は[[タスク源]]と無関係ですが、
[[マイクロタスク]]が[[タスクキュー]]に移されると[[タスク源]]が関係してきます。

* マイクロタスクの実行

[102] [[マイクロタスク]]は、[[マイクロタスクチェックポイントを行う]]手続きにより、
[[マイクロタスクキュー]]の順番で実行されます。

[12] [VAR[[[イベントループ]]]]について[DFN[[RUBYB[[[マイクロタスクチェックポイントを行う]]]@en[perform a microtask checkpoint]]]]には、
次のようにします。
[SRC[>>7]]

[FIG(steps)[
= [8] [VAR[イベントループ]]の[F[マイクロタスクチェックポイントを行っている]]が[[偽]]の場合、
== [9] [VAR[イベントループ]]の[F[マイクロタスクチェックポイントを行っている]]を、
[[真]]に設置します。
== [55] [VAR[[[イベントループ]]]]の[F[[[マイクロタスクキュー]]]]が[[空][list empty]]でない間、
[[繰り返し][while]]、
=== [56] [VAR[タスク]]を、
[VAR[イベントループ]]の[F[マイクロタスクキュー]]を [[dequeue]] した結果に設定します。
=== [63] [VAR[[[イベントループ]]]]の[F[[[現在走っているタスク]]]]を、[VAR[タスク]]に設定します。
=== [64] [VAR[タスク]]を実行します。
=== [65] [VAR[[[イベントループ]]]]の[F[[[現在走っているタスク]]]]を、 [[null]] に設定します。
== [32] [VAR[[[イベントループ]]]]の[F[[[環境設定群オブジェクト]]群]]の各[VAR[設定群]]について、
=== [36] [VAR[設定群]]の[[拒絶された約束について通知]]します。
== [96] [VAR[イベントループ]]の[[IndexedDBトランザクションの片付け]]をします。
== [13] [VAR[イベントループ]]の[F[マイクロタスクチェックポイントを行っている]]を、
[[偽]]に設定します。
]FIG]

[34] [[イベントループ]]は、
[DFN[[F[[RUBYB[[[マイクロタスクチェックポイントを行っている]]]@en[performing a microtask checkpoint]]]]]]を持ちます。
初期値は[[偽]]です。 [SRC[>>7]]

;; [11] [[マイクロタスク]]によって[[コールバック]]の[[スクリプト]]が呼び出されたりするわけですが、
その際 [[jump to a code entry-point]] [[アルゴリズム]]が呼ばれ、
その中で再度[[マイクロタスクチェックポイント]]が呼ばれることになるので、
[[マイクロタスクチェックポイントを行っている]]フラグでチェックして再実行しないようにしています。

[HISTORY[
[58] かつては[[マイクロタスク]]の実行が終わってから[[マイクロタスクキュー]]から削除されると規定されていました。
(これは[[タスク]]の実行でも同じでした。)
現在は削除されてから実行されていると規定されています。どちらも観測可能な挙動は同じです。
]HISTORY]

[15] [[マイクロタスクチェックポイントを行う]]のは次の場面です。
[FIG(list)[
- [16] [[イベントループ]]
- [83] [[イベントループのスピン]]
- [17] [[clean up after running a callback]] ([[コード入口点に飛ぶ]]手順から呼び出される)
- [121] [[字句の要素の作成]]から[[要素の作成]]を呼び出す直前
- [18] [[HTML]] [CODE(HTMLe)@en[[[script]]]] [[要素]]の[[終了タグ]]の[[構文解析]]時 ([[スクリプト]]実行の前)

@@ [19] [[SVG]] [CODE(XMLe)@en[[[script]]]] [[要素]]でも同様に呼び出されるものと推察されますが、
現時点で [[SVG]] [CODE(XMLe)@en[[[script]]]] [[要素]]の処理モデルを詳細に規定した仕様がありません。
]FIG]

[82] つまり[[マイクロタスク]]は、[[スクリプト]]や[[タスク]]の前後に実行されます。
複数の[[マイクロタスク]]があれば、それらをすべて実行してから次の[[タスク]]へと進みます。

;; [103] これが[[マイクロタスク]]の「マイクロ」たる所以と思われます。

* 複合マイクロタスク部分タスクの実行

[67] 指定された手順について[DFN[[RUBYB[[[複合マイクロタスク部分タスクを実行する]]]@en[execute a compound microtask subtask]]]]とは次のような手順をいいます [SRC[>>7]]。
[FIG(steps)[
= [68] [VAR@en[parent]] を[[現在走っているタスク]]とします。
== [69] これは本手順を呼び出している[[複合マイクロタスク]]となります。
= [70] [VAR@en[subtask]] を指定された手順を実行する[[タスク]]とします。
これが[[複合マイクロタスク部分タスク]]です。
[[タスク源]]は[[マイクロタスクタスク源]]とします。
= [71] [[現在走っているタスク]]を [VAR@en[subtask]] とします。
= [72] [VAR@en[subtask]] を実行します。
= [73] [[現在走っているタスク]]を [VAR@en[parent]] とします。
]FIG]

;; [79] この手順はすなわち、「ある手順をその場で[[タスク]]として実行する」ということになります。
[[複合マイクロタスク]]はそれ自体の手順の中で、[[複合マイクロタスク部分タスク]]として実行したい部分を >>67
の手順で“包んで”実行することになります。これは[[スピン]]の挙動を定義するためであり、
ただの[[孤独コールバックタスク]]と[[複合マイクロタスク]]が異なるのは[[スピン]]に対する挙動だけです。
[[スピン]]は実行中の[[タスク]]を終了させ、続きの実行を後回しにします。この後で実行する単位が、
>>67 によって当該[[複合マイクロタスク部分タスク]]だけに限定されます。 [[mutation observer]]
の場合だと、当該 [CODE(DOMi)@en[[[MutationObserver]]]] だけが中断され、他の [CODE(DOMi)@en[[[MutationObserver]]]]
があればそれらは即座に実行されます。

* 関連

[59] [[マイクロタスクキュー]]とは別に、[[タスクキュー]]なるものもあります。

[80] [[大域スクリプト片付けジョブ]]は[[マイクロタスク]]と似ていて同じようなタイミングで実行されますが、
異なるタイミングで実行されることもあります。

[38] [[拒絶された約束について通知]]は、[[マイクロタスク]]ではありませんが、
[[マイクロタスク]]が実行されるタイミングで[[マイクロタスク]]の後に実行され、
実質的に特別な[[マイクロタスク]]となっています。

* 歴史

[37] [[マイクロタスク]]は[[変異観測器]]のための仕組みとして [[HTML Standard]] に導入されました。

[REFS[
- [33] [CITE@en[DOM Mutation Events Replacement: When to deliver mutations]] ([[Rafael Weinstein]] 著, [TIME[2011-08-11 09:44:32 +09:00]] 版) <http://lists.w3.org/Archives/Public/public-webapps/2011JulSep/0780.html>
- [1] [CITE[IRC logs: freenode / #whatwg / 20120228]]
( ([TIME[2012-03-08 00:01:17 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20120228>
- [2] [CITE@en[Re: ''''''[''''''dom'''''']'''''' mutation observers and HTML]]
( ([[Olli Pettay]] 著, [TIME[2012-02-18 00:51:23 +09:00]] 版))
<http://lists.w3.org/Archives/Public/www-dom/2012JanMar/0066.html>
- [3] [CITE[IRC logs: freenode / #whatwg / 20120320]]
( ([TIME[2012-03-29 23:32:57 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20120320>
- [14] [CITE[Bug 17988 – The term microtask should be defined]]
( ([TIME[2012-07-21 17:51:05 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=17988>
- [21] [CITE@en[Web Applications 1.0 r7597       New feature: sorting tables. The actual sort algorithm isn't done yet, but this should be a good start for first draft reviewers.]] ([TIME[2012-12-27 08:58:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=7596&to=7597>
- [20] [CITE@en[Web Applications 1.0 r7484     The parser should have mutation observers.]] ([TIME[2012-10-24 07:24:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=7483&to=7484>
-[24] [CITE[IRC logs: freenode / #whatwg / 20130528]]
( ([TIME[2013-05-29 23:52:26 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20130528#l-1044>
-[25] [CITE@en[Bug 22185 – Microtask checkpoint wording is wrong -- and needs abstracting]]
( ([TIME[2013-06-09 01:40:24 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=22185>
-[26] [CITE@en[Web Applications 1.0 r7950     Bring the 'microtask checkpoint' invocation at the end of scripts more into line with implementations, and unrelated editorial fixes.]]
( ([TIME[2013-06-11 05:52:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7949&to=7950>
-[27] [CITE@en[Bug 22296 – Microtask and promises]]
( ([TIME[2013-09-13 07:31:35 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=22296>
-[29] [CITE[IRC logs: freenode / #whatwg / 20131107]]
( ([TIME[2013-11-09 12:27:06 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20131107#l-600>
-[40] [CITE@en[Web Applications 1.0 r8265 Provide integration hook for Custom Elements spec.]] ([TIME[2013-11-12 07:10:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=8264&to=8265>
]REFS]

[39] [CODE(URI)@en[[[blob:]]]] についても[[マイクロタスクチェックポイント]]での処理が検討されましたが、
[[global script clean-up jobs list]] という新しい仕組みになりました。

[REFS[
- [23] [CITE@en[Bug 19554 – Needed: An Algorithmic "Hook" For Culling URL.objectURLs with autoRevoke=true]]
( ([TIME[2013-05-30 08:45:57 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=19554>
]REFS]

[41] ここまで仕様書上[[マイクロタスク]]と呼ばれるものはなく、
[[マイクロタスクチェックポイント]]の一連の処理として定義されていました (>>12)。

[52] しかし >>48 によって[[タスク]]の一種として[[マイクロタスク]]が定義されるようになりました。
[[マイクロタスクキュー]]が導入され、[[マイクロタスク]]が後に通常の[[タスクキュー]]によって処理され得る単位となったのもこの時です。
それに加えて >>60 により、[[複合マイクロタスク]]が導入され、
[[マイクロタスク]]の一部分が[[複合マイクロタスク部分タスク]]として実行されるケースが生じました。

[REFS[
- [43] [CITE[IRC logs: freenode / #whatwg / 20140219]]
( ([TIME[2014-02-20 21:02:47 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20140219#l-367>
- [44] [CITE[IRC logs: freenode / #whatwg / 20140220]]
( ([TIME[2014-02-22 00:03:19 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20140220>
- [45] [CITE@en[Web Applications 1.0 r8507     Prevent microtasks from running reentrantly via the parser.]]
( ([TIME[2014-02-22 08:02:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8506&to=8507>
- [46] [CITE[IRC logs: freenode / #whatwg / 20140303]]
( ([TIME[2014-03-04 20:47:42 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20140303#l-550>
- [47] [CITE[IRC logs: freenode / #whatwg / 20140331]]
( ([TIME[2014-04-02 13:54:03 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20140331#l-653>
- [48] [CITE@en[Web Applications 1.0 r8463     First attempt at speccing the generic microtask queue idea.]]
( ([TIME[2014-02-05 10:00:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8462&to=8463>
- [60] [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>
- [74] [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>
- [81] [CITE@en[Web Applications 1.0 r8577 Fix prose around the <textarea> value / maxlength issues to be slightly less confusing and ambiguous. Clean up some text around MutationObservers.]] ([TIME[2014-04-24 00:38:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=8576&to=8577>
- [84] [CITE@en[Web Applications 1.0 r8617 Move table sorting to microtasks.]] ([TIME[2014-05-08 07:52:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=8616&to=8617>
- [85] [CITE@en[Web Applications 1.0 r8633 Remove the obsolete integration for custom elements from the HTML spec.]] ([TIME[2014-05-15 05:19:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=8632&to=8633>
- [86] [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>
]REFS]

[75] >>74 で[[マイクロタスク]]はメインの[[イベントループ]]だけでなく、[[ワーカー]]でも実行可能となりました。

[REFS[
- [4] [CITE@en[Make update the image data run when the document becomes active. · ee68507 · ResponsiveImagesCG/picture-element]] ([TIME[2014-10-23 10:42:01 +09:00]] 版) <https://github.com/ResponsiveImagesCG/picture-element/commit/ee685075cd65f02022d74b7932073fda4102d15f>
- [6] [CITE@en[Fix normative requirements for the timeout attribute (including for sync... · 2677cc2 · whatwg/xhr]] ([TIME[2014-10-23 10:46:18 +09:00]] 版) <https://github.com/whatwg/xhr/commit/2677cc2e0fe79d290437c3ea9ff370a5d795294b>
]REFS]

[5] >>4 で[[安定状態]]を提供するもの以外でも[[アルゴリズム]]の途中からの継続に[[マイクロタスク]]が使われるようになっています。

[10] >>6 で [[XHR]] の [CODE(DOMa)@en[[[timeout]]]] も[[マイクロタスク]]として再定義されました。

[87] [CITE@en[Re: Indexed DB Transactions vs. Microtasks]]
( ([[Jonas Sicking]] 著, [TIME[2014-06-07 09:51:31 +09:00]] 版))
<http://lists.w3.org/Archives/Public/public-webapps/2014AprJun/0861.html>

[108] [CITE[The "initialization" steps for Web browsers]]
( ([TIME[2014-06-11 01:04:31 +09:00]] 版))
<https://mail.mozilla.org/pipermail/es-discuss/2014-June/037554.html>


[88] [CITE@en[Bug 25714 - ''''''[''''''Custom'''''']'''''': Move microtask processing to compound microtask · ffeeba6 · w3c/webcomponents]]
( ([TIME[2014-11-23 18:29:07 +09:00]] 版))
<https://github.com/w3c/webcomponents/commit/ffeeba6b1a3446ebc183a0ae2b7ee8445e44635d>




[22] [CITE[IRC logs: freenode / #whatwg / 20150120]]
([TIME[2015-01-22 11:39:35 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20150120#l-658>

[FIG(quote)[
[FIGCAPTION[
[28] [CITE[IRC logs: freenode / #whatwg / 20150811]]
([TIME[2015-08-12 11:03:34 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20150811>
]FIGCAPTION]

> 
> # '''['''11:34''']''' <JakeA> Chrome's implementation performs a microtask checkpoint per listener, Firefox doesn't

]FIG]


[FIG(quote)[
[FIGCAPTION[
[30] [CITE[Tasks, microtasks, queues and schedules - JakeArchibald.com]]
([TIME[2015-09-15 11:02:26 +09:00]] 版)
<https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/>
]FIGCAPTION]

> Firefox and Safari are correctly exhausting the microtask queue between click listeners, as shown by the mutation callbacks, but promises appear to be queued differently. This is sort-of excusable given that the link between jobs & microtasks is vague, but I'd still expect them to execute between listener callbacks. Firefox ticket. Safari ticket.
> With Edge we've already seen it queue promises incorrectly, but it also fails to exhaust the microtask queue between click listeners, instead it does so after calling all listeners, which accounts for the single mutate log after both click logs. Bug ticket.

]FIG]


[31] [CITE@en[Add promise rejection tracking events · whatwg/html@61ccc05]]
([TIME[2015-12-03 22:59:10 +09:00]] 版)
<https://github.com/whatwg/html/commit/61ccc05b7437ba947390928f9e526da49550fed0>

[57] [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>

[111] [CITE@en[Add <script type="module"> and module resolution/fetching/evaluation · whatwg/html@cd1a9fb]] ([TIME[2016-01-29 22:30:42 +09:00]] 版) <https://github.com/whatwg/html/commit/cd1a9fb1e83f7d0bc30be8b34ecdaf444a0b19a4>

[112] [CITE@en[Fix #345: Remove table sorting model · whatwg/html@59b7e24]]
([TIME[2016-01-29 23:18:19 +09:00]] 版)
<https://github.com/whatwg/html/commit/59b7e2466c2b7c5c408a4963b05b13fd808aa07a>

[115] [CITE@en[Sync with recent changes to the JS spec's job queue · whatwg/html@5af258f]]
([TIME[2016-03-24 21:45:53 +09:00]] 版)
<https://github.com/whatwg/html/commit/5af258f33e3e2f55eb30e611cb7aee625a8bd16a>

[118] [CITE@en[Clarify settings object, realm, and global relationships · whatwg/html@0866f1b]]
([TIME[2016-03-28 00:24:44 +09:00]] 版)
<https://github.com/whatwg/html/commit/0866f1b3f4b4ea5a99a30909e9bbe557dea0b460>

[119] [CITE@en[1193394 – Microtasks and promises]]
([TIME[2016-04-08 09:42:02 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=1193394>

[122] [CITE@en[Unclear if microtasks are running as often as they should · Issue #1294 · whatwg/html]]
( ([TIME[2016-05-24 22:11:50 +09:00]]))
<https://github.com/whatwg/html/issues/1294>

[123] [CITE@en[Add a new section detailing the various potential realms]]
([[domenic]]著, [TIME[2016-05-03 06:09:12 +09:00]])
<https://github.com/whatwg/html/commit/6399af334edd6000bd394685923df5f0519194ab>

[124] [CITE@en[Fix incumbent settings object definition and add examples]]
([[domenic]]著, [TIME[2016-06-15 17:49:40 +09:00]])
<https://github.com/whatwg/html/commit/f97c3e478654114bd4c9cc8587418a5519f9eb09>

[150] [CITE@en[20821 – What happens if you spin the event loop from inside "perform a microtask checkpoint"? (showModalDialog, document.close()...)]], [TIME[2019-04-02T04:48:11.000Z]], [TIME[2021-03-26T11:51:44.857Z]] <https://www.w3.org/Bugs/Public/show_bug.cgi?id=20821>

[95] [CITE@en[Re: Compound microtasks vs solitary microtasks]]
([[Ian Hickson]]著, [TIME[2016-10-04 02:56:42 +09:00]])
<https://lists.w3.org/Archives/Public/www-archive/2016Oct/0001.html>

[104] [CITE@en[Improve the wording around handling timeouts]]
([[annevk]]著, [TIME[2017-03-13 20:06:32 +09:00]])
<https://github.com/whatwg/xhr/commit/4d40787e39eb872de30e40110d1201f90c4beecb>

[105] [CITE@en[Editorial: modernize perform a microtask checkpoint]]
([[annevk]]著, [TIME[2017-04-30 17:17:12 +09:00]])
<https://github.com/whatwg/html/commit/eb31d93fdf569da9b8529a79c3060868a15fa328>

[106] [CITE@en[28920 – If the stack of script settings objects is empty, perform a microtask checkpoint right before executing async or defer script]]
([TIME[2017-07-22 12:30:14 +09:00]])
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=28920>

[107] [CITE@en[1193394 - Microtasks and promises]]
([TIME[2017-07-28 16:53:04 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=1193394>

[116] [CITE@en[Ensure there is an active script while running JS jobs]]
([[domenic]]著, [TIME[2017-11-18 01:48:43 +09:00]])
<https://github.com/whatwg/html/commit/cc3fcc87a7c6f8783efa327b449d7381a0e0303d>

[117] [CITE@en[Ensure there is an active script while running JS jobs]]
([[domenic]]著, [TIME[2017-11-18 01:48:43 +09:00]])
<https://github.com/whatwg/html/commit/cc3fcc87a7c6f8783efa327b449d7381a0e0303d>

[126] [CITE@en[Ensure there is an active script while running JS jobs by domenic · Pull Request #3163 · whatwg/html]]
([TIME[2017-11-18 16:38:17 +09:00]])
<https://github.com/whatwg/html/pull/3163>

[127] [CITE@en[Ensure there is an active script while running JS jobs by domenic · Pull Request #3163 · whatwg/html]]
([TIME[2017-11-18 16:38:22 +09:00]])
<https://github.com/whatwg/html/pull/3163>

[129] [CITE@en[Ensure there is an active script while running JS jobs by domenic · Pull Request #3163 · whatwg/html]]
([TIME[2017-11-18 16:44:10 +09:00]])
<https://github.com/whatwg/html/pull/3163>

[130] [CITE@en[Ensure there is an active script while running JS jobs by domenic · Pull Request #3163 · whatwg/html]]
([TIME[2017-11-18 16:44:15 +09:00]])
<https://github.com/whatwg/html/pull/3163>

[131] [CITE@en[Proposal: self.queueMicrotask(f) · Issue #512 · whatwg/html]]
([TIME[2018-08-07 12:31:38 +09:00]])
<https://github.com/whatwg/html/issues/512>

[132] [CITE@en[Editorial: rigorize tasks and task queuing]]
([[domenic]], [TIME[2019-05-01 01:36:30 +09:00]], [TIME[2021-03-25T09:36:26.000Z]])
<https://github.com/whatwg/html/commit/f4e29076caad1779336adea40ac2125d6d1c9496>

[142] [CITE@en[Editorial: rigorize tasks and task queuing by domenic · Pull Request #4465 · whatwg/html]]
([TIME[2021-03-25T11:54:14.000Z]])
<https://github.com/whatwg/html/pull/4465>

[143] [CITE@en[Remove compound microtasks]]
([[annevk]], [TIME[2019-03-30 00:11:20 +09:00]], [TIME[2021-03-25T11:58:53.000Z]])
<https://github.com/whatwg/dom/commit/7a8406bcb0332c1370f305c77565b7a3c069541d>

[144] [CITE@en[Dispatching slotchange within a compound microtask · Issue #734 · whatwg/dom]]
([TIME[2021-03-25T12:02:38.000Z]])
<https://github.com/whatwg/dom/issues/734>

[145] [CITE@en[Remove compound microtasks by annevk · Pull Request #741 · whatwg/dom]]
([TIME[2021-03-25T12:04:36.000Z]])
<https://github.com/whatwg/dom/pull/741>

[146] [CITE@en[Remove compound microtasks]]
([[annevk]], [TIME[2019-03-30 00:53:50 +09:00]], [TIME[2021-03-26T11:37:26.000Z]])
<https://github.com/whatwg/html/commit/77240a20c840ac60f0b1102ec4ac8be7df717172>

[149] [CITE@en[Remove compound microtasks by annevk · Pull Request #4437 · whatwg/html]]
([TIME[2021-03-26T11:43:00.000Z]])
<https://github.com/whatwg/html/pull/4437>

[151] [CITE@en[Add "queue an element task" algorithm]]
([[dtapuska]], [TIME[2019-12-06 05:15:14 +09:00]], [TIME[2022-01-27T09:42:57.000Z]])
<https://github.com/whatwg/html/commit/a9e1d2ad5a7569010c685b271965ae4a3a34a64b>

[140] [CITE@en[Add the ability to queue an element task. by dtapuska · Pull Request #5072 · whatwg/html]]
([TIME[2022-01-27T09:53:54.000Z]])
<https://github.com/whatwg/html/pull/5072>