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