1. 소개
이 절은 비규범적이다.
HID(Human Interface Device, 인간 인터페이스 장치)는 사람에게서 입력을 받거나 사람에게 출력을 제공하는 장치의 한 유형이다. HID는 호스트와 장치 간의 양방향 통신을 위한 표준인 HID 프로토콜을 가리키기도 한다. 이 프로토콜은 설치 절차를 간소화하도록 설계되었다. HID 프로토콜은 원래 USB 장치용으로 개발되었지만 이후 Bluetooth를 포함한 여러 다른 프로토콜에서도 구현되었다.
웹 플랫폼은 이미 많은 HID 장치의 입력을 지원한다. 키보드, 포인팅 장치, 게임패드는 보통 HID 프로토콜로 구현된다. 그러나 이 지원은 HID 입력을 고수준 입력 API로 변환하는 운영체제의 HID 드라이버에 의존한다. 호스트의 HID 드라이버가 충분히 지원하지 않는 장치는 웹페이지에서 접근할 수 없는 경우가 많다. 마찬가지로 호스트의 HID 드라이버가 지원하지 않는 대부분의 장치 출력에도 접근할 수 없다.
관련 해설 문서도 참고한다.
2. 도입 동기가 되는 응용 사례
이 절은 비규범적이다.
2.1. 특수 용도 장치
가장 일반적인 HID 입력 장치 유형은 기존 고수준 입력 API를 통해 웹 플랫폼에서 이미 충분히 지원된다. 예를 들어 마우스 입력은 PointerEvent을
통해, 키보드 입력은 KeyboardEvent을
통해 접근할 수 있다. 이러한 장치의 입력은 호스트의 기본 HID 드라이버로 처리하며, 올바른 동작을 위해 보통 장치별 드라이버나 설정이 필요하지 않다. WebHID는 이처럼 고수준 입력
API로 이미 충분히 지원되는 장치를 위한 것이 아니다.
일부 HID 장치 유형에 대해서는 웹 플랫폼이 특정 기능은 지원하면서 다른 기능의 접근은 제한한다. 예를 들어 [GAMEPAD]는 대부분의 게임 컨트롤러의 입력 기능은 지원하지만 LED 표시등이나 오디오처럼 덜 일반적인 기능은 지원하지 않는다. 이러한 기능은 호스트 API가 충분히 지원하지 않는 경우가 많고, 사용자 에이전트에 지원을 추가하면 상당한 복잡성을 초래할 수 있다. WebHID는 고수준 API가 제공하는 기능이 불완전할 때 응용 프로그램에 대안을 제공한다.
많은 HID 장치는 어떤 웹 플랫폼 API로도 지원되지 않는다. HID 명세는 가상현실 제어 장치, 비행 시뮬레이터, 의료 장비 등을 포함해 HID로 지원할 수 있는 다양한 장치를 설명한다. WebHID는 추가 드라이버나 사용자 에이전트의 수정 없이 이러한 장치를 사용할 수 있게 한다.
2.2. 시제품 제작, 취미 및 교육용 장치
HID는 장치를 사용할 각 호스트마다 별도의 드라이버를 요구하지 않고 호스트의 범용 HID 드라이버를 사용할 수 있어 시제품 제작과 취미용 응용에 매력적이다. 간소화된 설치 절차 덕분에 교육자도 각 호스트의 시스템 설정을 수정하지 않고 교실의 학생들에게 장치를 배포하기 쉽다. 웹 플랫폼을 통해 HID 장치 접근을 제공하면 설치 요구사항을 더욱 줄일 수 있다. 특히 현재 호스트별 전용 응용 프로그램으로만 지원되는 장치에 유용하다.
3. 보안 및 개인정보 보호 고려사항
이 절은 비규범적이다.
3.1. 장치 접근 권한의 악용
HID 주변 장치는 강력한 기능을 노출할 수 있으며, 사용자의 명시적 동의 없이 페이지가 이를 사용하도록 해서는 안 된다. 예를 들어 HID 주변 장치에는 주변 환경 정보를 수집하는 센서가 있을 수 있다. 장치에는 공개하거나 덮어쓰면 안 되는 개인정보가 저장되어 있을 수 있다. 많은 장치는 펌웨어를 업그레이드하는 기능을 노출한다. 운영체제는 보통 응용 프로그램의 HID 장치 접근을 제한하지 않으며, 때로는 이 접근이 장치를 손상시키거나 저장된 데이터를 훼손하는 데 악용될 수 있다.
어떤 경우에는 장치가 웹페이지에서 전혀 접근해서는 안 되는 기능을 노출할 수 있다. 특정 장치는 공급업체 ID와 제품 ID로 식별하고 열거 과정에서 숨겨 차단할 수 있다. 보고서 설명자를 통해 장치가 자체 기능을 설명할 수 있으므로, 공급업체 ID와 제품 ID를 미리 알 수 없어도 이 정보로 장치 유형을 차단할 수 있다. 이를 위해 HID 용도 값, 즉 보고서 설명자 내 컬렉션에 할당된 값을 검사한다. 예를 들어 최상위 컬렉션에 키보드용 HID 용도가 지정된 장치의 접근을 거부하여 키보드와 유사한 장치의 접근을 차단할 수 있다.
악용을 줄이기 위해 사용자가 명시적으로 접근을 허용하기 전에는 페이지에 장치를 제공하지 않는다. 페이지가 먼저 접근을 요청해야 하며, 사용 가능한 모든 장치를 표시하는 선택기에서 사용자가 장치를 선택하면 권한이 부여된다. 페이지에 접근 권한이 부여되면 장치가 사용 중임을 나타내는 표시기를 보여 준다.
3.2. 장치 공격
HID 프로토콜은 매우 유연하며, 그 유연성을 활용하는 다양한 장치가 설계되어 왔다. 따라서 악성 페이지가 장치에 접근하여 장치 자체를 손상시키는 방식도 다양할 수 있다. HID 주변 장치가 사용자 정의 HID 보고서로 펌웨어 업데이트를 받도록 하는 것은 비교적 흔하다. 장치 제조업체는 펌웨어 바이너리의 진위를 검증하도록 펌웨어 업그레이드 절차를 신중하게 설계해야 하며, 장치의 보안을 약화할 수 있는 다운그레이드도 방지하는 것이 좋다. 신뢰할 수 없는 업그레이드는 장치에 새로운 기능을 추가하거나 완전히 다른 유형의 장치로 위장시키는 데 사용될 수 있다.
예상 범위를 벗어난 입력이 제공되면 손상되는 장치도 있다. 예를 들어 페이지가 잘못된 진동 명령을 보내면 게임패드의 진동 기능이 손상될 수 있다.
일반적으로 이러한 공격은 장치에 종속적이며 API 수준에서 완화할 수 없다.
3.3. 호스트 공격
악성 페이지가 장치 접근 권한을 얻으면 경우에 따라 이를 호스트 공격에 사용할 수 있다. 주요 우려 사항은 장치가 신뢰할 수 있는 입력 이벤트를 생성하는 데 사용될 수 있는지 여부이다. 이러한 이벤트는 사용자 의사를 대신 나타내며 더 강력한 웹 플랫폼 기능에 접근하는 데 사용될 수 있다.
마우스와 키보드는 보통 HID 주변 장치로 구현되며 신뢰할 수 있는 입력도 생성할 수 있다. HID 키보드나 마우스에는 입력 시퀀스를 저장했다가 나중에 재생할 수 있는 프로그래밍 가능한 매크로와 같은 고급 기능이 있을 수 있다. 장치 제조업체는 악성 앱이 예상치 못한 입력 시퀀스로 장치를 재프로그래밍하지 못하도록 이러한 기능을 신중히 설계해야 한다. 또한 사용자의 명시적 동의 없이 매크로 재생이 시작되지 않도록 보호해야 한다.
3.4. 완화 대책
보안 및 개인정보 보호 위험을 줄이기 위해 사용자 에이전트는 장치 접근 요청에 선택기 기반 흐름을 구현할 것을 권장한다. 페이지가 HID 장치 접근을 요청하면 사용자 에이전트는 페이지가 장치에 접근하려 한다는 사실을 알리는 대화 상자를 표시하는 것이 좋다. 대화 상자에는 연결된 HID 장치의 목록을 표시하고 페이지에 노출할 장치를 선택하도록 요청하는 것이 좋다. 실수로 클릭할 가능성을 줄이기 위해 대화 상자는 두 번의 별도 상호작용을 요구하는 것이 좋다. 첫 번째는 목록에서 장치를 선택하는 동작이고, 두 번째는 선택을 확인하고 대화 상자를 닫는 동작이다.
4.
확장 대상: Navigator 인터페이스
[SecureContext ]partial interface Navigator { [SameObject ]readonly attribute HID hid ; };
4.1. hid 속성
hid
속성을 가져올 때는 언제나 HID 객체의 동일한 인스턴스를
반환한다.
5. 확장 대상: WorkerNavigator 인터페이스
[Exposed =(DedicatedWorker ,ServiceWorker ),SecureContext ]partial interface WorkerNavigator { [SameObject ]readonly attribute HID hid ; };
5.1. hid
속성
hid
속성을 가져올 때는 언제나 HID 객체의 동일한 인스턴스를
반환한다.
6. HID 인터페이스
[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
참고: 사용자 에이전트 구현은 조건부 노출을 선택할 수
있다. 대상은 hid
속성(소유 객체: Navigator)이며,
관련 전역 객체(소유 객체: Navigator)가
ServiceWorkerGlobalScope인
경우에 해당한다. 예를 들어 브라우저 확장 컨텍스트가 이에 해당하며, [browserext]에서 설명한다.
HID의 인스턴스는 다음 표에서
설명하는 내부 슬롯을 갖도록 생성한다:
| 내부 슬롯 | 초깃값 | 설명(비규범적) |
|---|---|---|
[[devices]]
| 비어 있는 순서 있는 집합 |
하나의 순서 있는 집합 구성 요소: HIDDevice
인스턴스. 다음을 나타낸다:
HID 인터페이스
현재 시스템에서 사용할 수 있는 인터페이스이다.
|
onconnect속성, 자료형: EventHandler-
onconnect해당 속성은 이벤트 처리기 IDL 속성 이며 다음의connect이벤트 유형에 대응한다. ondisconnect속성, 자료형: EventHandler-
ondisconnect해당 속성은 이벤트 처리기 IDL 속성 이며 다음의disconnect이벤트 유형에 대응한다.
예를 들어 USB 장치는 인터페이스의 집합으로 구현되며 각 인터페이스는 인터페이스 클래스를 지정할 수 있다. 장치에 HID 클래스를 사용하는 USB 인터페이스가 여러 개 있으면 각 인터페이스는 별개의 HID 인터페이스로 열거된다.
-
device을(를)
HIDDevice(으)로 둔다. -
device.
[[vendorId]]의 값을 해당 인터페이스를 노출하는 장치의 공급업체 ID로 설정한다. -
device.
[[productId]]의 값을 해당 인터페이스를 노출하는 장치의 제품 ID로 설정한다. -
device.
[[productName]]의 값을 해당 인터페이스를 노출하는 장치의 제품 이름으로 설정한다. -
device.
[[collections]]의 값을 보고서 설명자 파싱의 결과로 설정한다. -
hid을(를) 다음 호출의 결과로 둔다: device의 관련 전역 객체의
Navigator객체의hid게터. 이는 device의 관련 전역 객체가Window객체일 때 해당한다. 그렇지 않으면 device의 관련 전역 객체의WorkerNavigator객체의hid게터를 호출한 결과로 둔다. -
추가한다: device을(를) hid.
[[devices]]에 추가한다. -
사용자가 사이트의 device 접근을 이전의
requestDevice()호출 결과로 허용했다면 전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 hid이며 HID 장치 태스크 소스를 사용한다. 이 태스크는 이벤트를 발생시킨다. 이름은connect, 대상은 hid, 사용 인터페이스는HIDConnectionEvent이며,device속성을 device(으)로 초기화한다.
보고서 설명자 형식은 [USBIF-HID-CLASS]의 6.2.2절에서 설명한다. 아래 알고리즘은 해당 절에 기술된 것과 동일한 파싱 알고리즘을 구현하기 위한 것이다.
보고서 설명자에는 세 종류의 항목이 들어 있다. 주 항목은 데이터 필드를 정의하고 묶는 데 사용한다. 전역 항목과 지역 항목은 데이터 필드를 설명한다. 지역 항목은 바로 다음 주 항목에만 적용되는 특성을 정의하는 반면, 전역 항목은 이후에 정의되는 모든 주 항목에 영향을 주는 특성을 정의한다.
각 항목에는 항목 데이터 필드가 있으며, 항목과 관련된 0, 1, 2 또는 4바이트의 데이터를 담는다. 또한 bSize 필드가 있어 항목 데이터 필드를 저장하는 데 사용하는 바이트 수를 설명한다. 각 항목에는 유형을 식별하는 태그도 있다.
-
items을(를) 보고서 설명자의 바이트 시퀀스를 리스트로 변환한 결과로 둔다. 이 리스트는 주 항목, 전역 항목 및 지역 항목으로 구성된다.
-
collections을(를) 비어 있는 시퀀스(원소 유형:
HIDCollectionInfo)로 초기화한다. -
ancestors을(를) 비어 있는 리스트로 초기화한다.
-
localState을(를) 비어 있는 순서 있는 맵으로 초기화한다.
-
usages을(를) 비어 있는 시퀀스(원소 유형:
unsigned long)로 초기화한다. -
stringIndices을(를) 비어 있는 리스트로 초기화한다.
-
globalStack을(를) 비어 있는 스택으로 초기화한다.
-
initialGlobalState을(를) 비어 있는 순서 있는 맵으로 초기화한다.
-
reportId을(를) 0으로 초기화한다.
-
initialGlobalState["
unitSystem"]의 값을"none"(으)로 설정한다. -
initialGlobalState["
unitExponent"]의 값을 0으로 설정한다. -
initialGlobalState["
unitFactorLengthExponent"]의 값을 0으로 설정한다. -
initialGlobalState["
unitFactorMassExponent"]의 값을 0으로 설정한다. -
initialGlobalState["
unitFactorTimeExponent"]의 값을 0으로 설정한다. -
initialGlobalState["
unitFactorTemperatureExponent"]의 값을 0으로 설정한다. -
initialGlobalState["
unitFactorCurrentExponent"]의 값을 0으로 설정한다. -
initialGlobalState["
unitFactorLuminousIntensityExponent"]의 값을 0으로 설정한다. -
initialGlobalState["
logicalMinimum"]의 값을 0으로 설정한다. -
initialGlobalState["
logicalMaximum"]의 값을 0으로 설정한다. -
initialGlobalState["
physicalMinimum"]의 값을 0으로 설정한다. -
initialGlobalState["
physicalMaximum"]의 값을 0으로 설정한다. -
푸시한다: initialGlobalState을(를) globalStack에 푸시한다.
-
각각에 대해, 즉 item(대상: items)마다:
참고: 주 항목은 [USBIF-HID-CLASS]의 6.2.2.4절부터 6.2.2.6절까지에서 설명한다. Input 태그, Output 태그 또는 Feature 태그가 있는 항목은 입력, 출력 또는 기능 보고서의 필드를 정의한다. 항목 데이터 필드는, 주 항목에 Input 태그, Output 태그 또는 Feature 태그가 있는 경우, 데이터 필드를 설명하는 여러 불리언 매개변수를 담은 비트 필드이다. Collection 태그가 있는 항목은 현재 컬렉션 안에 중첩된 새 컬렉션을 정의하며, 현재 컬렉션이 없으면 새 최상위 컬렉션을 정의한다. 항목 데이터 필드는, 주 항목에 Collection 태그가 있는 경우, 컬렉션 유형을 담는다. End Collection 태그가 있는 항목은 현재 컬렉션을 닫는다.
-
item이(가) 주 항목이면:
-
item에 Input 태그, Output 태그 또는 Feature 태그가 있으면:
-
globalState을(를) 마지막 항목(대상: globalStack)으로 둔다.
-
reportId을(를) globalState["
reportId"]로 둔다. -
reportItem을(를) HID 보고서 항목 생성의 결과로 둔다. 입력은 item, localState, globalState, usages 및 stringIndices이다.
-
각각에 대해, 즉 collection(대상: ancestors)마다:
-
reports을(를) 다음과 같이 둔다:
-
collection["
inputReports"] — item에 Input 태그가 있는 경우, -
collection["
outputReports"] — item에 Output 태그가 있는 경우, 또는 -
collection["
featureReports"] — item에 Feature 태그가 있는 경우.
-
-
reports에 항목이 있고 그
reportId속성이 reportId와 같으면 report을(를) 해당 항목으로 둔다.그렇지 않으면:
-
report을(를) 새
HIDReportInfo딕셔너리로 둔다. -
report["
reportId"]의 값을 reportId(으)로 설정한다. -
report["
items"]의 값을 비어 있는 시퀀스(원소 유형:HIDReportItem)로 설정한다. -
추가한다: report을(를) reports에 추가한다.
-
-
-
-
item에 Collection 태그가 있으면:
-
collection을(를) 새
HIDCollectionInfo딕셔너리로 둔다. -
usage을(를) 첫 번째 항목(대상: usages)으로 둔다.
-
collection["
usage"]의 값을 usage(으)로 설정한다. -
collection["
type"]의 값을 컬렉션의 유형을 나타내는 값으로 설정한다. -
collection["
children"]의 값을 비어 있는 시퀀스(원소 유형:HIDCollectionInfo)로 설정한다. -
collection["
inputReports"]의 값을 비어 있는 시퀀스(원소 유형:HIDReportInfo)로 설정한다. -
collection["
outputReports"]의 값을 비어 있는 시퀀스(원소 유형:HIDReportInfo)로 설정한다. -
collection["
featureReports"]의 값을 비어 있는 시퀀스(원소 유형:HIDReportInfo)로 설정한다. -
ancestors이(가) 비어 있으면 추가한다. 즉, collection을(를) collections에 추가한다.
그렇지 않으면:
-
추가한다: collection을(를) ancestors에 추가한다.
-
-
item에 End Collection 태그가 있으면 제거한다. 즉, 마지막 항목을(를) ancestors에서 제거한다.
-
localState을(를) 비어 있는 순서 있는 맵으로 설정한다.
-
usages을(를) 비어 있는 시퀀스(원소 유형:
unsigned long)로 설정한다.참고: 전역 항목은 6.2.2.7절에서 설명한다. Usage Page 태그, Logical Minimum 태그, Logical Maximum 태그, Physical Minimum 태그, Physical Maximum 태그, Unit Exponent 태그, Unit 태그, Report Size 태그, Report ID 태그 또는 Report Count 태그가 있는 항목은 전역 항목 상태 표의 해당 필드를 수정한다. Push 태그가 있는 항목은 현재 전역 항목 상태 표의 복사본을 항목 상태 스택에 푸시한다. Pop 태그가 있는 항목은 전역 항목 상태 표를 항목 상태 스택의 맨 위 값으로 대체한다. 항목 상태 스택을 조작해도 전역 Report ID 값은 영향을 받지 않는다.
-
item이(가) 전역 항목이면:
-
globalState을(를) 마지막 항목(대상: globalStack)으로 둔다.
-
value을(를) 항목 데이터 필드를
unsigned long(으)로 해석한 값으로 둔다. -
item에 Usage Page 태그가 있으면 globalState["
usagePage"]의 값을 value(으)로 설정한다. -
item에 Logical Minimum 태그가 있으면 globalState["
logicalMinimum"]의 값을 value(으)로 설정한다. -
item에 Logical Maximum 태그가 있으면 globalState["
logicalMaximum"]의 값을 value(으)로 설정한다. -
item에 Physical Minimum 태그가 있으면 globalState["
physicalMinimum"]의 값을 value(으)로 설정한다. -
item에 Physical Maximum 태그가 있으면 globalState["
physicalMaximum"]의 값을 value(으)로 설정한다. -
item에 Report Size 태그가 있으면 globalState["
reportSize"]의 값을 value(으)로 설정한다. -
item에 Report ID 태그가 있으면 globalState["
reportId"]의 값을 value(으)로 설정한다. -
item에 Report Count 태그가 있으면 globalState["
reportCount"]의 값을 value(으)로 설정한다. -
item에 Unit 태그가 있으면:
-
nibbles을(를) value을(를) 시퀀스로 해석한 결과로 둔다. 이 시퀀스는 하위 비트부터 시작하는 4비트 부호 있는 2의 보수 정수 8개로 구성된다.
-
nibbles[0]의 값에 따라:
-
0이면 globalState["
unitSystem"]의 값을"none"(으)로 설정한다. -
1이면 globalState["
unitSystem"]의 값을"si-linear"(으)로 설정한다. -
2이면 globalState["
unitSystem"]의 값을"si-rotation"(으)로 설정한다. -
3이면 globalState["
unitSystem"]의 값을"english-linear"(으)로 설정한다. -
4이면 globalState["
unitSystem"]의 값을"english-rotation"(으)로 설정한다. -
-1이면 globalState["
unitSystem"]의 값을"vendor-defined"(으)로 설정한다. -
그렇지 않으면 globalState["
unitSystem"]의 값을"reserved"(으)로 설정한다.
-
-
globalState["
unitFactorLengthExponent"]의 값을 nibbles[1](으)로 설정한다. -
globalState["
unitFactorMassExponent"]의 값을 nibbles[2](으)로 설정한다. -
globalState["
unitFactorTimeExponent"]의 값을 nibbles[3](으)로 설정한다. -
globalState["
unitFactorTemperatureExponent"]의 값을 nibbles[4](으)로 설정한다. -
globalState["
unitFactorCurrentExponent"]의 값을 nibbles[5](으)로 설정한다. -
globalState["
unitFactorLuminousIntensityExponent"]의 값을 nibbles[6](으)로 설정한다.
-
-
item에 Unit Exponent 태그가 있으면 globalState["
unitExponent"]의 값을 항목 데이터 필드의 최하위 4비트를 부호 있는 2의 보수 정수로 해석한 결과로 설정한다. -
item에 Push 태그가 있으면 푸시한다. 즉, globalState의 복사본을 globalStack에 푸시한다.
-
참고: 지역 항목은 6.2.2.8절에서 설명한다. Usage 태그, Usage Minimum 태그, Usage Maximum 태그, String Index 태그, String Minimum 태그 또는 String Maximum 태그가 있는 항목은 지역 항목 상태 표의 해당 필드를 수정한다. 지역 항목 상태는 각 주 항목 이후에 지워진다.
-
-
item이(가) 지역 항목이면:
-
value을(를) 항목 데이터 필드를
unsigned long(으)로 해석한 값으로 둔다. -
item에 Usage 태그, Usage Minimum 태그 또는 Usage Maximum 태그가 있고 item의 bSize 필드가 1 또는 2인 경우:
-
item에 Usage Minimum 태그가 있으면 localState["
usageMinimum"]의 값을 value(으)로 설정한다. -
item에 Usage Maximum 태그가 있으면 localState["
usageMaximum"]의 값을 value(으)로 설정한다. -
item에 String Index 태그가 있으면 추가한다. 즉, value을(를) stringIndices에 추가한다.
-
item에 String Minimum 태그가 있으면 localState[
"stringMinimum"]의 값을 value(으)로 설정한다. -
item에 String Maximum 태그가 있으면 localState[
"stringMaximum"]의 값을 value(으)로 설정한다.
-
-
-
reportItem을(를) 새
HIDReportItem딕셔너리로 둔다. -
value을(를) 항목 데이터 필드를
unsigned long(으)로 해석한 값으로 둔다. -
bitfield을(를) 리스트로 둔다. 원소는
boolean값이며, value의 각 비트를 하위 비트부터 나타낸다. -
reportItem["
isConstant"]의 값을 bitfield[0](으)로 설정한다. -
reportItem["
isArray"]의 값을 !bitfield[1](으)로 설정한다. -
reportItem["
isAbsolute"]의 값을 !bitfield[2](으)로 설정한다. -
reportItem["
wrap"]의 값을 bitfield[3](으)로 설정한다. -
reportItem["
isLinear"]의 값을 !bitfield[4](으)로 설정한다. -
reportItem["
hasPreferredState"]의 값을 !bitfield[5](으)로 설정한다. -
reportItem["
hasNull"]의 값을 bitfield[6](으)로 설정한다. -
reportItem["
isVolatile"]의 값을 bitfield[7](으)로 설정한다. -
reportItem["
isBufferedBytes"]의 값을 bitfield[8](으)로 설정한다. -
reportItem["
usages"]의 값을 usages(으)로 설정한다. -
reportItem["
reportSize"]의 값을 globalState["reportSize"]로 설정한다. -
reportItem["
reportCount"]의 값을 globalState["reportCount"]로 설정한다. -
reportItem["
unitExponent"]의 값을 globalState["unitExponent"]로 설정한다. -
reportItem["
unitSystem"]의 값을 globalState["unitSystem"]로 설정한다. -
reportItem["
unitFactorLengthExponent"]의 값을 globalState["unitFactorLengthExponent"]로 설정한다. -
reportItem["
unitFactorMassExponent"]의 값을 globalState["unitFactorMassExponent"]로 설정한다. -
reportItem["
unitFactorTimeExponent"]의 값을 globalState["unitFactorTimeExponent"]로 설정한다. -
reportItem["
unitFactorTemperatureExponent"]의 값을 globalState["unitFactorTemperatureExponent"]로 설정한다. -
reportItem["
unitFactorCurrentExponent"]의 값을 globalState["unitFactorCurrentExponent"]로 설정한다. -
reportItem["
unitFactorLuminousIntensityExponent"]의 값을 globalState["unitFactorLuminousIntensityExponent"]로 설정한다. -
reportItem["
logicalMinimum"]의 값을 globalState["logicalMinimum"]로 설정한다. -
reportItem["
logicalMaximum"]의 값을 globalState["logicalMaximum"]로 설정한다. -
reportItem["
physicalMinimum"]의 값을 globalState["physicalMinimum"]로 설정한다. -
reportItem["
physicalMaximum"]의 값을 globalState["physicalMaximum"]로 설정한다. -
"
usageMinimum"과 "usageMaximum"이 모두 localState에 있고 localState["usageMinimum"]의 값이 localState["usageMaximum"]의 값보다 작거나 같으면 reportItem["isRange"]의 값을true로 설정하고, 그렇지 않으면 false로 설정한다. -
reportItem["
isRange"]의 값이true이면 reportItem["usageMinimum"]의 값을 localState["usageMinimum"]로 설정한다. -
reportItem["
isRange"]의 값이true이면 reportItem["usageMaximum"]의 값을 localState["usageMaximum"]로 설정한다. -
"stringMinimum"이(가) localState에 있고"stringMaximum"이(가) localState에 있으면: -
각각에 대해, 즉 stringIndex(대상: stringIndices)마다:
-
reportItem을(를) 반환한다.
-
device을(를)
HIDDevice로 둔다. 이는 hid.[[devices]]에 있으며 해당 인터페이스를 나타낸다. -
hid을(를) 다음 호출의 결과로 둔다: device의 관련 전역 객체의
Navigator객체의hid게터. 이는 device의 관련 전역 객체가Window객체일 때 해당한다. 그렇지 않으면 device의 관련 전역 객체의WorkerNavigator객체의hid게터를 호출한 결과로 둔다. -
제거한다: device을(를) hid.
[[devices]]에서 제거한다. -
사용자가 사이트의 device 접근을 이전의
requestDevice()호출 결과로 허용했다면 전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 hid이며 HID 장치 태스크 소스를 사용한다. 이 태스크는 이벤트를 발생시킨다. 이름은disconnect, 대상은 hid, 사용 인터페이스는HIDConnectionEvent이며,device속성을 device(으)로 초기화한다.
6.1. getDevices() 메서드
getDevices()
메서드 단계는 다음과 같다:
-
promise을(를) 새 프로미스로 둔다.
-
document을(를)
null(으)로 둔다. -
this의 관련 전역 객체가
DedicatedWorkerGlobalScope또는window객체이면 document을(를) this의 관련 전역 객체의 연결된 Document로 설정한다. -
this의 관련 전역 객체가
ServiceWorkerGlobalScope객체이고 연결된 서비스 워커 클라이언트가 윈도 클라이언트이면 document을(를) 연결된 Document로 설정한다. 이는 연결된 서비스 워커 클라이언트의 전역 객체에 연결된 문서이다. -
document이(가)
null이거나, document에 사용이 허용되지 않은 정책 제어 기능의 이름이 "hid"이면 거부한다. 즉, promise을(를) "SecurityError"DOMException(으)로 거부하고 promise을(를) 반환한다. -
다음 단계를 병렬로 실행한다:
-
각각에 대해, 즉 device(대상: this.
[[devices]])마다:-
사용자가 사이트의 device 접근을 이전의
requestDevice()호출 결과로 허용했고 device.[[state]]이(가)"forgotten"이 아니면 추가한다. 즉, device을(를) devices에 추가한다.
-
-
전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 this이며, HID 장치 태스크 소스를 사용한다. 이 태스크는 이행한다. 즉, promise을(를) devices 값으로 이행한다.
-
promise을(를) 반환한다.
6.2. requestDevice() 메서드
requestDevice()
권한 대화 상자는 연결된 장치의 목록을 표시하고 사용자에게 하나를 선택하도록 요청한다.
장치에 여러 HID 인터페이스가 있으면 대화 상자는 하나의 항목만 표시할 수 있다. 그 항목은 모든 인터페이스를 나타낸다. 사용자가 여러 HID 인터페이스를 나타내는 항목을 선택하면 사용자 에이전트는 접근을 허용해야 한다. 허용 대상은 장치가 노출하는 모든 HID 인터페이스이다.
requestDevice()
메서드 단계는 다음과 같다:
-
promise을(를) 새 프로미스로 둔다.
-
this의 관련 전역 객체의 연결된 Document에 사용이 허용되지 않은 정책 제어 기능의 이름이 "hid"이면 거부한다. 즉, promise을(를) "
SecurityError"DOMException(으)로 거부하고 promise을(를) 반환한다. -
관련 전역 객체(소유 객체: this)가
window가 아니면 거부한다. 즉, promise을(를) "NotSupportedError"DOMException(으)로 거부하고 promise을(를) 반환한다. -
관련 전역 객체(소유 객체: this)에 일시적 활성화가 없으면 거부한다. 즉, promise을(를) "
SecurityError"DOMException(으)로 거부하고 promise을(를) 반환한다. -
options["
filters"]이(가) 있으면 다음 단계를 각각에 대해 실행한다. 즉, filter(대상: options["filters"])마다 실행한다: -
options["
exclusionFilters"]이(가) 있으면 다음 단계를 실행한다:-
options["
exclusionFilters"]이(가) 비어 있으면 거부한다. 즉, promise을(를)TypeError(으)로 거부하고 promise을(를) 반환한다. -
각각에 대해, 즉 exclusionFilter(대상: options["
exclusionFilters"])마다:
-
-
다음 단계를 병렬로 실행한다:
-
availableDevices을(를) 비어 있는 리스트로 초기화한다.
-
각각에 대해, 즉 device(대상: this.
[[devices]])마다:-
device이(가) 하나 이상의 필터와 일치하고(필터 목록: options["
filters"]), device이(가) 어떤 필터와도 일치하지 않으면(필터 목록: options["exclusionFilters"]), 추가한다. 즉, device을(를) availableDevices에 추가한다.
-
-
availableDevices의 장치 목록을 표시하여 사용자에게 이 사이트가 HID 장치에 접근하도록 허용할 것을 요청한다.
참고: 사용자 에이전트는 사용자에게 표시하기 전에 장치 목록을 수정할 수 있다. 예를 들어 여러 HID 인터페이스를 가진 장치는 하나의 항목으로 나타내는 것이 좋다. 이 항목을 선택하면 장치가 노출하는 모든 인터페이스에 접근할 수 있도록 한다. 장치가 단일 인터페이스로 구현되었는지 인터페이스 집합으로 구현되었는지는 사용자가 알지 못할 수 있는 구현 세부사항이며, 장치 접근 권한과 관련된 것으로 보지 않는 것이 좋다.
-
사용자가 장치를 선택하지 않으면 전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 this이며, HID 장치 태스크 소스를 사용한다. 이 태스크는 이행한다. 즉, promise을(를) devices 값으로 이행한다. 그런 다음 이 단계를 중단한다.
-
각각에 대해, 즉 device(대상: this.
[[devices]])마다: -
전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 device이며, HID 장치 태스크 소스를 사용한다. 이 태스크는 이행한다. 즉, promise을(를) devices 값으로 이행한다.
-
-
promise을(를) 반환한다.
6.2.1. HIDDeviceRequestOptions 딕셔너리
dictionary HIDDeviceRequestOptions {required sequence <HIDDeviceFilter >filters ;sequence <HIDDeviceFilter >exclusionFilters ; };
filters멤버, 시퀀스 자료형:<HIDDeviceFilter>- HID 장치용 필터.
exclusionFilters멤버, 시퀀스 자료형:<HIDDeviceFilter>- HID 장치용 제외 필터.
6.2.2.
HIDDeviceFilter 딕셔너리
dictionary HIDDeviceFilter {unsigned short vendorId ;unsigned short productId ;unsigned short usagePage ;unsigned short usage ; };
vendorId멤버, 자료형: unsigned short- 다음의 공급업체 ID 와 일치시킨다.
productId멤버, 자료형: unsigned short-
다음의 제품 ID 와 일치시킨다. 다음의
vendorId멤버가 없으면productId는 무시한다. usagePage멤버, 자료형: unsigned short- 다음의 최상위 컬렉션 용도 페이지 와 일치시킨다.
usage멤버, 자료형: unsigned short-
다음의 최상위
컬렉션 용도 ID 와 일치시킨다. 다음의
usagePage멤버가 없으면usage는 무시한다.
requestDevice().
필터가 없으면 어느 제외 필터에도 일치하지 않는 모든 연결된 장치를 포함한다. 필터가 하나 이상 있으면 필터 하나 이상에 일치하고 어느 제외 필터에도 일치하지 않는 장치를 포함한다.
모든 HIDDeviceFilter
멤버는 선택 사항이다. 각 멤버는 규칙 하나를 지정한다. HIDDeviceFilter에
일치하려면 모든 규칙을 만족해야 한다. 비어 있는 HIDDeviceFilter는
어떤 장치에나 일치한다.
장치 ID 규칙은 공급업체 ID와 제품 ID를 기준으로 장치를 선택하는 데 사용한다. 이는
응용 프로그램이 특정 장치에서만 작동하도록 설계되었거나 공급업체 고유 기능에 의존할 때 유용하다. vendorId
규칙을 포함하면 필터는 지정된 공급업체 ID를 갖는 장치에만
일치한다. productId
규칙도 포함하면 필터는 지정된 공급업체 ID와 제품 ID를 갖는 장치에만 일치한다. productId는
vendorId
규칙 없이 지정되면 무시한다.
용도 규칙은 HID 용도, 즉 장치의 최상위 컬렉션에
할당된 값을 기준으로 장치를 선택하는 데 사용한다. 이는 응용 프로그램이 표준 장치 유형과 작동하도록 설계되었을 때 유용하다. 장치에 일치하려면 장치의 컬렉션 중 적어도 하나는 모든 용도
규칙에 일치해야 한다. usagePage
규칙을 포함하면 필터는 장치에 지정된 용도 페이지를 갖는
컬렉션이 있을 때만 일치한다. usage
규칙도 포함하면 필터는 지정된 용도 페이지와 용도 ID를 갖는 장치에만 일치한다. usage는
usagePage
규칙 없이 지정되면 무시한다.
장치 ID 규칙과 용도 규칙은 결합할 수 있다. 예를 들어 응용 프로그램은 특정 공급업체의 장치 중에서도 특정 장치 클래스를 구현한 장치에만 일치시키려 할 수 있다.
exclusionFilters
옵션을 통해 응용 프로그램은 requestDevice()이(가)
만든 선택기 대화 상자에 표시되는 일부 장치를 제외할 수 있다. 이 장치들은 예를 들어 특정 장치 클래스를 구현하더라도 예상대로 작동하지 않는 것으로 알려져 있다.
HIDDeviceFilter
filter 은(는) 다음에 해당한다: 유효한 필터 단, 다음 단계가 반환하는 값이 다음과 같아야 한다: true:
HIDDevice
device 어느 필터에든 일치한다 그 대상은 다음이다: 시퀀스
filters 구성 요소: HIDDeviceFilter
단, 다음 단계가 반환하는 값이 다음과 같아야 한다: true:
-
filters이(가) 비어 있으면
true을(를) 반환한다. -
각각에 대해, 즉 filter(대상: filters)마다:
-
filter이(가) 장치 ID와 일치하고(장치: device), filter이(가) 하나 이상의 컬렉션과 일치하면(컬렉션을 가진 장치: device),
true을(를) 반환한다.
-
-
false을(를) 반환한다.
HIDDeviceFilter
filter 장치 ID에 일치한다 구성 요소: device 단, 다음 단계가 반환하는 값이
다음과 같아야 한다:
true:
HIDDeviceFilter
filter 어느 컬렉션에든 일치한다 구성 요소: device 단, 다음 단계가 반환하는 값이
다음과 같아야 한다:
true:
-
각각에 대해, 즉 collection(대상: device.
collections)마다:-
filter이(가) 컬렉션에 일치하고 그 컬렉션이 collection이면
true을(를) 반환한다.
-
-
false을(를) 반환한다.
HIDDeviceFilter
filter 컬렉션에 일치한다 collection 단, 다음 단계가 반환하는 값이 다음과
같아야 한다: true:
7. HIDDevice 인터페이스
[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 장치 태스크 소스에 작업을 큐에 넣는다.
HIDDevice의
인스턴스는 다음 표에서 설명하는 내부 슬롯을 갖도록 생성한다:
| 내부 슬롯 | 초깃값 | 설명(비규범적) |
|---|---|---|
[[state]]
| "closed"
| 다음의 활성 상태를 추적한다: HIDDevice
|
[[vendorId]]
| 0 | 다음의 공급업체 ID 장치의 값이다. |
[[productId]]
| 0 | 다음의 제품 ID 장치의 값이다. |
[[productName]]
| ""
| 다음의 제품 이름 장치의 값이다. |
[[collections]]
| 비어 있는 시퀀스 구성 요소: HIDCollectionInfo
| 다음의 최상위 컬렉션 생성 방법: 보고서 설명자 파싱 |
[[pendingSendReportPromises]]
| 비어 있는 리스트 | 대기 중인 sendReport()
Promise들
|
[[pendingSendFeatureReportPromises]]
| 비어 있는 리스트 | 대기 중인 sendFeatureReport()
Promise들
|
[[pendingReceiveFeatureReportPromises]]
| 비어 있는 리스트 | 대기 중인 receiveFeatureReport()
Promise들
|
oninputreport속성, 자료형: EventHandler-
oninputreport해당 속성은 이벤트 처리기 IDL 속성 이며 다음의inputreport이벤트 유형에 대응한다. opened속성, 자료형: boolean, 읽기 전용-
다음의 상태를 나타내는 플래그:
HIDDevice데이터를 전송할 준비가 되었는지를 나타낸다. vendorId속성, 자료형: unsigned short, 읽기 전용-
다음의 공급업체
ID 해당 속성은
unsigned short값. 공급업체 ID 발급 기관이 할당하며 장치 제조업체를 식별한다.vendorId속성은 장치의 공급업체 ID이다. 장치에 공급업체 ID가 없거나 공급업체 ID에 접근할 수 없으면 이 속성은 0이어야 한다.다음의vendorId게터의 단계는 다음과 같다:-
this.
[[vendorId]]을(를) 반환한다.
-
productId속성, 자료형: unsigned short, 읽기 전용-
다음의 제품
ID 해당 속성은
unsigned short값. 장치 제조업체가 할당하며 제품을 식별한다.productId속성은 장치의 제품 ID이다. 장치에 제품 ID가 없거나 제품 ID에 접근할 수 없으면 이 속성은 0이어야 한다.다음의productId게터의 단계는 다음과 같다:-
this.
[[productId]]을(를) 반환한다.
-
productName속성, 자료형: DOMString, 읽기 전용-
제품을 식별하는 문자열.
USB HID 장치의 경우 제품 이름에는 장치 설명자에 지정된 인덱스
iProduct의 문자열 설명자 값을 포함하는 것이 좋다. Bluetooth HID 장치의 경우 제품 이름에는 Device Name 특성 값을 포함하는 것이 좋다. 장치에 제품 이름이 없거나 제품 이름이 비어 있거나 접근할 수 없으면 이 속성은 빈 문자열을 반환해야 한다.productName문자열에는 일련번호나 Bluetooth 장치 주소처럼 장치를 고유하게 식별하는 데 사용할 수 있는 식별자를 포함하지 않는 것이 좋다.다음의productName게터의 단계는 다음과 같다:-
this.
[[productName]]을(를) 반환한다.
-
collections속성, 자료형: FrozenArray<HIDCollectionInfo>, 읽기 전용-
다음의 시퀀스 구성 요소:
HIDCollectionInfo다음을 나타낸다: 최상위 컬렉션 포함 위치: 보고서 설명자.다음의collections게터의 단계는 다음과 같다:-
this.
[[collections]]을(를) 반환한다.
참고: 최상위 컬렉션은 장치 내에서 비슷한 목적을 갖는 항목을 묶는다. 응용 프로그램은 HID 용도가 최상위 컬렉션에 어떻게 적용되었는지 살펴 장치를 식별한다. 응용 프로그램이 장치를 인식하지 못할 수도 있다. 이는 장치가 해당 유형의 관례를 따르지 않을 때 발생한다. 표준 HID 장치의 관례적인 동작은 [USBIF-HID-USAGE]를 참고한다.
-
-
입력 보고서가 차단된 보고서이면 이 단계를 중단한다.
-
reportId을(를) 이 보고서의 보고서 ID로 둔다. 단, HID 인터페이스가 보고서 ID를 사용하지 않으면 0으로 둔다.
-
data을(를)
DataView로 둔다. 이는 입력 보고서를 나타내는 바이트 시퀀스를 기반으로 생성한다. HID 인터페이스가 보고서 ID를 사용하면 이 바이트 시퀀스에는 보고서 ID 바이트를 포함해서는 안 된다. -
전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 this이며, HID 장치 태스크 소스를 사용한다. 이 태스크는 이벤트를 발생시킨다. 이름은
inputreport, 대상은 device, 사용 인터페이스는HIDInputReportEvent이며,device속성은 device,reportId속성은 reportId,data속성은 data(으)로 초기화한다.
7.1. open() 메서드
open()
메서드 단계는 다음과 같다:
-
promise을(를) 새 프로미스로 둔다.
-
this.
[[state]]이(가)"closed"이 아니면 거부한다. 즉, promise을(를) "InvalidStateError"DOMException(으)로 거부하고 promise을(를) 반환한다. -
다음 단계를 병렬로 수행한다:
-
운영체제를 호출하여 HID 장치를 연다.
-
어떤 이유로든 실패하면 전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 this이며, HID 장치 태스크 소스를 사용한다. 이 태스크는 거부한다. 즉, promise을(를) "
NetworkError"DOMException(으)로 거부한다. 그런 다음 이 단계를 중단한다. -
전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 this이며, HID 장치 태스크 소스를 사용한다. 이 태스크는 이행한다. 즉, promise을(를)
undefined값으로 이행한다.
-
-
promise을(를) 반환한다.
7.2. close() 메서드
close()
메서드 단계는 다음과 같다:
-
promise을(를) 새 프로미스로 둔다.
-
this.
[[state]]이(가)"forgotten","forgetting","opening"또는"closing"중 하나이면 거부한다. 즉, promise을(를) "InvalidStateError"DOMException(으)로 거부하고 promise을(를) 반환한다. -
각각에 대해, 즉 pendingPromise(대상: this.
[[pendingSendReportPromises]])마다:-
거부한다: pendingPromise을(를) "
AbortError"DOMException(으)로 거부한다.
-
-
비운다: this.
[[pendingSendReportPromises]]을(를) 비운다. -
각각에 대해, 즉 pendingPromise(대상: this.
[[pendingSendFeatureReportPromises]])마다:-
거부한다: pendingPromise을(를) "
AbortError"DOMException(으)로 거부한다.
-
-
비운다: this.
[[pendingSendFeatureReportPromises]]을(를) 비운다. -
각각에 대해, 즉 pendingPromise(대상: this.
[[pendingReceiveFeatureReportPromises]])마다:-
거부한다: pendingPromise을(를) "
AbortError"DOMException(으)로 거부한다.
-
-
비운다: this.
[[pendingReceiveFeatureReportPromises]]을(를) 비운다. -
다음 단계를 병렬로 수행한다:
-
운영체제를 호출하여 HID 장치를 닫고 관련된 모든 자원을 해제한다.
-
전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 this이며, HID 장치 태스크 소스를 사용한다. 이 태스크는 이행한다. 즉, promise을(를)
undefined값으로 이행한다.
-
-
promise을(를) 반환한다.
7.3. forget() 메서드
참고: 사용자 에이전트는 API 간의 권한을 통합하기로 결정할 수 있다. 예를 들어 WebHID와 WebUSB 장치 접근을 하나의 저수준 장치 접근 권한으로 추적할 수 있다. 따라서 이 메서드는 앞으로 다른 권한(아직 지정되지 않음)도 철회할 수 있다.
forget()
메서드 단계는 다음과 같다:
-
promise을(를) 새 프로미스로 둔다.
-
다음 단계를 병렬로 수행한다:
-
각각에 대해, 즉 device(대상: this.
[[devices]])마다:-
device이(가) HIDDevice와 장치 접근 권한을 공유하지 않으면 다음 장치로 넘어간다.
-
device.
[[state]]의 값을"forgetting"(으)로 설정한다. -
각각에 대해, 즉 pendingPromise(대상: device.
[[pendingSendReportPromises]])마다:-
거부한다: pendingPromise을(를) "
AbortError"DOMException(으)로 거부한다.
-
-
비운다: device.
[[pendingSendReportPromises]]을(를) 비운다. -
각각에 대해, 즉 pendingPromise(대상: device.
[[pendingSendFeatureReportPromises]])마다:-
거부한다: pendingPromise을(를) "
AbortError"DOMException(으)로 거부한다.
-
-
비운다: device.
[[pendingSendFeatureReportPromises]]을(를) 비운다. -
각각에 대해, 즉 pendingPromise(대상: device.
[[pendingReceiveFeatureReportPromises]])마다:-
거부한다: pendingPromise을(를) "
AbortError"DOMException(으)로 거부한다.
-
-
비운다: device.
[[pendingReceiveFeatureReportPromises]]을(를) 비운다. -
사용자 에이전트를 호출하여 모든 HID 인터페이스에 대한 접근을 철회한다. 이 인터페이스들은 device이(가) 노출한다.
-
device.
[[state]]의 값을"forgotten"(으)로 설정한다.
-
-
전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 this이며, HID 장치 태스크 소스를 사용한다. 이 태스크는 이행한다. 즉, promise을(를)
undefined값으로 이행한다.
-
-
promise을(를) 반환한다.
7.4. sendReport() 메서드
sendReport()
메서드는 지정된 다음 값으로 출력 보고서를 보내는 데 사용한다: reportId 및 data. 만약 HID 인터페이스 가 다음을 하지 않으면: 보고서 ID 사용, 보고서 ID 대신
0을 전달한다.
HID 인터페이스가 보고서 ID를 사용하면 보고서 ID 값 0은 예약되어 있으므로 사용하지 않는 것이 좋다.
sendReport()
메서드의 단계는 다음과 같다:
-
promise을(를) 새 프로미스로 둔다.
-
this.
[[state]]이(가)"opened"이 아니면 거부한다. 즉, promise을(를) "InvalidStateError"DOMException(으)로 거부하고 promise을(를) 반환한다. -
reportId이(가) 0이고, HID 인터페이스(이를 나타내는 객체: this)가 보고서 ID를 사용하거나, reportId이(가) 0이 아닌데 인터페이스가 보고서 ID를 사용하지 않으면 거부한다. 즉, promise을(를) "
TypeError"DOMException(으)로 거부하고 promise을(를) 반환한다. -
추가한다: promise을(를) this.
[[pendingSendReportPromises]]에 추가한다. -
다음 단계를 병렬로 수행한다:
-
이 보고서가 차단된 보고서이면 전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 this이며, HID 장치 태스크 소스를 사용한다. 이 태스크는 거부한다. 즉, promise을(를) "
NotAllowedError"DOMException(으)로 거부한다. 그런 다음 이 단계를 중단한다. -
운영체제를 호출하여 지정된 reportId 및 data 값으로 출력 보고서를 보낸다.
-
어떤 이유로든 실패하면 전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 this이며, HID 장치 태스크 소스를 사용한다. 이 태스크는 거부한다. 즉, promise을(를) "
NetworkError"DOMException(으)로 거부한다. 그런 다음 이 단계를 중단한다. -
전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 this이며, HID 장치 태스크 소스를 사용한다. 이 태스크는 이행한다. 즉, promise을(를)
undefined값으로 이행한다.
-
-
promise을(를) 반환한다.
7.5. sendFeatureReport() 메서드
sendFeatureReport()
메서드는 지정된 다음 값으로 기능 보고서를 보내는 데 사용한다: reportId 및
data. 만약 HID 인터페이스 가 다음을 하지 않으면: 보고서 ID 사용, 보고서 ID 대신 0을 전달한다.
HID 인터페이스가 보고서 ID를 사용하면 보고서 ID 값 0은 예약되어 있으므로 사용하지 않는 것이 좋다.
sendFeatureReport()
메서드의 단계는 다음과 같다:
-
promise을(를) 새 프로미스로 둔다.
-
this.
[[state]]이(가)"opened"이 아니면 거부한다. 즉, promise을(를) "InvalidStateError"DOMException(으)로 거부하고 promise을(를) 반환한다. -
reportId이(가) 0이고, HID 인터페이스(이를 나타내는 객체: this)가 보고서 ID를 사용하거나, reportId이(가) 0이 아닌데 인터페이스가 보고서 ID를 사용하지 않으면 거부한다. 즉, promise을(를) "
TypeError"DOMException(으)로 거부하고 promise을(를) 반환한다. -
추가한다: promise을(를) this.
[[pendingSendFeatureReportPromises]]에 추가한다. -
다음 단계를 병렬로 수행한다:
-
이 보고서가 차단된 보고서이면 전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 this이며, HID 장치 태스크 소스를 사용한다. 이 태스크는 거부한다. 즉, promise을(를) "
NotAllowedError"DOMException(으)로 거부한다. 그런 다음 이 단계를 중단한다. -
운영체제를 호출하여 지정된 reportId 및 data 값으로 기능 보고서를 보낸다.
-
어떤 이유로든 실패하면 전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 this이며, HID 장치 태스크 소스를 사용한다. 이 태스크는 거부한다. 즉, promise을(를) "
NetworkError"DOMException(으)로 거부한다. 그런 다음 이 단계를 중단한다. -
전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 this이며, HID 장치 태스크 소스를 사용한다. 이 태스크는 이행한다. 즉, promise을(를)
undefined값으로 이행한다.
-
-
promise을(를) 반환한다.
7.6.
receiveFeatureReport() 메서드
receiveFeatureReport()
메서드는 다음에 지정된 값으로 기능 보고서를 요청하는 데 사용한다: reportId. 만약 HID 인터페이스 가 다음을 하지 않으면: 보고서 ID 사용, 보고서 ID 대신
0을 전달한다.
HID 인터페이스가 보고서 ID를 사용하면 보고서 ID 값 0은 예약되어 있으므로 사용하지 않는 것이 좋다.
receiveFeatureReport()
메서드의 단계는 다음과 같다:
-
promise을(를) 새 프로미스로 둔다.
-
this.
[[state]]이(가)"opened"이 아니면 거부한다. 즉, promise을(를) "InvalidStateError"DOMException(으)로 거부하고 promise을(를) 반환한다. -
reportId이(가) 0이고, HID 인터페이스(이를 나타내는 객체: this)가 보고서 ID를 사용하거나, reportId이(가) 0이 아닌데 인터페이스가 보고서 ID를 사용하지 않으면 거부한다. 즉, promise을(를) "
TypeError"DOMException(으)로 거부하고 promise을(를) 반환한다. -
추가한다: promise을(를) this.
[[pendingReceiveFeatureReportPromises]]에 추가한다. -
다음 단계를 병렬로 수행한다:
-
이 보고서가 차단된 보고서이면 전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 this이며, HID 장치 태스크 소스를 사용한다. 이 태스크는 거부한다. 즉, promise을(를) "
NotAllowedError"DOMException(으)로 거부한다. 그런 다음 이 단계를 중단한다. -
data을(를)
DataView로 둔다. 이는 바이트 시퀀스를 기반으로 생성하며, 그 시퀀스는 운영체제를 호출하여 지정된 reportId 값으로 기능 보고서를 읽은 결과를 나타낸다.참고: data에는 운영체제에서 받은 보고서 데이터가 그대로 들어간다. 장치가 보고서 ID를 사용하면 첫 바이트는 보고서 ID일 수 있다. 장치가 보고서 ID 대신 다른 데이터로 응답할 수 있으므로 이 바이트도 포함한다.
-
어떤 이유로든 기능 보고서 읽기에 실패하면 전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 this이며, HID 장치 태스크 소스를 사용한다. 이 태스크는 거부한다. 즉, promise을(를) "
NetworkError"DOMException(으)로 거부한다. 그런 다음 이 단계를 중단한다. -
전역 태스크를 큐에 넣는다. 대상 관련 전역 객체의 소유자는 this이며, HID 장치 태스크 소스를 사용한다. 이 태스크는 이행한다. 즉, promise을(를) data 값으로 이행한다.
-
-
promise을(를) 반환한다.
8. HIDConnectionEvent 인터페이스
[Exposed =(DedicatedWorker ,ServiceWorker ,Window ),SecureContext ]interface HIDConnectionEvent :Event {(constructor DOMString ,type HIDConnectionEventInit ); [eventInitDict SameObject ]readonly attribute HIDDevice device ; };
device속성, 자료형: HIDDevice, 읽기 전용-
다음의
HIDDevice인스턴스이며, 연결되거나 연결 해제된 장치를 나타낸다.
8.1.
HIDConnectionEventInit 딕셔너리
dictionary HIDConnectionEventInit :EventInit {required HIDDevice device ; };
device멤버, 자료형: HIDDevice- 이벤트와 관련된 장치.
9.
HIDInputReportEvent 인터페이스
[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, 읽기 전용-
다음의
HIDDevice인스턴스이며, 다음을 나타낸다: HID 인터페이스 입력 보고서를 보낸 인터페이스이다. reportId속성, 자료형: octet, 읽기 전용- 이 보고서의 1바이트 식별 접두사. 단, 다음의 HID 인터페이스가 다음을 하지 않는 경우에는 0이다: 보고서 ID 사용.
data속성, 자료형: DataView, 읽기 전용-
다음의
DataView입력 보고서의 데이터를 포함한다. 단, 다음의reportId바이트는 제외한다. 이는 다음의 HID 인터페이스 보고서 ID 사용 시에 해당한다.
9.1.
HIDInputReportEventInit 딕셔너리
dictionary HIDInputReportEventInit :EventInit {required HIDDevice device ;required octet reportId ;required DataView data ; };
device멤버, 자료형: HIDDevice- 이벤트와 관련된 장치.
reportId멤버, 자료형: octet- 입력 보고서의 보고서 ID.
data멤버, 자료형: DataView- 입력 보고서의 데이터.
10.
HIDCollectionInfo 딕셔너리
dictionary HIDCollectionInfo {unsigned short usagePage ;unsigned short usage ;octet type ;sequence <HIDCollectionInfo >children ;sequence <HIDReportInfo >inputReports ;sequence <HIDReportInfo >outputReports ;sequence <HIDReportInfo >featureReports ; };
장치가 시스템에 처음 연결되면 시스템은 보고서 설명자를 장치가 노출하는 각 HID 인터페이스에서 가져와야 한다. 보고서 설명자는 바이트 시퀀스이며, 이를 장치가 지원하는 각 보고서의 배치를 설명하는 계층적 자료구조로 확장할 수 있다. 이 자료구조의 원소를 항목이라고 한다. 서로 관련된 항목의 그룹을 컬렉션이라고 한다.
HIDCollectionInfo
객체는 보고서 설명자 내의 단일
컬렉션을 나타낸다. 컬렉션에 중첩된 컬렉션이 있으면 이를 children의
원소로 포함한다.
inputReports,
outputReports
및 featureReports
속성에는 시퀀스가 들어 있다. 그 원소인 HIDReportInfo는
이 컬렉션에 기술된 각 보고서의 정보를 제공한다. 최상위 컬렉션에서는 HIDReportInfo가
보고서를 구성하는 모든 항목의 평탄화된 뷰를 나타낸다. 평탄화된 뷰는 중첩 컬렉션의 항목을 최상위 컬렉션의 항목과 원래 순서대로 섞어 놓는다. 중첩 컬렉션에서는 HIDReportInfo에
그 컬렉션과 그 안의 중첩 컬렉션에 포함된 항목만 들어 있다.
usagePage멤버, 자료형: unsigned short-
다음의 용도 페이지 구성 요소. 해당 구성 요소가 속하는
것은 다음이다: HID 용도 이 컬렉션과 관련된 용도이다.
HID 용도는 응용 프로그램이 항목이나 컬렉션의 목적과 의미를 식별하도록 해석할 수 있는 상수이다. HID 용도는
unsigned long값이며, 상위 비트의unsigned short자료형 용도 페이지와 하위 비트의unsigned short자료형 용도 ID로 구성된다. 표준 HID 용도 값은 [USBIF-HID-CLASS] 및 USB Implementers Forum에서 발행한 다른 문서에서 설명한다. usage멤버, 자료형: unsigned short-
다음의 용도 ID 구성 요소. 해당 구성 요소가 속하는 것은
다음이다: HID 용도 이 컬렉션과 관련된 용도이다.
용도 ID는 개별 HID 용도를 해당 용도 페이지에서 선택하는 데 사용한다. 관례적으로 용도 ID 0x01부터 0x1F까지는 최상위 컬렉션용으로 예약되어 있다.
type멤버, 자료형: octet-
다음을 나타내는 값: 컬렉션 유형.
컬렉션 유형 값 물리적 0x00 응용 0x01 논리적 0x02 보고서 0x03 명명된 배열 0x04 용도 전환 0x05 용도 수정 0x06 향후 사용을 위해 예약됨 0x07부터 0x7F까지 공급업체 정의 0x80부터 0xFF까지 각 컬렉션 유형은 묶인 항목 간의 서로 다른 관계 유형을 설명한다. 자세한 내용은 [USBIF-HID-CLASS]의 6.2.2.6절에서 컬렉션 유형을 참고한다.
children멤버, 시퀀스 자료형:<HIDCollectionInfo>-
다음의 시퀀스 구성 요소:
HIDCollectionInfo이 컬렉션 안에 중첩된 컬렉션을 나타낸다. inputReports멤버, 시퀀스 자료형:<HIDReportInfo>-
다음의 시퀀스 구성 요소:
HIDReportInfo이 컬렉션에 기술된 입력 보고서를 나타낸다. outputReports멤버, 시퀀스 자료형:<HIDReportInfo>-
다음의 시퀀스 구성 요소:
HIDReportInfo이 컬렉션에 기술된 출력 보고서를 나타낸다. featureReports멤버, 시퀀스 자료형:<HIDReportInfo>-
다음의 시퀀스 구성 요소:
HIDReportInfo이 컬렉션에 기술된 기능 보고서를 나타낸다.
11. HIDReportInfo 딕셔너리
dictionary HIDReportInfo {octet reportId ;sequence <HIDReportItem >items ; };
HIDReportInfo는
보고서 설명자 내의 입력, 출력 또는
기능 보고서 하나를 나타낸다.
reportId멤버, 자료형: octet-
다음의 HID 인터페이스
보고서 ID를 사용한다 각 보고서 전송에 1바이트 식별 접두사를 붙이는 경우에 해당한다. 다음의
reportId멤버는 이 보고서의 접두사이다. 이는 인터페이스가 다음과 같을 때 해당한다: 보고서 ID를 사용한다, 그렇지 않으면 0이다. items멤버, 시퀀스 자료형:<HIDReportItem>-
다음의 시퀀스 구성 요소:
HIDReportItem이 보고서의 필드를 나타낸다.
12. HIDReportItem 딕셔너리
dictionary 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멤버, 자료형: boolean-
true데이터가 절댓값(고정된 원점 기준)이면 이 값이며, 또는false데이터가 상대값(이전 보고서 이후의 값 변화)이면 이 값이다. isArray멤버, 자료형: boolean-
true항목이 보고서에 배열 데이터 필드를 생성하고 각 필드에 눌린 버튼이나 키에 대응하는 인덱스가 들어 있으면 이 값이며, 또는false항목이 보고서에 변수 데이터 필드를 생성하고 각 필드에 값이 들어 있으면 이 값이다. isBufferedBytes멤버, 자료형: boolean-
true항목이 고정 크기의 바이트 스트림을 내보내면 이 값이며, 또는false항목이 수치량이면 이 값이다. isConstant멤버, 자료형: boolean-
true항목이 수정할 수 없는 정적 읽기 전용 필드이면 이 값이며, 또는false항목이 수정 가능한 장치 데이터를 포함하는 보고서 필드를 정의하면 이 값이다. isLinear멤버, 자료형: boolean-
true항목이 측정값과 보고값 사이의 선형 관계를 나타내면 이 값이며, 또는false데이터가 어떤 방식으로든 처리되었으면 이 값이다. isRange멤버, 자료형: boolean-
true항목이 다음에서 용도를 할당하면 이 값이다: HID 용도 범위. 이 범위는 다음으로 정의한다:usageMinimum및usageMaximum, 또는false항목에 다음이 있으면 이 값이다: 시퀀스 구성 요소: HID 용도 값. 포함 위치:usages. isVolatile멤버, 자료형: boolean-
true호스트 상호작용 없이 항목 값이 바뀔 수 있으면 이 값이며, 또는false호스트만 항목 값을 변경하는 것이 좋으면 이 값이다.기능 항목과 출력 항목에만 사용한다.
hasNull멤버, 자료형: boolean-
true항목에 의미 있는 데이터를 보내지 않는 널 상태가 있으면 이 값이며, 또는false널 상태가 없으면 이 값이다. 널 상태에서는 항목이 지정된 다음 범위를 벗어나는 값을 보고한다:logicalMinimum및logicalMaximum. hasPreferredState멤버, 자료형: boolean-
true사용자가 제어 장치를 물리적으로 조작하지 않을 때 돌아가는 기본 상태가 있으면 이 값이며, 또는false기본 상태가 없으면 이 값이다. wrap멤버, 자료형: boolean-
true항목 값이 상한이나 하한에 도달했을 때 반대편 끝으로 순환하면 이 값이며, 또는false항목 값이 순환하지 않으면 이 값이다. usages멤버, 자료형:sequence<unsigned long>-
만약
isRange이(가)true이거나 이 항목과 관련된 다음의 HID 용도 값이 없으면usages는 undefined여야 한다.isRange이(가)false이면usages은(는) 시퀀스이며 이 항목과 관련된 HID 용도 값을 원소로 갖는다. usageMinimum멤버, 자료형: unsigned long-
만약
isRange이(가)true이면usageMinimum에는 최소의 다음 값이 들어 있다: HID 용도 값. 이 항목과 관련된 용도 범위 내의 값이다.isRange이(가)false이면usageMinimum은(는) undefined여야 한다. usageMaximum멤버, 자료형: unsigned long-
만약
isRange이(가)true이면usageMaximum에는 최대의 다음 값이 들어 있다: HID 용도 값. 이 항목과 관련된 용도 범위 내의 값이다.isRange이(가)false이면usageMaximum은(는) undefined여야 한다. reportSize멤버, 자료형: unsigned short-
각 보고서 데이터 필드의 크기(비트 단위). 다음의
reportSize는 0보다 커야 한다. reportCount멤버, 자료형: unsigned short-
이 항목에 대해 보고서에 포함되는 필드 수. 다음의
reportCount는 0보다 커야 한다. unitExponent멤버, 자료형: byte- 단위 지수 값. 항목에 단위 정의가 없으면 0이다.
unitSystem멤버, 자료형: HIDUnitSystem-
다음의
HIDUnitSystem열거형 값으로, 단위 정의에 사용할 단위계를 지정한다. 또는"none"항목에 단위 정의가 없으면 이 값이다. unitFactorLengthExponent멤버, 자료형: byte- 단위 정의에 있는 길이 단위(센티미터, 라디안, 인치 또는 도)의 지수 값. 항목에 단위 정의가 없으면 0이다.
unitFactorMassExponent멤버, 자료형: byte- 단위 정의에 있는 질량 단위(그램 또는 슬러그)의 지수 값. 항목에 단위 정의가 없으면 0이다.
unitFactorTimeExponent멤버, 자료형: byte- 단위 정의에 있는 시간 단위(초)의 지수 값. 항목에 단위 정의가 없으면 0이다.
unitFactorTemperatureExponent멤버, 자료형: byte- 단위 정의에 있는 온도 단위(켈빈 또는 화씨도)의 지수 값. 항목에 단위 정의가 없으면 0이다.
unitFactorCurrentExponent멤버, 자료형: byte- 단위 정의에 있는 전류 단위(암페어)의 지수 값. 항목에 단위 정의가 없으면 0이다.
unitFactorLuminousIntensityExponent멤버, 자료형: byte- 단위 정의에 있는 광도 단위(칸델라)의 지수 값. 항목에 단위 정의가 없으면 0이다.
logicalMinimum멤버, 자료형: long- 논리 단위로 나타낸 이 항목의 최솟값. 변수 항목이나 배열 항목이 보고할 최솟값이다.
logicalMaximum멤버, 자료형: long- 논리 단위로 나타낸 이 항목의 최댓값. 변수 항목이나 배열 항목이 보고할 최댓값이다.
physicalMinimum멤버, 자료형: long-
이 항목의 물리적 범위의 최솟값. 이는 다음을 나타낸다:
logicalMinimum에 단위를 적용한 값이다. physicalMaximum멤버, 자료형: long-
이 항목의 물리적 범위의 최댓값. 이는 다음을 나타낸다:
logicalMaximum에 단위를 적용한 값이다. strings멤버, 시퀀스 자료형:<DOMString>- 이 항목과 관련된 문자열. 문자열이 없으면 비어 있는 시퀀스 를 사용한다.
13. HIDUnitSystem 열거형
[USBIF-HID-CLASS]의 6.2.2.7절은 SI 선형, SI 회전, 영국식 선형, 영국식 회전이라는 네 가지 표준 단위계를 정의한다. 각 항목은 이 네 단위계 중 하나나 공급업체 정의 단위계를 사용하거나, 단위계를 사용하지 않는다.
enum HIDUnitSystem {"none" ,"si-linear" ,"si-rotation" ,"english-linear" ,"english-rotation" ,"vendor-defined" ,"reserved" };
"none"- 단위계 없음. 항목에 단위 정의가 없음을 나타낸다.
"si-linear"- SI 선형 단위계는 센티미터, 그램, 초, 켈빈, 암페어, 칸델라를 사용한다.
"si-rotation"- SI 회전 단위계는 라디안, 그램, 초, 켈빈, 암페어, 칸델라를 사용한다.
"english-linear"- 영국식 선형 단위계는 인치, 슬러그, 초, 화씨도, 암페어, 칸델라를 사용한다.
"english-rotation"- 영국식 회전 단위계는 도, 슬러그, 초, 화씨도, 암페어, 칸델라를 사용한다.
"vendor-defined"- 공급업체가 정의한 단위계.
"reserved"- 장치가 단위계에 예약된 값을 사용했음을 나타낸다.
14. 사용 예
document. addEventListener( 'DOMContentLoaded' , async () => { let devices= await navigator. hid. getDevices(); devices. forEach( device=> { console. log( `HID: ${ device. productName} ` ); }); });
navigator. hid. addEventListener( 'connect' , ({ device}) => { console. log( `HID connected: ${ device. productName} ` ); }); navigator. hid. addEventListener( 'disconnect' , ({ device}) => { console. log( `HID disconnected: ${ device. productName} ` ); });
getDevices()
. 그때까지 연결 이벤트도 발생하지 않는다. 페이지는 할 수 있다 : 다음을 사용하여 권한을 요청할 수 있다:
requestDevice().
이 예에서 페이지는 다음 값을 가진 장치에 대한 접근을 요청한다: 공급업체
ID 0xABCD. 장치는 반드시 다음 값을 가진 컬렉션도 갖춰야 한다: 용도 페이지 소비자 (0x000C) 및
용도 ID
소비자 제어 (0x0001). 다음 값을 가진 장치는 제품 ID 0x1234
오작동하는 것으로 보고되었다.
let requestButton= document. getElementById( "request-hid-device" ); requestButton. addEventListener( "click" , async () => { let device; try { const devices= await navigator. hid. requestDevice({ filters: [ { vendorId: 0xabcd , usagePage: 0x000c , usage: 0x0001 , }, ], exclusionFilters: [ { vendorId: 0xabcd , productId: 0x1234 , } ], }); device= devices[ 0 ]; } catch ( error) { console. log( "An error occurred." ); } if ( ! device) { console. log( "No device was selected." ); } else { console. log( `HID: ${ device. productName} ` ); } });
device. oninputreport= ({ device, reportId, data}) => { console. log( `Input report ${ reportId} from ${ device. productName} :` , new Uint8Array( data. buffer)); }; if ( ! device. opened) await device. open();
try { if ( ! device. opened) await device. open(); const outputReportData= new Uint8Array([ 0x12 , 0x34 , 0x56 , 0x78 ]); await device. sendReport( 0x05 , outputReportData); console. log( "Output report sent" ); } catch ( error) { console. log( "An error occurred." ) }
try { if ( ! device. opened) await device. open(); const oldFeatureData= await device. receiveFeatureReport( 0x80 ); console. log( "Feature report received:" , new Uint8Array( oldFeatureData. buffer)); const newFeatureData= new Uint8Array([ 0x12 , 0x34 , 0x56 , 0x78 ]); await device. sendFeatureReport( 0x80 , newFeatureData); console. log( "Feature report sent" ); } catch ( error) { console. log( "An error occurred." ) }
15. HID 차단 목록
이 명세는 https://github.com/whatwg/hid 저장소의 차단 목록 파일을 사용하여 웹사이트가 접근할 수 있는 HID 장치의 집합을 제한한다.
HID 차단 목록은 차단 목록 파싱의 결과이다. 파싱 대상은 https://github.com/whatwg/hid/blob/main/blocklist.txt이다.
true:
-
각각에 대해, 즉 rule(대상: HID 차단 목록)마다:
-
보고서가 차단 목록 규칙에 의해 차단되고 해당 규칙이 rule이면
true을(를) 반환한다.
-
-
false을(를) 반환한다.
true:
-
reportId을(를) 보고서의 보고서 ID로 둔다. 단, HID 인터페이스가 보고서 ID를 사용하지 않으면 0으로 둔다.
-
reportType을(를) 입력 보고서이면
"input", 출력 보고서이면"output", 기능 보고서이면"feature"(으)로 둔다. -
collection을(를) 보고서를 포함하는 최상위 컬렉션으로 둔다.
-
rule에
"vendor"이(가) 있고 rule["vendor"]이(가) device.vendorId이 아니면false을(를) 반환한다. -
rule에
"product"이(가) 있고 rule["product"]이(가) device.productId이 아니면false을(를) 반환한다. -
rule에
"reportId"이(가) 있고 rule["reportId"]이(가) reportId이 아니면false을(를) 반환한다. -
rule에
"reportType"이(가) 있고 rule["reportType"]이(가) reportType이 아니면false을(를) 반환한다. -
rule에
"usagePage"이(가) 있고 rule["usagePage"]이(가) collection["usagePage"]이 아니면false을(를) 반환한다. -
rule에
"usage"이(가) 있고 rule.["usage"]이(가) collection["usage"]이 아니면false을(를) 반환한다. -
true을(를) 반환한다.
16. 통합
16.1. 권한 정책
이 명세는 hid
속성을 Navigator
객체에 노출할지 여부를 제어하는 기능을 정의한다.
이 기능의 이름은 "hid"이다.
이 기능의 기본 허용 목록은 'self'이다.
감사의 말
훌륭한 기여를 해 주신 Feras Aldahlawi, François Beaufort, Jack Hsieh, Jeffrey Yasskin, Jonas Due Vesterheden, Kagami Sascha Rosylight, Marcos Cáceres, Peter Høy Andersen, Reilly Grant, Rob Pitkin, Ted Mielczarek, Thomas Steiner, Tim Steiner 및 Vincent Scheib에게 감사한다.
이 표준의 작성자는 Matt Reynolds(Google, mattreynolds@google.com)이다.
지식재산권
저작권 © WHATWG(Apple, Google, Mozilla, Microsoft). 이 저작물에는 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스가 적용된다. 이 저작물의 일부가 소스 코드에 포함되는 경우, 해당 소스 코드 내 부분에는 대신 BSD 3-Clause 라이선스가 적용된다.