 Chromium Code Reviews
 Chromium Code Reviews Issue 1115213004:
  Add chrome.hid.getUserSelectedDevices API.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master
    
  
    Issue 1115213004:
  Add chrome.hid.getUserSelectedDevices API.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master| Index: extensions/browser/api/hid/hid_api.cc | 
| diff --git a/extensions/browser/api/hid/hid_api.cc b/extensions/browser/api/hid/hid_api.cc | 
| index d67f56499d88346f99b184179e09d220e31e4776..c0679bcf9ec235357fd87a990e33dd770f6e48de 100644 | 
| --- a/extensions/browser/api/hid/hid_api.cc | 
| +++ b/extensions/browser/api/hid/hid_api.cc | 
| @@ -14,6 +14,8 @@ | 
| #include "device/hid/hid_device_info.h" | 
| #include "device/hid/hid_service.h" | 
| #include "extensions/browser/api/api_resource_manager.h" | 
| +#include "extensions/browser/api/device_permissions_prompt.h" | 
| +#include "extensions/browser/api/extensions_api_client.h" | 
| #include "extensions/common/api/hid.h" | 
| #include "net/base/io_buffer.h" | 
| @@ -26,7 +28,6 @@ using device::HidService; | 
| namespace { | 
| -const char kErrorServiceUnavailable[] = "HID services are unavailable."; | 
| const char kErrorPermissionDenied[] = "Permission to access device was denied."; | 
| const char kErrorInvalidDeviceId[] = "Invalid HID device ID."; | 
| const char kErrorFailedToOpenDevice[] = "Failed to open HID device."; | 
| @@ -67,12 +68,10 @@ HidGetDevicesFunction::~HidGetDevicesFunction() {} | 
| ExtensionFunction::ResponseAction HidGetDevicesFunction::Run() { | 
| scoped_ptr<core_api::hid::GetDevices::Params> parameters = | 
| hid::GetDevices::Params::Create(*args_); | 
| - EXTENSION_FUNCTION_VALIDATE(parameters.get()); | 
| + EXTENSION_FUNCTION_VALIDATE(parameters); | 
| HidDeviceManager* device_manager = HidDeviceManager::Get(browser_context()); | 
| - if (!device_manager) { | 
| - return RespondNow(Error(kErrorServiceUnavailable)); | 
| - } | 
| + CHECK(device_manager); | 
| std::vector<HidDeviceFilter> filters; | 
| if (parameters->options.filters) { | 
| @@ -101,6 +100,51 @@ void HidGetDevicesFunction::OnEnumerationComplete( | 
| Respond(OneArgument(devices.release())); | 
| } | 
| +HidGetUserSelectedDevicesFunction::HidGetUserSelectedDevicesFunction() { | 
| +} | 
| + | 
| +HidGetUserSelectedDevicesFunction::~HidGetUserSelectedDevicesFunction() { | 
| +} | 
| + | 
| +ExtensionFunction::ResponseAction HidGetUserSelectedDevicesFunction::Run() { | 
| + scoped_ptr<core_api::hid::GetUserSelectedDevices::Params> parameters = | 
| + hid::GetUserSelectedDevices::Params::Create(*args_); | 
| + EXTENSION_FUNCTION_VALIDATE(parameters); | 
| + | 
| + content::WebContents* web_contents = GetSenderWebContents(); | 
| + if (!web_contents || !user_gesture()) { | 
| + return RespondNow(OneArgument(new base::ListValue())); | 
| + } | 
| + | 
| + bool multiple = false; | 
| + std::vector<HidDeviceFilter> filters; | 
| + if (parameters->options) { | 
| + multiple = parameters->options->multiple && *parameters->options->multiple; | 
| + if (parameters->options->filters) { | 
| + const auto& api_filters = *parameters->options->filters; | 
| + filters.resize(api_filters.size()); | 
| + for (size_t i = 0; i < api_filters.size(); ++i) { | 
| + ConvertHidDeviceFilter(api_filters[i], &filters[i]); | 
| + } | 
| + } | 
| + } | 
| + | 
| + prompt_ = | 
| + ExtensionsAPIClient::Get()->CreateDevicePermissionsPrompt(web_contents); | 
| + CHECK(prompt_); | 
| + prompt_->AskForHidDevices( | 
| 
Devlin
2015/05/14 17:38:11
This is problematic with your handling of having n
 
Reilly Grant (use Gerrit)
2015/05/14 18:04:28
You're right that the documentation for RespondLat
 
Devlin
2015/05/14 18:32:02
But there's a larger problem, which is that the AP
 | 
| + extension(), browser_context(), multiple, filters, | 
| + base::Bind(&HidGetUserSelectedDevicesFunction::OnDevicesChosen, this)); | 
| + return RespondLater(); | 
| +} | 
| + | 
| +void HidGetUserSelectedDevicesFunction::OnDevicesChosen( | 
| + const std::vector<scoped_refptr<HidDeviceInfo>>& devices) { | 
| + HidDeviceManager* device_manager = HidDeviceManager::Get(browser_context()); | 
| + CHECK(device_manager); | 
| + Respond(OneArgument(device_manager->GetApiDevicesFromList(devices).Pass())); | 
| +} | 
| + | 
| HidConnectFunction::HidConnectFunction() : connection_manager_(nullptr) { | 
| } | 
| @@ -109,18 +153,14 @@ HidConnectFunction::~HidConnectFunction() {} | 
| ExtensionFunction::ResponseAction HidConnectFunction::Run() { | 
| scoped_ptr<core_api::hid::Connect::Params> parameters = | 
| hid::Connect::Params::Create(*args_); | 
| - EXTENSION_FUNCTION_VALIDATE(parameters.get()); | 
| + EXTENSION_FUNCTION_VALIDATE(parameters); | 
| HidDeviceManager* device_manager = HidDeviceManager::Get(browser_context()); | 
| - if (!device_manager) { | 
| - return RespondNow(Error(kErrorServiceUnavailable)); | 
| - } | 
| + CHECK(device_manager); | 
| connection_manager_ = | 
| ApiResourceManager<HidConnectionResource>::Get(browser_context()); | 
| - if (!connection_manager_) { | 
| - return RespondNow(Error(kErrorServiceUnavailable)); | 
| - } | 
| + CHECK(connection_manager_); | 
| scoped_refptr<HidDeviceInfo> device_info = | 
| device_manager->GetDeviceInfo(parameters->device_id); | 
| @@ -128,14 +168,12 @@ ExtensionFunction::ResponseAction HidConnectFunction::Run() { | 
| return RespondNow(Error(kErrorInvalidDeviceId)); | 
| } | 
| - if (!HidDeviceManager::HasPermission(extension(), device_info)) { | 
| + if (!device_manager->HasPermission(extension(), device_info, true)) { | 
| return RespondNow(Error(kErrorPermissionDenied)); | 
| } | 
| HidService* hid_service = device::DeviceClient::Get()->GetHidService(); | 
| - if (!hid_service) { | 
| - return RespondNow(Error(kErrorServiceUnavailable)); | 
| - } | 
| + CHECK(hid_service); | 
| hid_service->Connect( | 
| device_info->device_id(), | 
| @@ -145,7 +183,7 @@ ExtensionFunction::ResponseAction HidConnectFunction::Run() { | 
| void HidConnectFunction::OnConnectComplete( | 
| scoped_refptr<HidConnection> connection) { | 
| - if (!connection.get()) { | 
| + if (!connection) { | 
| Respond(Error(kErrorFailedToOpenDevice)); | 
| return; | 
| } | 
| @@ -163,13 +201,11 @@ HidDisconnectFunction::~HidDisconnectFunction() {} | 
| ExtensionFunction::ResponseAction HidDisconnectFunction::Run() { | 
| scoped_ptr<core_api::hid::Disconnect::Params> parameters = | 
| hid::Disconnect::Params::Create(*args_); | 
| - EXTENSION_FUNCTION_VALIDATE(parameters.get()); | 
| + EXTENSION_FUNCTION_VALIDATE(parameters); | 
| ApiResourceManager<HidConnectionResource>* connection_manager = | 
| ApiResourceManager<HidConnectionResource>::Get(browser_context()); | 
| - if (!connection_manager) { | 
| - return RespondNow(Error(kErrorServiceUnavailable)); | 
| - } | 
| + CHECK(connection_manager); | 
| int connection_id = parameters->connection_id; | 
| HidConnectionResource* resource = | 
| @@ -195,9 +231,7 @@ ExtensionFunction::ResponseAction HidConnectionIoFunction::Run() { | 
| ApiResourceManager<HidConnectionResource>* connection_manager = | 
| ApiResourceManager<HidConnectionResource>::Get(browser_context()); | 
| - if (!connection_manager) { | 
| - return RespondNow(Error(kErrorServiceUnavailable)); | 
| - } | 
| + CHECK(connection_manager); | 
| HidConnectionResource* resource = | 
| connection_manager->Get(extension_id(), connection_id_); | 
| @@ -215,7 +249,7 @@ HidReceiveFunction::~HidReceiveFunction() {} | 
| bool HidReceiveFunction::ValidateParameters() { | 
| parameters_ = hid::Receive::Params::Create(*args_); | 
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 
| + EXTENSION_FUNCTION_VALIDATE(parameters_); | 
| set_connection_id(parameters_->connection_id); | 
| return true; | 
| } | 
| @@ -245,7 +279,7 @@ HidSendFunction::~HidSendFunction() {} | 
| bool HidSendFunction::ValidateParameters() { | 
| parameters_ = hid::Send::Params::Create(*args_); | 
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 
| + EXTENSION_FUNCTION_VALIDATE(parameters_); | 
| set_connection_id(parameters_->connection_id); | 
| return true; | 
| } | 
| @@ -274,7 +308,7 @@ HidReceiveFeatureReportFunction::~HidReceiveFeatureReportFunction() {} | 
| bool HidReceiveFeatureReportFunction::ValidateParameters() { | 
| parameters_ = hid::ReceiveFeatureReport::Params::Create(*args_); | 
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 
| + EXTENSION_FUNCTION_VALIDATE(parameters_); | 
| set_connection_id(parameters_->connection_id); | 
| return true; | 
| } | 
| @@ -303,7 +337,7 @@ HidSendFeatureReportFunction::~HidSendFeatureReportFunction() {} | 
| bool HidSendFeatureReportFunction::ValidateParameters() { | 
| parameters_ = hid::SendFeatureReport::Params::Create(*args_); | 
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 
| + EXTENSION_FUNCTION_VALIDATE(parameters_); | 
| set_connection_id(parameters_->connection_id); | 
| return true; | 
| } |