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

Side by Side Diff: content/common/webmessageportchannel_impl.cc

Issue 7477027: Support Transferable objects (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Update for interface changes. Created 9 years, 4 months 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « content/common/webmessageportchannel_impl.h ('k') | content/renderer/webworker_base.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/common/webmessageportchannel_impl.h" 5 #include "content/common/webmessageportchannel_impl.h"
6 6
7 #include "content/common/child_process.h" 7 #include "content/common/child_process.h"
8 #include "content/common/child_thread.h" 8 #include "content/common/child_thread.h"
9 #include "content/common/worker_messages.h" 9 #include "content/common/worker_messages.h"
10 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSerializedScriptVa lue.h"
10 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" 11 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
12 #include "third_party/WebKit/Source/WebKit/chromium/public/WebMessagePortChannel .h"
11 #include "third_party/WebKit/Source/WebKit/chromium/public/WebMessagePortChannel Client.h" 13 #include "third_party/WebKit/Source/WebKit/chromium/public/WebMessagePortChannel Client.h"
12 14
13 using WebKit::WebMessagePortChannel; 15 using WebKit::WebMessagePortChannel;
14 using WebKit::WebMessagePortChannelArray; 16 #ifdef WebTransferableReceipt_h
17 using WebKit::WebMessagePortReceipt;
18 #endif
19 using WebKit::WebTransferableReceiptArray;
15 using WebKit::WebMessagePortChannelClient; 20 using WebKit::WebMessagePortChannelClient;
21 using WebKit::WebSerializedScriptValue;
16 using WebKit::WebString; 22 using WebKit::WebString;
17 23
18 WebMessagePortChannelImpl::WebMessagePortChannelImpl() 24 WebMessagePortChannelImpl::WebMessagePortChannelImpl()
19 : client_(NULL), 25 : client_(NULL),
20 route_id_(MSG_ROUTING_NONE), 26 route_id_(MSG_ROUTING_NONE),
21 message_port_id_(MSG_ROUTING_NONE) { 27 message_port_id_(MSG_ROUTING_NONE) {
22 AddRef(); 28 AddRef();
23 Init(); 29 Init();
24 } 30 }
25 31
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 void WebMessagePortChannelImpl::entangle(WebMessagePortChannel* channel) { 74 void WebMessagePortChannelImpl::entangle(WebMessagePortChannel* channel) {
69 // The message port ids might not be set up yet, if this channel wasn't 75 // The message port ids might not be set up yet, if this channel wasn't
70 // created on the main thread. So need to wait until we're on the main thread 76 // created on the main thread. So need to wait until we're on the main thread
71 // before getting the other message port id. 77 // before getting the other message port id.
72 scoped_refptr<WebMessagePortChannelImpl> webchannel( 78 scoped_refptr<WebMessagePortChannelImpl> webchannel(
73 static_cast<WebMessagePortChannelImpl*>(channel)); 79 static_cast<WebMessagePortChannelImpl*>(channel));
74 Entangle(webchannel); 80 Entangle(webchannel);
75 } 81 }
76 82
77 void WebMessagePortChannelImpl::postMessage( 83 void WebMessagePortChannelImpl::postMessage(
78 const WebString& message, 84 const WebString& raw_message,
79 WebMessagePortChannelArray* channels) { 85 WebTransferableReceiptArray* receipts) {
80 if (MessageLoop::current() != ChildThread::current()->message_loop()) { 86 if (MessageLoop::current() != ChildThread::current()->message_loop()) {
81 ChildThread::current()->message_loop()->PostTask(FROM_HERE, 87 ChildThread::current()->message_loop()->PostTask(FROM_HERE,
82 NewRunnableMethod(this, &WebMessagePortChannelImpl::postMessage, 88 NewRunnableMethod(this, &WebMessagePortChannelImpl::postMessage,
83 message, channels)); 89 raw_message, receipts));
84 return; 90 return;
85 } 91 }
86 92
87 std::vector<int> message_port_ids(channels ? channels->size() : 0); 93 size_t unflattenable_count = 0;
88 if (channels) { 94 #ifndef WebTransferableReceipt_h
95 WebString message = raw_message;
96 unflattenable_count = receipts ? receipts->size() : 0;
97 #else
98 WebString message = receipts ? WebSerializedScriptValue::flattenReceiptList(
99 raw_message, *receipts, &unflattenable_count) : raw_message;
100 #endif
101 std::vector<int> message_port_ids(unflattenable_count);
102 size_t next_unflattenable = 0;
103 if (receipts) {
89 // Extract the port IDs from the source array, then free it. 104 // Extract the port IDs from the source array, then free it.
90 for (size_t i = 0; i < channels->size(); ++i) { 105 for (size_t i = 0; i < receipts->size(); ++i) {
91 WebMessagePortChannelImpl* webchannel = 106 #ifndef WebTransferableReceipt_h
92 static_cast<WebMessagePortChannelImpl*>((*channels)[i]); 107 {
93 message_port_ids[i] = webchannel->message_port_id(); 108 #else
94 webchannel->QueueMessages(); 109 if (!WebSerializedScriptValue::isFlattenable((*receipts)[i])) {
95 DCHECK(message_port_ids[i] != MSG_ROUTING_NONE); 110 DCHECK(toWebMessagePortReceipt((*receipts)[i]));
111 #endif
112 DCHECK(next_unflattenable < unflattenable_count);
113 WebMessagePortChannelImpl* webchannel =
114 #ifndef WebTransferableReceipt_h
115 static_cast<WebMessagePortChannelImpl*>((*receipts)[i]);
116 #else
117 static_cast<WebMessagePortChannelImpl*>(
118 static_cast<WebMessagePortReceipt*>((*receipts)[i])->channel());
119 #endif
120 message_port_ids[next_unflattenable] = webchannel->message_port_id();
121 webchannel->QueueMessages();
122 DCHECK(message_port_ids[next_unflattenable] != MSG_ROUTING_NONE);
123 ++next_unflattenable;
124 }
125 #ifdef WebTransferableReceipt_h
126 delete ((*receipts)[i]);
127 (*receipts)[i] = 0;
128 #endif
96 } 129 }
97 delete channels; 130 delete receipts;
98 } 131 }
132 DCHECK(next_unflattenable == unflattenable_count);
99 133
100 IPC::Message* msg = new WorkerProcessHostMsg_PostMessage( 134 IPC::Message* msg = new WorkerProcessHostMsg_PostMessage(
101 message_port_id_, message, message_port_ids); 135 message_port_id_, message, message_port_ids);
102 Send(msg); 136 Send(msg);
103 } 137 }
104 138
139 #ifndef WebTransferableReceipt_h
105 bool WebMessagePortChannelImpl::tryGetMessage( 140 bool WebMessagePortChannelImpl::tryGetMessage(
141 #else
142 bool WebMessagePortChannelImpl::tryGetMessageWithNewReceipts(
143 #endif
106 WebString* message, 144 WebString* message,
107 WebMessagePortChannelArray& channels) { 145 WebTransferableReceiptArray& receipts) {
108 base::AutoLock auto_lock(lock_); 146 base::AutoLock auto_lock(lock_);
109 if (message_queue_.empty()) 147 if (message_queue_.empty())
110 return false; 148 return false;
111 149
112 *message = message_queue_.front().message; 150 *message = message_queue_.front().message;
113 const std::vector<WebMessagePortChannelImpl*>& channel_array = 151 const std::vector<WebMessagePortChannelImpl*>& channel_array =
114 message_queue_.front().ports; 152 message_queue_.front().ports;
115 WebMessagePortChannelArray result_ports(channel_array.size()); 153 WebTransferableReceiptArray result_ports(channel_array.size());
116 for (size_t i = 0; i < channel_array.size(); i++) { 154 for (size_t i = 0; i < channel_array.size(); i++) {
155 #ifndef WebTransferableReceipt_h
117 result_ports[i] = channel_array[i]; 156 result_ports[i] = channel_array[i];
157 #else
158 result_ports[i] = new WebMessagePortReceipt(channel_array[i]);
159 #endif
118 } 160 }
119 161
120 channels.swap(result_ports); 162 receipts.swap(result_ports);
121 message_queue_.pop(); 163 message_queue_.pop();
122 return true; 164 return true;
123 } 165 }
124 166
125 void WebMessagePortChannelImpl::Init() { 167 void WebMessagePortChannelImpl::Init() {
126 if (MessageLoop::current() != ChildThread::current()->message_loop()) { 168 if (MessageLoop::current() != ChildThread::current()->message_loop()) {
127 ChildThread::current()->message_loop()->PostTask(FROM_HERE, 169 ChildThread::current()->message_loop()->PostTask(FROM_HERE,
128 NewRunnableMethod(this, &WebMessagePortChannelImpl::Init)); 170 NewRunnableMethod(this, &WebMessagePortChannelImpl::Init));
129 return; 171 return;
130 } 172 }
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 277
236 message_port_id_ = MSG_ROUTING_NONE; 278 message_port_id_ = MSG_ROUTING_NONE;
237 279
238 Release(); 280 Release();
239 ChildProcess::current()->ReleaseProcess(); 281 ChildProcess::current()->ReleaseProcess();
240 } 282 }
241 283
242 WebMessagePortChannelImpl::Message::Message() {} 284 WebMessagePortChannelImpl::Message::Message() {}
243 285
244 WebMessagePortChannelImpl::Message::~Message() {} 286 WebMessagePortChannelImpl::Message::~Message() {}
OLDNEW
« no previous file with comments | « content/common/webmessageportchannel_impl.h ('k') | content/renderer/webworker_base.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698