Title: [124846] trunk
Revision
124846
Author
[email protected]
Date
2012-08-06 21:06:16 -0700 (Mon, 06 Aug 2012)

Log Message

WebSocket.send() should accept ArrayBufferView
https://bugs.webkit.org/show_bug.cgi?id=90877

Reviewed by Kent Tamura.

Source/WebCore:

Accept ArrayBufferView as an argument of WebSocket.send() to comply with recent change
in specification: <http://html5.org/tools/web-apps-tracker?from=7084&to=7085>.

Once WebSocket.send(ArrayBuffer) was removed from the specification, but added back
in <http://html5.org/tools/web-apps-tracker?from=7202&to=7203>. Thus the functionality
of send(ArrayBuffer) is kept as-is.

Tests: http/tests/websocket/tests/hybi/send-arraybufferview.html
       http/tests/websocket/tests/hybi/workers/send-arraybufferview.html

* Modules/websockets/ThreadableWebSocketChannel.h:
Change the signature of send() to receive offset and length so the clients can send
subrange of an ArrayBuffer.
* Modules/websockets/WebSocket.cpp:
(WebCore::WebSocket::send):
WebSocket.send(ArrayBufferView) is added, which puts the sub region of the given
ArrayBuffer into the outgoing frame queue.
* Modules/websockets/WebSocket.h:
* Modules/websockets/WebSocket.idl:
* Modules/websockets/WebSocketChannel.cpp:
(WebCore::WebSocketChannel::send):
* Modules/websockets/WebSocketChannel.h:
(WebSocketChannel):
* Modules/websockets/WorkerThreadableWebSocketChannel.cpp:
(WebCore::WorkerThreadableWebSocketChannel::send):
(WebCore::WorkerThreadableWebSocketChannel::Peer::send):
(WebCore::WorkerThreadableWebSocketChannel::Bridge::send):
Send only necessary part of data to the main thread.
* Modules/websockets/WorkerThreadableWebSocketChannel.h:
(WorkerThreadableWebSocketChannel):
(Bridge):
* bindings/js/JSWebSocketCustom.cpp:
(WebCore::JSWebSocket::send): Accept ArrayBufferView in send().
* bindings/v8/custom/V8WebSocketCustom.cpp:
(WebCore::V8WebSocket::sendCallback): Ditto.

Source/WebKit/chromium:

* src/WebSocketImpl.cpp:
(WebKit::WebSocketImpl::sendArrayBuffer):
Apply change in function signature of WebSocketChannel::send().

LayoutTests:

Two tests are added to check whether WebSocket.send(ArrayBufferView) works in the
main thread and in a worker.

* http/tests/websocket/tests/hybi/send-arraybufferview-expected.txt: Added.
* http/tests/websocket/tests/hybi/send-arraybufferview.html: Added.
* http/tests/websocket/tests/hybi/workers/resources/send-arraybufferview.js: Added.
* http/tests/websocket/tests/hybi/workers/send-arraybufferview-expected.txt: Added.
* http/tests/websocket/tests/hybi/workers/send-arraybufferview.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (124845 => 124846)


--- trunk/LayoutTests/ChangeLog	2012-08-07 03:59:53 UTC (rev 124845)
+++ trunk/LayoutTests/ChangeLog	2012-08-07 04:06:16 UTC (rev 124846)
@@ -1,3 +1,19 @@
+2012-08-06  Yuta Kitamura  <[email protected]>
+
+        WebSocket.send() should accept ArrayBufferView
+        https://bugs.webkit.org/show_bug.cgi?id=90877
+
+        Reviewed by Kent Tamura.
+
+        Two tests are added to check whether WebSocket.send(ArrayBufferView) works in the
+        main thread and in a worker.
+
+        * http/tests/websocket/tests/hybi/send-arraybufferview-expected.txt: Added.
+        * http/tests/websocket/tests/hybi/send-arraybufferview.html: Added.
+        * http/tests/websocket/tests/hybi/workers/resources/send-arraybufferview.js: Added.
+        * http/tests/websocket/tests/hybi/workers/send-arraybufferview-expected.txt: Added.
+        * http/tests/websocket/tests/hybi/workers/send-arraybufferview.html: Added.
+
 2012-08-06  Roger Fong  <[email protected]>
 
         LayoutTest: fast/forms/input-set-composition-scroll.html is failing on Windows.

