Copyright © 2024 the Contributors to the WebHID API Specification, published by the Web Platform Incubator Community Group under the W3C Community Contributor License Agreement (CLA). A human-readable summary is available.
本ドキュメントは、Human Interface Device (HID) プロトコルをサポートするデバイスへのアクセスを提供するAPIについて説明します。
本仕様は Web Platform Incubator Community Group によって公開されました。W3C標準ではなく、W3C Standards Track上の仕様でもありません。 また、 W3C Community Contributor License Agreement (CLA) のもとで限定的なオプトアウト等の条件も適用されます。 W3C Community and Business Groups について詳細をご覧ください。
本仕様について議論する場合は GitHub Issues が推奨されます。
このセクションは規範的ではありません。
HID(ヒューマン・インターフェース・デバイス)は、人間から入力を受け取る、もしくは人間へ出力を提供するタイプのデバイスです。また、HIDプロトコルは、ホストとデバイス間の双方向通信のための標準であり、インストール手順を簡素化するために設計されています。HIDプロトコルはもともとUSBデバイス向けに開発されましたが、その後Bluetoothなど多くの他のプロトコル上でも実装されるようになりました。
ウェブプラットフォームはすでに多くのHIDデバイスからの入力をサポートしています。キーボード、ポインティングデバイス、ゲームパッドなどは、一般的にHIDプロトコルを用いて実装されています。しかしながら、このサポートは、HID入力を高レベルの入力APIに変換するOSのHIDドライバーに依存しています。ホストのHIDドライバーで十分にサポートされていないデバイスは、ウェブページからアクセスできない場合が多いです。同様に、ホストのHIDドライバーでサポートされていないほとんどのデバイスの出力も利用できません。
関連する 解説ドキュメントもご参照ください。
このセクションは規範的ではありません。
HID入力デバイスの最も一般的なカテゴリは、既存の高レベル入力APIを通してウェブプラットフォームできちんとサポートされています。例えば、マウス入力は
PointerEventで、キーボード入力は
KeyboardEventで利用可能です。これらのデバイスからの入力は、ホストのネイティブHIDドライバーによって処理され、通常デバイス固有のドライバーや設定なしで動作します。WebHIDは、このように高レベル入力APIですでに十分サポートされているデバイスを対象としていません。
一部のHIDデバイスカテゴリでは、ウェブプラットフォームがデバイスの一部機能のみをサポートし、他の機能へのアクセスを制限している場合があります。例えば、[GAMEPAD]は、ほとんどのゲームコントローラーの入力機能をサポートしていますが、LEDインジケーターや音声などあまり一般的でない機能はサポートしていません。これらの機能はホストAPIであまりサポートされないことが多く、ユーザーエージェント内での対応は高い複雑性をもたらします。WebHIDは、高レベルAPIが提供する機能が不十分な場合にアプリケーション側で代替を提供できます。
多くのHIDデバイスは、どのウェブプラットフォームAPIからもサポートされていません。HID仕様では仮想現実コントローラー、フライトシミュレータ、医療機器など、さまざまなデバイスがHIDでサポート可能であると記載されています。WebHIDにより、追加のドライバーやユーザーエージェントの改変無しで、これらのデバイスが利用可能になります。
HIDはプロトタイピングやホビイストの用途に魅力的です。なぜなら、各ホストごとに専用のドライバーを必要とせず、汎用のHIDドライバーを使えるためです。また、簡略化されたインストール手順により、教育者がシステム構成を変更することなく、学生全員のPCに機器を展開しやすくなっています。ウェブプラットフォーム経由でHIDデバイスにアクセスできれば、特定ホスト専用アプリケーションでのみサポートされている現状よりも、インストール要件がさらに減少します。
このセクションは規範的ではありません。
HID周辺機器は強力な機能を持つ場合があり、ユーザーの明示的な同意なしにページからアクセス可能にすべきではありません。例えば、HID周辺機器が周囲の情報を収集できるセンサーを搭載していることがあります。デバイスが秘匿情報を保存しており、それが漏洩や上書きされるべきではない場合もあります。多くのデバイスはファームウェアアップグレード機能を持っています。OSは通常、HIDデバイスへのアプリケーションからのアクセスを制限していないため、このアクセスが悪用されてデバイスが破損したり、保存されているデータが損なわれたりすることがあります。
場合によっては、Webページから全くアクセス可能にすべきでない機能がデバイスに存在することもあります。特定のデバイスは、vendor IDやproduct IDの認識によってブロックし、列挙時に非表示にすることができます。report descriptor によってデバイスは自らの機能を記述でき、この情報を使えば、vendor IDやproduct IDが事前に判明しない場合でもデバイスカテゴリのブロックが可能です。これは、HID usage値をreport descriptor内のコレクションに割り当てて検査することで実現できます。例えば、キーボード的なデバイスには、そのtop-level collectionにHID usageでキーボードカテゴリが含まれている場合、アクセスを拒否できます。
悪用を防ぐため、ユーザーが明示的に許可を与えるまで、デバイスはページに利用可能となりません。アクセスはまずページからリクエストされ、ユーザーが利用可能デバイスの一覧から選択した後に与えられます。ページがアクセス許可を得た後は、デバイスが使用中であることを示すインジケーターが表示されます。
HIDプロトコルは非常に柔軟であり、これを活用した多様なデバイスが設計されています。そのため、デバイスへのアクセスが、悪意のあるページによってデバイス自体を損傷する様々な可能性があります。ファームウェアアップデートをカスタムHIDレポートで送信できるHID周辺機器も少なくありません。デバイスメーカーは、ファームウェアバイナリが正規のものであることを確認する仕組みをファームウェアアップグレード機構に組み込む必要があり、またダウングレードによってセキュリティが低下しないよう保護するべきです。信頼されていないアップグレードは、デバイスに新機能を追加したり、まったく別のタイプのデバイスを装う原因になり得ます。
一部のデバイスは、予期される範囲外の入力を与えることで損傷する場合があります。例えば、ゲームパッドの振動機能は、不正な振動コマンドがページから送信されると損傷する可能性があります。
一般に、これらの種の攻撃はデバイス固有のものであり、APIレベルでの緩和は困難です。
悪意のあるページがデバイスへのアクセスを獲得した場合、このアクセスによってホストを攻撃できる場合もあります。主な懸念は、デバイスによって信頼された入力イベントを生成できるかどうかです。これらのイベントはユーザーの意図を表す代理として機能し、より強力なウェブプラットフォームの機能利用に使われる可能性があります。
マウスやキーボードは通常HID周辺機器として実装されており、信頼された入力も生成可能です。HIDキーボードやマウスは、プログラマブルマクロのような高度な機能を持つ場合もあり、これにより入力のシーケンスを記録し、後で再生できます。デバイスメーカーは、悪意あるアプリが予期しない入力シーケンスでデバイスを再プログラミングしたり、ユーザーの明示的な同意なしにマクロ再生をトリガーすることがないように注意して設計する必要があります。
セキュリティおよびプライバシーリスクを軽減するため、ユーザーエージェントはデバイスアクセス要求時に選択式のUIフローを実装することが推奨されます。ページがHIDデバイスへのアクセスを要求した場合、ユーザーエージェントはそのページがデバイスにアクセスしたい旨を通知するダイアログを表示すべきです。このダイアログには接続されたHIDデバイスの一覧を表示し、その中からページ上で公開するデバイスをユーザーに選択してもらうよう求めるべきです。偶発的なクリックを減らすため、デバイス選択と、選択の確定・ダイアログの閉鎖とで、少なくとも2度の操作を必要としてください。
WebIDL[Exposed=(DedicatedWorker,ServiceWorker,Window), SecureContext]
interface HID : EventTarget {
attribute EventHandler onconnect;
attribute EventHandler ondisconnect;
Promise<sequence<HIDDevice>> getDevices();
[Exposed=Window] Promise<sequence<HIDDevice>> requestDevice(
HIDDeviceRequestOptions options);
};
ユーザーエージェントの実装は、Navigator
の hid 属性を条件付きで公開することを選択できる場合があります。これは、Navigator
の 関連グローバルオブジェクト
が ServiceWorkerGlobalScope
のときです。例えば、
[browserext] のブラウザー拡張機能のコンテキストにおいて。
HID のインスタンスは、次の表に記載の内部スロットとともに作成されます。
| 内部スロット | 初期値 | 説明(非規範的) |
|---|---|---|
| [[devices]] | 空の 順序付き集合 |
システムで現在利用可能な HID インターフェイス を表す HIDDevice インスタンスの 順序付き集合
|
onconnect
属性
onconnect は、
イベントハンドラー
IDL 属性であり、
connect イベント型に対応します。
ondisconnect
属性
ondisconnect は、
イベントハンドラー
IDL 属性であり、
disconnect
イベント型に対応します。
システムで HID インターフェイス が利用可能になったとき、次の手順を実行します。
HID インターフェイス は、HID プロトコルを介してデバイスと通信するために使用できる論理的インターフェイスです。各 HID インターフェイス は、そのインターフェイスでサポートされるレポート集合を記述する report descriptor を 1 つだけ持ちます。1 つの物理デバイスが 1 つ以上の HID インターフェイス を公開する場合があります。複数の HID インターフェイス を持つデバイスは、各インターフェイスごとにこれらの手順を 1 回実行します。
例えば、USB デバイスはインターフェイスの集合として実装され、それぞれがインターフェイスクラスを指定することがあります。デバイスに HID クラスを使用する複数の USB インターフェイスがある場合、各インターフェイスは個別の HID インターフェイス として列挙されます。
HIDDevice
とします。
[[vendorId]]
を、そのインターフェイスを公開しているデバイスの vendor ID に設定します。
[[productId]] を、そのインターフェイスを公開しているデバイスの product ID に設定します。
[[productName]] を、そのインターフェイスを公開しているデバイスの product name に設定します。
[[collections]] を、
Report descriptor を解析した結果に設定します。
Window
オブジェクトである場合は、その Navigator
オブジェクトの hid ゲッターを呼び出した結果とし、そうでない場合は
WorkerNavigator
オブジェクトの hid ゲッターを呼び出した結果とします。
[[devices]] に追加します。
requestDevice() の呼び出し結果として
ユーザーがサイトに device へのアクセスを許可している場合は、queue a global
task を 関連グローバルオブジェクト
上で実行し、HID
device task source を用いて イベントを発火し、hid
に対して connect という名前のイベントを、HIDConnectionEvent を使用して発生させ、その device
属性を device に初期化します。
report descriptor を解析するには、次の手順を実行します。
システムは通常、デバイスが最初に接続されたときに各 HID インターフェイス の report descriptor の バイト列 を読み取り、値をシステムレジストリにキャッシュします。report descriptor が利用できないが、各レポートのレイアウトを再構成するために使用できる情報をシステムが提供する場合、ユーザーエージェントは report descriptor の解析の代わりに別のアルゴリズムを使用してもよいです。
report descriptor の形式は [USBIF-HID-CLASS] の 6.2.2 節に記述されています。以下のアルゴリズムは、その節で説明されている解析アルゴリズムと同じものを実装することを意図しています。
report descriptor には 3 つのクラスのアイテムが含まれます。Main items はデータフィールドの定義とグループ化に使用されます。Global items と Local items はデータフィールドを記述します。 Local items は次の Main item にのみ適用される特性を定義し、Global items は、その後に定義されるすべての Main items に影響する特性を定義します。
各アイテムは、0、1、2、または 4 バイトの当該アイテムに関連するデータを含む item data field と、bSize field という、item data field の格納に使用されるバイト数を記述するフィールドを持ちます。各アイテムには、その種類を識別するタグもあります。
HIDCollectionInfo)として初期化します。
unsigned long)として初期化します。
unitSystem"] を
"none" に設定します。
unitExponent"] を
0 に設定します。
unitFactorLengthExponent"]
を
0 に設定します。
unitFactorMassExponent"] を
0 に設定します。
unitFactorTimeExponent"] を
0 に設定します。
unitFactorTemperatureExponent"]
を 0 に設定します。
unitFactorCurrentExponent"]
を
0 に設定します。
unitFactorLuminousIntensityExponent"]
を 0 に設定します。
logicalMinimum"] を 0 に設定します。
logicalMaximum"] を 0 に設定します。
physicalMinimum"] を 0 に設定します。
physicalMaximum"] を 0 に設定します。
Main items は [USBIF-HID-CLASS] の 6.2.2.4 から 6.2.2.6 節に記述されています。Input tag、 Output tag、または Feature tag を持つアイテムは、入力・出力・フィーチャーレポート内のフィールドを定義します。item data field は、Main item が Input tag、Output tag、 または Feature tag を持つ場合、データフィールドを記述する複数の真偽値パラメータからなるビットフィールドです。Collection tag を持つアイテムは、現在のコレクション内に新しいコレクションを入れ子に定義するか、現在のコレクションが存在しない場合は新しい top-level collection を定義します。Main item が Collection tag を持つ場合、その item data field には collection type が含まれます。End Collection tag を持つアイテムは、現在のコレクションを閉じます。
reportId"] とします。
inputReports"]
(item が Input tag を持つ場合)
outputReports"]
(item が Output tag を持つ場合)
featureReports"]
(item が Feature tag を持つ場合)
reports に、
その reportId
属性が reportId
に等しい要素が含まれている場合は、report をその要素とします。
それ以外の場合:
HIDReportInfo
辞書とします。
reportId"]
を
reportId に設定します。
items"]
を、
空の sequence
(要素は HIDReportItem)
に設定します。
items"]
に追加します。
HIDCollectionInfo
辞書とします。
usagePage"]
を
globalState["usagePage"]
に設定します。
usage"] を
usage に設定します。
type"] を、
コレクションの種類を表す値に設定します。
children"] を
空の sequence(要素は HIDCollectionInfo)に設定します。
inputReports"]
を空の sequence(要素は HIDReportInfo)に設定します。
outputReports"]
を空の sequence(要素は HIDReportInfo)に設定します。
featureReports"]
を空の sequence(要素は HIDReportInfo)に設定します。
もし ancestors が 空 であれば、append により collection を collections に追加します。
それ以外の場合:
unsigned
long)に設定します。
Global items は 6.2.2.7 節に記述されています。 Usage Page tag、 Logical Minimum tag、 Logical Maximum tag、 Physical Minimum tag、 Physical Maximum tag、 Unit Exponent tag、 Unit tag、 Report Size tag、 Report ID tag、 および Report Count tag は、グローバルアイテム状態テーブルのそれぞれのフィールドを変更します。Push tag を持つアイテムは、現在のグローバルアイテム状態テーブルのコピーをアイテム状態スタックにプッシュします。Pop tag を持つアイテムは、アイテム状態スタックの先頭の内容でグローバルアイテム状態テーブルを置き換えます。アイテム状態スタックを操作しても、グローバルな Report ID の値は影響を受けません。
unsigned long として解釈した値とします。
usagePage"]
を
value に設定します。
logicalMinimum"]
を
value に設定します。
logicalMaximum"]
を
value に設定します。
physicalMinimum"]
を
value に設定します。
physicalMaximum"]
を
value に設定します。
reportSize"] を
value に設定します。
reportId"] を
value に設定します。
reportCount"]
を value に設定します。
unitSystem"]
を
"none"
に設定
unitSystem"]
を
"si-linear"
に設定
unitSystem"]
を
"si-rotation"
に設定
unitSystem"]
を
"english-linear"
に設定
unitSystem"]
を
"english-rotation"
に設定
unitSystem"]
を
"vendor-defined"
に設定
unitSystem"]
を
"reserved"
に設定
unitFactorLengthExponent"]
を nibbles[1] に設定します。
unitFactorMassExponent"]
を nibbles[2] に設定します。
unitFactorTimeExponent"]
を nibbles[3] に設定します。
unitFactorTemperatureExponent"]
を nibbles[4] に設定します。
unitFactorCurrentExponent"]
を nibbles[5] に設定します。
unitFactorLuminousIntensityExponent"]
を nibbles[6] に設定します。
unitExponent"]
を、
item data field
の最下位 4 ビットを符号付き 2 の補数整数として解釈した結果に設定します。
Local items は 6.2.2.8 節に記述されています。 Usage tag、Usage Minimum tag、 Usage Maximum tag、String Index tag、 String Minimum tag、または String Maximum tag を持つアイテムは、ローカルアイテム状態テーブルのそれぞれのフィールドを変更します。ローカルアイテムの状態は各 Main item の後にクリアされます。
unsigned long として解釈した値とします。
usageMinimum"] を
value に設定します。
usageMaximum"] を
value に設定します。
"stringMinimum"] を value に設定します。
"stringMaximum"] を value に設定します。
HID レポートアイテムを作成するには、item、localState、globalState、usages、stringIndices を用いて次の手順を実行します。
HIDReportItem
辞書とします。
unsigned long として解釈した値とします。
boolean
値の list とします。
isConstant"] を bitfield[0]
に設定します。
isArray"] を !bitfield[1]
に設定します。
isAbsolute"] を
!bitfield[2] に設定します。
wrap"] を
bitfield[3] に設定します。
isLinear"] を !bitfield[4]
に設定します。
hasPreferredState"] を
bitfield[5] に設定します。
hasNull"] を bitfield[6] に設定します。
isVolatile"] を bitfield[7]
に設定します。
isBufferedBytes"] を
bitfield[8] に設定します。
usages"] を usages に設定します。
reportSize"] を
globalState["reportSize"] に設定します。
reportCount"] を
globalState["reportCount"]
に設定します。
unitExponent"] を
globalState["unitExponent"]
に設定します。
unitSystem"] を
globalState["unitSystem"] に設定します。
unitFactorLengthExponent"]
を
globalState["unitFactorLengthExponent"]
に設定します。
unitFactorMassExponent"] を
globalState["unitFactorMassExponent"]
に設定します。
unitFactorTimeExponent"] を
globalState["unitFactorTimeExponent"]
に設定します。
unitFactorTemperatureExponent"]
を globalState["unitFactorTemperatureExponent"]
に設定します。
unitFactorCurrentExponent"]
を
globalState["unitFactorCurrentExponent"]
に設定します。
unitFactorLuminousIntensityExponent"]
を
globalState["unitFactorLuminousIntensityExponent"]
に設定します。
logicalMinimum"] を
globalState["logicalMinimum"] に設定します。
logicalMaximum"] を
globalState["logicalMaximum"] に設定します。
もし localState に "usageMinimum"
が含まれている場合、
reportItem["usageMinimum"] を
localState["usageMinimum"] に設定します。
もし localState に "usageMaximum"
が含まれている場合、
reportItem["usageMaximum"] を
localState["usageMaximum"] に設定します。
isRange"] を、reportItem["usageMinimum"] が
reportItem["usageMaximum"] より小さい場合は
true、それ以外は false に設定します。
"stringMinimum" と "stringMaximum" が存在する場合:
システムで HID インターフェイス が利用できなくなった場合、次の手順を実行します。
[[devices]] の中で当該インターフェイスを表す HIDDevice とします。
Window
オブジェクトである場合は、その Navigator
オブジェクトの hid ゲッターを呼び出した結果とし、そうでない場合は
WorkerNavigator
オブジェクトの hid ゲッターを呼び出した結果とします。
[[devices]] から削除します。
requestDevice() の呼び出し結果として
ユーザーがサイトに device へのアクセスを許可している場合は、queue a global
task を 関連グローバルオブジェクト
上で実行し、HID
device task source を用いて イベントを発火し、hid
に対して disconnect という名前のイベントを、HIDConnectionEvent を使用して発生させ、その device
属性を device に初期化します。
getDevices() メソッドの手順は次のとおりです:
null とします。DedicatedWorkerGlobalScope
または window
オブジェクトである場合、document を this の
関連グローバルオブジェクト
の 関連付けられた
Document に設定します。
ServiceWorkerGlobalScope
オブジェクトで、関連する service worker
client が
window client の場合、document を、関連する service worker
client の
グローバルオブジェクト の 関連付けられた
Document に設定します。
null である、または document が 使用が許可されていない
ポリシー制御機能(名前
"hid")である場合、reject により
promise を "SecurityError" の DOMException で拒否して、
promise を返します。
HIDDevice)として設定します。
[[devices]] について:
requestDevice()
の結果として
ユーザーがサイトに device へのアクセスを許可しており、
かつ device.[[state]] が
"forgotten" でない場合、
append により device を devices に追加します。
requestDevice()
の許可ダイアログは、接続されたデバイスの一覧を提示し、ユーザーに 1 つを選択させます。
デバイスに複数の HID インターフェイス がある場合、ダイアログは MAY(〜してもよい) として それらすべてを代表する 1 つの項目のみを表示することがあります。ユーザーが複数の HID インターフェイス を表す項目を選択した場合、 ユーザーエージェントはデバイスが公開するすべての HID インターフェイス へのアクセスを MUST(必ず)付与しなければなりません。
requestDevice() メソッドの手順は次のとおりです:
"hid")である場合、reject により promise
を "SecurityError" の DOMException で拒否して、
promise を返します。
window
でない場合、
reject により promise
を "NotSupportedError"
の DOMException で拒否して、
promise を返します。
SecurityError" の DOMException で拒否して、
promise を返します。
filters"] が存在する場合、
次の手順を for each で
filter ∈
options["filters"] について実行します:
exclusionFilters"]
が
存在する場合、次の手順を実行します:
exclusionFilters"]
が空であれば、reject により promise を TypeError
で拒否して
promise を返します。
exclusionFilters"]
について:
[[devices]] について:
filters"] の
いずれかのフィルターに一致し、
かつ device が
options["exclusionFilters"]
の
いずれのフィルターにも一致しない 場合、
append により device を availableDevices に追加します。
HIDDevice)とします。
[[devices]] について:
[[state]] を
"closed" に設定し、append により device を devices に追加します。
WebIDLdictionary HIDDeviceRequestOptions {
required sequence<HIDDeviceFilter> filters;
sequence<HIDDeviceFilter> exclusionFilters;
};
filters メンバー
exclusionFilters メンバー
WebIDLdictionary HIDDeviceFilter {
unsigned long vendorId;
unsigned short productId;
unsigned short usagePage;
unsigned short usage;
};
vendorId
メンバー
productId
メンバー
vendorId
メンバーが存在しない場合、productId
は無視されます。
usagePage
メンバー
usage メンバー
usagePage メンバーが存在しない場合、
usage は無視されます。
デバイスフィルターは、requestDevice()
により作成される
チューザーダイアログでユーザーに提示されるデバイスの一覧を絞り込むために使用されます。フィルターが提供されない場合、
いずれの除外フィルターにも一致しないすべての接続済みデバイスが含まれます。1 つ以上のフィルターが提供された場合、
いずれかのフィルターに一致し、かつどの除外フィルターにも一致しないデバイスが含まれます。
すべての HIDDeviceFilter
のメンバーは任意です。各メンバーは 1 つの規則を指定します。HIDDeviceFilter に一致するには、
すべての規則を満たす必要があります。空の HIDDeviceFilter は任意のデバイスに一致します。
デバイス ID 規則は、ベンダー ID と
プロダクト ID
によってデバイスを選択するために使用されます。これは、アプリケーションが特定のデバイスでのみ動作するよう設計されている場合や、
ベンダー固有の機能に依存している場合に有用です。
vendorId 規則を含めると、
フィルターは指定された ベンダー ID を持つデバイスのみに一致します。
さらに productId 規則も含めた場合、
フィルターは指定された ベンダー ID と
プロダクト ID を持つデバイスにのみ一致します。
productId は、
vendorId
規則なしで指定された場合は無視されます。
Usage 規則は、デバイスの トップレベルコレクション に割り当てられた
HID usage によってデバイスを選択するために使用されます。これは、
アプリケーションが標準的なデバイスクラスで動作するよう設計されている場合に有用です。デバイスに一致するには、少なくとも 1 つのコレクションがすべての usage
規則に一致しなければなりません。
usagePage 規則を含めると、
デバイスに指定された usage page を持つコレクションが含まれている場合にのみ一致します。
さらに usage 規則も含めた場合、
フィルターは指定された usage page と
usage ID を持つデバイスにのみ一致します。
usage は、
usagePage
規則なしで指定された場合は無視されます。
デバイス ID 規則と usage 規則は組み合わせることができます。例えば、特定のベンダーのデバイスに一致させつつ、 特定のデバイスクラスを実装するデバイスのみに限定したい場合があります。
exclusionFilters
オプションにより、アプリケーションは
requestDevice()
のチューザーダイアログで
ユーザーに提示されるデバイスのうち、たとえ特定のデバイスクラスを実装していても期待どおりに動作しないことが知られているデバイスを
除外することができます。
HIDDeviceFilter の filter が 有効なフィルター であるのは、次の手順が true を返す場合です:
false を返します。
productId"] が存在し、
filter["vendorId"] が存在しない場合は、
false を返します。
usage"] が存在し、
filter["usagePage"] が存在しない場合は、
false を返します。
true を返します。
HIDDevice の device が、
sequence
filters(HIDDeviceFilter)内の いずれかのフィルターに一致する のは、次の手順が true
を返す場合です:
true を返します。
true を返します。
false を返します。
HIDDeviceFilter の filter が デバイス ID に一致する のは、次の手順が
true を返す場合です:
vendorId" が filter に含まれる場合:
true を返します。
HIDDeviceFilter の filter が いずれかのコレクションに一致する のは、次の手順が
true を返す場合です:
collections について:
true を返します。
false を返します。
HIDDeviceFilter の filter が コレクションに一致する
collection なのは、次の手順が
true を返す場合です:
WebIDL[Exposed=(DedicatedWorker,ServiceWorker,Window), SecureContext]
interface HIDDevice : EventTarget {
attribute EventHandler oninputreport;
readonly attribute boolean opened;
readonly attribute unsigned short vendorId;
readonly attribute unsigned short productId;
readonly attribute DOMString productName;
readonly attribute FrozenArray<HIDCollectionInfo> collections;
Promise<undefined> open();
Promise<undefined> close();
Promise<undefined> forget();
Promise<undefined> sendReport([EnforceRange] octet reportId, BufferSource data);
Promise<undefined> sendFeatureReport(
[EnforceRange] octet reportId,
BufferSource data);
Promise<DataView> receiveFeatureReport([EnforceRange] octet reportId);
};
このインターフェイス上のメソッドは通常、非同期に完了し、HID device task source に作業をキューイングします。
HIDDevice のインスタンスは、次の表に記載の内部スロットとともに作成されます。
| 内部スロット | 初期値 | 説明(非規範的) |
|---|---|---|
| [[state]] |
"closed"
|
HIDDevice のアクティブ状態を追跡します
|
| [[vendorId]] | 0 | デバイスの vendor ID |
| [[productId]] | 0 | デバイスの product ID |
| [[productName]] |
""
|
デバイスの product name |
| [[collections]] |
空の sequence(要素は HIDCollectionInfo)
|
report descriptor を解析して作成された top-level collections |
| [[pendingSendReportPromises]] | 空の list |
保留中の sendReport() の Promise
|
| [[pendingSendFeatureReportPromises]] | 空の list |
保留中の sendFeatureReport()
の Promise
|
| [[pendingReceiveFeatureReportPromises]] | 空の list |
保留中の receiveFeatureReport()
の Promise
|
oninputreport 属性
oninputreport は、
イベントハンドラー
IDL 属性であり、
inputreport
イベント型に対応します。
opened
属性
HIDDevice がデータ転送の準備ができていることを示すフラグです。
opened ゲッターの手順は次のとおりです:
vendorId
属性
vendor ID は、
デバイスの製造元を識別するために vendor ID の発行元によって割り当てられる unsigned short 値です。
vendorId 属性は、デバイスの vendor ID です。
デバイスに vendor ID がない、または
vendor ID にアクセスできない場合、この属性は MUST 0
でなければなりません。
vendorId ゲッターの手順は次のとおりです:
[[vendorId]] を返す。
productId
属性
product ID は、
製品を識別するためにデバイスの製造元によって割り当てられる unsigned short 値です。
productId 属性は、デバイスの
product ID です。デバイスに product ID がない、または
product ID にアクセスできない場合、この属性は
MUST 0 でなければなりません。
productId ゲッターの手順は次のとおりです:
[[productId]] を返す。
productName 属性
製品を識別する文字列です。
USB HID デバイスでは、product name は、デバイスディスクリプタで指定されたインデックス iProduct にある
文字列ディスクリプタの値を含む SHOULD(含めるべき) です。Bluetooth HID デバイスでは、
product name は
デバイス名特性(Device Name characteristic)の値を含む SHOULD(含めるべき) です。
デバイスに product name がない、または
product name が空もしくはアクセスできない場合、
この属性は空文字列を返す MUST(必ず) があります。
productName 文字列には、
デバイスを一意に識別し得るシリアル番号や Bluetooth デバイスアドレスなどの識別子を含める
SHOULD NOT(含めるべきではありません)。
productName ゲッターの手順は次のとおりです:
[[productName]] を返す。
collections 属性
sequence(要素は HIDCollectionInfo)であり、
report descriptor 内の
top-level collections を表します。
collections ゲッターの手順は次のとおりです:
[[collections]] を返す。
入力レポートが device から受信されたとき、次の手順を実行します:
DataView とする。
HID interface が
uses report IDs する場合、
その byte sequence には
レポート ID バイトを含めては MUST NOT なりません。
inputreport という名前のイベントを
device に対して発生させる。HIDInputReportEvent を使用し、
その device 属性を device に、
reportId 属性を
reportId に、
data 属性を
data に初期化する。
open() メソッドの手順は次のとおりです:
[[state]] が "closed" でない場合、
reject により promise を
"InvalidStateError" の
DOMException で拒否し、
promise を返す。
[[state]] を "opening" に設定する。
NetworkError" の
DOMException
で拒否し、
これらの手順を中止する。
[[state]] を "opened" に設定する。
undefined で解決する。
close() メソッドの手順は次のとおりです:
[[state]] が "forgotten" または
"forgetting" の場合、reject により promise を
"InvalidStateError" の
DOMException で拒否し、
promise を返す。
[[state]] を "closing" に設定する。
[[pendingSendReportPromises]]
について:
AbortError" の
DOMException
で拒否する。
[[pendingSendReportPromises]]
を空にする。
[[pendingSendFeatureReportPromises]]
について:
AbortError" の
DOMException
で拒否する。
[[pendingSendFeatureReportPromises]]
を空にする。
[[pendingReceiveFeatureReportPromises]]
について:
AbortError" の
DOMException
で拒否する。
[[pendingReceiveFeatureReportPromises]]
を空にする。
[[state]] を "closed" に設定する。
undefined で解決する。
ユーザーエージェントは API をまたいで権限を統合することを MAY(してもよい) あります。例えば、 WebHID と WebUSB のデバイスアクセスを統一された低レベルデバイスアクセス権限で追跡するなどです。 そのため、このメソッドは将来的に追加の(未特定の)権限も取り消す可能性があります。
forget() メソッドの手順は次のとおりです:
[[devices]] について:
[[state]] を
"forgetting" に設定する。
[[pendingSendReportPromises]]
について:
AbortError"
の
DOMException
で拒否する。
[[pendingSendReportPromises]]
を空にする。
[[pendingSendFeatureReportPromises]]
について:
AbortError"
の
DOMException
で拒否する。
[[pendingSendFeatureReportPromises]]
を空にする。
[[pendingReceiveFeatureReportPromises]]
について:
AbortError"
の
DOMException
で拒否する。
[[pendingReceiveFeatureReportPromises]]
を空にする。
[[state]] を
"forgotten" に設定する。
undefined で解決する。
sendReport() メソッドは、
指定された reportId と data
を持つ出力レポートを送信するために使用されます。
HID interface が
use report IDs しない場合は、レポート ID の代わりに 0 を渡します。
HID interfaces のうち use report IDs するものでは、 レポート ID の値 0 は予約済みであり使用すべきではありません。
sendReport() メソッドの手順は次のとおりです:
[[state]] が "opened" でない場合、
reject により promise を
"InvalidStateError" の
DOMException で拒否し、
promise を返す。
TypeError" の
DOMException で拒否し、
promise を返す。
[[pendingSendReportPromises]]
に追加する。
NotAllowedError"
の
DOMException
で拒否し、
これらの手順を中止する。
NetworkError" の
DOMException
で拒否し、
これらの手順を中止する。
undefined で解決する。
sendFeatureReport()
メソッドは、指定された reportId と
data を持つフィーチャーレポートを送信するために使用されます。
HID
interface が
use report IDs しない場合は、
レポート ID の代わりに 0 を渡します。
HID interfaces のうち use report IDs するものでは、 レポート ID の値 0 は予約済みであり使用すべきではありません。
sendFeatureReport()
メソッドの手順は次のとおりです:
[[state]] が "opened" でない場合、
reject により promise を
"InvalidStateError" の
DOMException で拒否し、
promise を返す。
TypeError" の
DOMException で拒否し、
promise を返す。
[[pendingSendFeatureReportPromises]]
に追加する。
NotAllowedError"
の
DOMException
で拒否し、
これらの手順を中止する。
NetworkError" の
DOMException
で拒否し、
これらの手順を中止する。
undefined で解決する。
receiveFeatureReport()
メソッドは、指定された reportId を持つフィーチャーレポートを要求するために使用されます。
HID interface が
use report IDs しない場合は、
レポート ID の代わりに 0 を渡します。
HID interfaces のうち use report IDs するものでは、 レポート ID の値 0 は予約済みであり使用すべきではありません。
receiveFeatureReport()
メソッドの手順は次のとおりです:
[[state]] が "opened" でない場合、
reject により promise を
"InvalidStateError" の
DOMException で拒否し、
promise を返す。
TypeError" の
DOMException で拒否し、
promise を返す。
[[pendingReceiveFeatureReportPromises]]
に追加する。
NotAllowedError"
の
DOMException
で拒否し、
これらの手順を中止する。
DataView とする。
NetworkError" の
DOMException
で拒否し、
これらの手順を中止する。
WebIDL[Exposed=(DedicatedWorker,ServiceWorker,Window), SecureContext]
interface HIDConnectionEvent : Event {
constructor(DOMString type, HIDConnectionEventInit eventInitDict);
[SameObject] readonly attribute HIDDevice device;
};
device 属性
HIDDevice インスタンス。
WebIDLdictionary HIDConnectionEventInit : EventInit {
required HIDDevice device;
};
device メンバー
WebIDL[Exposed=(DedicatedWorker,ServiceWorker,Window), SecureContext]
interface HIDInputReportEvent : Event {
constructor(DOMString type, HIDInputReportEventInit eventInitDict);
[SameObject] readonly attribute HIDDevice device;
readonly attribute octet reportId;
readonly attribute DataView data;
};
device 属性
HIDDevice
インスタンス。
reportId 属性
data
属性
DataView。
HID インターフェイス が
report ID を使用する場合は
reportId バイトを除外。
WebIDLdictionary HIDInputReportEventInit : EventInit {
required HIDDevice device;
required octet reportId;
required DataView data;
};
device メンバー
reportId メンバー
data メンバー
WebIDLdictionary HIDCollectionInfo {
unsigned short usagePage;
unsigned short usage;
octet type;
sequence<HIDCollectionInfo> children;
sequence<HIDReportInfo> inputReports;
sequence<HIDReportInfo> outputReports;
sequence<HIDReportInfo> featureReports;
};
デバイスがシステムに初めて接続されたとき、システムはそのデバイスが公開する各 HID インターフェイス の レポート記述子を取得しなければならない (MUST)。 レポート記述子は 各レポートの構成を記述する階層的なデータ構造に展開できる バイト列である。 このデータ構造の要素は item と呼ばれる。関係を共有する item のグループは collection と呼ばれる。
HIDCollectionInfo オブジェクトは、
レポート記述子内の 1 つの collection を表す。
collection が入れ子の collection を含む場合、入れ子の collection は
children の要素として含まれる。
inputReports、
outputReports、
および featureReports 属性には、
この collection 内で記述される各レポートについての情報を与える
sequence の
HIDReportInfo が含まれる。
トップレベル collection では、
HIDReportInfo はレポートを構成する全 item の平坦化ビューを表す。
平坦化ビューでは、入れ子の collection 内の item と
トップレベル collection 内の item が交互に並ぶ。
入れ子の collection では、HIDReportInfo は
当該 collection とその入れ子 collection に含まれる item のみを含む。
usagePage メンバー
この collection に関連付けられた HID usage の usage page 要素。
HID usages は、アプリケーションが item や collection の目的・意味を識別するために解釈できる定数である。
HID usage は、
上位ビットの unsigned short な usage page と、
下位ビットの unsigned short な usage ID からなる unsigned long 値である。
標準的な HID usage の値は
[USBIF-HID-CLASS]
および
USB Implementers Forum の他の文書で記載されている。
デバイスが公開する トップレベル collection の HID usage は、一般的なデバイス種別の識別に用いられる。
usage メンバー
この collection に関連付けられた HID usage の usage ID 要素。
usage ID は、 usage page 上の個々の HID usage を選択するために使われる。 慣例により、usage ID の 0x01〜0x1F は トップレベル collection に予約されている。
type メンバー
collection type を表す値。
| Collection type | 値 |
|---|---|
| Physical | 0x00 |
| Application | 0x01 |
| Logical | 0x02 |
| Report | 0x03 |
| Named Array | 0x04 |
| Usage Switch | 0x05 |
| Usage Modified | 0x06 |
| 将来の使用のために予約 | 0x07 〜 0x7F |
| ベンダー定義 | 0x80 〜 0xFF |
各 collection type は、グループ化された item 間の異なる種類の関係を記述する。 USBIF-HID-CLASS の 6.2.2.6 節を参照のこと。
children メンバー
HIDCollectionInfo。
inputReports メンバー
HIDReportInfo。
outputReports メンバー
HIDReportInfo。
featureReports メンバー
HIDReportInfo。
WebIDLdictionary HIDReportInfo {
octet reportId;
sequence<HIDReportItem> items;
};
HIDReportInfo は、
レポート記述子内の 1 つの入力・出力・フィーチャーレポートを表す。
reportId メンバー
reportId メンバーがそのプレフィックスであり、そうでなければ 0。
items メンバー
HIDReportItem。
WebIDLdictionary HIDReportItem {
boolean isAbsolute;
boolean isArray;
boolean isBufferedBytes;
boolean isConstant;
boolean isLinear;
boolean isRange;
boolean isVolatile;
boolean hasNull;
boolean hasPreferredState;
boolean wrap;
sequence<unsigned long> usages;
unsigned long usageMinimum;
unsigned long usageMaximum;
unsigned short reportSize;
unsigned short reportCount;
byte unitExponent;
HIDUnitSystem unitSystem;
byte unitFactorLengthExponent;
byte unitFactorMassExponent;
byte unitFactorTimeExponent;
byte unitFactorTemperatureExponent;
byte unitFactorCurrentExponent;
byte unitFactorLuminousIntensityExponent;
long logicalMinimum;
long logicalMaximum;
long physicalMinimum;
long physicalMaximum;
sequence<DOMString> strings;
};
isAbsolute メンバー
true。
データが相対値(前回レポートからの変化量を示す)の場合は false。
isArray メンバー
true。
各データフィールドが値を含む可変データフィールドをレポートに生成する場合は false。
isBufferedBytes メンバー
true、数値量であれば false。
isConstant メンバー
true。
修正可能なデバイスデータを含むレポートフィールドを定義する場合は false。
isLinear メンバー
true、何らかの処理が施されている場合は false。
isRange メンバー
usageMinimum と
usageMaximum により定義される
HID usage 範囲から usage を割り当てる場合は true。
項目が sequence の
HID usage 値を
usages に持つ場合は false。
isVolatile メンバー
ホストの操作なしに値が変化し得る場合は true、値がホストによってのみ変更されるべき場合は false。
フィーチャーおよび出力項目でのみ使用。
hasNull メンバー
true、持たない場合は false。
null 状態では、項目は指定された
logicalMinimum と
logicalMaximum の範囲外の値を報告する。
hasPreferredState メンバー
true、
そうでない場合は false。
wrap メンバー
true、
ロールオーバーしない場合は false。
usages メンバー
isRange が true の場合、または
この項目に関連付けられた HID usage 値がない場合、
usages は未定義でなければならない (MUST)。
isRange が false の場合、
usages は
この項目に関連付けられた HID usage 値の
sequence である。
usageMinimum メンバー
isRange が true の場合、
usageMinimum は
この項目に関連付けられた usage 範囲の最小の
HID usage 値を含む。
isRange が false の場合、
usageMinimum は未定義でなければならない
(MUST)。
usageMaximum メンバー
isRange が true の場合、
usageMaximum は
この項目に関連付けられた usage 範囲の最大の
HID usage 値を含む。
isRange が false の場合、
usageMaximum は未定義でなければならない
(MUST)。
reportSize メンバー
reportSize は 0 より大きくなければならない
(MUST)。
reportCount メンバー
reportCount は 0 より大きくなければならない
(MUST)。
unitExponent メンバー
unitSystem メンバー
HIDUnitSystem 列挙値。
項目に単位定義がない場合は "none"。
unitFactorLengthExponent メンバー
unitFactorMassExponent メンバー
unitFactorTimeExponent メンバー
unitFactorTemperatureExponent メンバー
unitFactorCurrentExponent
メンバー
unitFactorLuminousIntensityExponent メンバー
logicalMinimum メンバー
logicalMaximum メンバー
physicalMinimum メンバー
logicalMinimum を表す。
physicalMaximum メンバー
logicalMaximum を表す。
strings メンバー
[USBIF-HID-CLASS] の 6.2.2.7 節は 4 つの標準的な単位系を定義している: SI 直線、SI 回転、英米 直線、英米 回転。各項目はこれら 4 つの単位系のいずれか、ベンダー定義の単位系、または単位系なしを使用する。
WebIDLenum HIDUnitSystem {
"none", "si-linear", "si-rotation", "english-linear",
"english-rotation", "vendor-defined", "reserved"
};
"none"
"si-linear"
"si-rotation"
"english-linear"
"english-rotation"
"vendor-defined"
"reserved"
本仕様は、ウェブサイトがアクセス可能な HID デバイスの集合を制限するために、 https://github.com/WICG/webhid リポジトリ内のブロックリストファイルに依存する。
URL url にあるブロックリストを 解析した結果は、 sequence の辞書オブジェクトであり、 url を取得して、その内容を JSON として解析することで生成される。
HID ブロックリストは、 ブロックリストの解析を https://github.com/WICG/webhid/blob/main/blocklist.txt で行った結果である。
次の手順が true を返す場合、レポートは
ブロックされたレポートである:
true を返す。
false を返す。
次の手順が true を返す場合、レポートは規則 rule により
ブロックされる:
"input"、
出力レポートなら "output"、フィーチャーレポートなら "feature" とする。
"vendor" を含み、かつ rule["vendor"] が
device.vendorId と一致しない場合は false を返す。
"product" を含み、かつ rule["product"] が
device.productId と一致しない場合は false を返す。
"reportId" を含み、かつ rule["reportId"] が
reportId と一致しない場合は false を返す。
"reportType" を含み、かつ rule["reportType"] が
reportType と一致しない場合は false を返す。
"usagePage" を含み、かつ rule["usagePage"] が
collection["usagePage"] と一致しない場合は
false を返す。
"usage" を含み、かつ rule.["usage"] が
collection["usage"] と一致しない場合は
false を返す。
true を返す。
本仕様は、hid 属性が
Navigator
オブジェクト上で公開されるかどうかを制御する機能を定義する。
この機能の機能名は "hid" である。
この機能の既定の許可リストは
'self' である。
非規範と明記されたセクションに加え、この仕様のすべての作成ガイドライン、図、例、注記は非規範である。これ以外のすべては規範である。
本文書における MAY, MUST, MUST NOT, SHOULD, SHOULD NOT というキーワードは、 BCP 14 [RFC2119] および [RFC8174] に従って解釈される。 ただし、ここに示すようにすべて大文字で現れる場合に限る。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: