Index: third_party/WebKit/Source/modules/webusb/USBDevice.cpp |
diff --git a/third_party/WebKit/Source/modules/webusb/USBDevice.cpp b/third_party/WebKit/Source/modules/webusb/USBDevice.cpp |
index 5396f8832ed58fe919cbbbff90abbdd648e89524..5ef0df98fbd75f9d338278363a7714f1887da5a6 100644 |
--- a/third_party/WebKit/Source/modules/webusb/USBDevice.cpp |
+++ b/third_party/WebKit/Source/modules/webusb/USBDevice.cpp |
@@ -16,8 +16,11 @@ |
#include "modules/webusb/USBControlTransferParameters.h" |
#include "modules/webusb/USBError.h" |
#include "modules/webusb/USBInTransferResult.h" |
+#include "modules/webusb/USBIsochronousInTransferResult.h" |
+#include "modules/webusb/USBIsochronousOutTransferResult.h" |
#include "modules/webusb/USBOutTransferResult.h" |
#include "public/platform/modules/webusb/WebUSBTransferInfo.h" |
+#include "wtf/Assertions.h" |
namespace blink { |
@@ -101,7 +104,8 @@ public: |
static USBInTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBTransferInfo> webTransferInfo) |
{ |
- return USBInTransferResult::create(convertTransferStatus(webTransferInfo->status), webTransferInfo->data); |
+ ASSERT(webTransferInfo->status.size() == 1); |
+ return USBInTransferResult::create(convertTransferStatus(webTransferInfo->status[0]), webTransferInfo->data); |
} |
private: |
@@ -115,13 +119,51 @@ public: |
static USBOutTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBTransferInfo> webTransferInfo) |
{ |
- return USBOutTransferResult::create(convertTransferStatus(webTransferInfo->status), webTransferInfo->bytesWritten); |
+ ASSERT(webTransferInfo->status.size() == 1); |
+ ASSERT(webTransferInfo->bytesTransferred.size() == 1); |
+ return USBOutTransferResult::create(convertTransferStatus(webTransferInfo->status[0]), webTransferInfo->bytesTransferred[0]); |
} |
private: |
OutputTransferResult() = delete; |
}; |
+class IsochronousInputTransferResult { |
+ WTF_MAKE_NONCOPYABLE(IsochronousInputTransferResult); |
+ |
+public: |
+ using WebType = OwnPtr<WebUSBTransferInfo>; |
+ |
+ static USBIsochronousInTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBTransferInfo> webTransferInfo) |
+ { |
+ ASSERT(webTransferInfo->status.size() == webTransferInfo->packetLength.size() && webTransferInfo->packetLength.size() == webTransferInfo->bytesTransferred.size()); |
+ RefPtr<DOMArrayBuffer> buffer = DOMArrayBuffer::create(webTransferInfo->data.data(), webTransferInfo->data.size()); |
+ HeapVector<Member<USBIsochronousInTransferPacket>> packets(webTransferInfo->status.size()); |
+ size_t byteOffset = 0; |
+ for (size_t i = 0; i < webTransferInfo->status.size(); ++i) { |
+ packets.append(USBIsochronousInTransferPacket::create(convertTransferStatus(webTransferInfo->status[i]), DOMDataView::create(buffer, byteOffset, webTransferInfo->bytesTransferred[i]))); |
+ byteOffset += webTransferInfo->packetLength[i]; |
+ } |
+ return USBIsochronousInTransferResult::create(buffer, packets); |
+ } |
+}; |
+ |
+class IsochronousOutputTransferResult { |
+ WTF_MAKE_NONCOPYABLE(IsochronousOutputTransferResult); |
+ |
+public: |
+ using WebType = OwnPtr<WebUSBTransferInfo>; |
+ |
+ static USBIsochronousOutTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBTransferInfo> webTransferInfo) |
+ { |
+ ASSERT(webTransferInfo->status.size() == webTransferInfo->bytesTransferred.size()); |
+ HeapVector<Member<USBIsochronousOutTransferPacket>> packets(webTransferInfo->status.size()); |
+ for (size_t i = 0; i < webTransferInfo->status.size(); ++i) |
+ packets.append(USBIsochronousOutTransferPacket::create(convertTransferStatus(webTransferInfo->status[i]), webTransferInfo->bytesTransferred[i])); |
+ return USBIsochronousOutTransferResult::create(packets); |
+ } |
+}; |
+ |
class BufferSource { |
WTF_MAKE_NONCOPYABLE(BufferSource); |
public: |
@@ -282,6 +324,23 @@ ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN |
return promise; |
} |
+ScriptPromise USBDevice::isochronousTransferIn(ScriptState* scriptState, uint8_t endpointNumber, Vector<unsigned> packetLengths) |
+{ |
+ ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
+ ScriptPromise promise = resolver->promise(); |
+ m_device->isochronousTransfer(WebUSBDevice::TransferDirection::In, endpointNumber, nullptr, 0, packetLengths, 0, new CallbackPromiseAdapter<IsochronousInputTransferResult, USBError>(resolver)); |
+ return promise; |
+} |
+ |
+ScriptPromise USBDevice::isochronousTransferOut(ScriptState* scriptState, uint8_t endpointNumber, const ArrayBufferOrArrayBufferView& data, Vector<unsigned> packetLengths) |
+{ |
+ ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
+ ScriptPromise promise = resolver->promise(); |
+ BufferSource buffer(data); |
+ m_device->isochronousTransfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buffer.data(), buffer.size(), packetLengths, 0, new CallbackPromiseAdapter<IsochronousOutputTransferResult, USBError>(resolver)); |
+ return promise; |
+} |
+ |
ScriptPromise USBDevice::reset(ScriptState* scriptState) |
{ |
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |