Index: content/worker/webworkerclient_proxy.cc |
diff --git a/content/worker/webworkerclient_proxy.cc b/content/worker/webworkerclient_proxy.cc |
index 3493b32f2ce4694d6e93716564afa85b60f41234..fa0ad1dd641191001b834aeeed3700c09ce93459 100644 |
--- a/content/worker/webworkerclient_proxy.cc |
+++ b/content/worker/webworkerclient_proxy.cc |
@@ -24,6 +24,7 @@ |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFileSystemCallbacks.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebSerializedScriptValue.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURL.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebWorker.h" |
@@ -31,7 +32,11 @@ |
using WebKit::WebApplicationCacheHost; |
using WebKit::WebFrame; |
using WebKit::WebMessagePortChannel; |
-using WebKit::WebMessagePortChannelArray; |
+#ifdef WebTransferableReceipt_h |
+using WebKit::WebMessagePortReceipt; |
+#endif |
+using WebKit::WebTransferableReceiptArray; |
+using WebKit::WebSerializedScriptValue; |
using WebKit::WebSecurityOrigin; |
using WebKit::WebString; |
using WebKit::WebWorker; |
@@ -53,18 +58,42 @@ WebWorkerClientProxy::~WebWorkerClientProxy() { |
} |
void WebWorkerClientProxy::postMessageToWorkerObject( |
- const WebString& message, |
- const WebMessagePortChannelArray& channels) { |
- std::vector<int> message_port_ids(channels.size()); |
- std::vector<int> routing_ids(channels.size()); |
- for (size_t i = 0; i < channels.size(); ++i) { |
- WebMessagePortChannelImpl* webchannel = |
- static_cast<WebMessagePortChannelImpl*>(channels[i]); |
- message_port_ids[i] = webchannel->message_port_id(); |
- webchannel->QueueMessages(); |
- DCHECK(message_port_ids[i] != MSG_ROUTING_NONE); |
- routing_ids[i] = MSG_ROUTING_NONE; |
+ const WebString& raw_message, |
+ const WebTransferableReceiptArray& receipts) { |
+ size_t unflattenable_count; |
+#ifndef WebTransferableReceipt_h |
+ WebString message = raw_message; |
+ unflattenable_count = receipts.size(); |
+#else |
+ WebString message = WebSerializedScriptValue::flattenReceiptList( |
+ raw_message, receipts, &unflattenable_count); |
+#endif |
+ std::vector<int> message_port_ids(unflattenable_count); |
+ std::vector<int> routing_ids(unflattenable_count); |
+ size_t next_unflattenable = 0; |
+ for (size_t i = 0; i < receipts.size(); ++i) { |
+#ifndef WebTransferableReceipt_h |
+ { |
+#else |
+ if (!WebSerializedScriptValue::isFlattenable(receipts[i])) { |
+ DCHECK(toWebMessagePortReceipt(receipts[i])); |
+#endif |
+ DCHECK(next_unflattenable < unflattenable_count); |
+ WebMessagePortChannelImpl* webchannel = |
+#ifndef WebTransferableReceipt_h |
+ static_cast<WebMessagePortChannelImpl*>(receipts[i]); |
+#else |
+ static_cast<WebMessagePortChannelImpl*>( |
+ static_cast<WebMessagePortReceipt*>(receipts[i])->channel()); |
+#endif |
+ message_port_ids[next_unflattenable] = webchannel->message_port_id(); |
+ webchannel->QueueMessages(); |
+ CHECK(message_port_ids[next_unflattenable] != MSG_ROUTING_NONE); |
+ routing_ids[next_unflattenable] = MSG_ROUTING_NONE; |
+ ++next_unflattenable; |
+ } |
} |
+ DCHECK(next_unflattenable == unflattenable_count); |
Send(new WorkerMsg_PostMessage( |
route_id_, message, message_port_ids, routing_ids)); |