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

Unified Diff: third_party/WebKit/Source/modules/websockets/DOMWebSocket.cpp

Issue 1666893003: [ABANDONED] WebSocket Blob receive in the browser process: renderer changes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@websocket_blob_receive_host_merged
Patch Set: Created 4 years, 10 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/websockets/DOMWebSocket.cpp
diff --git a/third_party/WebKit/Source/modules/websockets/DOMWebSocket.cpp b/third_party/WebKit/Source/modules/websockets/DOMWebSocket.cpp
index 48cfa5ef7de27303e1916492a2f2c50de30f91a9..ce926d81767f2607d2cd436ba0f8133fecfcee1d 100644
--- a/third_party/WebKit/Source/modules/websockets/DOMWebSocket.cpp
+++ b/third_party/WebKit/Source/modules/websockets/DOMWebSocket.cpp
@@ -41,6 +41,7 @@
#include "core/dom/SecurityContext.h"
#include "core/events/MessageEvent.h"
#include "core/fileapi/Blob.h"
+#include "core/fileapi/FileReaderLoader.h"
#include "core/frame/ConsoleTypes.h"
#include "core/frame/LocalDOMWindow.h"
#include "core/frame/LocalFrame.h"
@@ -552,14 +553,31 @@ String DOMWebSocket::binaryType() const
return String();
}
+// static
+WebSocketChannel::BinaryType DOMWebSocket::toChannelBinaryType(BinaryType binaryType)
+{
+ static_assert(static_cast<WebSocketChannel::BinaryType>(BinaryTypeBlob) == WebSocketChannel::BinaryTypeBlob, "enums must match");
+ static_assert(static_cast<WebSocketChannel::BinaryType>(BinaryTypeArrayBuffer) == WebSocketChannel::BinaryTypeArrayBuffer, "enums must match");
+ ASSERT(binaryType == BinaryTypeBlob || binaryType == BinaryTypeArrayBuffer);
+ return static_cast<WebSocketChannel::BinaryType>(binaryType);
+}
+
void DOMWebSocket::setBinaryType(const String& binaryType)
{
if (binaryType == "blob") {
- m_binaryType = BinaryTypeBlob;
+ if (m_binaryType != BinaryTypeBlob) {
+ m_binaryType = BinaryTypeBlob;
+ if (m_channel)
+ m_channel->changeBinaryType(toChannelBinaryType(m_binaryType));
+ }
return;
}
if (binaryType == "arraybuffer") {
- m_binaryType = BinaryTypeArrayBuffer;
+ if (m_binaryType != BinaryTypeArrayBuffer) {
+ m_binaryType = BinaryTypeArrayBuffer;
+ if (m_channel)
+ m_channel->changeBinaryType(toChannelBinaryType(m_binaryType));
+ }
return;
}
ASSERT_NOT_REACHED();
@@ -628,9 +646,9 @@ void DOMWebSocket::didReceiveTextMessage(const String& msg)
m_eventQueue->dispatch(MessageEvent::create(msg, SecurityOrigin::create(m_url)->toString()));
}
-void DOMWebSocket::didReceiveBinaryMessage(PassOwnPtr<Vector<char>> binaryData)
+void DOMWebSocket::didReceiveArrayBuffer(PassOwnPtr<Vector<char>> binaryData)
{
- WTF_LOG(Network, "WebSocket %p didReceiveBinaryMessage() %lu byte binary message", this, static_cast<unsigned long>(binaryData->size()));
+ WTF_LOG(Network, "WebSocket %p didReceiveArrayBuffer() %lu byte binary message", this, static_cast<unsigned long>(binaryData->size()));
switch (m_binaryType) {
case BinaryTypeBlob: {
size_t size = binaryData->size();
@@ -652,6 +670,29 @@ void DOMWebSocket::didReceiveBinaryMessage(PassOwnPtr<Vector<char>> binaryData)
}
}
+void DOMWebSocket::didReceiveBlob(PassRefPtr<BlobDataHandle> blobDataHandle)
+{
+ WTF_LOG(Network, "WebSocket %p didReceiveBlob() %llu byte binary message", this, blobDataHandle->size());
+ switch (m_binaryType) {
+ case BinaryTypeBlob: {
+ Blob* blob = Blob::create(blobDataHandle);
+ Platform::current()->histogramEnumeration("WebCore.WebSocket.ReceiveType", WebSocketReceiveTypeBlob, WebSocketReceiveTypeMax);
+ m_eventQueue->dispatch(MessageEvent::create(blob, SecurityOrigin::create(m_url)->toString()));
+ break;
+ }
+
+ case BinaryTypeArrayBuffer: {
+ // FIXME: Make this async.
+ FileReaderLoader fileReaderLoader(FileReaderLoader::ReadAsArrayBuffer, nullptr);
+ fileReaderLoader.start(executionContext(), blobDataHandle);
+ RefPtr<DOMArrayBuffer> arrayBuffer = fileReaderLoader.arrayBufferResult();
+ Platform::current()->histogramEnumeration("WebCore.WebSocket.ReceiveType", WebSocketReceiveTypeArrayBuffer, WebSocketReceiveTypeMax);
+ m_eventQueue->dispatch(MessageEvent::create(arrayBuffer.release(), SecurityOrigin::create(m_url)->toString()));
+ break;
+ }
+ }
+}
+
void DOMWebSocket::didError()
{
WTF_LOG(Network, "WebSocket %p didError()", this);

Powered by Google App Engine
This is Rietveld 408576698