/
589.txt
109 lines (79 loc) · 7.38 KB
/
589.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
[2] [[Web IDL]] の[[型定義]]された[[型]] [DFN[[CODE(DOMi)@en[[[VibratePattern]]]]]] は、
[CODE(IDL)@en[[[unsigned long]]]] または [CODE(IDL)@en[[[unsigned long]]]] の [CODE(IDL)@en[[[sequence<>]]]]
です [SRC[>>1]]。これを[DFN[[RUBYB[[[バイブレーションパターン]]]@en[vibration pattern]]]]といいます。
* 仕様書
[REFS[
- [1] [CITE@en[Vibration API]] ([TIME[2014-11-20 01:59:39 +09:00]] 版) <http://dev.w3.org/2009/dap/vibration/#h2_vibration-interface>
-- [4] [CITE@en[Vibration API]] ([TIME[2014-11-20 01:59:39 +09:00]] 版) <http://dev.w3.org/2009/dap/vibration/#dfn-validate-and-normalize>
-- [13] [CITE@en[Vibration API]] ([TIME[2014-11-20 01:59:39 +09:00]] 版) <http://dev.w3.org/2009/dap/vibration/#dfn-perform-vibration>
- [39] [CITE@en-US[Notifications API Standard]] ([TIME[2015-01-17 19:42:33 +09:00]] 版) <https://notifications.spec.whatwg.org/#vibration-pattern>
]REFS]
* 意味
[25] [[バイブレーションパターン]]は、[[バイブレーション]]の動作パターンを表しています。
[26] 単一の値は、その値のみを含むリストと等価です。
[27] リストは、[[バイブレーション]]させる長さとその後何もしない時間を交互に指定したものです。
何個でも指定できます。 (ただし正の偶数個の指定は、末尾の要素が何もしない時間の指定となりますから、
意味がありません。) 空でも構いません。
[28] 各値は、[[ミリ秒]]単位の[[時間]]の長さを表しています。 0 でも構いません。
;; [34] 空のリストや [CODE[0]] のみの値により、現在実施中の[[バイブレーション]]を停止させることができます。
* 文脈
[3] [CODE(DOMi)@en[[[VibratePattern]]]] は、 [CODE(DOMm)@en[[[vibrate]]]]
[[メソッド]]の[[引数]]に使われています。
[36] [CODE(DOMi)@en[[[Notification]]]] [[コンストラクター]]
([CODE(DOMi)@en[[[NotificationOptions]]]]) に [CODE(DOMi)@en[[[VibratePattern]]]]
を [CODE[[[vibrate]]]] として指定することができます。
[[通知]]は、[DFN[[RUBYB[[[バイブレーションパターン]]]@en[[[vibration pattern]]]]]]を持つことができます [SRC[>>39]]。
* 検証および正規化
[5] [[バイブレーションパターン]]の[DFN[[RUBYB[検証および正規化]@en[validate and normalize]]]]とは、次のような操作です [SRC[>>4]]。
[FIG(steps)[
= [6] 与えられた[[バイブレーションパターン]]が単一の値なら、この値のみを含むリストとします。
= [7] リストの長さが最大値より大きければ、
先頭から最大値分の要素だけを残し、残りを削除します。
= [8] リストの長さが[[正]]の[[偶数]]なら、末尾の要素は無意味ですから、除去して構いません。
= [9] リストの各要素の値が時間間隔の最大値より大きければ、最大値に置き換えます。
= [10] 得られたリストを返します。
]FIG]
[11] リストの長さの最大値は、[[実装依存]]です。[[利用者エージェント]]は、[[装置]]や [[OS]]
の制限より長い時に内部的にパターンを分割することで、実質的にそれより長いパターンに対応できます。
しかし、[[利用者]]に対する[[DoS攻撃]]を企てる[[アプリケーション]]があるかもしれませんから、
あまりに長いパターンは無視するべきかもしれません。
なお[[アプリケーション]]も、同様に[[利用者エージェント]]が対応できないとわかっている長いパターンを分割して [CODE(JS)@en[[[navigator.vibrate]]]] を呼び出すことはできます。 [SRC[>>4]]
[12] [RUBYB[時間間隔]@en[duration]]の最大値は、[[実装依存]]です [SRC[>>4]]。
[38] この[[アルゴリズム]]は、 [CODE(JS)@en[[[navigate.vibrate]]]] や
[CODE(DOMi)@en[[[Notification]]]] [[コンストラクター]]から呼び出されます。
* バイブレーションの実施
[14] [[バイブレーションパターン]]について[DFN[[RUBYB[バイブレーションを実施]@en[perform vibration]]]]するとは、次のような操作をいいます [SRC[>>13]]。
[FIG(steps)[
= [15] [[偽]]を返してここで停止しても構いません。
= [16] 本[[アルゴリズム]]が別途動作中なら、
== [17] 別途動作中の本[[アルゴリズム]]を停止させます。
== [18] 与えられたパターンが空か、値 0 のみの長さ1のリストか、
[[装置]]が[[バイブレーション]]できない状態なら、[[真]]を返して停止します。
= [19] [[真]]を返し、[[並列に]]次の操作を実行します。
== [20] [VAR[i]] を 0 とします。
== [21] リストの [VAR[i]] 番目 (先頭は 0 番目) の要素の値を[[ミリ秒]]単位の[[時間]]とし、
=== [22] [VAR[i]] が[[偶数]]なら、その間[[装置]]を[[バイブレーション]]させます。
=== [23] [VAR[i]] が[[奇数]]なら、その間何もせずに待ちます。
== [24] リストの [VAR[i]] 番目の要素が最後の要素でなければ、 [VAR[i]] を[[インクリメント]]して前の手順に戻ります。
]FIG]
[29] [[利用者エージェント]]は、[[利用者]]の設定に従い[[バイブレーション]]を無効にしても構いませんし、
一定時間内の利用回数を制限しても構いません [SRC[>>15]]。その場合[[偽]]を返して停止することになります。
[30] [[デスクトップブラウザー]]など[[バイブレーション]]可能な[[装置]]が存在しない時の挙動は明記されていませんが、
[[Chrome]] も [[Firefox]] も[[真]]を返します。[[実装報告]] [SRC[>>35]]
は[[デスクトップブラウザー]]のテスト結果も掲載しており、これが想定通りの動作のようです。
[31] この[[アルゴリズム]]は、自身が別途実行されることにより (>>18)、
あるいは [CODE(DOMe)@en[[[visibilitychange]]]] により [SRC[>>13]] 停止させられることがあります。
;; [32] なお [CODE(JS)@en[[[navigate.vibrate]]]] [[メソッド]]は本[[アルゴリズム]]を呼び出すよりも前に
[CODE(JS)@en[[[document.hidden]]]] をチェックし、[[真]]ならば[[偽]]を返して停止することになっています。
;; [33] >>18 と >>30 により、[[バイブレーション]]が実際に動作したかどうかを[[アプリケーション]]が確実に判断することはできません。
[37] この[[アルゴリズム]]は、 [CODE(JS)@en[[[navigate.vibrate]]]] や
[CODE(DOMi)@en[[[Notification]]]] の [[display steps]] から呼び出されます。
* アクセス可能性
[41] [[バイブレーションパターン]]はその違いによって[[通知]]の種別を表すなど、
有用な情報を表すことができます。しかし、[[バイブレーション]]は無効に設定されていたり、
[[装置]]にその機能が存在しなかったりすることもあります。
[40] [[著者]]は[[バイブレーションパターン]]のみでしか[[利用者]]がアクセスできない形で情報を提供するべきではない [SRC[>>39]] とされています。
* 歴史
[REFS[
- [35] [CITE@en[Vibration API: All Results]] ([TIME[2014-12-08 17:31:14 +09:00]] 版) <http://w3c.github.io/test-results/vibration/20141118.html>
]REFS]