| // META: script=/resources/test-only-api.js |
| // META: script=/webusb/resources/usb-helpers.js |
| 'use strict'; |
| |
| async function runTestForInterfaceClass(t, interfaceClass) { |
| await navigator.usb.test.initialize(); |
| |
| const fakeDeviceTemplate = { |
| usbVersionMajor: 2, |
| usbVersionMinor: 0, |
| usbVersionSubminor: 0, |
| deviceClass: 7, |
| deviceSubclass: 1, |
| deviceProtocol: 2, |
| vendorId: 0x18d1, |
| productId: 0xf00d, |
| deviceVersionMajor: 1, |
| deviceVersionMinor: 2, |
| deviceVersionSubminor: 3, |
| manufacturerName: 'Google, Inc.', |
| productName: 'Test Device', |
| serialNumber: '4 (chosen randomly)', |
| activeConfigurationValue: 0, |
| configurations: [{ |
| configurationValue: 1, |
| configurationName: 'Default configuration', |
| interfaces: [{ |
| interfaceNumber: 0, |
| alternates: [{ |
| alternateSetting: 0, |
| interfaceClass: interfaceClass, |
| interfaceSubclass: 0x01, |
| interfaceProtocol: 0x01, |
| interfaceName: 'Protected interface', |
| endpoints: [] |
| }] |
| }, { |
| interfaceNumber: 1, |
| alternates: [{ |
| alternateSetting: 0, |
| interfaceClass: 0xff, |
| interfaceSubclass: 0x01, |
| interfaceProtocol: 0x01, |
| interfaceName: 'Unprotected interface', |
| endpoints: [] |
| }] |
| }] |
| }] |
| }; |
| |
| let fakeDevice; |
| let device = await new Promise((resolve) => { |
| navigator.usb.addEventListener('connect', (e) => { |
| resolve(e.device); |
| }, { once: true }); |
| fakeDevice = navigator.usb.test.addFakeDevice(fakeDeviceTemplate); |
| }); |
| |
| await device.open(); |
| await device.selectConfiguration(1); |
| |
| await promise_rejects_dom(t, 'SecurityError', device.claimInterface(0)); |
| await device.claimInterface(1); |
| |
| await device.close(); |
| fakeDevice.disconnect(); |
| } |
| |
| usb_test( |
| (t) => runTestForInterfaceClass(t, 0x01), |
| 'Protected audio interface cannot be claimed'); |
| usb_test( |
| (t) => runTestForInterfaceClass(t, 0x03), |
| 'Protected HID interface cannot be claimed'); |
| usb_test( |
| (t) => runTestForInterfaceClass(t, 0x08), |
| 'Protected mass storage interface cannot be claimed'); |
| usb_test( |
| (t) => runTestForInterfaceClass(t, 0x0B), |
| 'Protected smart card interface cannot be claimed'); |
| usb_test( |
| (t) => runTestForInterfaceClass(t, 0x0E), |
| 'Protected video interface cannot be claimed'); |
| usb_test( |
| (t) => runTestForInterfaceClass(t, 0x10), |
| 'Protected audio/video interface cannot be claimed'); |
| usb_test( |
| (t) => runTestForInterfaceClass(t, 0xE0), |
| 'Protected wireless controller interface cannot be claimed'); |