[61] [CODE(DOMi)@en[Window]] [[オブジェクト]]の
[CODE(DOMm)@en[requestIdleCallback]] [[メソッド]]は、
[[アイドル状態]]になったら実行する[[コールバック関数]]を登録するものです。
[CODE(DOMm)@en[cancelIdleCallback]] [[メソッド]]は、その登録を取り消すものです。

* 仕様書

[REFS[
- [21] [CITE@en[Cooperative Scheduling of Background Tasks]] ([TIME[2016-07-20 22:12:51 +09:00]]) <https://w3c.github.io/requestidlecallback/>
]REFS]

* [CODE(DOMi)@en[Window]] インターフェイス [CODE(DOMm)@en[requestIdleCallback]] メソッド

[45] [CODE(DOMi)@en[Window]] [[オブジェクト]]の [DFN[[CODE(DOMm)@en[requestIdleCallback]]]]
[[メソッド]]は、[[アイドル状態]]で実行するべき[[コールバック関数]]を登録するものです。

[FIG(list members)[
: [51] 第1引数 :
:[[コールバック関数]] ([CODE(DOMi)@en[IdleRequestCallback]]) 
です。任意の [[JavaScript関数]]を指定できます。
必須です。
: [52] 第2引数:
省略可能な[[辞書]] [DFN[[CODE[IdleRequestOptions]]]] [SRC[>>21]] です。
次の[[辞書メンバー]]を指定できます。
[FIG(list members)[
:[53] [CODE(DOMa)@en[timeout][IdleRequestOptions]]:
タイムアウト処理の実行前に最低限待つべき時間を[[ミリ秒]]単位で指定できます。
[CODE(IDL)@en[unsigned long]] です [SRC[>>21]]。
[[辞書メンバー]]としては必須ですが、[[辞書]]自体を省略した時の既定値はタイムアウト無しとなります。
なお、この指定は最低限の待ち時間であり、[[Webブラウザー]]は状況に応じて更に長く待つことも認められています。
]FIG]
]FIG]

[62] 指定された[[コールバック関数]]は、[[アイドル状態]]になると、実行されます。
ただし、 [CODE[timeout][requestIdleCallback]] が指定された場合には、
指定時間内に実行できなかった場合にタイムアウトとして実行されます。
通常の実行かタイムアウトの実行かは、[[コールバック関数]]の[[引数]]として与えられる
[CODE(DOMi)@en[IdleDeadline]] [[オブジェクト]]の
[CODE(DOMm)@en[didTimeout]] [[IDL属性]]で判断できます。

[54] この[[メソッド]]は、[[ハンドル]]を返します。これは今回の[[コールバック関数]]の登録を表すもので、
[CODE(DOMm)@en[cancelIdleCallback]] の実行時に指定するものです。 [CODE(IDL)@en[unsigned long]]
です [SRC[>>21]]。

-*-*-

[30] [CODE(DOMi)@en[Window]] [[インターフェイス]]の
[CODE(DOMm)@en[requestIdleCallback]]
[[メソッド]]は、次のようにしなければ[MUST[なりません]] [SRC[>>21]]。
[FIG(steps)[
= [31] [VAR[コールバック]]を、必須の第1引数を [CODE(IDL)@en[IdleRequestCallback]]
と解釈した結果に設定します。
= [32] [VAR[オプション群]]を、省略可能な第2引数を [CODE(IDL)@en[IdleRequestOptions]]
と解釈した結果に設定します。
= [33] [VAR[窓]]を、[[文脈オブジェクト]]に設定します。
= [34] [VAR[窓]]の[F[アイドルコールバック識別子]]を、 [N[1]] [[インクリメント]]します。
= [35] [VAR[ハンドル]]を、[VAR[窓]]の[F[アイドルコールバック識別子]]に設定します。
= [36] ([VAR[ハンドル]], [VAR[コールバック]]) を、
[VAR[窓]]の[F[アイドル要求コールバック群のリスト]]に [[push]] します。
= [37] [VAR[ハンドル]]を返します。
]FIG]