Added: trunk/LayoutTests/http/tests/websocket/tests/hybi/send-arraybufferview-expected.txt (0 => 124846)


--- trunk/LayoutTests/http/tests/websocket/tests/hybi/send-arraybufferview-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/tests/websocket/tests/hybi/send-arraybufferview-expected.txt	2012-08-07 04:06:16 UTC (rev 124846)
@@ -0,0 +1,12 @@
+WebSocket: Send ArrayBufferViews.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS PASS: Message #0.
+PASS PASS: Message #1.
+PASS PASS: Message #2.
+PASS closeEvent.wasClean is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/http/tests/websocket/tests/hybi/send-arraybufferview.html (0 => 124846)


--- trunk/LayoutTests/http/tests/websocket/tests/hybi/send-arraybufferview.html	                        (rev 0)
+++ trunk/LayoutTests/http/tests/websocket/tests/hybi/send-arraybufferview.html	2012-08-07 04:06:16 UTC (rev 124846)
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script type="text/_javascript_">
+description("WebSocket: Send ArrayBufferViews.");
+
+window.jsTestIsAsync = true;
+
+function startsWith(target, prefix)
+{
+    return target.indexOf(prefix) === 0;
+}
+
+function createArrayBufferViewContainingHelloWorld()
+{
+    var hello = "Hello, world!";
+    var array = new Uint8Array(hello.length);
+    for (var i = 0; i < hello.length; ++i)
+        array[i] = hello.charCodeAt(i);
+    return array;
+}
+
+function createEmptyArrayBufferView()
+{
+    return new Uint8Array(0);
+}
+
+function createArrayBufferViewContainingAllDistinctBytes()
+{
+    // Return a slice of ArrayBuffer.
+    var buffer = new ArrayBuffer(1000);
+    var array = new Uint8Array(buffer, 123, 256);
+    for (var i = 0; i < 256; ++i)
+        array[i] = i;
+    return array;
+}
+
+var url = ""
+var ws = new WebSocket(url);
+var closeEvent;
+
+ws._onopen_ = function()
+{
+    ws.send(createArrayBufferViewContainingHelloWorld());
+    ws.send(createEmptyArrayBufferView());
+    ws.send(createArrayBufferViewContainingAllDistinctBytes());
+};
+
+ws._onmessage_ = function(event)
+{
+    var message = event.data;
+    if (startsWith(message, "PASS"))
+        testPassed(message);
+    else
+        testFailed(message);
+};
+
+ws._onclose_ = function(event)
+{
+    closeEvent = event;
+    shouldBeTrue("closeEvent.wasClean");
+    finishJSTest();
+};
+
+</script>
+<script src=""
+</body>
+</html>

Added: trunk/LayoutTests/http/tests/websocket/tests/hybi/workers/resources/send-arraybufferview.js (0 => 124846)


--- trunk/LayoutTests/http/tests/websocket/tests/hybi/workers/resources/send-arraybufferview.js	                        (rev 0)
+++ trunk/LayoutTests/http/tests/websocket/tests/hybi/workers/resources/send-arraybufferview.js	2012-08-07 04:06:16 UTC (rev 124846)
@@ -0,0 +1,47 @@
+function createArrayBufferViewContainingHelloWorld()
+{
+    var hello = "Hello, world!";
+    var array = new Uint8Array(hello.length);
+    for (var i = 0; i < hello.length; ++i)
+        array[i] = hello.charCodeAt(i);
+    return array;
+}
+
+function createEmptyArrayBufferView()
+{
+    return new Uint8Array(0);
+}
+
+function createArrayBufferViewContainingAllDistinctBytes()
+{
+    // Return a slice of ArrayBuffer.
+    var buffer = new ArrayBuffer(1000);
+    var array = new Uint8Array(buffer, 123, 256);
+    for (var i = 0; i < 256; ++i)
+        array[i] = i;
+    return array;
+}
+
+var url = ""
+var ws = new WebSocket(url);
+
+ws._onopen_ = function()
+{
+    ws.send(createArrayBufferViewContainingHelloWorld());
+    ws.send(createEmptyArrayBufferView());
+    ws.send(createArrayBufferViewContainingAllDistinctBytes());
+};
+
+ws._onmessage_ = function(event)
+{
+    postMessage(event.data);
+};
+
+ws._onclose_ = function(closeEvent)
+{
+    if (closeEvent.wasClean === true)
+        postMessage("PASS: closeEvent.wasClean is true.");
+    else
+        postMessage("FAIL: closeEvent.wasClean should be true, but was: " + closeEvent.wasClean);
+    postMessage("DONE");
+};

