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

Unified Diff: webkit/plugins/ppapi/ppb_websocket_impl.cc

Issue 8774042: WebSocket Pepper API: ArrayBuffer support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: sync path had a bug Created 9 years 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
« no previous file with comments | « ppapi/tests/test_websocket.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/plugins/ppapi/ppb_websocket_impl.cc
diff --git a/webkit/plugins/ppapi/ppb_websocket_impl.cc b/webkit/plugins/ppapi/ppb_websocket_impl.cc
index 825a4e94f92ee5cab56ebfcb8042cc66041ad07f..eec0d9a762d3167f3a9c39afca4f0666126e1367 100644
--- a/webkit/plugins/ppapi/ppb_websocket_impl.cc
+++ b/webkit/plugins/ppapi/ppb_websocket_impl.cc
@@ -11,6 +11,7 @@
#include "base/logging.h"
#include "googleurl/src/gurl.h"
#include "net/base/net_util.h"
+#include "ppapi/c/dev/ppb_var_array_buffer_dev.h"
#include "ppapi/c/pp_completion_callback.h"
#include "ppapi/c/pp_errors.h"
#include "ppapi/c/pp_var.h"
@@ -28,6 +29,7 @@
#include "webkit/plugins/ppapi/ppapi_plugin_instance.h"
#include "webkit/plugins/ppapi/resource_helper.h"
+using ppapi::ArrayBufferVar;
using ppapi::PpapiGlobals;
using ppapi::StringVar;
using ppapi::thunk::PPB_WebSocket_API;
@@ -54,9 +56,6 @@ uint64_t SaturateAdd(uint64_t a, uint64_t b) {
}
uint64_t GetFrameSize(uint64_t payload_size) {
- if (!payload_size)
- return 0;
-
uint64_t overhead = kHybiBaseFramingOverhead + kHybiMaskingKeyLength;
if (payload_size > kMinimumPayloadSizeWithEightByteExtendedPayloadLength)
overhead += 8;
@@ -284,8 +283,10 @@ int32_t PPB_WebSocket_Impl::ReceiveMessage(PP_Var* message,
return PP_ERROR_BADARGUMENT;
// Just return received message if any received message is queued.
- if (!received_messages_.empty())
+ if (!received_messages_.empty()) {
+ receive_callback_var_ = message;
return DoReceive();
+ }
// Check state again. In CLOSED state, no more messages will be received.
if (state_ == PP_WEBSOCKETREADYSTATE_CLOSED_DEV)
@@ -326,8 +327,15 @@ int32_t PPB_WebSocket_Impl::SendMessage(PP_Var message) {
scoped_refptr<StringVar> message_string = StringVar::FromPPVar(message);
if (message_string)
payload_size += message_string->value().length();
+ } else if (message.type == PP_VARTYPE_ARRAY_BUFFER) {
+ scoped_refptr<ArrayBufferVar> message_array_buffer =
+ ArrayBufferVar::FromPPVar(message);
+ if (message_array_buffer)
+ payload_size += message_array_buffer->ByteLength();
+ } else {
+ // TODO(toyoshim): Support Blob.
+ return PP_ERROR_NOTSUPPORTED;
}
- // TODO(toyoshim): Support binary data.
buffered_amount_after_close_ =
SaturateAdd(buffered_amount_after_close_, GetFrameSize(payload_size));
@@ -335,19 +343,33 @@ int32_t PPB_WebSocket_Impl::SendMessage(PP_Var message) {
return PP_ERROR_FAILED;
}
- if (message.type != PP_VARTYPE_STRING) {
- // TODO(toyoshim): Support binary data.
+ // Send the message.
+ if (message.type == PP_VARTYPE_STRING) {
+ // Convert message to WebString.
+ scoped_refptr<StringVar> message_string = StringVar::FromPPVar(message);
+ if (!message_string)
+ return PP_ERROR_BADARGUMENT;
+ WebString web_message = WebString::fromUTF8(message_string->value());
+ if (!websocket_->sendText(web_message))
+ return PP_ERROR_BADARGUMENT;
+ } else if (message.type == PP_VARTYPE_ARRAY_BUFFER) {
+ // Convert message to WebData.
+ // TODO(toyoshim): Must add a WebKit interface which handles WebArrayBuffer
+ // directly.
+ scoped_refptr<ArrayBufferVar> message_array_buffer =
+ ArrayBufferVar::FromPPVar(message);
+ if (!message_array_buffer)
+ return PP_ERROR_BADARGUMENT;
+ WebData web_message = WebData(
+ static_cast<const char*>(message_array_buffer->Map()),
+ static_cast<size_t>(message_array_buffer->ByteLength()));
+ if (!websocket_->sendBinary(web_message))
+ return PP_ERROR_BADARGUMENT;
+ } else {
+ // TODO(toyoshim): Support Blob.
return PP_ERROR_NOTSUPPORTED;
}
- // Convert message to WebString.
- scoped_refptr<StringVar> message_string = StringVar::FromPPVar(message);
- if (!message_string)
- return PP_ERROR_BADARGUMENT;
- WebString web_message = WebString::fromUTF8(message_string->value());
- if (!websocket_->sendText(web_message))
- return PP_ERROR_BADARGUMENT;
-
return PP_OK;
}
@@ -423,8 +445,18 @@ void PPB_WebSocket_Impl::didReceiveBinaryData(const WebData& binaryData) {
if (error_was_received_ || !InValidStateToReceive(state_))
return;
- // TODO(toyoshim): Support to receive binary data.
- DLOG(INFO) << "didReceiveBinaryData is not implemented yet.";
+ // Append received data to queue.
+ PP_Var var = PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar(
+ binaryData.size());
+ scoped_refptr<ArrayBufferVar> arraybuffer = ArrayBufferVar::FromPPVar(var);
+ void* data = arraybuffer->Map();
+ memcpy(data, binaryData.data(), binaryData.size());
+ received_messages_.push(var);
+
+ if (!wait_for_receive_)
+ return;
+
+ PP_RunAndClearCompletionCallback(&receive_callback_, DoReceive());
}
void PPB_WebSocket_Impl::didReceiveMessageError() {
« no previous file with comments | « ppapi/tests/test_websocket.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698