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

Side by Side Diff: third_party/WebKit/Source/modules/webusb/USBDevice.cpp

Issue 1830833002: Track USB endpoint state in Blink. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@copy_interface
Patch Set: Created 4 years, 9 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
« no previous file with comments | « third_party/WebKit/Source/modules/webusb/USBDevice.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "modules/webusb/USBDevice.h" 5 #include "modules/webusb/USBDevice.h"
6 6
7 #include "bindings/core/v8/CallbackPromiseAdapter.h" 7 #include "bindings/core/v8/CallbackPromiseAdapter.h"
8 #include "bindings/core/v8/ScriptPromise.h" 8 #include "bindings/core/v8/ScriptPromise.h"
9 #include "bindings/core/v8/ScriptPromiseResolver.h" 9 #include "bindings/core/v8/ScriptPromiseResolver.h"
10 #include "bindings/core/v8/ToV8.h" 10 #include "bindings/core/v8/ToV8.h"
(...skipping 14 matching lines...) Expand all
25 namespace blink { 25 namespace blink {
26 26
27 namespace { 27 namespace {
28 28
29 const char kDeviceStateChangeInProgress[] = "An operation that changes the devic e state is in progress."; 29 const char kDeviceStateChangeInProgress[] = "An operation that changes the devic e state is in progress.";
30 const char kInterfaceNotFound[] = "The interface number provided is not supporte d by the device in its current configuration."; 30 const char kInterfaceNotFound[] = "The interface number provided is not supporte d by the device in its current configuration.";
31 const char kInterfaceStateChangeInProgress[] = "An operation that changes interf ace state is in progress."; 31 const char kInterfaceStateChangeInProgress[] = "An operation that changes interf ace state is in progress.";
32 const char kOpenRequired[] = "The device must be opened first."; 32 const char kOpenRequired[] = "The device must be opened first.";
33 const char kVisibiltyError[] = "Connection is only allowed while the page is vis ible. This is a temporary measure until we are able to effectively communicate t o the user that the page is connected to a device."; 33 const char kVisibiltyError[] = "Connection is only allowed while the page is vis ible. This is a temporary measure until we are able to effectively communicate t o the user that the page is connected to a device.";
34 34
35 DOMException* convertControlTransferParameters(
36 WebUSBDevice::TransferDirection direction,
37 const USBControlTransferParameters& parameters,
38 WebUSBDevice::ControlTransferParameters* webParameters)
39 {
40 webParameters->direction = direction;
41 35
42 if (parameters.requestType() == "standard")
43 webParameters->type = WebUSBDevice::RequestType::Standard;
44 else if (parameters.requestType() == "class")
45 webParameters->type = WebUSBDevice::RequestType::Class;
46 else if (parameters.requestType() == "vendor")
47 webParameters->type = WebUSBDevice::RequestType::Vendor;
48 else
49 return DOMException::create(TypeMismatchError, "The control transfer req uestType parameter is invalid.");
50
51 // TODO(reillyg): Check for interface and endpoint availability if that is
52 // the control transfer target.
53 if (parameters.recipient() == "device")
54 webParameters->recipient = WebUSBDevice::RequestRecipient::Device;
55 else if (parameters.recipient() == "interface")
56 webParameters->recipient = WebUSBDevice::RequestRecipient::Interface;
57 else if (parameters.recipient() == "endpoint")
58 webParameters->recipient = WebUSBDevice::RequestRecipient::Endpoint;
59 else if (parameters.recipient() == "other")
60 webParameters->recipient = WebUSBDevice::RequestRecipient::Other;
61 else
62 return DOMException::create(TypeMismatchError, "The control transfer rec ipient parameter is invalid.");
63
64 webParameters->request = parameters.request();
65 webParameters->value = parameters.value();
66 webParameters->index = parameters.index();
67 return nullptr;
68 }
69 36
70 String convertTransferStatus(const WebUSBTransferInfo::Status& status) 37 String convertTransferStatus(const WebUSBTransferInfo::Status& status)
71 { 38 {
72 switch (status) { 39 switch (status) {
73 case WebUSBTransferInfo::Status::Ok: 40 case WebUSBTransferInfo::Status::Ok:
74 return "ok"; 41 return "ok";
75 case WebUSBTransferInfo::Status::Stall: 42 case WebUSBTransferInfo::Status::Stall:
76 return "stall"; 43 return "stall";
77 case WebUSBTransferInfo::Status::Babble: 44 case WebUSBTransferInfo::Status::Babble:
78 return "babble"; 45 return "babble";
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 return USBDevice::create(device, resolver->getExecutionContext()); 285 return USBDevice::create(device, resolver->getExecutionContext());
319 } 286 }
320 287
321 USBDevice::USBDevice(PassOwnPtr<WebUSBDevice> device, ExecutionContext* context) 288 USBDevice::USBDevice(PassOwnPtr<WebUSBDevice> device, ExecutionContext* context)
322 : ContextLifecycleObserver(context) 289 : ContextLifecycleObserver(context)
323 , PageLifecycleObserver(toDocument(context)->page()) 290 , PageLifecycleObserver(toDocument(context)->page())
324 , m_device(device) 291 , m_device(device)
325 , m_opened(false) 292 , m_opened(false)
326 , m_deviceStateChangeInProgress(false) 293 , m_deviceStateChangeInProgress(false)
327 , m_configurationIndex(-1) 294 , m_configurationIndex(-1)
295 , m_inEndpoints(15)
296 , m_outEndpoints(15)
328 { 297 {
329 int configurationIndex = findConfigurationIndex(info().activeConfiguration); 298 int configurationIndex = findConfigurationIndex(info().activeConfiguration);
330 if (configurationIndex != -1) 299 if (configurationIndex != -1)
331 onConfigurationSelected(true /* success */, configurationIndex); 300 onConfigurationSelected(true /* success */, configurationIndex);
332 } 301 }
333 302
334 void USBDevice::onDeviceOpenedOrClosed(bool opened) 303 void USBDevice::onDeviceOpenedOrClosed(bool opened)
335 { 304 {
336 m_opened = opened; 305 m_opened = opened;
337 m_deviceStateChangeInProgress = false; 306 m_deviceStateChangeInProgress = false;
338 } 307 }
339 308
340 void USBDevice::onConfigurationSelected(bool success, size_t configurationIndex) 309 void USBDevice::onConfigurationSelected(bool success, size_t configurationIndex)
341 { 310 {
342 if (success) { 311 if (success) {
343 m_configurationIndex = configurationIndex; 312 m_configurationIndex = configurationIndex;
344 size_t numInterfaces = info().configurations[m_configurationIndex].inter faces.size(); 313 size_t numInterfaces = info().configurations[m_configurationIndex].inter faces.size();
345 m_claimedInterfaces.clearAll(); 314 m_claimedInterfaces.clearAll();
346 m_claimedInterfaces.resize(numInterfaces); 315 m_claimedInterfaces.resize(numInterfaces);
347 m_interfaceStateChangeInProgress.clearAll(); 316 m_interfaceStateChangeInProgress.clearAll();
348 m_interfaceStateChangeInProgress.resize(numInterfaces); 317 m_interfaceStateChangeInProgress.resize(numInterfaces);
349 m_selectedAlternates.resize(numInterfaces); 318 m_selectedAlternates.resize(numInterfaces);
350 m_selectedAlternates.fill(0); 319 m_selectedAlternates.fill(0);
320 m_inEndpoints.clearAll();
321 m_outEndpoints.clearAll();
351 } 322 }
352 m_deviceStateChangeInProgress = false; 323 m_deviceStateChangeInProgress = false;
353 } 324 }
354 325
355 void USBDevice::onInterfaceClaimedOrUnclaimed(bool claimed, size_t interfaceInde x) 326 void USBDevice::onInterfaceClaimedOrUnclaimed(bool claimed, size_t interfaceInde x)
356 { 327 {
357 if (claimed) 328 if (claimed) {
358 m_claimedInterfaces.set(interfaceIndex); 329 m_claimedInterfaces.set(interfaceIndex);
359 else 330 } else {
360 m_claimedInterfaces.clear(interfaceIndex); 331 m_claimedInterfaces.clear(interfaceIndex);
332 m_selectedAlternates[interfaceIndex] = 0;
333 }
334 setEndpointsForInterface(interfaceIndex, claimed);
361 m_interfaceStateChangeInProgress.clear(interfaceIndex); 335 m_interfaceStateChangeInProgress.clear(interfaceIndex);
362 } 336 }
363 337
364 void USBDevice::onAlternateInterfaceSelected(bool success, size_t interfaceIndex , size_t alternateIndex) 338 void USBDevice::onAlternateInterfaceSelected(bool success, size_t interfaceIndex , size_t alternateIndex)
365 { 339 {
366 if (success) 340 if (success)
367 m_selectedAlternates[interfaceIndex] = alternateIndex; 341 m_selectedAlternates[interfaceIndex] = alternateIndex;
342 setEndpointsForInterface(interfaceIndex, success);
368 m_interfaceStateChangeInProgress.clear(interfaceIndex); 343 m_interfaceStateChangeInProgress.clear(interfaceIndex);
369 } 344 }
370 345
371 bool USBDevice::isInterfaceClaimed(size_t configurationIndex, size_t interfaceIn dex) const 346 bool USBDevice::isInterfaceClaimed(size_t configurationIndex, size_t interfaceIn dex) const
372 { 347 {
373 return m_configurationIndex != -1 && static_cast<size_t>(m_configurationInde x) == configurationIndex && m_claimedInterfaces.get(interfaceIndex); 348 return m_configurationIndex != -1 && static_cast<size_t>(m_configurationInde x) == configurationIndex && m_claimedInterfaces.get(interfaceIndex);
374 } 349 }
375 350
376 size_t USBDevice::selectedAlternateInterface(size_t interfaceIndex) const 351 size_t USBDevice::selectedAlternateInterface(size_t interfaceIndex) const
377 { 352 {
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
472 ScriptPromise promise = resolver->promise(); 447 ScriptPromise promise = resolver->promise();
473 if (ensureDeviceConfigured(resolver)) { 448 if (ensureDeviceConfigured(resolver)) {
474 int interfaceIndex = findInterfaceIndex(interfaceNumber); 449 int interfaceIndex = findInterfaceIndex(interfaceNumber);
475 if (interfaceIndex == -1) { 450 if (interfaceIndex == -1) {
476 resolver->reject(DOMException::create(NotFoundError, "The interface number provided is not supported by the device in its current configuration.")); 451 resolver->reject(DOMException::create(NotFoundError, "The interface number provided is not supported by the device in its current configuration."));
477 } else if (m_interfaceStateChangeInProgress.get(interfaceIndex)) { 452 } else if (m_interfaceStateChangeInProgress.get(interfaceIndex)) {
478 resolver->reject(DOMException::create(InvalidStateError, kInterfaceS tateChangeInProgress)); 453 resolver->reject(DOMException::create(InvalidStateError, kInterfaceS tateChangeInProgress));
479 } else if (!m_claimedInterfaces.get(interfaceIndex)) { 454 } else if (!m_claimedInterfaces.get(interfaceIndex)) {
480 resolver->resolve(); 455 resolver->resolve();
481 } else { 456 } else {
457 setEndpointsForInterface(interfaceIndex, false);
juncai 2016/03/24 17:47:46 nit: add comment for false parameter.
Reilly Grant (use Gerrit) 2016/03/24 21:00:41 Done.
482 m_interfaceStateChangeInProgress.set(interfaceIndex); 458 m_interfaceStateChangeInProgress.set(interfaceIndex);
483 m_device->releaseInterface(interfaceNumber, new ClaimInterfacePromis eAdapter(this, resolver, interfaceIndex, false /* release */)); 459 m_device->releaseInterface(interfaceNumber, new ClaimInterfacePromis eAdapter(this, resolver, interfaceIndex, false /* release */));
484 } 460 }
485 } 461 }
486 return promise; 462 return promise;
487 } 463 }
488 464
489 ScriptPromise USBDevice::selectAlternateInterface(ScriptState* scriptState, uint 8_t interfaceNumber, uint8_t alternateSetting) 465 ScriptPromise USBDevice::selectAlternateInterface(ScriptState* scriptState, uint 8_t interfaceNumber, uint8_t alternateSetting)
490 { 466 {
491 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 467 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
492 ScriptPromise promise = resolver->promise(); 468 ScriptPromise promise = resolver->promise();
493 if (ensureInterfaceClaimed(interfaceNumber, resolver)) { 469 if (ensureInterfaceClaimed(interfaceNumber, resolver)) {
494 // TODO(reillyg): This is duplicated work. 470 // TODO(reillyg): This is duplicated work.
495 int interfaceIndex = findInterfaceIndex(interfaceNumber); 471 int interfaceIndex = findInterfaceIndex(interfaceNumber);
496 ASSERT(interfaceIndex != -1); 472 ASSERT(interfaceIndex != -1);
497 int alternateIndex = findAlternateIndex(interfaceIndex, alternateSetting ); 473 int alternateIndex = findAlternateIndex(interfaceIndex, alternateSetting );
498 if (alternateIndex == -1) { 474 if (alternateIndex == -1) {
499 resolver->reject(DOMException::create(NotFoundError, "The alternate setting provided is not supported by the device in its current configuration.")) ; 475 resolver->reject(DOMException::create(NotFoundError, "The alternate setting provided is not supported by the device in its current configuration.")) ;
500 } else { 476 } else {
477 setEndpointsForInterface(interfaceIndex, false);
juncai 2016/03/24 17:47:46 ditto.
Reilly Grant (use Gerrit) 2016/03/24 21:00:41 Done.
501 m_interfaceStateChangeInProgress.set(interfaceIndex); 478 m_interfaceStateChangeInProgress.set(interfaceIndex);
502 m_device->setInterface(interfaceNumber, alternateSetting, new Select AlternateInterfacePromiseAdapter(this, resolver, interfaceIndex, alternateIndex) ); 479 m_device->setInterface(interfaceNumber, alternateSetting, new Select AlternateInterfacePromiseAdapter(this, resolver, interfaceIndex, alternateIndex) );
503 } 480 }
504 } 481 }
505 return promise; 482 return promise;
506 } 483 }
507 484
508 ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo ntrolTransferParameters& setup, unsigned length) 485 ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo ntrolTransferParameters& setup, unsigned length)
509 { 486 {
510 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 487 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
511 ScriptPromise promise = resolver->promise(); 488 ScriptPromise promise = resolver->promise();
512 if (ensureDeviceConfigured(resolver)) { 489 if (ensureDeviceConfigured(resolver)) {
513 WebUSBDevice::ControlTransferParameters parameters; 490 WebUSBDevice::ControlTransferParameters parameters;
514 DOMException* error = convertControlTransferParameters(WebUSBDevice::Tra nsferDirection::In, setup, &parameters); 491 if (convertControlTransferParameters(WebUSBDevice::TransferDirection::In , setup, &parameters, resolver))
515 if (error)
516 resolver->reject(error);
517 else
518 m_device->controlTransfer(parameters, nullptr, length, 0, new Callba ckPromiseAdapter<InputTransferResult, USBError>(resolver)); 492 m_device->controlTransfer(parameters, nullptr, length, 0, new Callba ckPromiseAdapter<InputTransferResult, USBError>(resolver));
519 } 493 }
520 return promise; 494 return promise;
521 } 495 }
522 496
523 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ontrolTransferParameters& setup) 497 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ontrolTransferParameters& setup)
524 { 498 {
525 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 499 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
526 ScriptPromise promise = resolver->promise(); 500 ScriptPromise promise = resolver->promise();
527 if (ensureDeviceConfigured(resolver)) { 501 if (ensureDeviceConfigured(resolver)) {
528 WebUSBDevice::ControlTransferParameters parameters; 502 WebUSBDevice::ControlTransferParameters parameters;
529 DOMException* error = convertControlTransferParameters(WebUSBDevice::Tra nsferDirection::Out, setup, &parameters); 503 if (convertControlTransferParameters(WebUSBDevice::TransferDirection::Ou t, setup, &parameters, resolver))
530 if (error)
531 resolver->reject(error);
532 else
533 m_device->controlTransfer(parameters, nullptr, 0, 0, new CallbackPro miseAdapter<OutputTransferResult, USBError>(resolver)); 504 m_device->controlTransfer(parameters, nullptr, 0, 0, new CallbackPro miseAdapter<OutputTransferResult, USBError>(resolver));
534 } 505 }
535 return promise; 506 return promise;
536 } 507 }
537 508
538 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ontrolTransferParameters& setup, const ArrayBufferOrArrayBufferView& data) 509 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ontrolTransferParameters& setup, const ArrayBufferOrArrayBufferView& data)
539 { 510 {
540 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 511 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
541 ScriptPromise promise = resolver->promise(); 512 ScriptPromise promise = resolver->promise();
542 if (ensureDeviceConfigured(resolver)) { 513 if (ensureDeviceConfigured(resolver)) {
543 WebUSBDevice::ControlTransferParameters parameters; 514 WebUSBDevice::ControlTransferParameters parameters;
544 DOMException* error = convertControlTransferParameters(WebUSBDevice::Tra nsferDirection::Out, setup, &parameters); 515 if (convertControlTransferParameters(WebUSBDevice::TransferDirection::Ou t, setup, &parameters, resolver)) {
545 if (error) {
546 resolver->reject(error);
547 } else {
548 BufferSource buffer(data); 516 BufferSource buffer(data);
549 m_device->controlTransfer(parameters, buffer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); 517 m_device->controlTransfer(parameters, buffer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver));
550 } 518 }
551 } 519 }
552 return promise; 520 return promise;
553 } 521 }
554 522
555 ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, String direction, u int8_t endpointNumber) 523 ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, String direction, u int8_t endpointNumber)
556 { 524 {
557 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 525 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
716 resolver->reject(DOMException::create(InvalidStateError, kInterfaceState ChangeInProgress)); 684 resolver->reject(DOMException::create(InvalidStateError, kInterfaceState ChangeInProgress));
717 else if (!m_claimedInterfaces.get(interfaceIndex)) 685 else if (!m_claimedInterfaces.get(interfaceIndex))
718 resolver->reject(DOMException::create(InvalidStateError, "The specified interface has not been claimed.")); 686 resolver->reject(DOMException::create(InvalidStateError, "The specified interface has not been claimed."));
719 else 687 else
720 return true; 688 return true;
721 return false; 689 return false;
722 } 690 }
723 691
724 bool USBDevice::ensureEndpointAvailable(bool inTransfer, uint8_t endpointNumber, ScriptPromiseResolver* resolver) const 692 bool USBDevice::ensureEndpointAvailable(bool inTransfer, uint8_t endpointNumber, ScriptPromiseResolver* resolver) const
725 { 693 {
726 // TODO(reillyg): Check endpoint availability once Blink is tracking which 694 if (!ensureDeviceConfigured(resolver))
727 // alternate interfaces are selected. 695 return false;
728 return ensureDeviceConfigured(resolver); 696 if (endpointNumber <= 0 || endpointNumber >= 16) {
juncai 2016/03/24 17:47:46 endpointNumber is uint8_t, checking < 0 seems redu
Reilly Grant (use Gerrit) 2016/03/24 21:00:41 Done.
697 resolver->reject(DOMException::create(IndexSizeError, "The specified end point number is out of range."));
698 return false;
699 }
700 auto& bitVector = inTransfer ? m_inEndpoints : m_outEndpoints;
701 if (!bitVector.get(endpointNumber - 1)) {
702 resolver->reject(DOMException::create(NotFoundError, "The specified endp oint is not part of a claimed and selected alternate interface."));
703 return false;
704 }
705 return true;
729 } 706 }
730 707
731 bool USBDevice::anyInterfaceChangeInProgress() const 708 bool USBDevice::anyInterfaceChangeInProgress() const
732 { 709 {
733 for (size_t i = 0; i < m_interfaceStateChangeInProgress.size(); ++i) { 710 for (size_t i = 0; i < m_interfaceStateChangeInProgress.size(); ++i) {
734 if (m_interfaceStateChangeInProgress.quickGet(i)) 711 if (m_interfaceStateChangeInProgress.quickGet(i))
735 return true; 712 return true;
736 } 713 }
737 return false; 714 return false;
738 } 715 }
739 716
717 bool USBDevice::convertControlTransferParameters(
718 WebUSBDevice::TransferDirection direction,
719 const USBControlTransferParameters& parameters,
720 WebUSBDevice::ControlTransferParameters* webParameters,
721 ScriptPromiseResolver* resolver) const
722 {
723 webParameters->direction = direction;
724
725 if (parameters.requestType() == "standard") {
juncai 2016/03/24 17:47:46 maybe can use a variable to store parameters.reque
Reilly Grant (use Gerrit) 2016/03/24 21:00:41 These are simple inline accessors. There is no ben
726 webParameters->type = WebUSBDevice::RequestType::Standard;
727 } else if (parameters.requestType() == "class") {
728 webParameters->type = WebUSBDevice::RequestType::Class;
729 } else if (parameters.requestType() == "vendor") {
730 webParameters->type = WebUSBDevice::RequestType::Vendor;
731 } else {
732 resolver->reject(DOMException::create(TypeMismatchError, "The control tr ansfer requestType parameter is invalid."));
733 return false;
734 }
735
736 if (parameters.recipient() == "device") {
juncai 2016/03/24 17:47:46 ditto for parameters.recipient().
737 webParameters->recipient = WebUSBDevice::RequestRecipient::Device;
738 } else if (parameters.recipient() == "interface") {
739 size_t interfaceNumber = parameters.index() & 0xff;
740 if (!ensureInterfaceClaimed(interfaceNumber, resolver))
741 return false;
742 webParameters->recipient = WebUSBDevice::RequestRecipient::Interface;
743 } else if (parameters.recipient() == "endpoint") {
744 bool inTransfer = parameters.index() & 0x80;
745 size_t endpointNumber = parameters.index() & 0x0f;
746 if (!ensureEndpointAvailable(inTransfer, endpointNumber, resolver))
747 return false;
748 webParameters->recipient = WebUSBDevice::RequestRecipient::Endpoint;
749 } else if (parameters.recipient() == "other") {
750 webParameters->recipient = WebUSBDevice::RequestRecipient::Other;
751 } else {
752 resolver->reject(DOMException::create(TypeMismatchError, "The control tr ansfer recipient parameter is invalid."));
753 return false;
754 }
755
756 webParameters->request = parameters.request();
757 webParameters->value = parameters.value();
758 webParameters->index = parameters.index();
759 return true;
760 }
761
762 void USBDevice::setEndpointsForInterface(size_t interfaceIndex, bool set)
763 {
764 const auto& configuration = info().configurations[m_configurationIndex];
765 const auto& interface = configuration.interfaces[interfaceIndex];
766 const auto& alternate = interface.alternates[m_selectedAlternates[interfaceI ndex]];
767 for (const auto& endpoint : alternate.endpoints) {
768 if (endpoint.endpointNumber == 0 || endpoint.endpointNumber >= 16)
769 continue; // Ignore endpoints with invalid indices.
770 auto& bitVector = endpoint.direction == WebUSBDevice::TransferDirection: :In ? m_inEndpoints : m_outEndpoints;
771 if (set)
772 bitVector.set(endpoint.endpointNumber - 1);
773 else
774 bitVector.clear(endpoint.endpointNumber - 1);
775 }
776 }
777
740 } // namespace blink 778 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/modules/webusb/USBDevice.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698