validate and normalize

VibratePattern (DOM)

[2] Web IDL型定義された VibratePattern は、 unsigned long または unsigned longsequence<> です >>1。これをバイブレーションパターン (vibration pattern) といいます。

仕様書

意味

[25] バイブレーションパターンは、バイブレーションの動作パターンを表しています。

[26] 単一の値は、その値のみを含むリストと等価です。

[27] リストは、バイブレーションさせる長さとその後何もしない時間を交互に指定したものです。 何個でも指定できます。 (ただし正の偶数個の指定は、末尾の要素が何もしない時間の指定となりますから、 意味がありません。) 空でも構いません。

[28] 各値は、ミリ秒単位の時間の長さを表しています。 0 でも構いません。

[34] 空のリストや 0 のみの値により、現在実施中のバイブレーションを停止させることができます。

文脈

[3] VibratePattern は、 vibrate メソッド引数に使われています。

[36] Notification コンストラクター (NotificationOptions) に VibratePatternvibrate として指定することができます。 通知は、バイブレーションパターン (vibration pattern) を持つことができます >>39

検証および正規化

[5] バイブレーションパターン検証および正規化 (validate and normalize) とは、次のような操作です >>4

  1. [6] 与えられたバイブレーションパターンが単一の値なら、この値のみを含むリストとします。
  2. [7] リストの長さが最大値より大きければ、 先頭から最大値分の要素だけを残し、残りを削除します。
  3. [8] リストの長さが偶数なら、末尾の要素は無意味ですから、除去して構いません。
  4. [9] リストの各要素の値が時間間隔の最大値より大きければ、最大値に置き換えます。
  5. [10] 得られたリストを返します。

[11] リストの長さの最大値は、実装依存です。利用者エージェントは、装置OS の制限より長い時に内部的にパターンを分割することで、実質的にそれより長いパターンに対応できます。 しかし、利用者に対するDoS攻撃を企てるアプリケーションがあるかもしれませんから、 あまりに長いパターンは無視するべきかもしれません。 なおアプリケーションも、同様に利用者エージェントが対応できないとわかっている長いパターンを分割して navigator.vibrate を呼び出すことはできます。 >>4

[12] 時間間隔 (duration) の最大値は、実装依存です >>4

[38] このアルゴリズムは、 navigate.vibrateNotification コンストラクターから呼び出されます。

バイブレーションの実施

[14] バイブレーションパターンについてバイブレーションを実施 (perform vibration) するとは、次のような操作をいいます >>13

  1. [15] を返してここで停止しても構いません。
  2. [16]アルゴリズムが別途動作中なら、
    1. [17] 別途動作中の本アルゴリズムを停止させます。
    2. [18] 与えられたパターンが空か、値 0 のみの長さ1のリストか、 装置バイブレーションできない状態なら、を返して停止します。
  3. [19] を返し、並列に次の操作を実行します。
    1. [20] i を 0 とします。
    2. [21] リストの i 番目 (先頭は 0 番目) の要素の値をミリ秒単位の時間とし、
      1. [22] i偶数なら、その間装置バイブレーションさせます。
      2. [23] i奇数なら、その間何もせずに待ちます。
    3. [24] リストの i 番目の要素が最後の要素でなければ、 iインクリメントして前の手順に戻ります。

[29] 利用者エージェントは、利用者の設定に従いバイブレーションを無効にしても構いませんし、 一定時間内の利用回数を制限しても構いません >>15。その場合を返して停止することになります。

[30] デスクトップブラウザーなどバイブレーション可能な装置が存在しない時の挙動は明記されていませんが、 ChromeFirefoxを返します。実装報告 >>35デスクトップブラウザーのテスト結果も掲載しており、これが想定通りの動作のようです。

[31] このアルゴリズムは、自身が別途実行されることにより (>>18)、 あるいは可視性状態の変化 >>13 (visibilitychange 相当) により停止させられることがあります。

[42] 可視性状態変化による停止は navigator.vibrate について規定されていますが、 Notification については規定されていません。
[32] なお navigate.vibrate メソッドは本アルゴリズムを呼び出すよりも前に可視性状態を検査し、 visible 以外ならばを返して停止することになっています。
[33] >>18>>30 により、バイブレーションが実際に動作したかどうかをアプリケーションが確実に判断することはできません。

[37] このアルゴリズムは、 navigate.vibrateNotificationdisplay steps から呼び出されます。

アクセス可能性

[41] バイブレーションパターンはその違いによって通知の種別を表すなど、 有用な情報を表すことができます。しかし、バイブレーションは無効に設定されていたり、 装置にその機能が存在しなかったりすることもあります。

[40] 著者バイブレーションパターンのみでしか利用者がアクセスできない形で情報を提供するべきではない >>39 とされています。

歴史