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; |
} |