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); |