Chromium Code Reviews| 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, ¶m); |
| + if (extension()->permissions_data()->CheckAPIPermissionWithParam( |
| + APIPermission::kUsbDevice, ¶m)) { |
| + 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; |
| } |