summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorreillyg <reillyg@chromium.org>2016-02-11 13:38:49 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-11 21:40:57 +0000
commit01bda807e1f107f607b767281c62d5f9ddb582b0 (patch)
treea77a19ee7dab5da6cf6cda19818c0222dbe32c13
parent22ecae62b23d376aa68675b4de70ad96c62ad44c (diff)
downloadchromium_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.cc6
-rw-r--r--device/usb/mojo/device_impl.cc7
-rw-r--r--device/usb/mojo/device_impl_unittest.cc17
-rw-r--r--device/usb/public/interfaces/device.mojom3
-rw-r--r--third_party/WebKit/Source/modules/webusb/USBError.cpp2
-rw-r--r--third_party/WebKit/public/platform/modules/webusb/WebUSBError.h1
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,