Added: trunk/LayoutTests/http/tests/websocket/tests/hybi/workers/send-arraybufferview-expected.txt (0 => 124846)


--- trunk/LayoutTests/http/tests/websocket/tests/hybi/workers/send-arraybufferview-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/tests/websocket/tests/hybi/workers/send-arraybufferview-expected.txt	2012-08-07 04:06:16 UTC (rev 124846)
@@ -0,0 +1,13 @@
+WebSocket: Send ArrayBufferViews in Web Workers.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS PASS: Message #0.
+PASS PASS: Message #1.
+PASS PASS: Message #2.
+PASS PASS: closeEvent.wasClean is true.
+DONE
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/http/tests/websocket/tests/hybi/workers/send-arraybufferview.html (0 => 124846)


--- trunk/LayoutTests/http/tests/websocket/tests/hybi/workers/send-arraybufferview.html	                        (rev 0)
+++ trunk/LayoutTests/http/tests/websocket/tests/hybi/workers/send-arraybufferview.html	2012-08-07 04:06:16 UTC (rev 124846)
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script type="text/_javascript_">
+description("WebSocket: Send ArrayBufferViews in Web Workers.");
+
+window.jsTestIsAsync = true;
+
+function startsWith(str, prefix)
+{
+    return str.indexOf(prefix) == 0;
+}
+
+var worker = new Worker("resources/send-arraybufferview.js");
+worker._onmessage_ = function (event)
+{
+    var message = event.data;
+    if (startsWith(message, "PASS"))
+        testPassed(message);
+    else if (startsWith(message, "FAIL"))
+        testFailed(message)
+    else
+        debug(message);
+    if (message === "DONE")
+        finishJSTest();
+};
+
+</script>
+<script src=""
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (124845 => 124846)


--- trunk/Source/WebCore/ChangeLog	2012-08-07 03:59:53 UTC (rev 124845)
+++ trunk/Source/WebCore/ChangeLog	2012-08-07 04:06:16 UTC (rev 124846)
@@ -1,3 +1,46 @@
+2012-08-06  Yuta Kitamura  <[email protected]>
+
+        WebSocket.send() should accept ArrayBufferView
+        https://bugs.webkit.org/show_bug.cgi?id=90877
+
+        Reviewed by Kent Tamura.
+
+        Accept ArrayBufferView as an argument of WebSocket.send() to comply with recent change
+        in specification: <http://html5.org/tools/web-apps-tracker?from=7084&to=7085>.
+
+        Once WebSocket.send(ArrayBuffer) was removed from the specification, but added back
+        in <http://html5.org/tools/web-apps-tracker?from=7202&to=7203>. Thus the functionality
+        of send(ArrayBuffer) is kept as-is.
+
+        Tests: http/tests/websocket/tests/hybi/send-arraybufferview.html
+               http/tests/websocket/tests/hybi/workers/send-arraybufferview.html
+
+        * Modules/websockets/ThreadableWebSocketChannel.h:
+        Change the signature of send() to receive offset and length so the clients can send
+        subrange of an ArrayBuffer.
+        * Modules/websockets/WebSocket.cpp:
+        (WebCore::WebSocket::send):
+        WebSocket.send(ArrayBufferView) is added, which puts the sub region of the given
+        ArrayBuffer into the outgoing frame queue.
+        * Modules/websockets/WebSocket.h:
+        * Modules/websockets/WebSocket.idl:
+        * Modules/websockets/WebSocketChannel.cpp:
+        (WebCore::WebSocketChannel::send):
+        * Modules/websockets/WebSocketChannel.h:
+        (WebSocketChannel):
+        * Modules/websockets/WorkerThreadableWebSocketChannel.cpp:
+        (WebCore::WorkerThreadableWebSocketChannel::send):
+        (WebCore::WorkerThreadableWebSocketChannel::Peer::send):
+        (WebCore::WorkerThreadableWebSocketChannel::Bridge::send):
+        Send only necessary part of data to the main thread.
+        * Modules/websockets/WorkerThreadableWebSocketChannel.h:
+        (WorkerThreadableWebSocketChannel):
+        (Bridge):
+        * bindings/js/JSWebSocketCustom.cpp:
+        (WebCore::JSWebSocket::send): Accept ArrayBufferView in send().
+        * bindings/v8/custom/V8WebSocketCustom.cpp:
+        (WebCore::V8WebSocket::sendCallback): Ditto.
+
 2012-08-06  James Robinson  <[email protected]>
 
         [chromium] Add gyp variable to control which compositor target is depended on

