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/hid/hid_api.cc

Issue 1115213004: Add chrome.hid.getUserSelectedDevices API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 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/hid/hid_api.cc
diff --git a/extensions/browser/api/hid/hid_api.cc b/extensions/browser/api/hid/hid_api.cc
index d67f56499d88346f99b184179e09d220e31e4776..209601e92e29ee5042319a11b83d8c7e1744c519 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"
@@ -101,6 +103,54 @@ void HidGetDevicesFunction::OnEnumerationComplete(
Respond(OneArgument(devices.release()));
}
+HidGetUserSelectedDevicesFunction::HidGetUserSelectedDevicesFunction() {
+}
+
+HidGetUserSelectedDevicesFunction::~HidGetUserSelectedDevicesFunction() {
+}
+
+ExtensionFunction::ResponseAction HidGetUserSelectedDevicesFunction::Run() {
Devlin 2015/05/05 22:19:50 I thought I saw something in the IDL about this ne
Reilly Grant (use Gerrit) 2015/05/06 00:52:52 Good catch.
+ scoped_ptr<core_api::hid::GetUserSelectedDevices::Params> parameters =
+ hid::GetUserSelectedDevices::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
Devlin 2015/05/05 22:19:50 nit: scoped_ptrs are Testable, so you don't need t
Reilly Grant (use Gerrit) 2015/05/06 00:52:52 Fixed.
+
+ bool multiple = false;
+ if (parameters->options.multiple) {
Devlin 2015/05/05 22:19:50 inline all this? bool multiple = parameters->optio
Reilly Grant (use Gerrit) 2015/05/06 00:52:52 Done.
+ multiple = *parameters->options.multiple;
+ }
+
+ std::vector<HidDeviceFilter> filters;
+ if (parameters->options.filters) {
+ filters.resize(parameters->options.filters->size());
+ for (size_t i = 0; i < parameters->options.filters->size(); ++i) {
+ ConvertHidDeviceFilter(parameters->options.filters->at(i), &filters[i]);
+ }
+ }
+
+ prompt_ = ExtensionsAPIClient::Get()->CreateDevicePermissionsPrompt(
+ GetAssociatedWebContents());
Devlin 2015/05/05 22:19:50 Prefer GetSenderWebContents() in most cases.
Reilly Grant (use Gerrit) 2015/05/06 00:52:53 Done.
+ if (!prompt_) {
+ return RespondNow(Error(kErrorServiceUnavailable));
+ }
+
+ prompt_->AskForHidDevices(
+ 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());
+ if (!device_manager) {
Devlin 2015/05/05 22:19:50 I'm seeing a lot of these null checks in this patc
Reilly Grant (use Gerrit) 2015/05/06 00:52:53 I've moved the check into Run. HidDeviceManager sh
Devlin 2015/05/06 23:04:28 I can sympathize, but if something should always b
Reilly Grant (use Gerrit) 2015/05/06 23:48:52 I've removed the kErrorServiceUnavailable message
+ Respond(Error(kErrorServiceUnavailable));
+ return;
+ }
+
+ Respond(
+ OneArgument(device_manager->GetApiDevicesFromList(devices).release()));
Devlin 2015/05/05 22:19:50 There's a OneArgument variation that takes a scope
Reilly Grant (use Gerrit) 2015/05/06 00:52:53 Done.
+}
+
HidConnectFunction::HidConnectFunction() : connection_manager_(nullptr) {
}
@@ -128,7 +178,7 @@ 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));
}

Powered by Google App Engine
This is Rietveld 408576698