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

Unified Diff: third_party/WebKit/Source/modules/webusb/USBDevice.cpp

Issue 1635903004: Add support for isochronous transfers in WebUSB. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@usb_isoc
Patch Set: Fix tense. Created 4 years, 11 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 side-by-side diff with in-line comments
Download patch
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);
« no previous file with comments | « third_party/WebKit/Source/modules/webusb/USBDevice.h ('k') | third_party/WebKit/Source/modules/webusb/USBDevice.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698