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

Unified Diff: chrome/browser/usb/web_usb_permission_provider.cc

Issue 1369643002: Add configuration and interface permission checks to DeviceImpl. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add new method ot Android USB mocks. Created 5 years, 3 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
« no previous file with comments | « chrome/browser/usb/web_usb_permission_provider.h ('k') | device/BUILD.gn » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/usb/web_usb_permission_provider.cc
diff --git a/chrome/browser/usb/web_usb_permission_provider.cc b/chrome/browser/usb/web_usb_permission_provider.cc
index f77232dccc6c07d05776e17289deaa023f4e909c..33e54597394cd4ee4158aba99da40b99f296ce50 100644
--- a/chrome/browser/usb/web_usb_permission_provider.cc
+++ b/chrome/browser/usb/web_usb_permission_provider.cc
@@ -11,10 +11,16 @@
#include "content/public/browser/render_frame_host.h"
#include "device/core/device_client.h"
+using device::usb::WebUsbDescriptorSet;
+using device::usb::WebUsbConfigurationSubsetPtr;
+using device::usb::WebUsbFunctionSubsetPtr;
+
namespace {
-bool FindOriginInDescriptorSet(const device::usb::WebUsbDescriptorSet* set,
- const GURL& origin) {
+bool FindOriginInDescriptorSet(const WebUsbDescriptorSet* set,
+ const GURL& origin,
+ const uint8_t* configuration_value,
+ const uint8_t* interface_number) {
if (!set)
return false;
for (size_t i = 0; i < set->origins.size(); ++i) {
@@ -24,6 +30,9 @@ bool FindOriginInDescriptorSet(const device::usb::WebUsbDescriptorSet* set,
for (size_t i = 0; i < set->configurations.size(); ++i) {
const device::usb::WebUsbConfigurationSubsetPtr& config =
set->configurations[i];
+ if (configuration_value &&
+ *configuration_value != config->configuration_value)
+ continue;
for (size_t j = 0; i < config->origins.size(); ++j) {
if (origin.spec() == config->origins[j])
return true;
@@ -31,6 +40,10 @@ bool FindOriginInDescriptorSet(const device::usb::WebUsbDescriptorSet* set,
for (size_t j = 0; j < config->functions.size(); ++j) {
const device::usb::WebUsbFunctionSubsetPtr& function =
config->functions[j];
+ // TODO(reillyg): Implement support for Interface Association Descriptors
+ // so that this check will match associated interfaces.
+ if (interface_number && *interface_number != function->first_interface)
+ continue;
for (size_t k = 0; k < function->origins.size(); ++k) {
if (origin.spec() == function->origins[k])
return true;
@@ -54,7 +67,7 @@ void WebUSBPermissionProvider::Create(
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
DCHECK(render_frame_host);
- // The created object is strongly bound to (and owned by) the pipe.
+ // The created object is owned by its bindings.
new WebUSBPermissionProvider(render_frame_host, request.Pass());
}
@@ -63,8 +76,11 @@ WebUSBPermissionProvider::~WebUSBPermissionProvider() {}
WebUSBPermissionProvider::WebUSBPermissionProvider(
content::RenderFrameHost* render_frame_host,
mojo::InterfaceRequest<PermissionProvider> request)
- : binding_(this, request.Pass()),
- render_frame_host_(render_frame_host) {}
+ : render_frame_host_(render_frame_host) {
+ bindings_.set_connection_error_handler(base::Bind(
+ &WebUSBPermissionProvider::OnConnectionError, base::Unretained(this)));
+ bindings_.AddBinding(this, request.Pass());
+}
void WebUSBPermissionProvider::HasDevicePermission(
mojo::Array<device::usb::DeviceInfoPtr> requested_devices,
@@ -75,10 +91,43 @@ void WebUSBPermissionProvider::HasDevicePermission(
mojo::Array<mojo::String> allowed_guids(0);
for (size_t i = 0; i < requested_devices.size(); ++i) {
const device::usb::DeviceInfoPtr& device = requested_devices[i];
- if (FindOriginInDescriptorSet(device->webusb_allowed_origins.get(),
- origin) &&
+ if (FindOriginInDescriptorSet(device->webusb_allowed_origins.get(), origin,
+ nullptr, nullptr) &&
EnableWebUsbOnAnyOrigin())
allowed_guids.push_back(device->guid);
}
callback.Run(allowed_guids.Pass());
}
+
+void WebUSBPermissionProvider::HasConfigurationPermission(
+ uint8_t requested_configuration_value,
+ device::usb::DeviceInfoPtr device,
+ const HasInterfacePermissionCallback& callback) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ callback.Run(FindOriginInDescriptorSet(
+ device->webusb_allowed_origins.get(),
+ render_frame_host_->GetLastCommittedURL().GetOrigin(),
+ &requested_configuration_value, nullptr));
+}
+
+void WebUSBPermissionProvider::HasInterfacePermission(
+ uint8_t requested_interface,
+ uint8_t configuration_value,
+ device::usb::DeviceInfoPtr device,
+ const HasInterfacePermissionCallback& callback) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ callback.Run(FindOriginInDescriptorSet(
+ device->webusb_allowed_origins.get(),
+ render_frame_host_->GetLastCommittedURL().GetOrigin(),
+ &configuration_value, &requested_interface));
+}
+
+void WebUSBPermissionProvider::Bind(
+ mojo::InterfaceRequest<device::usb::PermissionProvider> request) {
+ bindings_.AddBinding(this, request.Pass());
+}
+
+void WebUSBPermissionProvider::OnConnectionError() {
+ if (bindings_.empty())
+ delete this;
Ken Rockot(use gerrit already) 2015/09/28 17:43:40 Ah right - this seems like a good solution that do
+}
« no previous file with comments | « chrome/browser/usb/web_usb_permission_provider.h ('k') | device/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698