-
Notifications
You must be signed in to change notification settings - Fork 4
/
163.txt
383 lines (293 loc) · 14.6 KB
/
163.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
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
* 仕様書
[REFS[
-
[39]
[CITE@en-US-x-hixie[HTML Standard]], [TIME[2022-01-17T18:04:20.000Z]], [TIME[2022-01-19T10:08:18.943Z]] <https://html.spec.whatwg.org/#tracking-user-activation>
- [65] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#location>
- [68] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#allowed-to-show-a-popup>
- [4] [CITE@en-US[Fullscreen API Standard]] ([TIME[2016-07-22 02:49:58 +09:00]]) <https://fullscreen.spec.whatwg.org/#allowed-to-request-fullscreen>
- [9] [CITE@en[The Screen Orientation API]] ([TIME[2016-07-22 04:15:20 +09:00]]) <https://w3c.github.io/screen-orientation/#dfn-triggered-by-a-user-generated-orientation-change>
]REFS]
*
[40]
[CODE[Window]]
は、
[DFN[[F[[RUBYB[[RUBY[最][さい]][RUBY[終][しゅう]][RUBY[活][かっ]][RUBY[性][せい]][RUBY[化][か]][RUBY[時][じ]][RUBY[刻][こく]][RUBY[印][いん]]][last activation timestamp]]][最終活性化時刻印]]]]を持ちます。
これは、
最後の[[活性化通知]]を得た[[時刻]]を表しています。
[CODE[DOMHighResTimeStamp]]
値の他に、
[[+∞]] や
[[-∞]]
となることがあります。
初期値は
[[+∞]]
です。
[SRC[>>39]]
* 粘着性活性化
[43]
[CODE[Window]]
[VAR[窓]]が[DFN[[F[[RUBYB[[RUBY[粘][ねん]][RUBY[着][ちゃく]][RUBY[性][せい]][RUBY[活][かっ]][RUBY[性][せい]][RUBY[化][か]]][sticky activation]]][粘着性活性化]]]]状態であるか否かは、
[FIG(math)[
[VAR[窓]]の[F[最終活性化時刻印]] ≦ [[現在高解像度時刻]]
]FIG]
... であるか否かです。
[SRC[>>39]]
[44]
[VAR[窓]]の[F[粘着性活性化]]は、
[[利用者]]が[VAR[窓]]と interaction したことがあるかどうかを表しています。
初期状態では[[偽]]になります ([F[現在高解像度時刻]]が [[+∞]])。
[VAR[窓]]が初めて[[活性化通知]]を得たとき[[真]]となり、
再び[[偽]]となることはありません。
[SRC[>>39]]
[45]
[[Web頁]]を開いたとき (または勝手に開かれたとき)、
[[利用者]]が何も操作していないのに、
勝手に意図せぬ動作をして[[利用者]]が困るのを防ぐため、
使われています。
* 過渡活性化
[46]
[CODE[Window]]
[VAR[窓]]が[DFN[[F[[RUBYB[[RUBY[過][か]][RUBY[渡][と]][RUBY[活][かっ]][RUBY[性][せい]][RUBY[化][か]]][transient activation]]][過渡活性化]]]]状態であるか否かは、
[FIG(math)[
[VAR[窓]]の[F[最終活性化時刻印]] ≦ [[現在高解像度時刻]] <
[VAR[窓]]の[F[最終活性化時刻印]] + [[過渡活性化時間長]]
]FIG]
... であるか否かです。
[SRC[>>39]]
[47]
[VAR[窓]]の[F[過渡活性化]]は、
[[利用者]]が最近[VAR[窓]]と interaction したかどうかを表しています。
初期状態では[[偽]]になります。
[VAR[窓]]が[[活性化通知]]を得たとき[[真]]となり、
しばらくして[[偽]]に戻ります。
[SRC[>>39]]
[41]
[DFN[[RUBYB[[RUBY[過][か]][RUBY[渡][と]][RUBY[活][かっ]][RUBY[性][せい]][RUBY[化][か]][RUBY[時][じ]][RUBY[間][かん]][RUBY[長][ちょう]]][transient activation duration]]]]は、
[[利用者エージェント]]の定義する値です。
対象の [[API]] において[[利用者]]による[[活性化]]が利用可能な長さを表す定数です。
[SRC[>>39]]
[42]
この値は、高々数秒程度で、
[[利用者]]による[[頁]]との [[interaction]] と、
[[頁]]が当該 [[API]] を呼び出したこととの関係を知覚できる長さであることが期待されています。
[SRC[>>39]]
[48]
[VAR[窓]]の[F[過渡活性化]]状態が[[過渡活性化時間長]]の経過を以て[[偽]]となることを、
[DFN[[RUBYB[[RUBY[満][まん]][RUBY[期][き]][RUBY[済][ずみ]]][expired]]]]といいます。
[SRC[>>39]]
* 活性化通知
[50]
[[利用者エージェント]]は、
[[閲覧文脈]][VAR[閲覧文脈]]における
[[user interaction]]
に関する
[[activation triggering input event]]
の
[[dispatch]]
の前に、
[VAR[閲覧文脈]]について[[活性化通知]]しなければ[MUST[なりません]]。
[SRC[>>39]]
[56]
[DFN[activation triggering input event]]
は、
次のすべてを満たす[[イベント]][VAR[イベント]]です。
[SRC[>>39]]
- [57]
[VAR[イベント]]の[F[[CODE[isTrusted]]]]が[[真]]、かつ、
- [58]
[VAR[イベント]]の[F[型][イベント型]]が次のいずれか:
--
[CODE[change][onchange]]
-- [CODE[click][onclick]]
-- [CODE[contextmenu][oncontextmenu]]
-- [CODE[dblclick]]
-- [CODE[mouseup]]
-- [CODE[pointerup]]
-- [CODE[reset][onreset]]
-- [CODE[submit][onsubmit]]
-- [CODE[touchend]]
[49]
[[閲覧文脈]][VAR[閲覧文脈]]における[DFN[[RUBYB[[RUBYB[[RUBY[活][かっ]][RUBY[性][せい]][RUBY[化][か]][RUBY[通][つう]][RUBY[知][ち]]][activation notification]]]]]]は、
次のようにします。
[SRC[>>39]]
[FIG(steps)[
= [51]
[VAR[文書]]を、
[VAR[閲覧文脈]]の[F[活性文書]]に設定します。
=
[52]
[VAR[閲覧文脈群]]を、
[VAR[閲覧文脈]]、
[VAR[閲覧文脈]]の[[祖先閲覧文脈]]すべて、
[VAR[文書]]の [F[list of descendant browsing contexts]] 中の[[閲覧文脈]]のうち、
その[F[活性文書]]が[VAR[文書]]と[[同じ起源]]であるものすべて、
を含む[[リスト]]に設定します。
=
[53]
[VAR[窓群]]を、
[VAR[閲覧文脈群]]中の各[VAR[閲覧文脈]]の[F[[CODE[WindowProxy]]]]の[F(ss)[Window]]から[[構築]]した[CODE[Window]]の[[リスト]]に設定します。
=
[54]
[VAR[窓群]]の各[VAR[窓]]について、[[順に][list iterate]]、
==
[55]
[VAR[窓]]の[F[最終活性化時刻印]]を、
[[現在高解像度時刻]]に設定します。
]FIG]
* 活性化消費
[59]
[CODE[Window]]
[VAR[窓]]について[DFN[[RUBYB[[RUBY[利][り]][RUBY[用][よう]][RUBY[者][しゃ]][RUBY[活][かっ]][RUBY[性][せい]][RUBY[化][か]][RUBY[消][しょう]][RUBY[費][ひ]]][consume user activation]]]]は、
次のようにします。
[SRC[>>39]]
[FIG(steps)[
=
[61]
[VAR[窓]]の[F[閲覧文脈]]が [CODE[null]]
の場合、
==
[62] ここで停止します。
=
[63]
[VAR[頂]]を、
[VAR[窓]]の[F[閲覧文脈]]の[F[最上位閲覧文脈]]に設定します。
=
[70]
[VAR[閲覧文脈群]]を、
[VAR[頂]]の[F[活性文書]]の[F[list of the descendant browsing contexts]]に設定します。
=
[71]
[VAR[頂]]を、
[VAR[閲覧文脈群]]の[[末尾に追加]]します。
=
[72]
[VAR[窓群]]を、
[VAR[閲覧文脈群]]中の各[VAR[閲覧文脈]]の[F[[CODE[WindowProxy]]]]の[F(ss)[Window]]から[[構築]]した[CODE[Window]]の[[リスト]]に設定します。
=
[73]
[VAR[窓群]]の各[VAR[窓]]について、[[順に][list iterate]]、
==
[74]
[VAR[窓]]の[F[最終活性化時刻印]]が [[+∞]] で''ない''場合、
===
[75]
[VAR[窓]]の[F[最終活性化時刻印]]を、 [[-∞]] に設定します。
]FIG]
;; [76]
[[仕様書]]の[[アルゴリズム]]中の
[[list of the descendant browsing contexts]]
は毎回新しい複製が得られるようです。
[60]
[[活性化消費するAPI]]から呼び出されます。
[SRC[>>39]]
* 歴史
** 初期モデル
[1] [CITE@en[Editorial: "allowed to show a popup" → "triggered by user activation"]]
( ([[domenic]]著, [TIME[2016-06-01 17:23:12 +09:00]]))
<https://github.com/whatwg/html/commit/797f412eb78fd88bd5d0a1c098d17fbf1736c188>
[2] [CITE@en[Existing intervention: user gesture required for sensitive operations · Issue #12 · WICG/interventions]]
( ([TIME[2016-06-02 18:08:21 +09:00]]))
<https://github.com/WICG/interventions/issues/12>
[3] [CITE@en[Allow requestFullscreen() to be called from an orientation change event]]
([[mounirlamouri]]著, [TIME[2016-07-22 02:49:53 +09:00]])
<https://github.com/whatwg/fullscreen/commit/e5e96a9da944babf0e246980559cd80a46a300ca>
[11] [CITE@en[17041 – Setting location before the page is done loading shouldn't always be a replace load]]
( ([TIME[2016-08-26 14:04:08 +09:00]]))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=17041>
[12] [CITE@en[Consider pointerup and touchend for "triggered by user activation"]]
([[NavidZ]]著, [TIME[2016-10-13 05:29:42 +09:00]])
<https://github.com/whatwg/html/commit/adafe995c6d4f5f6df0497a534d31e51043b6750>
[30] [CITE@en[Add allow-top-navigation-by-user-activation sandbox token]]
([[domenic]]著, [TIME[2017-02-24 04:51:48 +09:00]])
<https://github.com/whatwg/html/commit/8abd73ec3a56541e3f6486d3a593a8bcfd67295d>
[33] [CITE@en[Require user gesture to request notification permissions · Issue #49 · WICG/interventions]]
([TIME[2017-07-16 00:39:12 +09:00]])
<https://github.com/WICG/interventions/issues/49>
[34] [CITE@en[Need concept of "consuming" user activation · Issue #3122 · whatwg/html]]
([TIME[2017-10-14 21:02:25 +09:00]])
<https://github.com/whatwg/html/issues/3122>
[35] [CITE@en[Treat trusted contextmenu events as user activation]]
([[mustaqahmed]]著, [TIME[2018-05-03 01:07:47 +09:00]])
<https://github.com/whatwg/html/commit/51bd770cf58cdd761674df0f47c9f9dfc58c5310>
[36] [CITE@en[Treat trusted `contextmenu` events as user activation. by mustaqahmed · Pull Request #3659 · whatwg/html]]
([TIME[2018-05-03 10:55:44 +09:00]])
<https://github.com/whatwg/html/pull/3659>
[37] [CITE@en[Deprecations and removals in Chrome 69 | Web | Google Developers]]
([TIME[2018-09-15 02:56:15 +09:00]])
<https://developers.google.com/web/updates/2018/09/chrome-70-deps-rems>
*** user activation
[69] [DFN[triggered by user activation]] (旧 [DFN[[[allowed to show a popup]]]])
とは、次のいずれかの条件を満たすことをいいます
[SRC[>>68]]。
[FIG(list)[
- [14] [[タスク]]が[[信頼済み]] [CODE(DOMe)@en[[[click]]]] [[イベント]]の[[活性化動作]]の処理中である
- [15] [[タスク]]が[[信頼済み]] [CODE(DOMe)@en[[[click]]]], [CODE(DOMe)@en[[[change]]]],
[CODE(DOMe)@en[contextmenu]],
[CODE(DOMe)@en[[[dblclick]]]], [CODE(DOMe)@en[[[mouseup]]]], [CODE(DOMe)@en[[[reset]]]],
[CODE(DOMe)@en[[[submit]]]],
[CODE(DOMe)@en[pointerup]],
[CODE(DOMe)@en[touchend]] [[イベント]]の[[イベントリスナー]]の処理中である
- [16] [[タスク]]が [[triggered by user activation]] な[[タスク]]から[[タスクキューに追加]]されたものである、
ただし最初の[[タスク]]から[[利用者エージェント]]定義の[[時間]]が経過していない
]FIG]
;; [17] 時間制限は、例えば[[クリック]]から数秒後ならともかく、数時間後は相応しくない
[SRC[>>68]] ことによります。
[EG[
[29] [CODE(HTMLe)@en[button]] の[[クリック]]時の[[ポップアップ]]は認められますが、
[CODE(HTMLe)@en[input]] の入力や [CODE(HTMLe)@en[select]] の変更では認められません。
]EG]
[31]
他に、[[閲覧文脈]]外部で[[利用者]]の明示的な指示があった場合も含めるべきと思われます。
[EG[
[32] 例えば[[利用者]]が[[ブックマーク]]から選択した[[ブックマークレット]]が
[CODE(JS)@en[window.open]] を実行した場合、[[ポップアップ窓]]が開かれるのが普通です。
]EG]
-*-*-
[64] [CODE(DOMi)@en[[[Location]]]] では、次のいずれかの条件を満たすと分岐します [SRC[>>65]]。 ([[タスク]]以外の判定条件もあります。 [CODE(DOMi)@en[[[Location]]]] 参照。)
[FIG(list)[
- [66] [[タスク]]が[[信頼済み]] [CODE(DOMe)@en[[[click]]]] [[イベント]]の[[活性化動作]]の処理中である
- [67] [[タスク]]が[[信頼済み]] [CODE(DOMe)@en[[[click]]]] [[イベント]]の[[イベントリスナー]]の処理中である
]FIG]
[18] [[タスク]]は、自身がこの条件を満たしているかどうかの情報を保持しておく必要があります。
また[[イベントオブジェクト]] (の持つ情報の一部または全部) も必要かもしれません。
例えば [CODE(JS)@en[[[window.open]]]] は、[[プラットフォームの慣習]]により、 [KBD[[[Ctrl]]]]
押下時に新しい[[閲覧文脈]]を常に開く、といったような動作にできます。
[25] 実際には [[triggered by user activation]] の実装 (またはその呼び出し元の実装)
は更に厳しく制限しているかもしれません。
[EG[
[27] 例えば同じ[[タスク]]内で多数の新しい[[最上位閲覧文脈]]を作成するのは[[ブラクラ]]であり、
拒否するべきと考えられます。
]EG]
[26] 更に、[[タスク]]を超えた制約もあるかもしれません。
[EG[
[28] 例えば [CODE(JS)@en[[[setTimeout]]]] を使って短時間に別の[[タスク]]で多くの新しい[[最上位閲覧文脈]]を作成するのは[[ブラクラ]]であり、
拒否するべきと考えられます。
]EG]
[19] [[triggered by user activation]] は、次の場面で使われます。
[FIG(list)[
- [[allowed to navigate]]
- [20] 新しい[[最上位閲覧文脈]]を開くかどうかの判断 ([[閲覧文脈名から閲覧文脈を選ぶ規則]]など)
- [21] [CODE(HTMLa)@en[[[download]]]] や [[navigate]] で[[ダウンロード]]するべきかの判断
- [24] [[navigate]] で[[ヘルパーアプリケーション]]を起動するべきかの判断
- [22] [CODE(DOMm)@en[[[requestAutocomplete]]]] 時
- [23] [CODE(HTML)@en[[[<input type=file>]]]] [[ダイアログ]]を開くかどうかの判断
- [[allowed to play]] の条件に使うことがあります。
]FIG]
[13] [[engagement gesture]] でも[[イベント]]のリストが参照されています。
*** user orientation change
[10] [DFN[triggered by a user generated orientation change]] とは、
[[現在走っているタスク]]の [F[process user orientation change]] が[[真]]であることをいいます
[SRC[>>9]]。
*** 全画面の要求
[5] [DFN[allowed to request fullscreen]] とは、
[FIG(list)[
- [6] [[triggered by user activation]]
- [7] [[triggered by a user generated orientation change]]
]FIG]
... の''いずれか''が[[真]]であることをいいます [SRC[>>4]]。
[8] これは、 [CODE(DOMm)@en[requestFullscreen]] で参照されます。
** 令和元(2019)年改定モデル
[38] [CITE@en[Revamp the user activation model]]
([[mustaqahmed]], [TIME[2019-12-05 04:09:23 +09:00]], [TIME[2022-01-19T09:21:45.000Z]])
<https://github.com/whatwg/html/commit/8f8c1f50158736b3cf16188377a0974a20367c8b>