Modified: trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannel.h (124845 => 124846)


--- trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannel.h	2012-08-07 03:59:53 UTC (rev 124845)
+++ trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannel.h	2012-08-07 04:06:16 UTC (rev 124846)
@@ -60,7 +60,7 @@
     virtual String subprotocol() = 0; // Will be available after didConnect() callback is invoked.
     virtual String extensions() = 0; // Will be available after didConnect() callback is invoked.
     virtual SendResult send(const String& message) = 0;
-    virtual SendResult send(const ArrayBuffer&) = 0;
+    virtual SendResult send(const ArrayBuffer&, unsigned byteOffset, unsigned byteLength) = 0;
     virtual SendResult send(const Blob&) = 0;
     virtual unsigned long bufferedAmount() const = 0;
     virtual void close(int code, const String& reason) = 0;

Modified: trunk/Source/WebCore/Modules/websockets/WebSocket.cpp (124845 => 124846)


--- trunk/Source/WebCore/Modules/websockets/WebSocket.cpp	2012-08-07 03:59:53 UTC (rev 124845)
+++ trunk/Source/WebCore/Modules/websockets/WebSocket.cpp	2012-08-07 04:06:16 UTC (rev 124846)
@@ -51,6 +51,8 @@
 #include "SecurityOrigin.h"
 #include "ThreadableWebSocketChannel.h"
 #include "WebSocketChannel.h"
+#include <wtf/ArrayBuffer.h>
+#include <wtf/ArrayBufferView.h>
 #include <wtf/HashSet.h>
 #include <wtf/OwnPtr.h>
 #include <wtf/PassOwnPtr.h>
@@ -289,9 +291,28 @@
         return false;
     }
     ASSERT(m_channel);
-    return m_channel->send(*binaryData) == ThreadableWebSocketChannel::SendSuccess;
+    return m_channel->send(*binaryData, 0, binaryData->byteLength()) == ThreadableWebSocketChannel::SendSuccess;
 }
 
