Index: content/renderer/webworker_proxy.cc |
diff --git a/content/renderer/webworker_proxy.cc b/content/renderer/webworker_proxy.cc |
index 1457be7f8d3a953116aa5edc5a064116cfe88f5c..0dd897e6b8ac27f5d18f5705973fd52f905d1311 100644 |
--- a/content/renderer/webworker_proxy.cc |
+++ b/content/renderer/webworker_proxy.cc |
@@ -10,12 +10,14 @@ |
#include "content/common/webmessageportchannel_impl.h" |
#include "content/common/worker_messages.h" |
#include "content/renderer/worker_devtools_agent_proxy.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebSerializedScriptValue.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURL.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebWorkerClient.h" |
using WebKit::WebCommonWorkerClient; |
using WebKit::WebMessagePortChannel; |
-using WebKit::WebMessagePortChannelArray; |
+using WebKit::WebTransferableReceiptArray; |
+using WebKit::WebSerializedScriptValue; |
using WebKit::WebString; |
using WebKit::WebURL; |
using WebKit::WebWorkerClient; |
@@ -67,18 +69,37 @@ void WebWorkerProxy::terminateWorkerContext() { |
} |
void WebWorkerProxy::postMessageToWorkerContext( |
- 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(); |
- routing_ids[i] = MSG_ROUTING_NONE; |
- DCHECK(message_port_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 (!receipts[i]->isFlattenable()) { |
+ DCHECK(receipts[i]->asWebMessagePortChannel()); |
+#endif |
+ DCHECK(next_unflattenable < unflattenable_count); |
+ WebMessagePortChannelImpl* webchannel = |
+ static_cast<WebMessagePortChannelImpl*>(receipts[i]); |
+ message_port_ids[next_unflattenable] = webchannel->message_port_id(); |
+ webchannel->QueueMessages(); |
+ routing_ids[next_unflattenable] = MSG_ROUTING_NONE; |
+ DCHECK(message_port_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)); |
} |
@@ -144,13 +165,13 @@ void WebWorkerProxy::OnPostMessage( |
const std::vector<int>& sent_message_port_ids, |
const std::vector<int>& new_routing_ids) { |
DCHECK(new_routing_ids.size() == sent_message_port_ids.size()); |
- WebMessagePortChannelArray channels(sent_message_port_ids.size()); |
+ WebTransferableReceiptArray receipts(sent_message_port_ids.size()); |
for (size_t i = 0; i < sent_message_port_ids.size(); ++i) { |
- channels[i] = new WebMessagePortChannelImpl( |
+ receipts[i] = new WebMessagePortChannelImpl( |
new_routing_ids[i], sent_message_port_ids[i]); |
} |
- client_->postMessageToWorkerObject(message, channels); |
+ client_->postMessageToWorkerObject(message, receipts); |
} |
void WebWorkerProxy::OnPostConsoleMessageToWorkerObject( |