[38] 引き続き、[[並列に]]、次のようにしなければ[MUST[なりません]] [SRC[>>21]]。
[FIG(steps)[
= [39] [VAR[オプション群]]が [CODE[null]] ではなく、
[VAR[オプション群]]の [F[[CODE(DOMa)@en[timeout][requestIdleCallback]]]]
が[[正]]なら、
== [40] [VAR[オプション群]]の [F[[CODE(DOMa)@en[timeout][requestIdleCallback]]]]
の[[ミリ秒]]分、待ちます。
== 
@@ [41] このアルゴリズムの開始時刻 + [VAR[オプション群]]の [F[[CODE(DOMa)@en[timeout][requestIdleCallback]]]] の[[ミリ秒]]、よりも小さなこのアルゴリズムの他の実行が未完了なら、
それを待ちます。
== [42] [[利用者エージェント]]定義の時間、待ちます。
これは[[電力消費]]の最適化の余地を[[利用者エージェント]]に与えるものです。
== [43] [[タスクをキューに追加]]します。
[FIG(list members)[
: [VAR[処理]] : 
[FIG(steps)[
= [44] [VAR[ハンドル]]と[VAR[窓]]について、
[[アイドルコールバックタイムアウト呼び出しアルゴリズム]]を実行します。
]FIG]
: [VAR[タスク源]] : [[アイドルタスクタスク源]]
]FIG]

]FIG]

* [CODE(DOMi)@en[Window]] インターフェイス [CODE(DOMm)@en[cancelIdleCallback]] メソッド

[55] [CODE(DOMi)@en[Window]] [[オブジェクト]]の [DFN[[CODE(DOMm)@en[cancelIdleCallback]]]]
[[メソッド]]は、登録済みの[[コールバック関数]]の実行を取り消すものです。

[FIG(list members)[
: [56] 第1引数 :
登録時に [CODE(DOMm)@en[requestIdleCallback]] [[メソッド]]が返した[[ハンドル]]を指定します。
]FIG]

[57] 該当するものが既に実行された場合や、該当するものがない場合には、何も起こりません。

[58] [[ハンドル]]は、 [CODE(DOMm)@en[setTimeout]] や [CODE(DOMm)@en[setInterval]]
とは別に管理されています。

[59] 一度利用された[[ハンドル]]が (同じ [CODE(DOMi)@en[Window]] で)
再利用されることはありません。 未使用の[[ハンドル]]が [CODE(DOMm)@en[cancelIdleCallback]]
されても、その後 [CODE(DOMm)@en[requestIdleCallback]] で利用されることはあり得ます。
その場合でも改めて [CODE(DOMm)@en[cancelIdleCallback]] しない限り普通に実行されます。

-*-*-

[46] [CODE(DOMi)@en[Window]] [[インターフェイス]]の
[CODE(DOMm)@en[cancelIdleCallback]]
[[メソッド]]は、次のようにしなければ[MUST[なりません]] [SRC[>>21]]。

[FIG(steps)[
= [47] [VAR[ハンドル]]を、必須の第1引数を [CODE(IDL)@en[unsigned long]] として解釈した結果に設定します。
= [48] [VAR[窓]]を、[[文脈オブジェクト]]に設定します。
= [49] [VAR[窓]]の[F[アイドル要求コールバック群のリスト]]から、
[F[ハンドル]]が[VAR[ハンドル]]の項目を(あれば)削除します。
= [50] [VAR[窓]]の[F[走らせられるアイドルコールバック群のリスト]]から、
[F[ハンドル]]が[VAR[ハンドル]]の項目を(あれば)削除します。
]FIG]

* 処理

[27] [CODE(DOMi)@en[Window]] は、
[DFN[[F[[RUBYB[[[アイドル要求コールバック群のリスト]]]@en[list of idle request callbacks]]]]]]を持ちます。
初期状態は空です。 [SRC[>>21]]

[28] [CODE(DOMi)@en[Window]] は、
[DFN[[F[[RUBYB[[[走らせられるアイドルコールバック群のリスト]]]@en[list of runnable idle callbacks]]]]]]を持ちます。
初期状態は空です。 [SRC[>>21]]

[60] この両リストは、 [CODE(DOMm)@en[requestIdleCallback]] と [CODE(DOMm)@en[cancelIdleCallback]]
の他、[[アイドル期間]]の開始や、
[CODE[IdleRequestCallback]] を実行する各[[アルゴリズム]]から参照・変更されます。

[29] [CODE(DOMi)@en[Window]] は、
[DFN[[F[[RUBYB[[[アイドルコールバック識別子]]]@en[idle callback identifier]]]]]]を持ちます。
初期状態は [N[0]] です。 [SRC[>>21]]
[CODE(DOMm)@en[requestIdleCallback]] から参照・変更されます。

* 歴史

