/
656.txt
286 lines (223 loc) · 14.1 KB
/
656.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
[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>