+bool WebSocket::send(ArrayBufferView* arrayBufferView, ExceptionCode& ec)
+{
+    LOG(Network, "WebSocket %p send arraybufferview %p", this, arrayBufferView);
+    ASSERT(arrayBufferView);
+    if (m_state == CONNECTING) {
+        ec = INVALID_STATE_ERR;
+        return false;
+    }
+    if (m_state == CLOSING || m_state == CLOSED) {
+        unsigned payloadSize = arrayBufferView->byteLength();
+        m_bufferedAmountAfterClose = saturateAdd(m_bufferedAmountAfterClose, payloadSize);
+        m_bufferedAmountAfterClose = saturateAdd(m_bufferedAmountAfterClose, getFramingOverhead(payloadSize));
+        return false;
+    }
+    ASSERT(m_channel);
+    RefPtr<ArrayBuffer> arrayBuffer(arrayBufferView->buffer());
+    return m_channel->send(*arrayBuffer, arrayBufferView->byteOffset(), arrayBufferView->byteLength()) == ThreadableWebSocketChannel::SendSuccess;
+}
+
 bool WebSocket::send(Blob* binaryData, ExceptionCode& ec)
 {
     LOG(Network, "WebSocket %p send blob %s", this, binaryData->url().string().utf8().data());

Modified: trunk/Source/WebCore/Modules/websockets/WebSocket.h (124845 => 124846)


--- trunk/Source/WebCore/Modules/websockets/WebSocket.h	2012-08-07 03:59:53 UTC (rev 124845)
+++ trunk/Source/WebCore/Modules/websockets/WebSocket.h	2012-08-07 04:06:16 UTC (rev 124846)
@@ -71,6 +71,7 @@
 
     bool send(const String& message, ExceptionCode&);
     bool send(ArrayBuffer*, ExceptionCode&);
+    bool send(ArrayBufferView*, ExceptionCode&);
     bool send(Blob*, ExceptionCode&);
 
     void close(int code, const String& reason, ExceptionCode&);

Modified: trunk/Source/WebCore/Modules/websockets/WebSocket.idl (124845 => 124846)


--- trunk/Source/WebCore/Modules/websockets/WebSocket.idl	2012-08-07 03:59:53 UTC (rev 124845)
+++ trunk/Source/WebCore/Modules/websockets/WebSocket.idl	2012-08-07 04:06:16 UTC (rev 124846)
@@ -69,6 +69,7 @@
         // booleans, null, undefined and objects except ArrayBuffer and Blob). Current code
         // generator does not handle this rule correctly.
         // boolean send(in ArrayBuffer data) raises(DOMException);
+        // boolean send(in ArrayBufferView data) raises(DOMException);
         // boolean send(in Blob data) raises(DOMException);
         // boolean send(in DOMString data) raises(DOMException);
         [Custom] boolean send(in DOMString data) raises(DOMException);

Modified: trunk/Source/WebCore/Modules/websockets/WebSocketChannel.cpp (124845 => 124846)


--- trunk/Source/WebCore/Modules/websockets/WebSocketChannel.cpp	2012-08-07 03:59:53 UTC (rev 124845)
+++ trunk/Source/WebCore/Modules/websockets/WebSocketChannel.cpp	2012-08-07 04:06:16 UTC (rev 124846)
@@ -153,10 +153,10 @@
     return ThreadableWebSocketChannel::SendSuccess;
 }
 
-ThreadableWebSocketChannel::SendResult WebSocketChannel::send(const ArrayBuffer& binaryData)
+ThreadableWebSocketChannel::SendResult WebSocketChannel::send(const ArrayBuffer& binaryData, unsigned byteOffset, unsigned byteLength)
 {
-    LOG(Network, "WebSocketChannel %p send arraybuffer %p", this, &binaryData);
-    enqueueRawFrame(WebSocketFrame::OpCodeBinary, static_cast<const char*>(binaryData.data()), binaryData.byteLength());
+    LOG(Network, "WebSocketChannel %p send arraybuffer %p %u %u", this, &binaryData, byteOffset, byteLength);
+    enqueueRawFrame(WebSocketFrame::OpCodeBinary, static_cast<const char*>(binaryData.data()) + byteOffset, byteLength);
     return ThreadableWebSocketChannel::SendSuccess;
 }
 

Modified: trunk/Source/WebCore/Modules/websockets/WebSocketChannel.h (124845 => 124846)


--- trunk/Source/WebCore/Modules/websockets/WebSocketChannel.h	2012-08-07 03:59:53 UTC (rev 124845)
+++ trunk/Source/WebCore/Modules/websockets/WebSocketChannel.h	2012-08-07 04:06:16 UTC (rev 124846)
@@ -72,7 +72,7 @@
     virtual String subprotocol() OVERRIDE;
     virtual String extensions() OVERRIDE;
     virtual ThreadableWebSocketChannel::SendResult send(const String& message) OVERRIDE;
-    virtual ThreadableWebSocketChannel::SendResult send(const ArrayBuffer&) OVERRIDE;
+    virtual ThreadableWebSocketChannel::SendResult send(const ArrayBuffer&, unsigned byteOffset, unsigned byteLength) OVERRIDE;
     virtual ThreadableWebSocketChannel::SendResult send(const Blob&) OVERRIDE;
     virtual unsigned long bufferedAmount() const OVERRIDE;
     virtual void close(int code, const String& reason) OVERRIDE; // Start closing handshake.

