* 仕様書

[REFS[
- [1] [CITE@en[Cooperative Scheduling of Background Tasks]] ([TIME[2016-12-21 17:01:17 +09:00]]) <https://w3c.github.io/requestidlecallback/#idl-def-idlerequestcallback>
- [4] [CITE@en[Cooperative Scheduling of Background Tasks]] ([TIME[2016-12-21 17:01:17 +09:00]]) <https://w3c.github.io/requestidlecallback/#dfn-invoke-idle-callbacks-algorithm>
- [63] [CITE@en[Cooperative Scheduling of Background Tasks]] ([TIME[2016-12-15 02:40:48 +09:00]]) <https://w3c.github.io/requestidlecallback/#dfn-invoke-idle-callback-timeout-algorithm>
]REFS]

* [CODE(IDL)@en[IdleRequestCallback]]

[60] [[コールバック関数]]は、 [[Web IDL]] では[[コールバック関数]]の[[データ型][データ型 (Web IDL)]]
[DFN[[CODE(DOMi)@en[IdleRequestCallback]]]] [SRC[>>1]]
と呼ばれています。

[61] [[コールバック関数]]は、引数として [CODE(DOMi)@en[IdleDeadline]] を1つ受け取ります
[SRC[>>1]]。

[62] [[コールバック関数]]の[[返し値]]は使われません [SRC[>>1]]。

** 実行期限

[21] [[コールバック関数]]は、短い時間で実行完了することが期待されています。

[22] [[引数]]の [CODE(DOMi)@en[IdleDeadline]] [[オブジェクト]]の
[CODE(DOMm)@en[timeRemaining]] [[メソッド]]により、
[[アイドル期間]]の残り時間が得られます。

[23] とはいっても、[[コールバック関数]]の実行自体は通常の方法で行われるものですから、
残り時間が [N[0]] になってもそれが理由で実行が中断されることはありません。

* 処理

[3] [VAR[イベントループ]]と[VAR[締切]]に関する[DFN[[RUBYB[アイドルコールバック群呼び出しアルゴリズム]@en[invoke idle callbacks algorithm]]]]は、
次のようにしなければ[MUST[なりません]] [SRC[>>4]]。

[FIG(steps)[
= [5] [VAR[文書群]]を、[VAR[イベントループ]]の[F[[[文書]]群]]の[VAR[文書]]のうち、
[VAR[文書]]の[F[完全に活性]]が[[真]]で、
[VAR[文書]]の[F[[CODE(DOMi)@en[Window]]]]の[F[走らせられるアイドルコールバック群のリスト]]が空でないものの[[リスト]]に設定します。
= [9] [VAR[文書群]]が空なら、
== [10] ここで停止します。
= [6] [VAR[今]]を、[[現在時刻]]に設定します。
= [7] [VAR[今]] < [VAR[締切]]なら、
== [8] [VAR[文書]]を、[VAR[文書群]]のいずれかの[[文書]]に設定します。
== [11] [VAR[項目]]を、[VAR[文書]]の[F[[CODE(DOMi)@en[Window]]]]の[F[走らせられるアイドルコールバック群のリスト]]を [[pop]] した結果に設定します。
== [12] [VAR[文書]]の[F[[CODE(DOMi)@en[Window]]]]の[F[走らせられるアイドルコールバック群のリスト]]が空なら、
=== [13] [VAR[文書]]を[VAR[文書群]]から削除します。
== [14] [VAR[アイドル締切]]を、新しい [CODE(DOMi)@en[IdleDeadline]] に設定します。
[FIG(list members)[
: [F[締切]] : [VAR[締切]]
: [F[[CODE(DOMa)@en[didTimeout]]]] : [[偽]]
]FIG]
== [15] [[コールバック関数の実行]]をします。
[FIG(list members)[
: [VAR[呼び出し可能]] : [VAR[項目]]の[F[コールバック]]
: [VAR[引数リスト]] : ([VAR[アイドル締切]])
: [VAR[this]] : 
@@
]FIG]
[[例外]]が[[投げ]]られたら、[[例外を報告]]します。
@@ [[仕様書]]では[[誤りを報告]]
== [16] [VAR[文書群]]が空でなければ、
=== [17] [[タスクをキューに追加]]する[SHOULD[べきです]]。
[FIG(list members)[
: [VAR[処理]] :
[FIG(steps)[
= [18] [VAR[イベントループ]]と[VAR[締切]]について、
[[アイドルコールバック群呼び出しアルゴリズム]]を実行します。
]FIG]
: [VAR[タスク源]] :
@@ [[アイドルタスクタスク源]]
]FIG]
]FIG]

[19] 次の[[タスク]]の追加が[SHOULD[SHOULD]]であって[MUST[MUST]]でないのは、
他により優先度の高い[[タスク]]が現れた時などに[[利用者エージェント]]の判断で[[アイドル期間]]を切り上げて通常の処理を行うためとされています [SRC[>>4]]。

;; [20] 再帰的な実行の他には、[[アイドル期間]]の開始により実行されます。

[64] [VAR[ハンドル]]と[VAR[窓]]についての[DFN[[RUBYB[アイドルコールバックタイムアウト呼び出しアルゴリズム]@en[invoke idle callback timeout algorithm]]]]は、
次のようにします [SRC[>>63]]。
[FIG(steps)[
= [65] [VAR[項目]]を、[VAR[窓]]の[F[アイドル要求コールバック群のリスト]]から[F[ハンドル]]が[VAR[ハンドル]]の項目を取得し、削除した結果に設定します。
= [66] [VAR[項目]]が [CODE[null]] なら、
== [67] [VAR[項目]]を、[VAR[窓]]の[F[走らせられるアイドルコールバック群のリスト]]から[F[ハンドル]]が[VAR[ハンドル]]の項目を取得し、削除した結果に設定します。
= [68] [VAR[項目]]が [CODE[null]] 以外なら、
== [70] [VAR[アイドル締切]]を、新しい [CODE(DOMi)@en[IdleDeadline]] に設定します。
[FIG(list members)[
: [F[締切]] : [[現在時刻]]
: [F[[CODE(DOMa)@en[didTimeout]]]] : [[真]]
]FIG]
== [69] [[コールバック関数の実行]]をします。
[FIG(list members)[
: [VAR[呼び出し可能]] : [VAR[項目]]の[F[コールバック]]
: [VAR[引数リスト]] : ([VAR[アイドル締切]])
: [VAR[this]] : 
@@
]FIG]
[[例外]]が[[投げ]]られたら、[[例外を報告]]します。
@@ [[仕様書]]では[[誤りを報告]]
]FIG]

[2] [CODE(DOMm)@en[requestIdleCallback]] から呼び出されます。

[24] [CITE@en[Fix didTimeout definition by rmcilroy · Pull Request #62 · w3c/requestidlecallback]]
([TIME[2017-08-11 16:21:05 +09:00]])
<https://github.com/w3c/requestidlecallback/pull/62/files>