| OLD | NEW |
| 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/ScriptPromise.h" | 7 #include "bindings/core/v8/ScriptPromise.h" |
| 8 #include "bindings/core/v8/ScriptPromiseResolver.h" | 8 #include "bindings/core/v8/ScriptPromiseResolver.h" |
| 9 #include "bindings/core/v8/ToV8.h" | 9 #include "bindings/core/v8/ToV8.h" |
| 10 #include "core/dom/DOMArrayBuffer.h" | 10 #include "core/dom/DOMArrayBuffer.h" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 case usb::TransferStatus::STALLED: | 65 case usb::TransferStatus::STALLED: |
| 66 return "stall"; | 66 return "stall"; |
| 67 case usb::TransferStatus::BABBLE: | 67 case usb::TransferStatus::BABBLE: |
| 68 return "babble"; | 68 return "babble"; |
| 69 default: | 69 default: |
| 70 ASSERT_NOT_REACHED(); | 70 ASSERT_NOT_REACHED(); |
| 71 return ""; | 71 return ""; |
| 72 } | 72 } |
| 73 } | 73 } |
| 74 | 74 |
| 75 mojo::WTFArray<uint8_t> convertBufferSource(const ArrayBufferOrArrayBufferView&
buffer) | 75 Vector<uint8_t> convertBufferSource(const ArrayBufferOrArrayBufferView& buffer) |
| 76 { | 76 { |
| 77 ASSERT(!buffer.isNull()); | 77 ASSERT(!buffer.isNull()); |
| 78 Vector<uint8_t> vector; | 78 Vector<uint8_t> vector; |
| 79 if (buffer.isArrayBuffer()) | 79 if (buffer.isArrayBuffer()) |
| 80 vector.append(static_cast<uint8_t*>(buffer.getAsArrayBuffer()->data()),
buffer.getAsArrayBuffer()->byteLength()); | 80 vector.append(static_cast<uint8_t*>(buffer.getAsArrayBuffer()->data()),
buffer.getAsArrayBuffer()->byteLength()); |
| 81 else | 81 else |
| 82 vector.append(static_cast<uint8_t*>(buffer.getAsArrayBufferView()->baseA
ddress()), buffer.getAsArrayBufferView()->byteLength()); | 82 vector.append(static_cast<uint8_t*>(buffer.getAsArrayBufferView()->baseA
ddress()), buffer.getAsArrayBufferView()->byteLength()); |
| 83 return mojo::WTFArray<uint8_t>(std::move(vector)); | 83 return vector; |
| 84 } | 84 } |
| 85 | 85 |
| 86 } // namespace | 86 } // namespace |
| 87 | 87 |
| 88 USBDevice::USBDevice(usb::DeviceInfoPtr deviceInfo, usb::DevicePtr device, Execu
tionContext* context) | 88 USBDevice::USBDevice(usb::DeviceInfoPtr deviceInfo, usb::DevicePtr device, Execu
tionContext* context) |
| 89 : ContextLifecycleObserver(context) | 89 : ContextLifecycleObserver(context) |
| 90 , m_deviceInfo(std::move(deviceInfo)) | 90 , m_deviceInfo(std::move(deviceInfo)) |
| 91 , m_device(std::move(device)) | 91 , m_device(std::move(device)) |
| 92 , m_opened(false) | 92 , m_opened(false) |
| 93 , m_deviceStateChangeInProgress(false) | 93 , m_deviceStateChangeInProgress(false) |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 } | 271 } |
| 272 | 272 |
| 273 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup) | 273 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup) |
| 274 { | 274 { |
| 275 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 275 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 276 ScriptPromise promise = resolver->promise(); | 276 ScriptPromise promise = resolver->promise(); |
| 277 if (ensureDeviceConfigured(resolver)) { | 277 if (ensureDeviceConfigured(resolver)) { |
| 278 auto parameters = convertControlTransferParameters(setup, resolver); | 278 auto parameters = convertControlTransferParameters(setup, resolver); |
| 279 if (parameters) { | 279 if (parameters) { |
| 280 m_deviceRequests.add(resolver); | 280 m_deviceRequests.add(resolver); |
| 281 m_device->ControlTransferOut(std::move(parameters), mojo::WTFArray<u
int8_t>(), 0, convertToBaseCallback(WTF::bind(&USBDevice::asyncControlTransferOu
t, wrapPersistent(this), 0, wrapPersistent(resolver)))); | 281 m_device->ControlTransferOut(std::move(parameters), Vector<uint8_t>(
), 0, convertToBaseCallback(WTF::bind(&USBDevice::asyncControlTransferOut, wrapP
ersistent(this), 0, wrapPersistent(resolver)))); |
| 282 } | 282 } |
| 283 } | 283 } |
| 284 return promise; | 284 return promise; |
| 285 } | 285 } |
| 286 | 286 |
| 287 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup, const ArrayBufferOrArrayBufferView& data) | 287 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup, const ArrayBufferOrArrayBufferView& data) |
| 288 { | 288 { |
| 289 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 289 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 290 ScriptPromise promise = resolver->promise(); | 290 ScriptPromise promise = resolver->promise(); |
| 291 if (ensureDeviceConfigured(resolver)) { | 291 if (ensureDeviceConfigured(resolver)) { |
| 292 auto parameters = convertControlTransferParameters(setup, resolver); | 292 auto parameters = convertControlTransferParameters(setup, resolver); |
| 293 if (parameters) { | 293 if (parameters) { |
| 294 mojo::WTFArray<uint8_t> buffer = convertBufferSource(data); | 294 Vector<uint8_t> buffer = convertBufferSource(data); |
| 295 unsigned transferLength = buffer.size(); | 295 unsigned transferLength = buffer.size(); |
| 296 m_deviceRequests.add(resolver); | 296 m_deviceRequests.add(resolver); |
| 297 m_device->ControlTransferOut(std::move(parameters), std::move(buffer
), 0, convertToBaseCallback(WTF::bind(&USBDevice::asyncControlTransferOut, wrapP
ersistent(this), transferLength, wrapPersistent(resolver)))); | 297 m_device->ControlTransferOut(std::move(parameters), buffer, 0, conve
rtToBaseCallback(WTF::bind(&USBDevice::asyncControlTransferOut, wrapPersistent(t
his), transferLength, wrapPersistent(resolver)))); |
| 298 } | 298 } |
| 299 } | 299 } |
| 300 return promise; | 300 return promise; |
| 301 } | 301 } |
| 302 | 302 |
| 303 ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, String direction, u
int8_t endpointNumber) | 303 ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, String direction, u
int8_t endpointNumber) |
| 304 { | 304 { |
| 305 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 305 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 306 ScriptPromise promise = resolver->promise(); | 306 ScriptPromise promise = resolver->promise(); |
| 307 if (ensureEndpointAvailable(direction == "in", endpointNumber, resolver)) { | 307 if (ensureEndpointAvailable(direction == "in", endpointNumber, resolver)) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 320 m_device->GenericTransferIn(endpointNumber, length, 0, convertToBaseCall
back(WTF::bind(&USBDevice::asyncTransferIn, wrapPersistent(this), wrapPersistent
(resolver)))); | 320 m_device->GenericTransferIn(endpointNumber, length, 0, convertToBaseCall
back(WTF::bind(&USBDevice::asyncTransferIn, wrapPersistent(this), wrapPersistent
(resolver)))); |
| 321 } | 321 } |
| 322 return promise; | 322 return promise; |
| 323 } | 323 } |
| 324 | 324 |
| 325 ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN
umber, const ArrayBufferOrArrayBufferView& data) | 325 ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN
umber, const ArrayBufferOrArrayBufferView& data) |
| 326 { | 326 { |
| 327 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 327 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 328 ScriptPromise promise = resolver->promise(); | 328 ScriptPromise promise = resolver->promise(); |
| 329 if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { | 329 if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { |
| 330 mojo::WTFArray<uint8_t> buffer = convertBufferSource(data); | 330 Vector<uint8_t> buffer = convertBufferSource(data); |
| 331 unsigned transferLength = buffer.size(); | 331 unsigned transferLength = buffer.size(); |
| 332 m_deviceRequests.add(resolver); | 332 m_deviceRequests.add(resolver); |
| 333 m_device->GenericTransferOut(endpointNumber, std::move(buffer), 0, conve
rtToBaseCallback(WTF::bind(&USBDevice::asyncTransferOut, wrapPersistent(this), t
ransferLength, wrapPersistent(resolver)))); | 333 m_device->GenericTransferOut(endpointNumber, buffer, 0, convertToBaseCal
lback(WTF::bind(&USBDevice::asyncTransferOut, wrapPersistent(this), transferLeng
th, wrapPersistent(resolver)))); |
| 334 } | 334 } |
| 335 return promise; | 335 return promise; |
| 336 } | 336 } |
| 337 | 337 |
| 338 ScriptPromise USBDevice::isochronousTransferIn(ScriptState* scriptState, uint8_t
endpointNumber, Vector<unsigned> packetLengths) | 338 ScriptPromise USBDevice::isochronousTransferIn(ScriptState* scriptState, uint8_t
endpointNumber, Vector<unsigned> packetLengths) |
| 339 { | 339 { |
| 340 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 340 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 341 ScriptPromise promise = resolver->promise(); | 341 ScriptPromise promise = resolver->promise(); |
| 342 if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { | 342 if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { |
| 343 m_deviceRequests.add(resolver); | 343 m_deviceRequests.add(resolver); |
| 344 m_device->IsochronousTransferIn(endpointNumber, mojo::WTFArray<uint32_t>
(std::move(packetLengths)), 0, convertToBaseCallback(WTF::bind(&USBDevice::async
IsochronousTransferIn, wrapPersistent(this), wrapPersistent(resolver)))); | 344 m_device->IsochronousTransferIn(endpointNumber, packetLengths, 0, conver
tToBaseCallback(WTF::bind(&USBDevice::asyncIsochronousTransferIn, wrapPersistent
(this), wrapPersistent(resolver)))); |
| 345 } | 345 } |
| 346 return promise; | 346 return promise; |
| 347 } | 347 } |
| 348 | 348 |
| 349 ScriptPromise USBDevice::isochronousTransferOut(ScriptState* scriptState, uint8_
t endpointNumber, const ArrayBufferOrArrayBufferView& data, Vector<unsigned> pac
ketLengths) | 349 ScriptPromise USBDevice::isochronousTransferOut(ScriptState* scriptState, uint8_
t endpointNumber, const ArrayBufferOrArrayBufferView& data, Vector<unsigned> pac
ketLengths) |
| 350 { | 350 { |
| 351 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 351 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 352 ScriptPromise promise = resolver->promise(); | 352 ScriptPromise promise = resolver->promise(); |
| 353 if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { | 353 if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { |
| 354 m_deviceRequests.add(resolver); | 354 m_deviceRequests.add(resolver); |
| 355 m_device->IsochronousTransferOut(endpointNumber, convertBufferSource(dat
a), mojo::WTFArray<uint32_t>(std::move(packetLengths)), 0, convertToBaseCallback
(WTF::bind(&USBDevice::asyncIsochronousTransferOut, wrapPersistent(this), wrapPe
rsistent(resolver)))); | 355 m_device->IsochronousTransferOut(endpointNumber, convertBufferSource(dat
a), packetLengths, 0, convertToBaseCallback(WTF::bind(&USBDevice::asyncIsochrono
usTransferOut, wrapPersistent(this), wrapPersistent(resolver)))); |
| 356 } | 356 } |
| 357 return promise; | 357 return promise; |
| 358 } | 358 } |
| 359 | 359 |
| 360 ScriptPromise USBDevice::reset(ScriptState* scriptState) | 360 ScriptPromise USBDevice::reset(ScriptState* scriptState) |
| 361 { | 361 { |
| 362 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 362 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 363 ScriptPromise promise = resolver->promise(); | 363 ScriptPromise promise = resolver->promise(); |
| 364 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { | 364 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { |
| 365 if (!m_opened) { | 365 if (!m_opened) { |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 526 mojoParameters->value = parameters.value(); | 526 mojoParameters->value = parameters.value(); |
| 527 mojoParameters->index = parameters.index(); | 527 mojoParameters->index = parameters.index(); |
| 528 return mojoParameters; | 528 return mojoParameters; |
| 529 } | 529 } |
| 530 | 530 |
| 531 void USBDevice::setEndpointsForInterface(size_t interfaceIndex, bool set) | 531 void USBDevice::setEndpointsForInterface(size_t interfaceIndex, bool set) |
| 532 { | 532 { |
| 533 const auto& configuration = *info().configurations[m_configurationIndex]; | 533 const auto& configuration = *info().configurations[m_configurationIndex]; |
| 534 const auto& interface = *configuration.interfaces[interfaceIndex]; | 534 const auto& interface = *configuration.interfaces[interfaceIndex]; |
| 535 const auto& alternate = *interface.alternates[m_selectedAlternates[interface
Index]]; | 535 const auto& alternate = *interface.alternates[m_selectedAlternates[interface
Index]]; |
| 536 for (const auto& endpoint : alternate.endpoints.storage()) { | 536 for (const auto& endpoint : alternate.endpoints) { |
| 537 uint8_t endpointNumber = endpoint->endpoint_number; | 537 uint8_t endpointNumber = endpoint->endpoint_number; |
| 538 if (endpointNumber == 0 || endpointNumber >= 16) | 538 if (endpointNumber == 0 || endpointNumber >= 16) |
| 539 continue; // Ignore endpoints with invalid indices. | 539 continue; // Ignore endpoints with invalid indices. |
| 540 auto& bitVector = endpoint->direction == usb::TransferDirection::INBOUND
? m_inEndpoints : m_outEndpoints; | 540 auto& bitVector = endpoint->direction == usb::TransferDirection::INBOUND
? m_inEndpoints : m_outEndpoints; |
| 541 if (set) | 541 if (set) |
| 542 bitVector.set(endpointNumber - 1); | 542 bitVector.set(endpointNumber - 1); |
| 543 else | 543 else |
| 544 bitVector.clear(endpointNumber - 1); | 544 bitVector.clear(endpointNumber - 1); |
| 545 } | 545 } |
| 546 } | 546 } |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 654 m_selectedAlternates[interfaceIndex] = alternateIndex; | 654 m_selectedAlternates[interfaceIndex] = alternateIndex; |
| 655 setEndpointsForInterface(interfaceIndex, success); | 655 setEndpointsForInterface(interfaceIndex, success); |
| 656 m_interfaceStateChangeInProgress.clear(interfaceIndex); | 656 m_interfaceStateChangeInProgress.clear(interfaceIndex); |
| 657 | 657 |
| 658 if (success) | 658 if (success) |
| 659 resolver->resolve(); | 659 resolver->resolve(); |
| 660 else | 660 else |
| 661 resolver->reject(DOMException::create(NetworkError, "Unable to set devic
e interface.")); | 661 resolver->reject(DOMException::create(NetworkError, "Unable to set devic
e interface.")); |
| 662 } | 662 } |
| 663 | 663 |
| 664 void USBDevice::asyncControlTransferIn(ScriptPromiseResolver* resolver, usb::Tra
nsferStatus status, mojo::WTFArray<uint8_t> data) | 664 void USBDevice::asyncControlTransferIn(ScriptPromiseResolver* resolver, usb::Tra
nsferStatus status, const Optional<Vector<uint8_t>>& data) |
| 665 { | 665 { |
| 666 if (!markRequestComplete(resolver)) | 666 if (!markRequestComplete(resolver)) |
| 667 return; | 667 return; |
| 668 | 668 |
| 669 DOMException* error = convertFatalTransferStatus(status); | 669 DOMException* error = convertFatalTransferStatus(status); |
| 670 if (error) | 670 if (error) |
| 671 resolver->reject(error); | 671 resolver->reject(error); |
| 672 else | 672 else |
| 673 resolver->resolve(USBInTransferResult::create(convertTransferStatus(stat
us), data.PassStorage())); | 673 resolver->resolve(USBInTransferResult::create(convertTransferStatus(stat
us), data)); |
| 674 } | 674 } |
| 675 | 675 |
| 676 void USBDevice::asyncControlTransferOut(unsigned transferLength, ScriptPromiseRe
solver* resolver, usb::TransferStatus status) | 676 void USBDevice::asyncControlTransferOut(unsigned transferLength, ScriptPromiseRe
solver* resolver, usb::TransferStatus status) |
| 677 { | 677 { |
| 678 if (!markRequestComplete(resolver)) | 678 if (!markRequestComplete(resolver)) |
| 679 return; | 679 return; |
| 680 | 680 |
| 681 DOMException* error = convertFatalTransferStatus(status); | 681 DOMException* error = convertFatalTransferStatus(status); |
| 682 if (error) | 682 if (error) |
| 683 resolver->reject(error); | 683 resolver->reject(error); |
| 684 else | 684 else |
| 685 resolver->resolve(USBOutTransferResult::create(convertTransferStatus(sta
tus), transferLength)); | 685 resolver->resolve(USBOutTransferResult::create(convertTransferStatus(sta
tus), transferLength)); |
| 686 } | 686 } |
| 687 | 687 |
| 688 void USBDevice::asyncClearHalt(ScriptPromiseResolver* resolver, bool success) | 688 void USBDevice::asyncClearHalt(ScriptPromiseResolver* resolver, bool success) |
| 689 { | 689 { |
| 690 if (!markRequestComplete(resolver)) | 690 if (!markRequestComplete(resolver)) |
| 691 return; | 691 return; |
| 692 | 692 |
| 693 if (success) | 693 if (success) |
| 694 resolver->resolve(); | 694 resolver->resolve(); |
| 695 else | 695 else |
| 696 resolver->reject(DOMException::create(NetworkError, "Unable to clear end
point.")); | 696 resolver->reject(DOMException::create(NetworkError, "Unable to clear end
point.")); |
| 697 } | 697 } |
| 698 | 698 |
| 699 void USBDevice::asyncTransferIn(ScriptPromiseResolver* resolver, usb::TransferSt
atus status, mojo::WTFArray<uint8_t> data) | 699 void USBDevice::asyncTransferIn(ScriptPromiseResolver* resolver, usb::TransferSt
atus status, const Optional<Vector<uint8_t>>& data) |
| 700 { | 700 { |
| 701 if (!markRequestComplete(resolver)) | 701 if (!markRequestComplete(resolver)) |
| 702 return; | 702 return; |
| 703 | 703 |
| 704 DOMException* error = convertFatalTransferStatus(status); | 704 DOMException* error = convertFatalTransferStatus(status); |
| 705 if (error) | 705 if (error) |
| 706 resolver->reject(error); | 706 resolver->reject(error); |
| 707 else | 707 else |
| 708 resolver->resolve(USBInTransferResult::create(convertTransferStatus(stat
us), data.PassStorage())); | 708 resolver->resolve(USBInTransferResult::create(convertTransferStatus(stat
us), data)); |
| 709 } | 709 } |
| 710 | 710 |
| 711 void USBDevice::asyncTransferOut(unsigned transferLength, ScriptPromiseResolver*
resolver, usb::TransferStatus status) | 711 void USBDevice::asyncTransferOut(unsigned transferLength, ScriptPromiseResolver*
resolver, usb::TransferStatus status) |
| 712 { | 712 { |
| 713 if (!markRequestComplete(resolver)) | 713 if (!markRequestComplete(resolver)) |
| 714 return; | 714 return; |
| 715 | 715 |
| 716 DOMException* error = convertFatalTransferStatus(status); | 716 DOMException* error = convertFatalTransferStatus(status); |
| 717 if (error) | 717 if (error) |
| 718 resolver->reject(error); | 718 resolver->reject(error); |
| 719 else | 719 else |
| 720 resolver->resolve(USBOutTransferResult::create(convertTransferStatus(sta
tus), transferLength)); | 720 resolver->resolve(USBOutTransferResult::create(convertTransferStatus(sta
tus), transferLength)); |
| 721 } | 721 } |
| 722 | 722 |
| 723 void USBDevice::asyncIsochronousTransferIn(ScriptPromiseResolver* resolver, mojo
::WTFArray<uint8_t> data, mojo::WTFArray<usb::IsochronousPacketPtr> mojoPackets) | 723 void USBDevice::asyncIsochronousTransferIn(ScriptPromiseResolver* resolver, cons
t Optional<Vector<uint8_t>>& data, Vector<usb::IsochronousPacketPtr> mojoPackets
) |
| 724 { | 724 { |
| 725 if (!markRequestComplete(resolver)) | 725 if (!markRequestComplete(resolver)) |
| 726 return; | 726 return; |
| 727 | 727 |
| 728 DOMArrayBuffer* buffer = DOMArrayBuffer::create(data.storage().data(), data.
storage().size()); | 728 DOMArrayBuffer* buffer = data ? DOMArrayBuffer::create(data->data(), data->s
ize()) : nullptr; |
| 729 HeapVector<Member<USBIsochronousInTransferPacket>> packets; | 729 HeapVector<Member<USBIsochronousInTransferPacket>> packets; |
| 730 packets.reserveCapacity(mojoPackets.size()); | 730 packets.reserveCapacity(mojoPackets.size()); |
| 731 size_t byteOffset = 0; | 731 size_t byteOffset = 0; |
| 732 for (const auto& packet : mojoPackets.storage()) { | 732 for (const auto& packet : mojoPackets) { |
| 733 DOMException* error = convertFatalTransferStatus(packet->status); | 733 DOMException* error = convertFatalTransferStatus(packet->status); |
| 734 if (error) { | 734 if (error) { |
| 735 resolver->reject(error); | 735 resolver->reject(error); |
| 736 return; | 736 return; |
| 737 } | 737 } |
| 738 packets.append(USBIsochronousInTransferPacket::create(convertTransferSta
tus(packet->status), DOMDataView::create(buffer, byteOffset, packet->transferred
_length))); | 738 packets.append(USBIsochronousInTransferPacket::create(convertTransferSta
tus(packet->status), buffer ? DOMDataView::create(buffer, byteOffset, packet->tr
ansferred_length) : nullptr)); |
| 739 byteOffset += packet->length; | 739 byteOffset += packet->length; |
| 740 } | 740 } |
| 741 resolver->resolve(USBIsochronousInTransferResult::create(buffer, packets)); | 741 resolver->resolve(USBIsochronousInTransferResult::create(buffer, packets)); |
| 742 } | 742 } |
| 743 | 743 |
| 744 void USBDevice::asyncIsochronousTransferOut(ScriptPromiseResolver* resolver, moj
o::WTFArray<usb::IsochronousPacketPtr> mojoPackets) | 744 void USBDevice::asyncIsochronousTransferOut(ScriptPromiseResolver* resolver, Vec
tor<usb::IsochronousPacketPtr> mojoPackets) |
| 745 { | 745 { |
| 746 if (!markRequestComplete(resolver)) | 746 if (!markRequestComplete(resolver)) |
| 747 return; | 747 return; |
| 748 | 748 |
| 749 HeapVector<Member<USBIsochronousOutTransferPacket>> packets; | 749 HeapVector<Member<USBIsochronousOutTransferPacket>> packets; |
| 750 packets.reserveCapacity(mojoPackets.size()); | 750 packets.reserveCapacity(mojoPackets.size()); |
| 751 for (const auto& packet : mojoPackets.storage()) { | 751 for (const auto& packet : mojoPackets) { |
| 752 DOMException* error = convertFatalTransferStatus(packet->status); | 752 DOMException* error = convertFatalTransferStatus(packet->status); |
| 753 if (error) { | 753 if (error) { |
| 754 resolver->reject(error); | 754 resolver->reject(error); |
| 755 return; | 755 return; |
| 756 } | 756 } |
| 757 packets.append(USBIsochronousOutTransferPacket::create(convertTransferSt
atus(packet->status), packet->transferred_length)); | 757 packets.append(USBIsochronousOutTransferPacket::create(convertTransferSt
atus(packet->status), packet->transferred_length)); |
| 758 } | 758 } |
| 759 resolver->resolve(USBIsochronousOutTransferResult::create(packets)); | 759 resolver->resolve(USBIsochronousOutTransferResult::create(packets)); |
| 760 } | 760 } |
| 761 | 761 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 782 bool USBDevice::markRequestComplete(ScriptPromiseResolver* resolver) | 782 bool USBDevice::markRequestComplete(ScriptPromiseResolver* resolver) |
| 783 { | 783 { |
| 784 auto requestEntry = m_deviceRequests.find(resolver); | 784 auto requestEntry = m_deviceRequests.find(resolver); |
| 785 if (requestEntry == m_deviceRequests.end()) | 785 if (requestEntry == m_deviceRequests.end()) |
| 786 return false; | 786 return false; |
| 787 m_deviceRequests.remove(requestEntry); | 787 m_deviceRequests.remove(requestEntry); |
| 788 return true; | 788 return true; |
| 789 } | 789 } |
| 790 | 790 |
| 791 } // namespace blink | 791 } // namespace blink |
| OLD | NEW |