Modified: trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.cpp (124845 => 124846)


--- trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.cpp	2012-08-07 03:59:53 UTC (rev 124845)
+++ trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.cpp	2012-08-07 04:06:16 UTC (rev 124846)
@@ -91,11 +91,11 @@
     return m_bridge->send(message);
 }
 
-ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::send(const ArrayBuffer& binaryData)
+ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::send(const ArrayBuffer& binaryData, unsigned byteOffset, unsigned byteLength)
 {
     if (!m_bridge)
         return ThreadableWebSocketChannel::SendFail;
-    return m_bridge->send(binaryData);
+    return m_bridge->send(binaryData, byteOffset, byteLength);
 }
 
 ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::send(const Blob& binaryData)
@@ -188,7 +188,7 @@
     ASSERT(isMainThread());
     if (!m_mainWebSocketChannel || !m_workerClientWrapper)
         return;
-    ThreadableWebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel->send(binaryData);
+    ThreadableWebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel->send(binaryData, 0, binaryData.byteLength());
     m_loaderProxy.postTaskForModeToWorkerContext(createCallbackTask(&workerContextDidSend, m_workerClientWrapper, sendRequestResult), m_taskMode);
 }
 
@@ -488,14 +488,14 @@
     return clientWrapper->sendRequestResult();
 }
 
-ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(const ArrayBuffer& binaryData)
+ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(const ArrayBuffer& binaryData, unsigned byteOffset, unsigned byteLength)
 {
     if (!m_workerClientWrapper || !m_peer)
         return ThreadableWebSocketChannel::SendFail;
     // ArrayBuffer isn't thread-safe, hence the content of ArrayBuffer is copied into Vector<char>.
-    OwnPtr<Vector<char> > data = "" Vector<char>(binaryData.byteLength()));
+    OwnPtr<Vector<char> > data = "" Vector<char>(byteLength));
     if (binaryData.byteLength())
-        memcpy(data->data(), binaryData.data(), binaryData.byteLength());
+        memcpy(data->data(), static_cast<const char*>(binaryData.data()) + byteOffset, byteLength);
     setMethodNotCompleted();
     m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocketChannel::mainThreadSendArrayBuffer, AllowCrossThreadAccess(m_peer), data.release()));
     RefPtr<Bridge> protect(this);

Modified: trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.h (124845 => 124846)


--- trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.h	2012-08-07 03:59:53 UTC (rev 124845)
+++ trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.h	2012-08-07 04:06:16 UTC (rev 124846)
@@ -66,7 +66,7 @@
     virtual String subprotocol() OVERRIDE;
     virtual String extensions() OVERRIDE;
     virtual ThreadableWebSocketChannel::SendResult send(const String& message) OVERRIDE;
-    virtual ThreadableWebSocketChannel::SendResult send(const ArrayBuffer&) OVERRIDE;
+    virtual ThreadableWebSocketChannel::SendResult send(const ArrayBuffer&, unsigned byteOffset, unsigned byteLength) OVERRIDE;
     virtual ThreadableWebSocketChannel::SendResult send(const Blob&) OVERRIDE;
     virtual unsigned long bufferedAmount() const OVERRIDE;
     virtual void close(int code, const String& reason) OVERRIDE;
@@ -134,7 +134,7 @@
         void initialize();
         void connect(const KURL&, const String& protocol);
         ThreadableWebSocketChannel::SendResult send(const String& message);
-        ThreadableWebSocketChannel::SendResult send(const ArrayBuffer&);
+        ThreadableWebSocketChannel::SendResult send(const ArrayBuffer&, unsigned byteOffset, unsigned byteLength);
         ThreadableWebSocketChannel::SendResult send(const Blob&);
         unsigned long bufferedAmount();
         void close(int code, const String& reason);

Modified: trunk/Source/WebCore/bindings/js/JSWebSocketCustom.cpp (124845 => 124846)


--- trunk/Source/WebCore/bindings/js/JSWebSocketCustom.cpp	2012-08-07 03:59:53 UTC (rev 124845)
+++ trunk/Source/WebCore/bindings/js/JSWebSocketCustom.cpp	2012-08-07 04:06:16 UTC (rev 124846)
@@ -37,6 +37,7 @@
 
 #include "ExceptionCode.h"
 #include "JSArrayBuffer.h"
