-
Notifications
You must be signed in to change notification settings - Fork 4
/
312.txt
110 lines (91 loc) · 6.8 KB
/
312.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
* 仕様書
[REFS[
- [1] [CITE@en[Cooperative Scheduling of Background Tasks]] ([TIME[2016-12-21 17:01:17 +09:00]]) <https://w3c.github.io/requestidlecallback/#h-start-an-event-loop-s-idle-period>
]REFS]
* イベントループのアイドル状態
[2] [[利用者エージェント]]は、[[イベントループ]][VAR[イベントループ]]に関して、
[RUBYB[十分な時間]@en[a non-trivial amount of time]][RUBYB[アイドル]@en[idle]]であり続けそうだと思われる場合であって、
他の[[イベントループ]]その他のより優先度の高い作業に悪影響を及ぼさないと考えられる場合には、
[VAR[イベントループ]]の新しい[[アイドル期間]]を開始する[SHOULD[べきです]] [SRC[>>1]]。
[3] [[利用者エージェント]]は、[[電力消費]]の節約のために[[文書]]が[[隠れている][document.hidden]]場合に[[アイドル期間]]を開始する頻度を下げる [SRC[>>1]] など、
適当に調整できます。
[4] [VAR[イベントループ]]の[[アイドル期間]]の開始は、
次のようにしなければ[MUST[なりません]] [SRC[>>1]]。
[FIG(steps)[
= [5] [VAR[最終締切]]を、[VAR[イベントループ]]の[F[最終アイドル期間締切]]に設定します。
= [7] [VAR[今]]を、[[現在時刻]]に設定します。
= [8] [VAR[最終締切]] > [VAR[今]なら、
== [9] ここで停止します。
= [10] [VAR[締切]]を、[VAR[今]]より大きな適切な値に設定します。
[VAR[締切]]は、[[アイドル]]状態であり続けると予想される時刻としますが、
[VAR[今]] + 50 [[ms]] [[以下]]とします。
= [11] [VAR[文書群]]を、[VAR[イベントループ]]に関連付けられた[[文書]]のうち、
[[完全に活性]]なものの[[リスト]]に設定します。
= [12] [VAR[文書群]]の各[VAR[文書]]について、
== [13] [VAR[文書]]の[F[[CODE(DOMi)@en[Window]]]]の[F[アイドル要求コールバック群のリスト]]の各項目を、
そのままの順序で、
[VAR[文書]]の[F[[CODE(DOMi)@en[Window]]]]の[F[走らせられるアイドルコールバック群のリスト]]の末尾に追加します。
== [14] [VAR[文書]]の[F[[CODE(DOMi)@en[Window]]]]の[F[アイドル要求コールバック群のリスト]]を、
空にします。
= [15] [[タスクをキューに追加]]します。
[FIG(list members)[
: [VAR[処理]] :
[FIG(steps)[
= [16] [[アイドルコールバック群の呼び出しアルゴリズム]]を[VAR[締切]]について実行します。
]FIG]
: [VAR[タスク源]] : [[アイドルタスクタスク源]]
]FIG]
= [17] [VAR[イベントループ]]の[F[最終アイドル期間締切]]を、[VAR[締切]]に設定します。
]FIG]
[6] [VAR[イベントループ]]は、
[DFN[[F[[RUBYB[[[最終アイドル期間締切]]]@en[last idle period deadline]]]]]]を持ちます。
初期値は [N[0]] です。 [SRC[>>1]]
[20] [VAR[締切]]は、[[利用者エージェント]]が任意の基準で決定できます。
[CODE(DOMm)@en[requestIdleCallback]] の[[コールバック]]の実行で、
他の時間に厳しいタスクが遅延してしまわないように注意する必要があります。
そのため、次の最小値とするべきです [SRC[>>1]]。
[FIG(list)[
- [21] [CODE(DOMm)@en[setTimeout]] と [CODE(DOMm)@en[setInterval]] の[[タイマー]]で直近のもの
- [22] [CODE(DOMm)@en[requestAnimationFrame]] の[[コールバック]]の次の実行
- [23] 次のフレームの[[レンダリング]]、音声処理、その他[[利用者エージェント]]が重要と考える内部処理の次の実行
]FIG]
[18] [DFN[[RUBYB[アイドル期間]@en[idle period]]]]とは、
[VAR[今]]から[VAR[締切]]までをいいます。
[VAR[イベントループ]]の[[アイドル期間]]は、同時に複数開始することはできません。
[SRC[>>1]]
[19] [[利用者エージェント]]は、途中で[[アイドル]]状態でなくなったと判断したら、
[VAR[締切]]を待たずに[[アイドル期間]]を打ち切ることもできます。
その場合であっても、[VAR[締切]]まで次の[[アイドル期間]]は開始できません。 [SRC[>>1]]
* メモ
[130] [[ブラウザー拡張]]や[[埋め込みブラウザー]]、他の[[アプリケーション]]から
[[Webブラウザー]]を制御する [[API]] などは、 [[Webページ]]の読み込みが終わり
「安定」した状態 ([[idle]] 状態) になったことを検知したい場合があります。
[EG[
[131] 例えば [[Webページ]]の表示が完了したら[[スクリーンショット]]を撮るソフトウェアの実装には、表示の完了のタイミングを知る必要があります。ここでいう表示の完了は、
必ずしも [[completely loaded]] ではなく、読み込み完了後に遅延して実行される[[スクリプト]]の完了も待ちたいです。
]EG]
[EG[
[132] [[Webアプリケーション]]の[[テスト]]のために外部から [[Webブラウザー]]を制御する場合、
[[クリック]]などの入出力操作を擬似的に発生させ、それに対する[[スクリプト]]の一連の動作が終わったら、
その時点の状態を確認したいかもしれません。
]EG]
[133] この状態は仕様上の概念ではありませんから ([[Webサイト]]の[[相互運用性]]には影響しません)、
判断方法はそれぞれの実装によります。一般的には、次のように判断するのが妥当でしょう。
[FIG(list)[
- [134] [[stops parsing]] ([[completely loaded]]) より後であり、 [CODE(JS)@en[[[document.open]]]] されていない
- [135] どの[[タスクキュー]]にも実行可能な[[タスク]]がない
- [136] [[マイクロタスク]]その他の実行可能な処理がない
- [138] 数秒以内に実行可能なタイマー ([CODE(DOMm)@en[[[setTimeout]]]] や
[CODE(HTTP)@en[[[Refresh]]]] など) がない
- [185] 実行中の [[fetch]] がない
- [205] 実行中の[[データベース取引]]がない
- [194] または、他の条件が満たされずとも、[[モーダルダイアログ]]の表示中である
]FIG]
[177] [[媒体]]の[[再生]]、[[アニメーション]]、[[ワーカー]]の実行、
[CODE(DOMi)@en[[[EventSource]]]] や [CODE(DOMi)@en[[[WebSocket]]]] などは、
無視するのが適当そうです。
[193] 無限に読み込みが続く場合や[[スクリプト]]により[[アニメーション]]する場合など、
この定義の「アイドル状態」に至らないこともあり得ます。
[217] [[ワーカー]]が [[protected worker]] でなくなるとは、
このアイドル状態に近いものを指しているようです ([[ワーカー]]の性質により、
本項での説明とは異なる点もあります)。