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

Side by Side Diff: device/usb/mojo/device_impl.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 "device/usb/mojo/device_impl.h" 5 #include "device/usb/mojo/device_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 } 137 }
138 device_handle_ = nullptr; 138 device_handle_ = nullptr;
139 } 139 }
140 140
141 bool DeviceImpl::HasControlTransferPermission( 141 bool DeviceImpl::HasControlTransferPermission(
142 UsbControlTransferRecipient recipient, 142 UsbControlTransferRecipient recipient,
143 uint16_t index) { 143 uint16_t index) {
144 DCHECK(device_handle_); 144 DCHECK(device_handle_);
145 const UsbConfigDescriptor* config = device_->active_configuration(); 145 const UsbConfigDescriptor* config = device_->active_configuration();
146 146
147 if (!permission_provider_)
148 return false;
149
150 if (recipient == UsbControlTransferRecipient::INTERFACE || 147 if (recipient == UsbControlTransferRecipient::INTERFACE ||
151 recipient == UsbControlTransferRecipient::ENDPOINT) { 148 recipient == UsbControlTransferRecipient::ENDPOINT) {
152 if (!config) 149 if (!config)
153 return false; 150 return false;
154 151
155 const UsbInterfaceDescriptor* interface = nullptr; 152 const UsbInterfaceDescriptor* interface = nullptr;
156 if (recipient == UsbControlTransferRecipient::ENDPOINT) { 153 if (recipient == UsbControlTransferRecipient::ENDPOINT) {
157 interface = device_handle_->FindInterfaceByEndpoint(index & 0xff); 154 interface = device_handle_->FindInterfaceByEndpoint(index & 0xff);
158 } else { 155 } else {
159 auto interface_it = 156 auto interface_it =
160 std::find_if(config->interfaces.begin(), config->interfaces.end(), 157 std::find_if(config->interfaces.begin(), config->interfaces.end(),
161 [index](const UsbInterfaceDescriptor& this_iface) { 158 [index](const UsbInterfaceDescriptor& this_iface) {
162 return this_iface.interface_number == (index & 0xff); 159 return this_iface.interface_number == (index & 0xff);
163 }); 160 });
164 if (interface_it != config->interfaces.end()) 161 if (interface_it != config->interfaces.end())
165 interface = &*interface_it; 162 interface = &*interface_it;
166 } 163 }
167 if (interface == nullptr) 164 if (interface == nullptr)
168 return false; 165 return false;
169 166
170 return permission_provider_->HasFunctionPermission( 167 return true;
iclelland.google 2017/05/02 14:42:52 Drive-by: I'm not really looking at this part of t
Reilly Grant (use Gerrit) 2017/05/02 19:29:05 Done.
171 interface->first_interface, config->configuration_value, device_);
172 } else if (config) { 168 } else if (config) {
173 return permission_provider_->HasConfigurationPermission( 169 return true;
174 config->configuration_value, device_);
175 } else { 170 } else {
176 // Client must already have device permission to have gotten this far. 171 // Client must already have device permission to have gotten this far.
177 return true; 172 return true;
178 } 173 }
179 } 174 }
180 175
181 // static 176 // static
182 void DeviceImpl::OnOpen(base::WeakPtr<DeviceImpl> self, 177 void DeviceImpl::OnOpen(base::WeakPtr<DeviceImpl> self,
183 const OpenCallback& callback, 178 const OpenCallback& callback,
184 scoped_refptr<UsbDeviceHandle> handle) { 179 scoped_refptr<UsbDeviceHandle> handle) {
185 if (!self) { 180 if (!self) {
186 handle->Close(); 181 handle->Close();
187 return; 182 return;
188 } 183 }
189 184
190 self->device_handle_ = std::move(handle); 185 self->device_handle_ = std::move(handle);
191 if (self->device_handle_ && self->permission_provider_) 186 if (self->device_handle_ && self->permission_provider_)
192 self->permission_provider_->IncrementConnectionCount(); 187 self->permission_provider_->IncrementConnectionCount();
193 callback.Run(self->device_handle_ ? mojom::UsbOpenDeviceError::OK 188 callback.Run(self->device_handle_ ? mojom::UsbOpenDeviceError::OK
194 : mojom::UsbOpenDeviceError::ACCESS_DENIED); 189 : mojom::UsbOpenDeviceError::ACCESS_DENIED);
195 } 190 }
196 191
197 void DeviceImpl::OnPermissionGrantedForOpen(const OpenCallback& callback, 192 void DeviceImpl::OnPermissionGrantedForOpen(const OpenCallback& callback,
198 bool granted) { 193 bool granted) {
199 if (granted && permission_provider_ && 194 if (granted) {
lunalu1 2017/05/03 15:01:21 If I recall correctly, you don't need bracket here
Reilly Grant (use Gerrit) 2017/05/04 01:16:50 Done, though I put the error case first which is m
200 permission_provider_->HasDevicePermission(device_)) {
201 device_->Open( 195 device_->Open(
202 base::Bind(&DeviceImpl::OnOpen, weak_factory_.GetWeakPtr(), callback)); 196 base::Bind(&DeviceImpl::OnOpen, weak_factory_.GetWeakPtr(), callback));
203 } else { 197 } else {
204 callback.Run(mojom::UsbOpenDeviceError::ACCESS_DENIED); 198 callback.Run(mojom::UsbOpenDeviceError::ACCESS_DENIED);
205 } 199 }
206 } 200 }
207 201
208 void DeviceImpl::Open(const OpenCallback& callback) { 202 void DeviceImpl::Open(const OpenCallback& callback) {
209 if (device_handle_) { 203 if (device_handle_) {
210 callback.Run(mojom::UsbOpenDeviceError::ALREADY_OPEN); 204 callback.Run(mojom::UsbOpenDeviceError::ALREADY_OPEN);
211 return; 205 return;
212 } 206 }
213 207
214 if (!device_->permission_granted()) { 208 if (!device_->permission_granted()) {
215 device_->RequestPermission( 209 device_->RequestPermission(
216 base::Bind(&DeviceImpl::OnPermissionGrantedForOpen, 210 base::Bind(&DeviceImpl::OnPermissionGrantedForOpen,
217 weak_factory_.GetWeakPtr(), callback)); 211 weak_factory_.GetWeakPtr(), callback));
218 return; 212 return;
219 } 213 }
220 214
221 if (permission_provider_ && 215 device_->Open(
222 permission_provider_->HasDevicePermission(device_)) { 216 base::Bind(&DeviceImpl::OnOpen, weak_factory_.GetWeakPtr(), callback));
223 device_->Open(
224 base::Bind(&DeviceImpl::OnOpen, weak_factory_.GetWeakPtr(), callback));
225 } else {
226 callback.Run(mojom::UsbOpenDeviceError::ACCESS_DENIED);
227 }
228 } 217 }
229 218
230 void DeviceImpl::Close(const CloseCallback& callback) { 219 void DeviceImpl::Close(const CloseCallback& callback) {
231 CloseHandle(); 220 CloseHandle();
232 callback.Run(); 221 callback.Run();
233 } 222 }
234 223
235 void DeviceImpl::SetConfiguration(uint8_t value, 224 void DeviceImpl::SetConfiguration(uint8_t value,
236 const SetConfigurationCallback& callback) { 225 const SetConfigurationCallback& callback) {
237 if (!device_handle_) { 226 if (!device_handle_) {
238 callback.Run(false); 227 callback.Run(false);
239 return; 228 return;
240 } 229 }
241 230
242 if (permission_provider_ && 231 device_handle_->SetConfiguration(value, callback);
243 permission_provider_->HasConfigurationPermission(value, device_)) {
244 device_handle_->SetConfiguration(value, callback);
245 } else {
246 callback.Run(false);
247 }
248 } 232 }
249 233
250 void DeviceImpl::ClaimInterface(uint8_t interface_number, 234 void DeviceImpl::ClaimInterface(uint8_t interface_number,
251 const ClaimInterfaceCallback& callback) { 235 const ClaimInterfaceCallback& callback) {
252 if (!device_handle_) { 236 if (!device_handle_) {
253 callback.Run(false); 237 callback.Run(false);
254 return; 238 return;
255 } 239 }
256 240
257 const UsbConfigDescriptor* config = device_->active_configuration(); 241 const UsbConfigDescriptor* config = device_->active_configuration();
258 if (!config) { 242 if (!config) {
259 callback.Run(false); 243 callback.Run(false);
260 return; 244 return;
261 } 245 }
262 246
263 auto interface_it = 247 auto interface_it =
264 std::find_if(config->interfaces.begin(), config->interfaces.end(), 248 std::find_if(config->interfaces.begin(), config->interfaces.end(),
265 [interface_number](const UsbInterfaceDescriptor& interface) { 249 [interface_number](const UsbInterfaceDescriptor& interface) {
266 return interface.interface_number == interface_number; 250 return interface.interface_number == interface_number;
267 }); 251 });
268 if (interface_it == config->interfaces.end()) { 252 if (interface_it == config->interfaces.end()) {
269 callback.Run(false); 253 callback.Run(false);
270 return; 254 return;
271 } 255 }
272 256
273 if (permission_provider_ && 257 device_handle_->ClaimInterface(interface_number, callback);
274 permission_provider_->HasFunctionPermission(interface_it->first_interface,
275 config->configuration_value,
276 device_)) {
277 device_handle_->ClaimInterface(interface_number, callback);
278 } else {
279 callback.Run(false);
280 }
281 } 258 }
282 259
283 void DeviceImpl::ReleaseInterface(uint8_t interface_number, 260 void DeviceImpl::ReleaseInterface(uint8_t interface_number,
284 const ReleaseInterfaceCallback& callback) { 261 const ReleaseInterfaceCallback& callback) {
285 if (!device_handle_) { 262 if (!device_handle_) {
286 callback.Run(false); 263 callback.Run(false);
287 return; 264 return;
288 } 265 }
289 266
290 device_handle_->ReleaseInterface(interface_number, callback); 267 device_handle_->ReleaseInterface(interface_number, callback);
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
436 base::Bind(&OnIsochronousTransferOut, callback)); 413 base::Bind(&OnIsochronousTransferOut, callback));
437 } 414 }
438 415
439 void DeviceImpl::OnDeviceRemoved(scoped_refptr<device::UsbDevice> device) { 416 void DeviceImpl::OnDeviceRemoved(scoped_refptr<device::UsbDevice> device) {
440 DCHECK_EQ(device_, device); 417 DCHECK_EQ(device_, device);
441 binding_->Close(); 418 binding_->Close();
442 } 419 }
443 420
444 } // namespace usb 421 } // namespace usb
445 } // namespace device 422 } // namespace device
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698