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

Side by Side Diff: chrome/browser/usb/web_usb_permission_provider.cc

Issue 2815003005: Integrate WebUSB with Feature Policy (Closed)
Patch Set: Ready for review Created 3 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/usb/web_usb_permission_provider.h" 5 #include "chrome/browser/usb/web_usb_permission_provider.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
11 #include "chrome/browser/profiles/profile.h" 11 #include "chrome/browser/profiles/profile.h"
12 #include "chrome/browser/usb/usb_blocklist.h" 12 #include "chrome/browser/usb/usb_blocklist.h"
13 #include "chrome/browser/usb/usb_chooser_context.h" 13 #include "chrome/browser/usb/usb_chooser_context.h"
14 #include "chrome/browser/usb/usb_chooser_context_factory.h" 14 #include "chrome/browser/usb/usb_chooser_context_factory.h"
15 #include "chrome/browser/usb/usb_tab_helper.h" 15 #include "chrome/browser/usb/usb_tab_helper.h"
16 #include "content/public/browser/browser_thread.h" 16 #include "content/public/browser/browser_thread.h"
17 #include "content/public/browser/render_frame_host.h" 17 #include "content/public/browser/render_frame_host.h"
18 #include "content/public/browser/web_contents.h" 18 #include "content/public/browser/web_contents.h"
19 #include "device/usb/usb_device.h" 19 #include "device/usb/usb_device.h"
20 #include "device/usb/webusb_descriptors.h"
21 20
22 using content::RenderFrameHost; 21 using content::RenderFrameHost;
23 using content::WebContents; 22 using content::WebContents;
24 23
25 // static 24 // static
26 bool WebUSBPermissionProvider::HasDevicePermission( 25 bool WebUSBPermissionProvider::HasDevicePermission(
27 UsbChooserContext* chooser_context, 26 UsbChooserContext* chooser_context,
28 const GURL& requesting_origin, 27 const GURL& requesting_origin,
29 const GURL& embedding_origin, 28 const GURL& embedding_origin,
30 bool is_embedded_frame,
31 scoped_refptr<const device::UsbDevice> device) { 29 scoped_refptr<const device::UsbDevice> device) {
32 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 30 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
33 31
34 if (UsbBlocklist::Get().IsExcluded(device)) 32 if (UsbBlocklist::Get().IsExcluded(device))
35 return false; 33 return false;
36 34
37 if (!chooser_context->HasDevicePermission(requesting_origin, embedding_origin, 35 return chooser_context->HasDevicePermission(requesting_origin,
38 device)) { 36 embedding_origin, device);
39 return false;
40 }
41
42 // On Android it is not possible to read the WebUSB descriptors until Chrome
43 // has been granted permission to open it. Instead we grant provisional access
44 // to the device and perform the allowed origins check when the client tries
45 // to open it.
46 if (!device->permission_granted())
47 return true;
48
49 // Embedded frames must have their origin in the list provided by the device.
50 if (is_embedded_frame) {
51 return device::FindInWebUsbAllowedOrigins(device->webusb_allowed_origins(),
52 requesting_origin, base::nullopt,
53 base::nullopt);
54 }
55
56 return true;
57 } 37 }
58 38
59 WebUSBPermissionProvider::WebUSBPermissionProvider( 39 WebUSBPermissionProvider::WebUSBPermissionProvider(
60 RenderFrameHost* render_frame_host) 40 RenderFrameHost* render_frame_host)
61 : render_frame_host_(render_frame_host), weak_factory_(this) { 41 : render_frame_host_(render_frame_host), weak_factory_(this) {
62 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 42 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
63 DCHECK(render_frame_host_); 43 DCHECK(render_frame_host_);
64 } 44 }
65 45
66 WebUSBPermissionProvider::~WebUSBPermissionProvider() {} 46 WebUSBPermissionProvider::~WebUSBPermissionProvider() {}
67 47
68 base::WeakPtr<device::usb::PermissionProvider> 48 base::WeakPtr<device::usb::PermissionProvider>
69 WebUSBPermissionProvider::GetWeakPtr() { 49 WebUSBPermissionProvider::GetWeakPtr() {
70 return weak_factory_.GetWeakPtr(); 50 return weak_factory_.GetWeakPtr();
71 } 51 }
72 52
73 bool WebUSBPermissionProvider::HasDevicePermission( 53 bool WebUSBPermissionProvider::HasDevicePermission(
74 scoped_refptr<const device::UsbDevice> device) const { 54 scoped_refptr<const device::UsbDevice> device) const {
75 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 55 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
76 56
77 WebContents* web_contents = 57 WebContents* web_contents =
78 WebContents::FromRenderFrameHost(render_frame_host_); 58 WebContents::FromRenderFrameHost(render_frame_host_);
79 RenderFrameHost* main_frame = web_contents->GetMainFrame(); 59 RenderFrameHost* main_frame = web_contents->GetMainFrame();
80 Profile* profile = 60 Profile* profile =
81 Profile::FromBrowserContext(web_contents->GetBrowserContext()); 61 Profile::FromBrowserContext(web_contents->GetBrowserContext());
82 62
83 return HasDevicePermission( 63 return HasDevicePermission(
84 UsbChooserContextFactory::GetForProfile(profile), 64 UsbChooserContextFactory::GetForProfile(profile),
85 render_frame_host_->GetLastCommittedURL().GetOrigin(), 65 render_frame_host_->GetLastCommittedURL().GetOrigin(),
86 main_frame->GetLastCommittedURL().GetOrigin(), 66 main_frame->GetLastCommittedURL().GetOrigin(), device);
87 render_frame_host_ != main_frame, device);
88 }
89
90 bool WebUSBPermissionProvider::HasConfigurationPermission(
91 uint8_t requested_configuration_value,
92 scoped_refptr<const device::UsbDevice> device) const {
93 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
94
95 // Embedded frames may only access configurations if their origin in the list
96 // provided by the device.
97 RenderFrameHost* main_frame =
98 WebContents::FromRenderFrameHost(render_frame_host_)->GetMainFrame();
99 if (render_frame_host_ != main_frame) {
100 return device::FindInWebUsbAllowedOrigins(
101 device->webusb_allowed_origins(),
102 render_frame_host_->GetLastCommittedURL().GetOrigin(),
103 requested_configuration_value, base::nullopt);
104 }
105
106 return true;
107 }
108
109 bool WebUSBPermissionProvider::HasFunctionPermission(
110 uint8_t requested_function,
111 uint8_t configuration_value,
112 scoped_refptr<const device::UsbDevice> device) const {
113 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
114
115 // Embedded frames may only access configurations if their origin in the list
116 // provided by the device.
117 RenderFrameHost* main_frame =
118 WebContents::FromRenderFrameHost(render_frame_host_)->GetMainFrame();
119 if (render_frame_host_ != main_frame) {
120 return device::FindInWebUsbAllowedOrigins(
121 device->webusb_allowed_origins(),
122 render_frame_host_->GetLastCommittedURL().GetOrigin(),
123 configuration_value, requested_function);
124 }
125
126 return true;
127 } 67 }
128 68
129 void WebUSBPermissionProvider::IncrementConnectionCount() { 69 void WebUSBPermissionProvider::IncrementConnectionCount() {
130 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 70 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
131 WebContents* web_contents = 71 WebContents* web_contents =
132 WebContents::FromRenderFrameHost(render_frame_host_); 72 WebContents::FromRenderFrameHost(render_frame_host_);
133 UsbTabHelper* tab_helper = UsbTabHelper::FromWebContents(web_contents); 73 UsbTabHelper* tab_helper = UsbTabHelper::FromWebContents(web_contents);
134 tab_helper->IncrementConnectionCount(render_frame_host_); 74 tab_helper->IncrementConnectionCount(render_frame_host_);
135 } 75 }
136 76
137 void WebUSBPermissionProvider::DecrementConnectionCount() { 77 void WebUSBPermissionProvider::DecrementConnectionCount() {
138 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 78 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
139 WebContents* web_contents = 79 WebContents* web_contents =
140 WebContents::FromRenderFrameHost(render_frame_host_); 80 WebContents::FromRenderFrameHost(render_frame_host_);
141 UsbTabHelper* tab_helper = UsbTabHelper::FromWebContents(web_contents); 81 UsbTabHelper* tab_helper = UsbTabHelper::FromWebContents(web_contents);
142 tab_helper->DecrementConnectionCount(render_frame_host_); 82 tab_helper->DecrementConnectionCount(render_frame_host_);
143 } 83 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698