1. 序論
◎非規範的この~APIは、 単純な触感~feedbackのみを要求する利用事例に取組むために,特定的に設計されている。 もっと木目細かな制御を要求する利用事例は、 この仕様の視野~外である。 この~APIは、 汎用な通知の仕組みとしての利用は意味されてはない。 そのような利用事例は、 `Notifications API^cite `NOTIFICATIONS$r 仕様を利用して取扱われるであろう。 加えて、 振動が可能化されているかどうかの決定-法も,この仕様の視野~外である。 ◎ The API is specifically designed to address use cases that require simple tactile feedback only. Use cases requiring more fine-grained control are out of scope for this specification. This API is not meant to be used as a generic notification mechanism. Such use cases may be handled using the Notifications API [NOTIFICATIONS] specification. In addition, determining whether vibration is enabled is out of scope for this specification.
2. 適合性
【 この節の内容は ~W3C日本語訳 共通~page に移譲。 】
3. 振動~interface
typedef (`unsigned long$ or sequence<`unsigned long$>) `VibratePattern@I; partial interface `Navigator$I { `boolean$ `vibrate$m(`VibratePattern$I %pattern); };
`振動~pattern@ は、 `VibratePattern$I 型により表現される。 ◎ A vibration pattern is represented by a VibratePattern object.
`振動~patternを処理する@ ときは、 所与の ( `振動~pattern$ %~pattern ) に対し: ◎ The rules for processing vibration patterns are as given in the following algorithm: • Let pattern be the first method argument of the vibrate() method.
- %妥当な~pattern ~LET `検証して正規化する$( %~pattern ) ◎ Let valid pattern be the result of passing pattern to validate and normalize.
-
~IF[ `~top-level閲覧~文脈$の`~system可視性~状態$ ~EQ `hidden^l 【!`可視性~状態を決定-$した結果 ~NEQ `可視^i `PAGE-VISIBILITY-2$r】 ] ⇒ ~RET ~F ◎ If the result of running the steps to determine the visibility state [PAGE-VISIBILITY-2] is not visible, then return false and terminate these steps.
【 この条件は、 原文では `PAGE-VISIBILITY-2$r による定義に基づいているが, その仕様は `HTML$r に統合された — この訳では、 ~HTMLの用語を参照するよう改める。 】
注記: ~OSの機能性と密接に統合された信用-済み(特権的な)~appは、 全く可視でない場合でも,機器を振動させ得る — したがって、 この段を無視し得る。 ◎ Note A trusted (also known as privileged) application that integrates closely with the operating system's functionality may vibrate the device even if such an application is not visible at all, and thus may ignore the previous step.
- ~RET `振動を遂行する$( コレに`関連な大域~obj$ %妥当な~pattern ) ◎ Perform vibration with this's relevant global object and valid pattern.
`検証して正規化する@ ときは、 所与の ( `振動~pattern$ %~pattern ) に対し,次の手続きを走らす: ◎ To validate and normalize a vibration pattern given pattern, run these steps:
- ~IF[ %~pattern は~listでない ] ⇒ %~pattern ~SET « %~pattern » ◎ If pattern is a list, proceed to the next step. Otherwise run the following substeps: • Let list be an initially empty list, and add pattern to list. • Set pattern to list.
-
%最大-長さ ~LET 実装に依存する,~patternの最大~長さ ◎ Let max length be an implementation-dependent maximum length of pattern.
注記: ~patternの長さ ~GT 最大-長さの場合、 この~APIの実装は,[ 実質的に同じ効果を達成するような複数の短い要請に,内部的に分断する ]ことも考慮できる — 最大-長さに後続するものを無視することなく。 しかしながら,最大-長さを超過する~patternを無視する方が適切になる事例もある。 例えば、 実質的に利用者に対する~DoS攻撃を成すほどに,長さが長い場合。 ~web~appは、 一部の実装~用には長さが長過ぎることを知っていて,~pattern内に切目があっても受容-可能な場合にも,複数の要請を為すかもしれない。 ◎ Note If the length of a pattern is greater than max length an implementation of this API could consider breaking the request effectively into multiple shorter requests internally to achieve the same effect, rather than ignoring what follows the max length. There are cases, however, where it is appropriate to ignore the pattern exceeding the max length. An example is if the length is so long that it would effectively create a denial of service attack on the user. A web application might also make multiple requests if it is known to the application that the length is too long for some implementations and a possible gap in between patterns is acceptable.
-
~IF[ %~pattern の長さ ~GT %最大-長さ ] ⇒ %~pattern を[ 最初の %最大-長さ 個の~entry ]だけ残して切落とす ◎ If the length of pattern is greater than max length, truncate pattern, leaving only the first max length entries.
注記: %~pattern の長さが 0 でない偶数の場合、 ~pattern内の最後の~entryによる効果は無くなるので,実装はこの時点で %~pattern から それを除去できる。 ◎ Note If the length of the pattern is even and not zero then the last entry in the pattern will have no effect so an implementation can remove it from the pattern at this point.
- %最大-所要時間 ~LET 実装に依存する[ %~pattern 内の単独の振動~entry ]用の最大~所要時間 ◎ Let max duration be an implementation-dependent maximum duration for a single vibration entry in a pattern.
- %~pattern 内の ~EACH( %~entry ) に対し ⇒ ~IF[ %~entry の値 ~GT %最大-所要時間 ] ⇒ %~entry の値 ~SET %最大-所要時間 ◎ For each entry in pattern whose value is greater than max duration, set the entry's value to max duration.
- ~RET %~pattern ◎ Return pattern.
`振動を遂行する@ ときは、 所与の ( `大域~obj$ %大域~obj, `~list$【!`振動~pattern$】 %~pattern ) に対し,次の手続きを走らす: ◎ To perform vibration using a global object global and a vibration pattern pattern, run these steps:
- ~IF[ %大域~obj は`居残な作動化を有して$いない ] ⇒ ~RET ~F ◎ If global does not have sticky activation, return false and terminate these steps.
-
任意選択で ⇒ ~RET ~F ◎ An implementation MAY return false and terminate these steps.
注記:実装は、 例えば次に挙げる~~理由から,~algoを中止することもある:
- 振動~hardwareは無い。
- 利用者は[ 所与の生成元に属する~pageは、 決して機器を振動-可能になるベキでない ]ことを指示する選好を設定した。
- 実装は、 ~pageが機器を振動させてよい時間の総量を制限していて,それを超過する要請を却下した。
- %~size ~LET %~pattern の`~size$ ◎ ↓
-
~IF[ `振動を遂行する$この~algoの別の~instanceが、 現在~走っている ]: ◎ If another instance of the perform vibration algorithm is already running, run the following substeps:
- その~instanceを中止する ◎ Abort that other instance of the perform vibration algorithm, if any.
-
~IF[ ~OR↓ ]…
- 機器は振動-不能である
- %~size ~EQ 0
- [ %~size ~EQ 1 ]~AND[ %~pattern[ 0 ] ~EQ 0 ]
…ならば ⇒ ~RET ~T
◎ If pattern is an empty list, contains a single entry with a value of 0, or if the device is unable to vibrate, then return true and terminate these steps.
- ~RET ~T — ただし、 以降の手続きも非同期に走らす ◎ Return true, and then continue running these steps asynchronously.
-
~EACH( %n ~IN { 0 〜 %~size − 1 } ) に対し,昇順に: ◎ For each time in pattern, run the following substeps:
- %時間 ~LET %~pattern[ %n ] ◎ ↓
- ~IF[ %n は偶数である ] ⇒ 機器を %時間 ~milli秒だけ振動させる ◎ If the index of time is even (the first entry has index 0), vibrate the device for time milliseconds.
- ~ELSE ⇒ %時間 ~milli秒だけ待機する ◎ Otherwise wait for time milliseconds.
~UAは、 `~top-level閲覧~文脈$の`~system可視性~状態$【!`Document^I の`可視性~状態$】が変化したものと決定したときは, すでに走っている`振動~patternを処理する$~algoを(もしあれば)中止するモノトスル。 ◎ When the user agent determines that the visibility state of the Document of the top-level browsing context changes, it MUST abort the already running processing vibration patterns algorithm, if any.
~security/~privacyの考慮点
Vibration API 自体は、 ~data~sourceではないので,~Web上で消費し得るような~dataは生産しない。 しかしながら,他の~API用の~event~sourceとして~serveし得ることが知られている。 特に,加速度計や~gyroscopeなどの ある種の~sensorは、 製造過程で微細なムラが生じがちなことが知られている。 そのようなわけで、 この~APIを介して生成される振動による刺激を用立てて悪用され得るような,指紋収集口を供する。 この~APIは,このイミにおいて、 他の仕組みとの併用で間接的な~privacy~riskを供する。 これは、 場合によっては,期待されない~privacy~riskを成し得る — 機器~間にまたがる追跡や通信を含めて。 加えて、 振動している機器は,外部の観測器から可視になるかもしれず、 物理的な識別を — 場合によっては利用者の追跡も — 可能化する。 ◎ Vibration API is not a source of data on its own and as such is not producing any data possible to consume on the Web. However, it is known that it can serve as a source of events for other APIs. In particular, it is known that certain sensors such as accelerometers or gyroscopes are prone to tiny imperfections during their manufacturing. As such, they provide a fingerprinting surface that can be exploited utilizing the vibration stimuli generated via the Vibration API. In this sense, Vibration API provides an indirect privacy risk, in conjunction with other mechanisms. This can create possibly unexpected privacy risks, including cross-device tracking and communication. Additionally, a device that is vibrating might be visible to external observers and enable physical identification, and possibly tracking of the user.
これらの理由から、 ~UAは,次をするベキである: ◎ For these reasons, the user agent SHOULD\
- ~APIが利用されていることを利用者に伝える。 ◎ inform the user when the API is being used and\
- 生成元ごとに, あるいは大域的に~APIを不能化する(実質的に何もしなくする)仕組みを供する。 ◎ provide a mechanism to disable the API (effectively no-op), on a per-origin basis or globally.
例
◎非規範的次の例では、 機器は,1000ms(~milli秒)間 振動することになる: ◎ In the following example the device will vibrate for 1000 milliseconds (ms): ◎ Example 1
/* 1000ms だけ振動させる ◎ vibrate for 1000 ms */ navigator.vibrate(1000); /* あるいは ◎ or alternatively */ navigator.vibrate([1000]);
次の例では、 ~patternは機器を 50ms 振動させ, 100ms 黙らせ, 150ms 振動させる: ◎ In the following example the pattern will cause the device to vibrate for 50 ms, be still for 100 ms, and then vibrate for 150 ms: ◎ Example 2
navigator.vibrate([50, 100, 150]);
次の例は、 既存の振動があれば,それを取消す: ◎ The following example cancels any existing vibrations: ◎ Example 3
/* 既存の振動があれば,取消す ◎ cancel any existing vibrations */ navigator.vibrate(0); /* あるいは ◎ or alternatively */ navigator.vibrate([]);