[1] [CITE@en[Re: setImmediate usage on the web]]
([[Ross McIlroy]] 著, [TIME[2015-06-25 00:50:41 +09:00]] 版)
<https://lists.w3.org/Archives/Public/public-web-perf/2015Jun/0113.html>

[2] [CITE[Cooperative Scheduling of Background Tasks - Google ドキュメント]]
([TIME[2015-06-25 18:42:08 +09:00]] 版)
<https://docs.google.com/document/d/1ZgYOBi_39-N6AbjL99qesiDagaSTbpN0R6CrSVK8NE4/edit?pli=1#>

[3] [CITE@en[''''''[''''''RequestIdleCallback'''''']'''''' Editor's Draft of requestIdleCallback spec]]
([[Ross McIlroy]] 著, [TIME[2015-07-22 22:28:07 +09:00]] 版)
<https://lists.w3.org/Archives/Public/public-web-perf/2015Jul/0014.html>

[4] [CITE@en[Cooperative Scheduling of Background Tasks]]
([TIME[2015-07-23 00:56:37 +09:00]] 版)
<https://w3c.github.io/requestidlecallback/>

[5] [CITE@en[Cooperative Scheduling of Background Tasks]]
( ([TIME[2015-09-17 12:28:31 +09:00]] 版))
<http://www.w3.org/TR/2015/WD-requestidlecallback-20150917/>

[6] [CITE@en[Cooperative Scheduling of Background Tasks]]
([TIME[2015-09-19 04:12:21 +09:00]] 版)
<http://www.w3.org/TR/2015/WD-requestidlecallback-20150918/>

[7] [CITE@en[Clamp timeRemaining() to 5 microsecond resolution. · w3c/requestidlecallback@241decc]]
([TIME[2015-09-25 19:30:30 +09:00]] 版)
<https://github.com/w3c/requestidlecallback/commit/241decc5b2e52b7b6b83a1de42203b4576a47d64>

[8] [CITE@en[Cooperative Scheduling of Background Tasks]]
([TIME[2015-09-25 08:59:16 +09:00]] 版)
<http://www.w3.org/TR/2015/WD-requestidlecallback-20150924/>

[9] [CITE@en[Cooperative Scheduling of Background Tasks]]
([TIME[2015-09-25 09:01:19 +09:00]] 版)
<http://www.w3.org/TR/2015/WD-requestidlecallback-20150925/>

[10] [CITE@en[Cooperative Scheduling of Background Tasks]]
([TIME[2015-09-29 22:33:11 +09:00]] 版)
<http://www.w3.org/TR/2015/WD-requestidlecallback-20150929/>

[11] [CITE@en[Cooperative Scheduling of Background Tasks]]
([TIME[2015-11-26 08:23:40 +09:00]] 版)
<http://www.w3.org/TR/2015/WD-requestidlecallback-20151125/>

[12] [CITE@en[Cooperative Scheduling of Background Tasks]]
([TIME[2015-12-10 04:13:51 +09:00]] 版)
<http://www.w3.org/TR/2015/WD-requestidlecallback-20151209/>

[13] [CITE@en[Cooperative Scheduling of Background Tasks]]
([TIME[2016-02-05 06:28:03 +09:00]] 版)
<https://www.w3.org/TR/2016/WD-requestidlecallback-20160204/>

[14] [CITE@en[Cooperative Scheduling of Background Tasks]]
([TIME[2016-02-26 04:52:28 +09:00]] 版)
<https://www.w3.org/TR/2016/WD-requestidlecallback-20160225/>

[15] [CITE@en[associate rIC callbacks with Window · w3c/requestidlecallback@311cccb]]
([TIME[2016-05-01 13:49:19 +09:00]] 版)
<https://github.com/w3c/requestidlecallback/commit/311cccb16237c58b4bdb1ed665fb36702ecafd5a>

[16] [CITE@en[Cooperative Scheduling of Background Tasks]]
([TIME[2016-04-29 02:04:45 +09:00]] 版)
<https://www.w3.org/TR/2016/WD-requestidlecallback-20160428/>

[17] [CITE@en[Allow arbitrary inter-document callback ordering · w3c/requestidlecallback@cac526a]]
([TIME[2016-05-01 13:50:39 +09:00]] 版)
<https://github.com/w3c/requestidlecallback/commit/cac526ae7057d6958c3be82b62026a3dbccca04b>

[18] [CITE@en[privacy section]]
( ([[igrigorik]]著, [TIME[2016-05-05 07:34:22 +09:00]]))
<https://github.com/w3c/requestidlecallback/commit/468fa6df94b00a54814dc4cf414b556fa41295d3>

[19] [CITE@en[Cooperative Scheduling of Background Tasks]]
( ([TIME[2016-05-18 06:55:55 +09:00]]))
<https://www.w3.org/TR/2016/WD-requestidlecallback-20160517/>

[20] [CITE[Using requestIdleCallback | Web Updates - Google Developers]]
([TIME[2016-07-19 06:25:53 +09:00]])
<https://developers.google.com/web/updates/2015/08/using-requestidlecallback>

[22] [CITE@en[w3c/requestidlecallback: Cooperative Scheduling of Background Tasks]]
([TIME[2016-07-27 00:05:18 +09:00]])
<https://github.com/w3c/requestidlecallback/>

[23] [CITE@en[consider work beyond other event loops]]
([[igrigorik]]著, [TIME[2016-11-29 07:38:18 +09:00]])
<https://github.com/w3c/requestidlecallback/commit/3a69ac324fdf9c4cc0fd5b7e249d2df680ee0a79>

[24] [CITE@en[Incorporate feedback (#50)]]
([[igrigorik]]著, [TIME[2016-12-15 02:40:45 +09:00]])
<https://github.com/w3c/requestidlecallback/commit/9f684e30b2c536db9038430a9e9d286da5a28295>

[25] [CITE@en-US[requestIdleCallback - Web APIs | MDN]]
([TIME[2016-12-15 22:24:40 +09:00]])
<https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback>

[26] [CITE@en[1198381 – Implement requestIdleCallback]]
([TIME[2016-12-16 09:41:29 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=1198381>

[71] [CITE@en[Cooperative Scheduling of Background Tasks]]
([TIME[2016-12-21 17:02:20 +09:00]])
<https://www.w3.org/TR/2016/WD-requestidlecallback-20161221/>

[63] [CITE@en[Using requestIdleCallback  |  Web  |  Google Developers]]
([TIME[2016-12-22 00:35:38 +09:00]])
<https://developers.google.com/web/updates/2015/08/using-requestidlecallback>

[64] [CITE@en[Cooperative Scheduling of Background Tasks]]
([TIME[2017-01-04 04:56:17 +09:00]])
<https://www.w3.org/TR/2017/WD-requestidlecallback-20170103/>

[65] [CITE@en[Cooperative Scheduling of Background Tasks: implementation report]]
([TIME[2017-01-09 21:45:30 +09:00]])
<https://w3c.github.io/test-results/requestidlecallback/>

[66] [CITE@en[Cooperative Scheduling of Background Tasks]]
([TIME[2017-01-27 01:59:43 +09:00]])
<https://www.w3.org/TR/2017/CR-requestidlecallback-20170131/>

[67] [CITE@en[Call for Exclusions: Cooperative Scheduling of Background Tasks]]
([[Coralie Mercier]]著, [TIME[2017-02-02 20:08:18 +09:00]])
<https://lists.w3.org/Archives/Public/public-web-perf/2017Feb/0000.html>

[68] [CITE@en[Align with w3c/hr-time#47]]
([[plehegar]]著, [TIME[2017-05-05 03:44:39 +09:00]])
<https://github.com/w3c/requestidlecallback/commit/eff3150172f2c4c1054aa9cb838559988c737fe9>

[69] [CITE@en[Address comments]]
([[rmcilroy]]著, [TIME[2017-07-27 19:43:23 +09:00]])
<https://github.com/w3c/requestidlecallback/commit/994f6a8e002035ee78c5c8cdab0f595b885e4837>

[70] [CITE@en[Address feedback on timeRemaining method. by rmcilroy · Pull Request #58 · w3c/requestidlecallback]]
([TIME[2017-08-19 21:29:39 +09:00]])
<https://github.com/w3c/requestidlecallback/pull/58>

[72] [CITE@en[Cooperative Scheduling of Background Tasks]]
([TIME[2017-10-09 18:31:29 +09:00]])
<https://www.w3.org/TR/2017/PR-requestidlecallback-20171010/>


[73] [CITE@en[Integrate with requestIdleCallback]]
([[rmcilroy]]著, [TIME[2018-10-25 23:57:45 +09:00]])
<https://github.com/whatwg/html/commit/01787ee712a7803e64e0da6ac9644a5e6b8d2cca>

[74] [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>