+#include "JSArrayBufferView.h"
 #include "JSBlob.h"
 #include "JSEventListener.h"
 #include "KURL.h"
@@ -100,6 +101,8 @@
     bool result;
     if (message.inherits(&JSArrayBuffer::s_info))
         result = impl()->send(toArrayBuffer(message), ec);
+    else if (message.inherits(&JSArrayBufferView::s_info))
+        result = impl()->send(toArrayBufferView(message), ec);
     else if (message.inherits(&JSBlob::s_info))
         result = impl()->send(toBlob(message), ec);
     else {

Modified: trunk/Source/WebCore/bindings/v8/custom/V8WebSocketCustom.cpp (124845 => 124846)


--- trunk/Source/WebCore/bindings/v8/custom/V8WebSocketCustom.cpp	2012-08-07 03:59:53 UTC (rev 124845)
+++ trunk/Source/WebCore/bindings/v8/custom/V8WebSocketCustom.cpp	2012-08-07 04:06:16 UTC (rev 124846)
@@ -38,6 +38,7 @@
 #include "Frame.h"
 #include "Settings.h"
 #include "V8ArrayBuffer.h"
+#include "V8ArrayBufferView.h"
 #include "V8Binding.h"
 #include "V8Blob.h"
 #include "V8Proxy.h"
@@ -127,6 +128,10 @@
         ArrayBuffer* arrayBuffer = V8ArrayBuffer::toNative(v8::Handle<v8::Object>::Cast(message));
         ASSERT(arrayBuffer);
         result = webSocket->send(arrayBuffer, ec);
+    } else if (V8ArrayBufferView::HasInstance(message)) {
+        ArrayBufferView* arrayBufferView = V8ArrayBufferView::toNative(v8::Handle<v8::Object>::Cast(message));
+        ASSERT(arrayBufferView);
+        result = webSocket->send(arrayBufferView, ec);
     } else if (V8Blob::HasInstance(message)) {
         Blob* blob = V8Blob::toNative(v8::Handle<v8::Object>::Cast(message));
         ASSERT(blob);

Modified: trunk/Source/WebKit/chromium/ChangeLog (124845 => 124846)


--- trunk/Source/WebKit/chromium/ChangeLog	2012-08-07 03:59:53 UTC (rev 124845)
+++ trunk/Source/WebKit/chromium/ChangeLog	2012-08-07 04:06:16 UTC (rev 124846)
@@ -1,3 +1,14 @@
+2012-08-06  Yuta Kitamura  <[email protected]>
+
+        WebSocket.send() should accept ArrayBufferView
+        https://bugs.webkit.org/show_bug.cgi?id=90877
+
+        Reviewed by Kent Tamura.
+
+        * src/WebSocketImpl.cpp:
+        (WebKit::WebSocketImpl::sendArrayBuffer):
+        Apply change in function signature of WebSocketChannel::send().
+
 2012-08-06  James Robinson  <[email protected]>
 
         [chromium] Remove lingering unwrap<>() calls in GraphicsLayerChromium.cpp

Modified: trunk/Source/WebKit/chromium/src/WebSocketImpl.cpp (124845 => 124846)


--- trunk/Source/WebKit/chromium/src/WebSocketImpl.cpp	2012-08-07 03:59:53 UTC (rev 124845)
+++ trunk/Source/WebKit/chromium/src/WebSocketImpl.cpp	2012-08-07 04:06:16 UTC (rev 124846)
@@ -126,7 +126,7 @@
 bool WebSocketImpl::sendArrayBuffer(const WebArrayBuffer& webArrayBuffer)
 {
 #if ENABLE(WEB_SOCKETS)
-    return m_private->send(*PassRefPtr<ArrayBuffer>(webArrayBuffer)) == ThreadableWebSocketChannel::SendSuccess;
+    return m_private->send(*PassRefPtr<ArrayBuffer>(webArrayBuffer), 0, webArrayBuffer.byteLength()) == ThreadableWebSocketChannel::SendSuccess;
 #else
     ASSERT_NOT_REACHED();
 #endif
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to