[35] [DFN[[RUBYB[[[マイクロタスク]]]@en[microtask]]]]は、 [[Webブラウザー]]における処理の単位で、 [[変異観測器]]や[[表]]の[[整列]]などの処理で用いられています。 * 仕様書 [REFS[ - [49] '''[CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) ''' - [7] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-03-28 21:58:58 +09:00]] 版) ]REFS] * マイクロタスク [50] [[マイクロタスク]]は、最初に[[タスクキュー]]ではなく[[マイクロタスクキュー]]に入れられた[[タスク]]です [SRC[>>49]]。 [51] [[マイクロタスク]]が通常の[[タスク]]に比べて「マイクロ」であるのは、 [[タスク]]が[[イベントループ]]の全体によって順次処理されていくのに対し、 [[マイクロタスク]]のほとんどがその[[イベントループ]]の一度の繰り返しの内で順次実行されることを指しています。 [[マイクロタスク]]自体も[[タスク]]の一種なのであって、 [[マイクロタスク]]によって[[タスク]]が構成されるような階層構造には''ありません''。 [42] [[マイクロタスク]]には、次のものがあります。 [FIG[ - [[カスタム要素]]の[[コールバック]]の呼び出し - [CODE(HTMLa)@en[[[sortable]]]] な[[表]]の[[整列]] - [[変異観測器]]の[[コールバック]]の呼び出し - [[Promise]] の[[コールバック]]の呼び出し ]FIG] * マイクロタスクキュー [53] [[イベントループ]]は[DFN[[RUBYB[[[マイクロタスクキュー]]]@en[microtask queue]]]]を ([[タスクキュー]]とは別に) 持ちます。[DFN[[RUBYB[[[マイクロタスクをキューに入れる]]]@en[queue a microtask]]]]とは、 [[マイクロタスク]]を自[[イベントループ]]の[[マイクロタスクキュー]]の末尾に追加することをいいます。 [SRC[>>49]] * マイクロタスクタスク源 [54] [[マイクロタスク]]の[[タスク源]]は[DFN[[RUBYB[[[マイクロタスクタスク源]]]@en[microtask task source]]]]となります。 [SRC[>>49]] [[マイクロタスクキュー]]には[[タスク源]]は関係してこないので、ほとんどの[[マイクロタスク]]は[[タスク源]]と無関係ですが、 [[マイクロタスク]]が[[タスクキュー]]に移されると[[タスク源]]が関係してきます。 * マイクロタスクチェックポイント [12] [DFN[[RUBYB[[[マイクロタスクチェックポイントを行う]]]@en[perform a microtask checkpoint]]]]際には次のようにし[['''なければなりません''']] [SRC[>>7]]。 [FIG[ = [8] [[マイクロタスクチェックポイントを行っている]]フラグが[[偽]]なら、 == [9] [[マイクロタスクチェックポイントを行っている]]フラグを[[真]]にします。 == [38] [RUBYB[[[カスタム要素チェックポイントを行う]]]@en[perform a custom elements checkpoint]][[アルゴリズム]]を実行します。 == [22] [RUBYB[[[未決の整列について表を整列]]]@en[sort the tables with pending sorts]]します。 == [10] [[スクリプトの閲覧文脈]]が所属している[[関連する類似起源閲覧文脈の単位]]の[[[CODE(DOMi)@en[MutationObserver]]オブジェクトを呼び出し]]します。 ==- [11] これによって[[コールバック]]の[[スクリプト]]が[[発火]]されたりするわけですが、 その際 [[jump to a code entry-point]] [[アルゴリズム]]が呼ばれ、その中で再度この[[算法]]が呼ばれることになるので、 [[マイクロタスクチェックポイントを行っている]]でチェックして再実行しないようにしています。 == [13] [[マイクロタスクチェックポイントを行っている]]フラグを[[偽]]にします。 ]FIG] [34] [DFN[[RUBYB[[[マイクロタスクチェックポイントを行っている]]]@en[performing a microtask checkpoint]]]]フラグは[RUBYB[[[関連同様起源閲覧文脈の単位]]]@en[unit of related similar-origin browsing contexts]]に付随するフラグで、初期値は[[偽]]です。 [SRC[>>7]] [15] [[マイクロタスクチェックポイントを行う]]のは次の場面です。 [FIG[ - [16] [[イベントループ]]の1ステップとして - [17] [[jump to a code entry-point]] ([[スクリプト]]実行) の1ステップとして - [18] [[HTML]] [CODE(HTMLe)@en[[[script]]]] [[要素]]の[[終了タグ]]の処理の1ステップとして ;; [19] [[SVG]] [CODE(XMLe)@en[[[script]]]] [[要素]]でも同様に呼び出されるものと推察されますが、 現時点で [[SVG]] [CODE(XMLe)@en[[[script]]]] [[要素]]の処理モデルを詳細に規定した仕様がありません。 ]FIG] * 歴史 [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]] 版) - [1] [CITE[IRC logs: freenode / #whatwg / 20120228]] ( ([TIME[2012-03-08 00:01:17 +09:00]] 版)) - [2] [CITE@en[Re: ''''''[''''''dom'''''']'''''' mutation observers and HTML]] ( ([[Olli Pettay]] 著, [TIME[2012-02-18 00:51:23 +09:00]] 版)) - [3] [CITE[IRC logs: freenode / #whatwg / 20120320]] ( ([TIME[2012-03-29 23:32:57 +09:00]] 版)) - [14] [CITE[Bug 17988 – The term microtask should be defined]] ( ([TIME[2012-07-21 17:51:05 +09:00]] 版)) - [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]] 版) - [20] [CITE@en[Web Applications 1.0 r7484 The parser should have mutation observers.]] ([TIME[2012-10-24 07:24:00 +09:00]] 版) -[24] [CITE[IRC logs: freenode / #whatwg / 20130528]] ( ([TIME[2013-05-29 23:52:26 +09:00]] 版)) -[25] [CITE@en[Bug 22185 – Microtask checkpoint wording is wrong -- and needs abstracting]] ( ([TIME[2013-06-09 01:40:24 +09:00]] 版)) -[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]] 版)) -[27] [CITE@en[Bug 22296 – Microtask and promises]] ( ([TIME[2013-09-13 07:31:35 +09:00]] 版)) -[29] [CITE[IRC logs: freenode / #whatwg / 20131107]] ( ([TIME[2013-11-09 12:27:06 +09:00]] 版)) -[40] [CITE@en[Web Applications 1.0 r8265 Provide integration hook for Custom Elements spec.]] ([TIME[2013-11-12 07:10:00 +09:00]] 版) ]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]] 版)) ]REFS] [41] ここまで仕様書上[[マイクロタスク]]と呼ばれるものはなく、 [[マイクロタスクチェックポイント]]の一連の処理として定義されていました (>>12)。 [52] しかし >>48 によって[[タスク]]の一種として[[マイクロタスク]]が定義されるようになりました。 [[マイクロタスクキュー]]が導入され、[[マイクロタスク]]が後に通常の[[タスクキュー]]によって処理され得る単位となったのもこの時です。 [REFS[ - [43] [CITE[IRC logs: freenode / #whatwg / 20140219]] ( ([TIME[2014-02-20 21:02:47 +09:00]] 版)) - [44] [CITE[IRC logs: freenode / #whatwg / 20140220]] ( ([TIME[2014-02-22 00:03:19 +09:00]] 版)) - [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]] 版)) - [46] [CITE[IRC logs: freenode / #whatwg / 20140303]] ( ([TIME[2014-03-04 20:47:42 +09:00]] 版)) - [47] [CITE[IRC logs: freenode / #whatwg / 20140331]] ( ([TIME[2014-04-02 13:54:03 +09:00]] 版)) - [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]] 版)) ]REFS]