Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Unified Diff: extensions/browser/api/usb/usb_api.cc

Issue 599303004: Add getUserSelectedDevices to the USB extensions API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: extensions/browser/api/usb/usb_api.cc
diff --git a/extensions/browser/api/usb/usb_api.cc b/extensions/browser/api/usb/usb_api.cc
index c5e35aad892d681dd65709f5bf2f8ed6cb519723..600cbf29acedc65a9a2b6a20a070f751a8f47442 100644
--- a/extensions/browser/api/usb/usb_api.cc
+++ b/extensions/browser/api/usb/usb_api.cc
@@ -12,6 +12,9 @@
#include "device/core/device_client.h"
#include "device/usb/usb_device_handle.h"
#include "device/usb/usb_service.h"
+#include "extensions/browser/api/device_permissions_manager.h"
+#include "extensions/browser/api/device_permissions_prompt.h"
+#include "extensions/browser/api/extensions_api_client.h"
#include "extensions/browser/api/usb/usb_device_resource.h"
#include "extensions/browser/extension_system.h"
#include "extensions/common/api/usb.h"
@@ -25,6 +28,7 @@ namespace CloseDevice = usb::CloseDevice;
namespace ControlTransfer = usb::ControlTransfer;
namespace FindDevices = usb::FindDevices;
namespace GetDevices = usb::GetDevices;
+namespace GetUserSelectedDevices = usb::GetUserSelectedDevices;
namespace InterruptTransfer = usb::InterruptTransfer;
namespace IsochronousTransfer = usb::IsochronousTransfer;
namespace GetConfiguration = usb::GetConfiguration;
@@ -36,6 +40,20 @@ namespace ResetDevice = usb::ResetDevice;
namespace SetInterfaceAlternateSetting = usb::SetInterfaceAlternateSetting;
using content::BrowserThread;
+using device::UsbConfigDescriptor;
+using device::UsbDevice;
+using device::UsbDeviceFilter;
+using device::UsbDeviceHandle;
+using device::UsbEndpointDescriptor;
+using device::UsbEndpointDirection;
+using device::UsbInterfaceDescriptor;
+using device::UsbService;
+using device::UsbSynchronizationType;
+using device::UsbTransferStatus;
+using device::UsbTransferType;
+using device::UsbUsageType;
+using std::string;
+using std::vector;
using usb::ConfigDescriptor;
using usb::ControlTransferInfo;
using usb::ConnectionHandle;
@@ -50,18 +68,6 @@ using usb::RequestType;
using usb::SynchronizationType;
using usb::TransferType;
using usb::UsageType;
-using device::UsbConfigDescriptor;
-using device::UsbDevice;
-using device::UsbDeviceFilter;
-using device::UsbDeviceHandle;
-using device::UsbEndpointDescriptor;
-using device::UsbEndpointDirection;
-using device::UsbInterfaceDescriptor;
-using device::UsbService;
-using device::UsbSynchronizationType;
-using device::UsbTransferStatus;
-using device::UsbTransferType;
-using device::UsbUsageType;
typedef std::vector<scoped_refptr<UsbDevice> > DeviceVector;
typedef scoped_ptr<DeviceVector> ScopedDeviceVector;
@@ -294,7 +300,7 @@ base::Value* PopulateConnectionHandle(int handle,
return result.ToValue().release();
}
-base::Value* PopulateDevice(UsbDevice* device) {
+base::Value* PopulateDevice(const UsbDevice* device) {
Device result;
result.device = device->unique_id();
result.vendor_id = device->vendor_id();
@@ -419,6 +425,25 @@ void ConvertConfigDescriptor(const UsbConfigDescriptor& input,
}
}
+void ConvertDeviceFilter(const usb::DeviceFilter& input,
+ UsbDeviceFilter* output) {
+ if (input.vendor_id) {
+ output->SetVendorId(*input.vendor_id);
+ }
+ if (input.product_id) {
+ output->SetProductId(*input.product_id);
+ }
+ if (input.interface_class) {
+ output->SetInterfaceClass(*input.interface_class);
+ }
+ if (input.interface_subclass) {
+ output->SetInterfaceSubclass(*input.interface_subclass);
+ }
+ if (input.interface_protocol) {
+ output->SetInterfaceProtocol(*input.interface_protocol);
+ }
+}
+
} // namespace
namespace extensions {
@@ -439,33 +464,21 @@ bool UsbAsyncApiFunction::Respond() {
return error_.empty();
}
-// static
-void UsbAsyncApiFunction::CreateDeviceFilter(const usb::DeviceFilter& input,
- UsbDeviceFilter* output) {
- if (input.vendor_id) {
- output->SetVendorId(*input.vendor_id);
- }
- if (input.product_id) {
- output->SetProductId(*input.product_id);
- }
- if (input.interface_class) {
- output->SetInterfaceClass(*input.interface_class);
- }
- if (input.interface_subclass) {
- output->SetInterfaceSubclass(*input.interface_subclass);
- }
- if (input.interface_protocol) {
- output->SetInterfaceProtocol(*input.interface_protocol);
- }
-}
-
bool UsbAsyncApiFunction::HasDevicePermission(scoped_refptr<UsbDevice> device) {
UsbDevicePermission::CheckParam param(
device->vendor_id(),
device->product_id(),
UsbDevicePermissionData::UNSPECIFIED_INTERFACE);
- return extension()->permissions_data()->CheckAPIPermissionWithParam(
- APIPermission::kUsbDevice, &param);
+ if (extension()->permissions_data()->CheckAPIPermissionWithParam(
+ APIPermission::kUsbDevice, &param)) {
+ return true;
+ }
+
+ if (device_permissions_.get()) {
+ return device_permissions_->CheckUsbDevice(device);
+ }
Finnur 2014/10/15 09:33:08 Nit: No braces for single-line if clauses.
Reilly Grant (use Gerrit) 2014/10/15 19:12:43 Style Guide: "In general, curly braces are not req
+
+ return false;
}
scoped_refptr<UsbDevice> UsbAsyncApiFunction::GetDeviceOrCompleteWithError(
@@ -657,6 +670,8 @@ UsbGetDevicesFunction::~UsbGetDevicesFunction() {
bool UsbGetDevicesFunction::Prepare() {
parameters_ = GetDevices::Params::Create(*args_);
EXTENSION_FUNCTION_VALIDATE(parameters_.get());
+ device_permissions_ = DevicePermissionsManager::Get(browser_context())
+ ->GetForExtension(extension()->id());
return true;
}
@@ -665,8 +680,8 @@ void UsbGetDevicesFunction::AsyncWorkStart() {
if (parameters_->options.filters) {
filters.resize(parameters_->options.filters->size());
for (size_t i = 0; i < parameters_->options.filters->size(); ++i) {
- CreateDeviceFilter(*parameters_->options.filters->at(i).get(),
- &filters[i]);
+ ConvertDeviceFilter(*parameters_->options.filters->at(i).get(),
+ &filters[i]);
}
}
if (parameters_->options.vendor_id) {
@@ -699,6 +714,46 @@ void UsbGetDevicesFunction::AsyncWorkStart() {
AsyncWorkCompleted();
}
+UsbGetUserSelectedDevicesFunction::UsbGetUserSelectedDevicesFunction() {
+}
+
+UsbGetUserSelectedDevicesFunction::~UsbGetUserSelectedDevicesFunction() {
+}
+
+AsyncApiFunction::ResponseAction UsbGetUserSelectedDevicesFunction::Run() {
+ scoped_ptr<extensions::core_api::usb::GetUserSelectedDevices::Params>
+ parameters = GetUserSelectedDevices::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
+
+ if (!user_gesture()) {
+ return RespondNow(OneArgument(new base::ListValue()));
+ }
Finnur 2014/10/15 09:33:08 nit: No braces.
+
+ std::vector<UsbDeviceFilter> filters(parameters->filters.size());
+ for (size_t i = 0; i < parameters->filters.size(); ++i) {
+ ConvertDeviceFilter(*parameters->filters[i].get(), &filters[i]);
+ }
Finnur 2014/10/15 09:33:08 nit: No braces.
+
+ DevicePermissionsPrompt* prompt =
+ new DevicePermissionsPrompt(GetAssociatedWebContents());
+ AddRef();
+ prompt->AskForUsbDevices(
+ this, extension(), browser_context(), parameters->multiple, filters);
+ return RespondLater();
+}
+
+void UsbGetUserSelectedDevicesFunction::UsbDevicesChosen(
+ const std::vector<scoped_refptr<UsbDevice>>& devices) {
+ scoped_ptr<base::ListValue> result(new base::ListValue());
+ for (const auto& device : devices) {
+ result->Append(PopulateDevice(device.get()));
+ }
Finnur 2014/10/15 09:33:08 nit: No braces.
+
+ SetResult(result.release());
+ SendResponse(true);
+ Release();
+}
+
UsbRequestAccessFunction::UsbRequestAccessFunction() {
}
@@ -708,6 +763,8 @@ UsbRequestAccessFunction::~UsbRequestAccessFunction() {
bool UsbRequestAccessFunction::Prepare() {
parameters_ = RequestAccess::Params::Create(*args_);
EXTENSION_FUNCTION_VALIDATE(parameters_.get());
+ device_permissions_ = DevicePermissionsManager::Get(browser_context())
+ ->GetForExtension(extension()->id());
return true;
}
@@ -741,6 +798,8 @@ UsbOpenDeviceFunction::~UsbOpenDeviceFunction() {
bool UsbOpenDeviceFunction::Prepare() {
parameters_ = OpenDevice::Params::Create(*args_);
EXTENSION_FUNCTION_VALIDATE(parameters_.get());
+ device_permissions_ = DevicePermissionsManager::Get(browser_context())
+ ->GetForExtension(extension()->id());
return true;
}

Powered by Google App Engine
This is Rietveld 408576698