diff options
author | reillyg <reillyg@chromium.org> | 2016-02-11 13:38:49 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-11 21:40:57 +0000 |
commit | 01bda807e1f107f607b767281c62d5f9ddb582b0 (patch) | |
tree | a77a19ee7dab5da6cf6cda19818c0222dbe32c13 | |
parent | 22ecae62b23d376aa68675b4de70ad96c62ad44c (diff) | |
download | chromium_src-01bda807e1f107f607b767281c62d5f9ddb582b0.zip chromium_src-01bda807e1f107f607b767281c62d5f9ddb582b0.tar.gz chromium_src-01bda807e1f107f607b767281c62d5f9ddb582b0.tar.bz2 |
webusb: Reject the promise if the device is already open.
This change adds the necessary plumbing for the USB Mojo service
implementation to detect when a device is already open and to report
this error so that the WebUSB API can reject the promise returned by
USBDevice::open() with an InvalidStateError.
BUG=492204
Review URL: https://codereview.chromium.org/1693433003
Cr-Commit-Position: refs/heads/master@{#375003}
-rw-r--r-- | content/renderer/usb/web_usb_device_impl.cc | 6 | ||||
-rw-r--r-- | device/usb/mojo/device_impl.cc | 7 | ||||
-rw-r--r-- | device/usb/mojo/device_impl_unittest.cc | 17 | ||||
-rw-r--r-- | device/usb/public/interfaces/device.mojom | 3 | ||||
-rw-r--r-- | third_party/WebKit/Source/modules/webusb/USBError.cpp | 2 | ||||
-rw-r--r-- | third_party/WebKit/public/platform/modules/webusb/WebUSBError.h | 1 |
6 files changed, 30 insertions, 6 deletions
diff --git a/content/renderer/usb/web_usb_device_impl.cc b/content/renderer/usb/web_usb_device_impl.cc index b6040a9..ebb1786 100644 --- a/content/renderer/usb/web_usb_device_impl.cc +++ b/content/renderer/usb/web_usb_device_impl.cc @@ -24,6 +24,7 @@ namespace { 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."; @@ -74,6 +75,11 @@ void OnOpenDevice( blink::WebUSBError::Error::Security, base::ASCIIToUTF16(kDeviceNoAccess))); break; + case device::usb::OpenDeviceError::ALREADY_OPEN: + scoped_callbacks->onError(blink::WebUSBError( + blink::WebUSBError::Error::InvalidState, + base::ASCIIToUTF16(kDeviceAlreadyOpen))); + break; default: NOTREACHED(); } diff --git a/device/usb/mojo/device_impl.cc b/device/usb/mojo/device_impl.cc index 724e911..0d1c64f 100644 --- a/device/usb/mojo/device_impl.cc +++ b/device/usb/mojo/device_impl.cc @@ -251,8 +251,11 @@ void DeviceImpl::GetConfiguration(const GetConfigurationCallback& callback) { } void DeviceImpl::Open(const OpenCallback& callback) { - device_->Open( - base::Bind(&DeviceImpl::OnOpen, weak_factory_.GetWeakPtr(), callback)); + if (device_handle_) + callback.Run(OpenDeviceError::ALREADY_OPEN); + else + device_->Open( + base::Bind(&DeviceImpl::OnOpen, weak_factory_.GetWeakPtr(), callback)); } void DeviceImpl::Close(const CloseCallback& callback) { diff --git a/device/usb/mojo/device_impl_unittest.cc b/device/usb/mojo/device_impl_unittest.cc index 626edd9..c6c2e49 100644 --- a/device/usb/mojo/device_impl_unittest.cc +++ b/device/usb/mojo/device_impl_unittest.cc @@ -459,10 +459,19 @@ TEST_F(USBDeviceImplTest, Open) { EXPECT_CALL(mock_device(), Open(_)); - base::RunLoop loop; - device->Open( - base::Bind(&ExpectOpenAndThen, OpenDeviceError::OK, loop.QuitClosure())); - loop.Run(); + { + base::RunLoop loop; + device->Open(base::Bind(&ExpectOpenAndThen, OpenDeviceError::OK, + loop.QuitClosure())); + loop.Run(); + } + + { + base::RunLoop loop; + device->Open(base::Bind(&ExpectOpenAndThen, OpenDeviceError::ALREADY_OPEN, + loop.QuitClosure())); + loop.Run(); + } EXPECT_CALL(mock_handle(), Close()); } diff --git a/device/usb/public/interfaces/device.mojom b/device/usb/public/interfaces/device.mojom index 25addb2..de7bd5f 100644 --- a/device/usb/public/interfaces/device.mojom +++ b/device/usb/public/interfaces/device.mojom @@ -10,6 +10,9 @@ enum OpenDeviceError { // The operating system denied access to the device. ACCESS_DENIED, + + // The device is already open. + ALREADY_OPEN, }; enum TransferDirection { diff --git a/third_party/WebKit/Source/modules/webusb/USBError.cpp b/third_party/WebKit/Source/modules/webusb/USBError.cpp index 7e20364..7fe3425 100644 --- a/third_party/WebKit/Source/modules/webusb/USBError.cpp +++ b/third_party/WebKit/Source/modules/webusb/USBError.cpp @@ -13,6 +13,8 @@ namespace blink { DOMException* USBError::take(ScriptPromiseResolver*, const WebUSBError& webError) { switch (webError.error) { + case WebUSBError::Error::InvalidState: + return DOMException::create(InvalidStateError, webError.message); case WebUSBError::Error::Network: return DOMException::create(NetworkError, webError.message); case WebUSBError::Error::NotFound: diff --git a/third_party/WebKit/public/platform/modules/webusb/WebUSBError.h b/third_party/WebKit/public/platform/modules/webusb/WebUSBError.h index e48a1d7..bf45f03 100644 --- a/third_party/WebKit/public/platform/modules/webusb/WebUSBError.h +++ b/third_party/WebKit/public/platform/modules/webusb/WebUSBError.h @@ -13,6 +13,7 @@ namespace blink { // satisfied. struct WebUSBError { enum class Error { + InvalidState, Network, NotFound, Security, |