diff options
23 files changed, 246 insertions, 214 deletions
diff --git a/chrome/browser/devtools/device/usb/android_usb_browsertest.cc b/chrome/browser/devtools/device/usb/android_usb_browsertest.cc index cbd9052..0d90ae4 100644 --- a/chrome/browser/devtools/device/usb/android_usb_browsertest.cc +++ b/chrome/browser/devtools/device/usb/android_usb_browsertest.cc @@ -421,7 +421,7 @@ class MockUsbDevice : public UsbDevice { new MockUsbDeviceHandle<T>(this)))); } - const UsbConfigDescriptor* GetActiveConfiguration() override { + const UsbConfigDescriptor* GetActiveConfiguration() const override { return T::kConfigured ? &config_desc_ : nullptr; } diff --git a/content/renderer/usb/type_converters.cc b/content/renderer/usb/type_converters.cc index acddfaf..5c47c93 100644 --- a/content/renderer/usb/type_converters.cc +++ b/content/renderer/usb/type_converters.cc @@ -213,6 +213,7 @@ TypeConverter<blink::WebUSBDeviceInfo, device::usb::DeviceInfoPtr>::Convert( device.productName = blink::WebString::fromUTF8(info->product_name); if (!info->serial_number.is_null()) device.serialNumber = blink::WebString::fromUTF8(info->serial_number); + device.activeConfiguration = info->active_configuration; device.configurations = blink::WebVector<blink::WebUSBDeviceInfo::Configuration>( info->configurations.size()); diff --git a/content/renderer/usb/web_usb_device_impl.cc b/content/renderer/usb/web_usb_device_impl.cc index d0cedd5..fc6920d 100644 --- a/content/renderer/usb/web_usb_device_impl.cc +++ b/content/renderer/usb/web_usb_device_impl.cc @@ -26,7 +26,6 @@ const char kClaimInterfaceFailed[] = "Unable to claim interface."; const char kClearHaltFailed[] = "Unable to clear endpoint."; const char kDeviceAlreadyOpen[] = "Device has already been opened."; const char kDeviceNoAccess[] = "Access denied."; -const char kDeviceNotConfigured[] = "Device not configured."; const char kDeviceUnavailable[] = "Device unavailable."; const char kDeviceResetFailed[] = "Unable to reset the device."; const char kReleaseInterfaceFailed[] = "Unable to release interface."; @@ -90,19 +89,6 @@ void OnDeviceClosed( callbacks.PassCallbacks()->onSuccess(); } -void OnGetConfiguration( - ScopedWebCallbacks<blink::WebUSBDeviceGetConfigurationCallbacks> callbacks, - uint8_t configuration_value) { - auto scoped_callbacks = callbacks.PassCallbacks(); - if (configuration_value == 0) { - RejectWithError(blink::WebUSBError(blink::WebUSBError::Error::NotFound, - kDeviceNotConfigured), - std::move(scoped_callbacks)); - } else { - scoped_callbacks->onSuccess(configuration_value); - } -} - void HandlePassFailDeviceOperation( ScopedWebCallbacks<blink::WebCallbacks<void, const blink::WebUSBError&>> callbacks, @@ -258,14 +244,6 @@ void WebUSBDeviceImpl::close(blink::WebUSBDeviceCloseCallbacks* callbacks) { base::Bind(&OnDeviceClosed, base::Passed(&scoped_callbacks))); } -void WebUSBDeviceImpl::getConfiguration( - blink::WebUSBDeviceGetConfigurationCallbacks* callbacks) { - auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks); - if (device_) - device_->GetConfiguration( - base::Bind(&OnGetConfiguration, base::Passed(&scoped_callbacks))); -} - void WebUSBDeviceImpl::setConfiguration( uint8_t configuration_value, blink::WebUSBDeviceSetConfigurationCallbacks* callbacks) { diff --git a/content/renderer/usb/web_usb_device_impl.h b/content/renderer/usb/web_usb_device_impl.h index d2bd81d..dea2e8f 100644 --- a/content/renderer/usb/web_usb_device_impl.h +++ b/content/renderer/usb/web_usb_device_impl.h @@ -35,8 +35,6 @@ class WebUSBDeviceImpl : public blink::WebUSBDevice { const blink::WebUSBDeviceInfo& info() const override; void open(blink::WebUSBDeviceOpenCallbacks* callbacks) override; void close(blink::WebUSBDeviceCloseCallbacks* callbacks) override; - void getConfiguration( - blink::WebUSBDeviceGetConfigurationCallbacks* callbacks) override; void setConfiguration( uint8_t configuration_value, blink::WebUSBDeviceSetConfigurationCallbacks* callbacks) override; diff --git a/device/usb/mock_usb_device.h b/device/usb/mock_usb_device.h index 569a471..b5cf2bd 100644 --- a/device/usb/mock_usb_device.h +++ b/device/usb/mock_usb_device.h @@ -41,7 +41,8 @@ class MockUsbDevice : public UsbDevice { const std::vector<UsbConfigDescriptor>& configurations); MOCK_METHOD1(Open, void(const OpenCallback&)); - MOCK_METHOD0(GetActiveConfiguration, const device::UsbConfigDescriptor*()); + MOCK_CONST_METHOD0(GetActiveConfiguration, + const device::UsbConfigDescriptor*()); // Public wrapper around UsbDevice::NotifyDeviceRemoved(). void NotifyDeviceRemoved(); diff --git a/device/usb/mojo/device_impl.cc b/device/usb/mojo/device_impl.cc index 9472571..a2dd316 100644 --- a/device/usb/mojo/device_impl.cc +++ b/device/usb/mojo/device_impl.cc @@ -190,12 +190,9 @@ void DeviceImpl::OnOpen(const OpenCallback& callback, } void DeviceImpl::GetDeviceInfo(const GetDeviceInfoCallback& callback) { - callback.Run(device_info_->Clone()); -} - -void DeviceImpl::GetConfiguration(const GetConfigurationCallback& callback) { const UsbConfigDescriptor* config = device_->GetActiveConfiguration(); - callback.Run(config ? config->configuration_value : 0); + device_info_->active_configuration = config ? config->configuration_value : 0; + callback.Run(device_info_->Clone()); } void DeviceImpl::Open(const OpenCallback& callback) { diff --git a/device/usb/mojo/device_impl.h b/device/usb/mojo/device_impl.h index 6c77d38..a0a4cfc 100644 --- a/device/usb/mojo/device_impl.h +++ b/device/usb/mojo/device_impl.h @@ -55,7 +55,6 @@ class DeviceImpl : public Device, public device::UsbDevice::Observer { // Device implementation: void GetDeviceInfo(const GetDeviceInfoCallback& callback) override; - void GetConfiguration(const GetConfigurationCallback& callback) override; void Open(const OpenCallback& callback) override; void Close(const CloseCallback& callback) override; void SetConfiguration(uint8_t value, diff --git a/device/usb/mojo/type_converters.cc b/device/usb/mojo/type_converters.cc index 0145abd..e22b58f 100644 --- a/device/usb/mojo/type_converters.cc +++ b/device/usb/mojo/type_converters.cc @@ -260,6 +260,8 @@ TypeConverter<device::usb::DeviceInfoPtr, device::UsbDevice>::Convert( info->manufacturer_name = base::UTF16ToUTF8(device.manufacturer_string()); info->product_name = base::UTF16ToUTF8(device.product_string()); info->serial_number = base::UTF16ToUTF8(device.serial_number()); + const device::UsbConfigDescriptor* config = device.GetActiveConfiguration(); + info->active_configuration = config ? config->configuration_value : 0; info->configurations = mojo::Array<device::usb::ConfigurationInfoPtr>::From( device.configurations()); if (device.webusb_allowed_origins()) { diff --git a/device/usb/public/interfaces/device.mojom b/device/usb/public/interfaces/device.mojom index de7bd5f..4b65a11 100644 --- a/device/usb/public/interfaces/device.mojom +++ b/device/usb/public/interfaces/device.mojom @@ -99,6 +99,7 @@ struct DeviceInfo { string? manufacturer_name; string? product_name; string? serial_number; + uint8 active_configuration; array<ConfigurationInfo> configurations; WebUsbDescriptorSet? webusb_allowed_origins; }; @@ -153,10 +154,6 @@ interface Device { // including the set of all available device configurations. GetDeviceInfo() => (DeviceInfo? info); - // Retrieves the |configuration_value| of the device's currently active - // configuration. Will return 0 if the device is unconfigured. - GetConfiguration() => (uint8 value); - // Opens the device. Methods below require the device be opened first. Open() => (OpenDeviceError error); diff --git a/device/usb/usb_device.h b/device/usb/usb_device.h index b1406d9..599c230 100644 --- a/device/usb/usb_device.h +++ b/device/usb/usb_device.h @@ -75,7 +75,7 @@ class UsbDevice : public base::RefCountedThreadSafe<UsbDevice> { // Gets the UsbConfigDescriptor for the active device configuration or nullptr // if the device is unconfigured. - virtual const UsbConfigDescriptor* GetActiveConfiguration() = 0; + virtual const UsbConfigDescriptor* GetActiveConfiguration() const = 0; void AddObserver(Observer* observer); void RemoveObserver(Observer* observer); diff --git a/device/usb/usb_device_android.cc b/device/usb/usb_device_android.cc index 6d246ba..b1a2baa 100644 --- a/device/usb/usb_device_android.cc +++ b/device/usb/usb_device_android.cc @@ -52,7 +52,7 @@ void UsbDeviceAndroid::Open(const OpenCallback& callback) { base::Bind(callback, nullptr)); } -const UsbConfigDescriptor* UsbDeviceAndroid::GetActiveConfiguration() { +const UsbConfigDescriptor* UsbDeviceAndroid::GetActiveConfiguration() const { return nullptr; } diff --git a/device/usb/usb_device_android.h b/device/usb/usb_device_android.h index ad468913..adbb20f 100644 --- a/device/usb/usb_device_android.h +++ b/device/usb/usb_device_android.h @@ -21,7 +21,7 @@ class UsbDeviceAndroid : public UsbDevice { // UsbDevice: void Open(const OpenCallback& callback) override; - const UsbConfigDescriptor* GetActiveConfiguration() override; + const UsbConfigDescriptor* GetActiveConfiguration() const override; private: UsbDeviceAndroid(JNIEnv* env, diff --git a/device/usb/usb_device_impl.cc b/device/usb/usb_device_impl.cc index 1a8bedf..19b52c9 100644 --- a/device/usb/usb_device_impl.cc +++ b/device/usb/usb_device_impl.cc @@ -208,7 +208,7 @@ void UsbDeviceImpl::Close(scoped_refptr<UsbDeviceHandle> handle) { } } -const UsbConfigDescriptor* UsbDeviceImpl::GetActiveConfiguration() { +const UsbConfigDescriptor* UsbDeviceImpl::GetActiveConfiguration() const { DCHECK(thread_checker_.CalledOnValidThread()); return active_configuration_; } diff --git a/device/usb/usb_device_impl.h b/device/usb/usb_device_impl.h index 40bfd1e..9a4f8c3 100644 --- a/device/usb/usb_device_impl.h +++ b/device/usb/usb_device_impl.h @@ -47,7 +47,7 @@ class UsbDeviceImpl : public UsbDevice { void CheckUsbAccess(const ResultCallback& callback) override; #endif // OS_CHROMEOS void Open(const OpenCallback& callback) override; - const UsbConfigDescriptor* GetActiveConfiguration() override; + const UsbConfigDescriptor* GetActiveConfiguration() const override; // These functions are used during enumeration only. The values must not // change during the object's lifetime. diff --git a/third_party/WebKit/LayoutTests/usb/resources/fake-devices.js b/third_party/WebKit/LayoutTests/usb/resources/fake-devices.js index cccea0b..5783f25 100644 --- a/third_party/WebKit/LayoutTests/usb/resources/fake-devices.js +++ b/third_party/WebKit/LayoutTests/usb/resources/fake-devices.js @@ -20,6 +20,7 @@ function fakeUsbDevices() { manufacturer_name: 'Google, Inc.', product_name: 'The amazing imaginary printer', serial_number: '4', + active_configuration: 0, configurations: [ { configuration_value: 1, diff --git a/third_party/WebKit/LayoutTests/usb/resources/usb-helpers.js b/third_party/WebKit/LayoutTests/usb/resources/usb-helpers.js index e2148c6..faf30ac 100644 --- a/third_party/WebKit/LayoutTests/usb/resources/usb-helpers.js +++ b/third_party/WebKit/LayoutTests/usb/resources/usb-helpers.js @@ -160,9 +160,8 @@ function usbMocks(mojo) { claimInterface(interfaceNumber) { assert_true(this.opened_); - - if (this.currentConfiguration_ === undefined) - return Promise.resolve({ success: false }); + assert_true(this.currentConfiguration_ !== undefined, + 'device configured'); if (this.claimedInterfaces_.has(interfaceNumber)) return Promise.resolve({ success: false }); @@ -178,9 +177,8 @@ function usbMocks(mojo) { releaseInterface(interfaceNumber) { assert_true(this.opened_); - - if (this.currentConfiguration_ === undefined) - return Promise.resolve({ success: false }); + assert_true(this.currentConfiguration_ !== undefined, + 'device configured'); if (this.claimedInterfaces_.has(interfaceNumber)) { this.claimedInterfaces_.delete(interfaceNumber); @@ -192,9 +190,8 @@ function usbMocks(mojo) { setInterfaceAlternateSetting(interfaceNumber, alternateSetting) { assert_true(this.opened_); - - if (this.currentConfiguration_ === undefined) - return Promise.resolve({ success: false }); + assert_true(this.currentConfiguration_ !== undefined, + 'device configured'); if (!this.claimedInterfaces_.has(interfaceNumber)) return Promise.resolve({ success: false }); @@ -220,12 +217,16 @@ function usbMocks(mojo) { clearHalt(endpoint) { assert_true(this.opened_); + assert_true(this.currentConfiguration_ !== undefined, + 'device configured'); // TODO(reillyg): Check that endpoint is valid. return Promise.resolve({ success: true }); } controlTransferIn(params, length, timeout) { assert_true(this.opened_); + assert_true(this.currentConfiguration_ !== undefined, + 'device configured'); return Promise.resolve({ status: device.TransferStatus.OK, data: [length >> 8, length & 0xff, params.request, params.value >> 8, @@ -235,6 +236,8 @@ function usbMocks(mojo) { controlTransferOut(params, data, timeout) { assert_true(this.opened_); + assert_true(this.currentConfiguration_ !== undefined, + 'device configured'); return Promise.resolve({ status: device.TransferStatus.OK, bytesWritten: data.byteLength @@ -243,6 +246,8 @@ function usbMocks(mojo) { genericTransferIn(endpointNumber, length, timeout) { assert_true(this.opened_); + assert_true(this.currentConfiguration_ !== undefined, + 'device configured'); // TODO(reillyg): Check that endpoint is valid. let data = new Array(length); for (let i = 0; i < length; ++i) @@ -255,6 +260,8 @@ function usbMocks(mojo) { genericTransferOut(endpointNumber, data, timeout) { assert_true(this.opened_); + assert_true(this.currentConfiguration_ !== undefined, + 'device configured'); // TODO(reillyg): Check that endpoint is valid. return Promise.resolve({ status: device.TransferStatus.OK, @@ -264,6 +271,8 @@ function usbMocks(mojo) { isochronousTransferIn(endpointNumber, packetLengths, timeout) { assert_true(this.opened_); + assert_true(this.currentConfiguration_ !== undefined, + 'device configured'); // TODO(reillyg): Check that endpoint is valid. let data = new Array(packetLengths.reduce((a, b) => a + b, 0)); let dataOffset = 0; @@ -282,6 +291,8 @@ function usbMocks(mojo) { isochronousTransferOut(endpointNumber, data, packetLengths, timeout) { assert_true(this.opened_); + assert_true(this.currentConfiguration_ !== undefined, + 'device configured'); // TODO(reillyg): Check that endpoint is valid. let packets = new Array(packetLengths.length); for (let i = 0; i < packetLengths.length; ++i) { diff --git a/third_party/WebKit/LayoutTests/usb/usbDevice.html b/third_party/WebKit/LayoutTests/usb/usbDevice.html index 722f2db..d4744e8 100644 --- a/third_party/WebKit/LayoutTests/usb/usbDevice.html +++ b/third_party/WebKit/LayoutTests/usb/usbDevice.html @@ -23,7 +23,13 @@ function assertRejectsWithNotFoundError(promise) { function assertRejectsWithNotOpenError(promise) { return assertRejectsWithError( - promise, 'InvalidStateError', 'The device must be open()ed first.') + promise, 'InvalidStateError', 'The device must be opened first.') +} + +function assertRejectsWithNotConfiguredError(promise) { + return assertRejectsWithError( + promise, 'InvalidStateError', + 'The device must have a configuration selected.'); } usb_test(usb => { @@ -71,18 +77,16 @@ usb_test(usb => { return navigator.usb.getDevices().then(devices => { assert_equals(1, devices.length); let device = devices[0]; + const message = + 'An operation that changes the device state is in progress.'; return Promise.all([ device.open(), - assertRejectsWithError(device.open(), 'InvalidStateError', - 'An open() or close() task is in progress.'), - assertRejectsWithError(device.close(), 'InvalidStateError', - 'An open() or close() task is in progress.'), + assertRejectsWithError(device.open(), 'InvalidStateError', message), + assertRejectsWithError(device.close(), 'InvalidStateError', message), ]).then(() => Promise.all([ device.close(), - assertRejectsWithError(device.open(), 'InvalidStateError', - 'An open() or close() task is in progress.'), - assertRejectsWithError(device.close(), 'InvalidStateError', - 'An open() or close() task is in progress.'), + assertRejectsWithError(device.open(), 'InvalidStateError', message), + assertRejectsWithError(device.close(), 'InvalidStateError', message), ])); }); }, 'open and close cannot be called again while open or close are in progress'); @@ -107,10 +111,10 @@ usb_test(usb => { return device.open() .then(() => { usb.mockDeviceManager.removeMockDevice(usb.fakeDevices[0]); - return assertRejectsWithNotFoundError(device.setConfiguration(1)); + return assertRejectsWithNotFoundError(device.selectConfiguration(1)); }); }); -}, 'setConfiguration rejects when called on a disconnected device'); +}, 'selectConfiguration rejects when called on a disconnected device'); usb_test(usb => { usb.mockDeviceManager.addMockDevice(usb.fakeDevices[0]); @@ -118,7 +122,7 @@ usb_test(usb => { assert_equals(1, devices.length); var device = devices[0]; return Promise.all([ - assertRejectsWithNotOpenError(device.setConfiguration(1)), + assertRejectsWithNotOpenError(device.selectConfiguration(1)), assertRejectsWithNotOpenError(device.claimInterface(0)), assertRejectsWithNotOpenError(device.releaseInterface(0)), assertRejectsWithNotOpenError(device.setInterface(0, 1)), @@ -153,12 +157,15 @@ usb_test(usb => { return navigator.usb.getDevices().then(devices => { assert_equals(1, devices.length); let device = devices[0]; + assert_equals(device.configuration, null); return device.open() - .then(() => device.setConfiguration(1)) - .then(() => device.getConfiguration()) - .then(config => { - usb.assertConfigurationInfoEquals( - config, usb.fakeDevices[0].configurations[0]); + .then(() => { + assert_equals(device.configuration, null); + return device.selectConfiguration(1); + }) + .then(() => { + usb.assertConfigurationInfoEquals( + device.configuration, usb.fakeDevices[0].configurations[0]); }) .then(() => device.close()); }); @@ -168,43 +175,52 @@ usb_test(usb => { usb.mockDeviceManager.addMockDevice(usb.fakeDevices[0]); return navigator.usb.getDevices().then(devices => { assert_equals(1, devices.length); - var device = devices[0]; - return device.open() - .then(() => device.setConfiguration(1)) - .then(() => device.getConfiguration()) - .then(config => { - usb.assertConfigurationInfoEquals( - config, usb.fakeDevices[0].configurations[0]); - usb.mockDeviceManager.removeMockDevice(usb.fakeDevices[0]); - return assertRejectsWithNotFoundError(device.getConfiguration()); - }); - }); -}, 'getConfiguration rejects when called on a disconnected device'); - -usb_test(usb => { - usb.mockDeviceManager.addMockDevice(usb.fakeDevices[0]); - return navigator.usb.getDevices().then(devices => { - assert_equals(devices.length, 1); let device = devices[0]; + assert_equals(device.configuration, null); return device.open() - .then(() => - assertRejectsWithError(device.getConfiguration(), 'NotFoundError')) + .then(() => assertRejectsWithError( + device.selectConfiguration(3), 'NotFoundError', + 'The configuration value provided is not supported by the device.')) .then(() => device.close()); }); -}, 'querying an unset configuration raises NotFoundError'); +}, 'selectConfiguration rejects on invalid configurations'); + usb_test(usb => { usb.mockDeviceManager.addMockDevice(usb.fakeDevices[0]); return navigator.usb.getDevices().then(devices => { assert_equals(1, devices.length); let device = devices[0]; - return device.open() - .then(() => device.setConfiguration(1)) - .then(() => device.claimInterface(0)) - .then(() => device.releaseInterface(0)) - .then(() => device.close()); + assert_equals(device.configuration, null); + return device.open().then(() => Promise.all([ + assertRejectsWithNotConfiguredError(device.claimInterface(0)), + assertRejectsWithNotConfiguredError(device.releaseInterface(0)), + assertRejectsWithNotConfiguredError(device.setInterface(0, 1)), + assertRejectsWithNotConfiguredError(device.controlTransferIn({ + requestType: 'vendor', + recipient: 'device', + request: 0x42, + value: 0x1234, + index: 0x5678 + }, 7)), + assertRejectsWithNotConfiguredError(device.controlTransferOut({ + requestType: 'vendor', + recipient: 'device', + request: 0x42, + value: 0x1234, + index: 0x5678 + }, new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]))), + assertRejectsWithNotConfiguredError(device.clearHalt(1)), + assertRejectsWithNotConfiguredError(device.transferIn(1, 8)), + assertRejectsWithNotConfiguredError( + device.transferOut(1, new ArrayBuffer(8))), + assertRejectsWithNotConfiguredError( + device.isochronousTransferIn(1, [8])), + assertRejectsWithNotConfiguredError( + device.isochronousTransferOut(1, new ArrayBuffer(8), [8])), + ])).then(() => device.close()); }); -}, 'an interface can be claimed and released'); +}, 'methods requiring it reject when the device is unconfigured'); usb_test(usb => { usb.mockDeviceManager.addMockDevice(usb.fakeDevices[0]); @@ -212,12 +228,12 @@ usb_test(usb => { assert_equals(1, devices.length); let device = devices[0]; return device.open() - .then(() => - // TODO(reillyg): This should be INVALID_STATE_ERR. - assertRejectsWithError(device.claimInterface(0), 'NetworkError')) + .then(() => device.selectConfiguration(1)) + .then(() => device.claimInterface(0)) + .then(() => device.releaseInterface(0)) .then(() => device.close()); }); -}, 'claiming an interface fails without an active configuration'); +}, 'an interface can be claimed and released'); usb_test(usb => { usb.mockDeviceManager.addMockDevice(usb.fakeDevices[0]); @@ -225,7 +241,7 @@ usb_test(usb => { assert_equals(1, devices.length); var device = devices[0]; return device.open() - .then(() => device.setConfiguration(1)) + .then(() => device.selectConfiguration(1)) .then(() => { usb.mockDeviceManager.removeMockDevice(usb.fakeDevices[0]); return assertRejectsWithNotFoundError(device.claimInterface(0)); @@ -239,7 +255,7 @@ usb_test(usb => { assert_equals(1, devices.length); var device = devices[0]; return device.open() - .then(() => device.setConfiguration(1)) + .then(() => device.selectConfiguration(1)) .then(() => device.claimInterface(0)) .then(() => { usb.mockDeviceManager.removeMockDevice(usb.fakeDevices[0]); @@ -254,7 +270,7 @@ usb_test(usb => { assert_equals(1, devices.length); let device = devices[0]; return device.open() - .then(() => device.setConfiguration(2)) + .then(() => device.selectConfiguration(2)) .then(() => device.claimInterface(0)) .then(() => device.setInterface(0, 1)) .then(() => device.close()); @@ -267,7 +283,7 @@ usb_test(usb => { assert_equals(1, devices.length); var device = devices[0]; return device.open() - .then(() => device.setConfiguration(2)) + .then(() => device.selectConfiguration(2)) .then(() => device.claimInterface(0)) .then(() => { usb.mockDeviceManager.removeMockDevice(usb.fakeDevices[0]); @@ -282,6 +298,7 @@ usb_test(usb => { assert_equals(1, devices.length); let device = devices[0]; return device.open() + .then(() => device.selectConfiguration(1)) .then(() => device.controlTransferIn({ requestType: 'vendor', recipient: 'device', @@ -308,6 +325,7 @@ usb_test(usb => { assert_equals(1, devices.length); let device = devices[0]; return device.open() + .then(() => device.selectConfiguration(1)) .then(() => { usb.mockDeviceManager.removeMockDevice(usb.fakeDevices[0]); return assertRejectsWithNotFoundError(device.controlTransferIn({ @@ -327,6 +345,7 @@ usb_test(usb => { assert_equals(1, devices.length); let device = devices[0]; return device.open() + .then(() => device.selectConfiguration(1)) .then(() => device.controlTransferOut({ requestType: 'vendor', recipient: 'device', @@ -349,6 +368,7 @@ usb_test(usb => { assert_equals(1, devices.length); let device = devices[0]; return device.open() + .then(() => device.selectConfiguration(1)) .then(() => { usb.mockDeviceManager.removeMockDevice(usb.fakeDevices[0]); return assertRejectsWithNotFoundError(device.controlTransferOut({ @@ -368,7 +388,7 @@ usb_test(usb => { assert_equals(devices.length, 1); let device = devices[0]; return device.open() - .then(() => device.setConfiguration(1)) + .then(() => device.selectConfiguration(1)) .then(() => device.claimInterface(0)) .then(() => device.clearHalt(1)) .then(() => device.close()); @@ -381,7 +401,7 @@ usb_test(usb => { assert_equals(devices.length, 1); let device = devices[0]; return device.open() - .then(() => device.setConfiguration(1)) + .then(() => device.selectConfiguration(1)) .then(() => device.claimInterface(0)) .then(() => { usb.mockDeviceManager.removeMockDevice(usb.fakeDevices[0]); @@ -396,7 +416,7 @@ usb_test(usb => { assert_equals(devices.length, 1); let device = devices[0]; return device.open() - .then(() => device.setConfiguration(1)) + .then(() => device.selectConfiguration(1)) .then(() => device.claimInterface(0)) .then(() => device.transferIn(1, 8)) .then(result => { @@ -416,7 +436,7 @@ usb_test(usb => { assert_equals(devices.length, 1); let device = devices[0]; return device.open() - .then(() => device.setConfiguration(1)) + .then(() => device.selectConfiguration(1)) .then(() => device.claimInterface(1)) .then(() => device.transferIn(2, 1024)) .then(result => { @@ -437,7 +457,7 @@ usb_test(usb => { assert_equals(devices.length, 1); let device = devices[0]; return device.open() - .then(() => device.setConfiguration(1)) + .then(() => device.selectConfiguration(1)) .then(() => device.claimInterface(1)) .then(() => { usb.mockDeviceManager.removeMockDevice(usb.fakeDevices[0]); @@ -452,7 +472,7 @@ usb_test(usb => { assert_equals(devices.length, 1); let device = devices[0]; return device.open() - .then(() => device.setConfiguration(1)) + .then(() => device.selectConfiguration(1)) .then(() => device.claimInterface(1)) .then(() => { let data = new DataView(new ArrayBuffer(1024)); @@ -475,7 +495,7 @@ usb_test(usb => { assert_equals(devices.length, 1); let device = devices[0]; return device.open() - .then(() => device.setConfiguration(1)) + .then(() => device.selectConfiguration(1)) .then(() => device.claimInterface(1)) .then(() => { let data = new DataView(new ArrayBuffer(1024)); @@ -493,7 +513,7 @@ usb_test(usb => { assert_equals(devices.length, 1); let device = devices[0]; return device.open() - .then(() => device.setConfiguration(2)) + .then(() => device.selectConfiguration(2)) .then(() => device.claimInterface(0)) .then(() => device.setInterface(0, 1)) .then(() => device.isochronousTransferIn( @@ -526,7 +546,7 @@ usb_test(usb => { assert_equals(devices.length, 1); let device = devices[0]; return device.open() - .then(() => device.setConfiguration(2)) + .then(() => device.selectConfiguration(2)) .then(() => device.claimInterface(0)) .then(() => device.setInterface(0, 1)) .then(() => { @@ -543,7 +563,7 @@ usb_test(usb => { assert_equals(devices.length, 1); let device = devices[0]; return device.open() - .then(() => device.setConfiguration(2)) + .then(() => device.selectConfiguration(2)) .then(() => device.claimInterface(0)) .then(() => device.setInterface(0, 1)) .then(() => { @@ -576,7 +596,7 @@ usb_test(usb => { assert_equals(devices.length, 1); let device = devices[0]; return device.open() - .then(() => device.setConfiguration(2)) + .then(() => device.selectConfiguration(2)) .then(() => device.claimInterface(0)) .then(() => device.setInterface(0, 1)) .then(() => { diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt index bf639ce..46f2d4f 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt @@ -6138,6 +6138,7 @@ interface USBConnectionEvent : Event method constructor interface USBDevice attribute @@toStringTag + getter configuration getter configurations getter deviceClass getter deviceProtocol @@ -6161,13 +6162,12 @@ interface USBDevice method constructor method controlTransferIn method controlTransferOut - method getConfiguration method isochronousTransferIn method isochronousTransferOut method open method releaseInterface method reset - method setConfiguration + method selectConfiguration method setInterface method transferIn method transferOut diff --git a/third_party/WebKit/Source/modules/webusb/USBDevice.cpp b/third_party/WebKit/Source/modules/webusb/USBDevice.cpp index d4bc001..e35f6d4 100644 --- a/third_party/WebKit/Source/modules/webusb/USBDevice.cpp +++ b/third_party/WebKit/Source/modules/webusb/USBDevice.cpp @@ -26,8 +26,8 @@ namespace blink { namespace { -const char kOpenCloseInProgress[] = "An open() or close() task is in progress."; -const char kOpenRequired[] = "The device must be open()ed first."; +const char kDeviceStateChangeInProgress[] = "An operation that changes the device state is in progress."; +const char kOpenRequired[] = "The device must be opened first."; DOMException* convertControlTransferParameters( WebUSBDevice::TransferDirection direction, @@ -110,27 +110,37 @@ private: bool m_desiredState; // true: open, false: closed }; -class GetConfigurationPromiseAdapter : public WebCallbacks<uint8_t, const WebUSBError&> { +class SelectConfigurationPromiseAdapter : public WebCallbacks<void, const WebUSBError&> { public: - GetConfigurationPromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver) : m_device(device), m_resolver(resolver) {} + SelectConfigurationPromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver, int configurationIndex) + : m_device(device) + , m_resolver(resolver) + , m_configurationIndex(configurationIndex) + { + } - void onSuccess(uint8_t value) override + void onSuccess() override { if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; - m_resolver->resolve(USBConfiguration::createFromValue(m_device, value)); + if (m_device) + m_device->onConfigurationSelected(true /* success */, m_configurationIndex); + m_resolver->resolve(); } void onError(const WebUSBError& e) override { if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) return; + if (m_device) + m_device->onConfigurationSelected(false /* failure */, m_configurationIndex); m_resolver->reject(USBError::take(m_resolver, e)); } private: - Persistent<USBDevice> m_device; + WeakPersistent<USBDevice> m_device; Persistent<ScriptPromiseResolver> m_resolver; + int m_configurationIndex; }; class InputTransferResult { @@ -234,16 +244,40 @@ USBDevice* USBDevice::take(ScriptPromiseResolver* resolver, PassOwnPtr<WebUSBDev return USBDevice::create(device, resolver->getExecutionContext()); } +USBDevice::USBDevice(PassOwnPtr<WebUSBDevice> device, ExecutionContext* context) + : ContextLifecycleObserver(context) + , m_device(device) + , m_opened(false) + , m_deviceStateChangeInProgress(false) +{ + m_configurationIndex = findConfigurationIndex(info().activeConfiguration); +} + void USBDevice::onDeviceOpenedOrClosed(bool opened) { m_opened = opened; m_deviceStateChangeInProgress = false; } +void USBDevice::onConfigurationSelected(bool success, int configurationIndex) +{ + if (success) + m_configurationIndex = configurationIndex; + m_deviceStateChangeInProgress = false; +} + +USBConfiguration* USBDevice::configuration() const +{ + if (m_configurationIndex != -1) + return USBConfiguration::create(this, m_configurationIndex); + return nullptr; +} + HeapVector<Member<USBConfiguration>> USBDevice::configurations() const { HeapVector<Member<USBConfiguration>> configurations; - for (size_t i = 0; i < info().configurations.size(); ++i) + size_t numConfigurations = info().configurations.size(); + for (size_t i = 0; i < numConfigurations; ++i) configurations.append(USBConfiguration::create(this, i)); return configurations; } @@ -253,7 +287,7 @@ ScriptPromise USBDevice::open(ScriptState* scriptState) ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); if (m_deviceStateChangeInProgress) { - resolver->reject(DOMException::create(InvalidStateError, kOpenCloseInProgress)); + resolver->reject(DOMException::create(InvalidStateError, kDeviceStateChangeInProgress)); } else if (m_opened) { resolver->resolve(); } else { @@ -268,7 +302,7 @@ ScriptPromise USBDevice::close(ScriptState* scriptState) ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); if (m_deviceStateChangeInProgress) { - resolver->reject(DOMException::create(InvalidStateError, kOpenCloseInProgress)); + resolver->reject(DOMException::create(InvalidStateError, kDeviceStateChangeInProgress)); } else if (!m_opened) { resolver->resolve(); } else { @@ -278,22 +312,25 @@ ScriptPromise USBDevice::close(ScriptState* scriptState) return promise; } -ScriptPromise USBDevice::getConfiguration(ScriptState* scriptState) -{ - ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); - ScriptPromise promise = resolver->promise(); - m_device->getConfiguration(new GetConfigurationPromiseAdapter(this, resolver)); - return promise; -} - -ScriptPromise USBDevice::setConfiguration(ScriptState* scriptState, uint8_t configurationValue) +ScriptPromise USBDevice::selectConfiguration(ScriptState* scriptState, uint8_t configurationValue) { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - if (!m_opened) + if (!m_opened) { resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); - else - m_device->setConfiguration(configurationValue, new CallbackPromiseAdapter<void, USBError>(resolver)); + } else if (m_deviceStateChangeInProgress) { + resolver->reject(DOMException::create(InvalidStateError, kDeviceStateChangeInProgress)); + } else { + int configurationIndex = findConfigurationIndex(configurationValue); + if (configurationIndex == -1) { + resolver->reject(DOMException::create(NotFoundError, "The configuration value provided is not supported by the device.")); + } else if (m_configurationIndex == configurationIndex) { + resolver->resolve(); + } else { + m_deviceStateChangeInProgress = true; + m_device->setConfiguration(configurationValue, new SelectConfigurationPromiseAdapter(this, resolver, configurationIndex)); + } + } return promise; } @@ -301,9 +338,7 @@ ScriptPromise USBDevice::claimInterface(ScriptState* scriptState, uint8_t interf { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - if (!m_opened) - resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); - else + if (ensureDeviceConfigured(resolver)) m_device->claimInterface(interfaceNumber, new CallbackPromiseAdapter<void, USBError>(resolver)); return promise; } @@ -312,9 +347,7 @@ ScriptPromise USBDevice::releaseInterface(ScriptState* scriptState, uint8_t inte { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - if (!m_opened) - resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); - else + if (ensureDeviceConfigured(resolver)) m_device->releaseInterface(interfaceNumber, new CallbackPromiseAdapter<void, USBError>(resolver)); return promise; } @@ -323,9 +356,7 @@ ScriptPromise USBDevice::setInterface(ScriptState* scriptState, uint8_t interfac { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - if (!m_opened) - resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); - else + if (ensureDeviceConfigured(resolver)) m_device->setInterface(interfaceNumber, alternateSetting, new CallbackPromiseAdapter<void, USBError>(resolver)); return promise; } @@ -334,19 +365,14 @@ ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - if (!m_opened) { - resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); - return promise; - } - - WebUSBDevice::ControlTransferParameters parameters; - DOMException* error = convertControlTransferParameters(WebUSBDevice::TransferDirection::In, setup, ¶meters); - if (error) { - resolver->reject(error); - return promise; + if (ensureDeviceConfigured(resolver)) { + WebUSBDevice::ControlTransferParameters parameters; + DOMException* error = convertControlTransferParameters(WebUSBDevice::TransferDirection::In, setup, ¶meters); + if (error) + resolver->reject(error); + else + m_device->controlTransfer(parameters, nullptr, length, 0, new CallbackPromiseAdapter<InputTransferResult, USBError>(resolver)); } - - m_device->controlTransfer(parameters, nullptr, length, 0, new CallbackPromiseAdapter<InputTransferResult, USBError>(resolver)); return promise; } @@ -354,19 +380,14 @@ ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - if (!m_opened) { - resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); - return promise; + if (ensureDeviceConfigured(resolver)) { + WebUSBDevice::ControlTransferParameters parameters; + DOMException* error = convertControlTransferParameters(WebUSBDevice::TransferDirection::Out, setup, ¶meters); + if (error) + resolver->reject(error); + else + m_device->controlTransfer(parameters, nullptr, 0, 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); } - - WebUSBDevice::ControlTransferParameters parameters; - DOMException* error = convertControlTransferParameters(WebUSBDevice::TransferDirection::Out, setup, ¶meters); - if (error) { - resolver->reject(error); - return promise; - } - - m_device->controlTransfer(parameters, nullptr, 0, 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); return promise; } @@ -374,20 +395,16 @@ ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - if (!m_opened) { - resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); - return promise; - } - - WebUSBDevice::ControlTransferParameters parameters; - DOMException* error = convertControlTransferParameters(WebUSBDevice::TransferDirection::Out, setup, ¶meters); - if (error) { - resolver->reject(error); - return promise; + if (ensureDeviceConfigured(resolver)) { + WebUSBDevice::ControlTransferParameters parameters; + DOMException* error = convertControlTransferParameters(WebUSBDevice::TransferDirection::Out, setup, ¶meters); + if (error) { + resolver->reject(error); + } else { + BufferSource buffer(data); + m_device->controlTransfer(parameters, buffer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); + } } - - BufferSource buffer(data); - m_device->controlTransfer(parameters, buffer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); return promise; } @@ -395,9 +412,7 @@ ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, uint8_t endpointNum { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - if (!m_opened) - resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); - else + if (ensureDeviceConfigured(resolver)) m_device->clearHalt(endpointNumber, new CallbackPromiseAdapter<void, USBError>(resolver)); return promise; } @@ -406,9 +421,7 @@ ScriptPromise USBDevice::transferIn(ScriptState* scriptState, uint8_t endpointNu { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - if (!m_opened) - resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); - else + if (ensureDeviceConfigured(resolver)) m_device->transfer(WebUSBDevice::TransferDirection::In, endpointNumber, nullptr, length, 0, new CallbackPromiseAdapter<InputTransferResult, USBError>(resolver)); return promise; } @@ -417,9 +430,7 @@ ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - if (!m_opened) { - resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); - } else { + if (ensureDeviceConfigured(resolver)) { BufferSource buffer(data); m_device->transfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buffer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); } @@ -430,9 +441,7 @@ ScriptPromise USBDevice::isochronousTransferIn(ScriptState* scriptState, uint8_t { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - if (!m_opened) - resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); - else + if (ensureDeviceConfigured(resolver)) m_device->isochronousTransfer(WebUSBDevice::TransferDirection::In, endpointNumber, nullptr, 0, packetLengths, 0, new CallbackPromiseAdapter<IsochronousInputTransferResult, USBError>(resolver)); return promise; } @@ -441,9 +450,7 @@ ScriptPromise USBDevice::isochronousTransferOut(ScriptState* scriptState, uint8_ { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - if (!m_opened) { - resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); - } else { + if (ensureDeviceConfigured(resolver)) { BufferSource buffer(data); m_device->isochronousTransfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buffer.data(), buffer.size(), packetLengths, 0, new CallbackPromiseAdapter<IsochronousOutputTransferResult, USBError>(resolver)); } @@ -456,6 +463,8 @@ ScriptPromise USBDevice::reset(ScriptState* scriptState) ScriptPromise promise = resolver->promise(); if (!m_opened) resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); + else if (m_deviceStateChangeInProgress) + resolver->reject(DOMException::create(InvalidStateError, kDeviceStateChangeInProgress)); else m_device->reset(new CallbackPromiseAdapter<void, USBError>(resolver)); return promise; @@ -472,4 +481,28 @@ DEFINE_TRACE(USBDevice) ContextLifecycleObserver::trace(visitor); } +int USBDevice::findConfigurationIndex(uint8_t configurationValue) const +{ + const auto& configurations = info().configurations; + for (size_t i = 0; i < configurations.size(); ++i) { + if (configurations[i].configurationValue == configurationValue) + return i; + } + return -1; +} + +bool USBDevice::ensureDeviceConfigured(ScriptPromiseResolver* resolver) const +{ + if (!m_opened) { + resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); + } else if (m_deviceStateChangeInProgress) { + resolver->reject(DOMException::create(InvalidStateError, kDeviceStateChangeInProgress)); + } else if (m_configurationIndex == -1) { + resolver->reject(DOMException::create(InvalidStateError, "The device must have a configuration selected.")); + } else { + return true; + } + return false; +} + } // namespace blink diff --git a/third_party/WebKit/Source/modules/webusb/USBDevice.h b/third_party/WebKit/Source/modules/webusb/USBDevice.h index aa6d419..9e8afc6 100644 --- a/third_party/WebKit/Source/modules/webusb/USBDevice.h +++ b/third_party/WebKit/Source/modules/webusb/USBDevice.h @@ -37,18 +37,12 @@ public: static USBDevice* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBDevice>); - explicit USBDevice(PassOwnPtr<WebUSBDevice> device, ExecutionContext* context) - : ContextLifecycleObserver(context) - , m_device(device) - , m_opened(false) - , m_deviceStateChangeInProgress(false) - { - } - + explicit USBDevice(PassOwnPtr<WebUSBDevice>, ExecutionContext*); virtual ~USBDevice() { } const WebUSBDeviceInfo& info() const { return m_device->info(); } void onDeviceOpenedOrClosed(bool); + void onConfigurationSelected(bool success, int configurationIndex); // IDL exposed interface: String guid() const { return info().guid; } @@ -66,13 +60,13 @@ public: String manufacturerName() const { return info().manufacturerName; } String productName() const { return info().productName; } String serialNumber() const { return info().serialNumber; } + USBConfiguration* configuration() const; HeapVector<Member<USBConfiguration>> configurations() const; bool opened() const { return m_opened; } ScriptPromise open(ScriptState*); ScriptPromise close(ScriptState*); - ScriptPromise getConfiguration(ScriptState*); - ScriptPromise setConfiguration(ScriptState*, uint8_t configurationValue); + ScriptPromise selectConfiguration(ScriptState*, uint8_t configurationValue); ScriptPromise claimInterface(ScriptState*, uint8_t interfaceNumber); ScriptPromise releaseInterface(ScriptState*, uint8_t interfaceNumber); ScriptPromise setInterface(ScriptState*, uint8_t interfaceNumber, uint8_t alternateSetting); @@ -91,9 +85,13 @@ public: DECLARE_TRACE(); private: + int findConfigurationIndex(uint8_t configurationValue) const; + bool ensureDeviceConfigured(ScriptPromiseResolver*) const; + OwnPtr<WebUSBDevice> m_device; bool m_opened; bool m_deviceStateChangeInProgress; + int m_configurationIndex; }; } // namespace blink diff --git a/third_party/WebKit/Source/modules/webusb/USBDevice.idl b/third_party/WebKit/Source/modules/webusb/USBDevice.idl index 84c2382..d09c8da 100644 --- a/third_party/WebKit/Source/modules/webusb/USBDevice.idl +++ b/third_party/WebKit/Source/modules/webusb/USBDevice.idl @@ -31,13 +31,13 @@ enum USBTransferStatus { readonly attribute DOMString? manufacturerName; readonly attribute DOMString? productName; readonly attribute DOMString? serialNumber; + readonly attribute USBConfiguration? configuration; readonly attribute sequence<USBConfiguration> configurations; readonly attribute boolean opened; [CallWith=ScriptState] Promise<void> open(); [CallWith=ScriptState] Promise<void> close(); - [CallWith=ScriptState] Promise<void> getConfiguration(); - [CallWith=ScriptState] Promise<void> setConfiguration(octet configurationValue); + [CallWith=ScriptState] Promise<void> selectConfiguration(octet configurationValue); [CallWith=ScriptState] Promise<void> claimInterface(octet interfaceNumber); [CallWith=ScriptState] Promise<void> releaseInterface(octet interfaceNumber); [CallWith=ScriptState] Promise<void> setInterface(octet interfaceNumber, octet alternateSetting); diff --git a/third_party/WebKit/public/platform/modules/webusb/WebUSBDevice.h b/third_party/WebKit/public/platform/modules/webusb/WebUSBDevice.h index 70a8d14..59ccd7f 100644 --- a/third_party/WebKit/public/platform/modules/webusb/WebUSBDevice.h +++ b/third_party/WebKit/public/platform/modules/webusb/WebUSBDevice.h @@ -17,7 +17,6 @@ struct WebUSBTransferInfo; using WebUSBDeviceOpenCallbacks = WebCallbacks<void, const WebUSBError&>; using WebUSBDeviceCloseCallbacks = WebCallbacks<void, const WebUSBError&>; -using WebUSBDeviceGetConfigurationCallbacks = WebCallbacks<uint8_t, const WebUSBError&>; using WebUSBDeviceSetConfigurationCallbacks = WebCallbacks<void, const WebUSBError&>; using WebUSBDeviceClaimInterfaceCallbacks = WebCallbacks<void, const WebUSBError&>; using WebUSBDeviceReleaseInterfaceCallbacks = WebCallbacks<void, const WebUSBError&>; @@ -67,10 +66,6 @@ public: // Ownership of the WebUSBDeviceCloseCallbacks is transferred to the client. virtual void close(WebUSBDeviceCloseCallbacks*) = 0; - // Gets the active configuration of the device. - // Ownership of the WebUSBDeviceGetConfigurationCallbacks is transferred to the client. - virtual void getConfiguration(WebUSBDeviceGetConfigurationCallbacks*) = 0; - // Sets the active configuration for the device. // Ownership of the WebUSBDeviceSetConfigurationCallbacks is transferred to the client. virtual void setConfiguration(uint8_t configurationValue, WebUSBDeviceSetConfigurationCallbacks*) = 0; diff --git a/third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceInfo.h b/third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceInfo.h index a2c049d..c59dd3b 100644 --- a/third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceInfo.h +++ b/third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceInfo.h @@ -101,6 +101,7 @@ struct WebUSBDeviceInfo { WebString manufacturerName; WebString productName; WebString serialNumber; + uint8_t activeConfiguration; WebVector<Configuration> configurations; }; |