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

Side by Side Diff: chrome/browser/worker_host/worker_process_host.cc

Issue 340036: Initial pass of shared workers renderer-side code (Closed)
Patch Set: Changes reflecting review feedback Created 11 years, 1 month 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
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 "chrome/browser/worker_host/worker_process_host.h" 5 #include "chrome/browser/worker_host/worker_process_host.h"
6 6
7 #include <set> 7 #include <set>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 void WorkerProcessHost::CreateWorker(const WorkerInstance& instance) { 137 void WorkerProcessHost::CreateWorker(const WorkerInstance& instance) {
138 ChildProcessSecurityPolicy::GetInstance()->GrantRequestURL( 138 ChildProcessSecurityPolicy::GetInstance()->GrantRequestURL(
139 id(), instance.url); 139 id(), instance.url);
140 140
141 instances_.push_back(instance); 141 instances_.push_back(instance);
142 Send(new WorkerProcessMsg_CreateWorker( 142 Send(new WorkerProcessMsg_CreateWorker(
143 instance.url, instance.worker_route_id)); 143 instance.url, instance.worker_route_id));
144 144
145 UpdateTitle(); 145 UpdateTitle();
146 instances_.back().sender->Send( 146 instances_.back().sender->Send(
147 new ViewMsg_DedicatedWorkerCreated(instance.sender_route_id)); 147 new ViewMsg_WorkerCreated(instance.sender_route_id));
148 } 148 }
149 149
150 bool WorkerProcessHost::FilterMessage(const IPC::Message& message, 150 bool WorkerProcessHost::FilterMessage(const IPC::Message& message,
151 int sender_pid) { 151 int sender_pid) {
152 for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) { 152 for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) {
153 if (i->sender_id == sender_pid && 153 if (i->sender_id == sender_pid &&
154 i->sender_route_id == message.routing_id()) { 154 i->sender_route_id == message.routing_id()) {
155 RelayMessage( 155 RelayMessage(
156 message, this, i->worker_route_id, next_route_id_callback_.get()); 156 message, this, i->worker_route_id, next_route_id_callback_.get());
157 return true; 157 return true;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 222
223 // Must be a ResourceMessageFilter. 223 // Must be a ResourceMessageFilter.
224 return static_cast<ResourceMessageFilter*>(sender)->next_route_id_callback(); 224 return static_cast<ResourceMessageFilter*>(sender)->next_route_id_callback();
225 } 225 }
226 226
227 void WorkerProcessHost::RelayMessage( 227 void WorkerProcessHost::RelayMessage(
228 const IPC::Message& message, 228 const IPC::Message& message,
229 IPC::Message::Sender* sender, 229 IPC::Message::Sender* sender,
230 int route_id, 230 int route_id,
231 CallbackWithReturnValue<int>::Type* next_route_id) { 231 CallbackWithReturnValue<int>::Type* next_route_id) {
232 if (message.type() != WorkerMsg_PostMessage::ID) { 232
233 if (message.type() == WorkerMsg_PostMessage::ID) {
234 // We want to send the receiver a routing id for the new channel, so
235 // crack the message first.
236 string16 msg;
237 std::vector<int> sent_message_port_ids;
238 std::vector<int> new_routing_ids;
239 if (!WorkerMsg_PostMessage::Read(
240 &message, &msg, &sent_message_port_ids, &new_routing_ids)) {
241 return;
242 }
243 DCHECK(sent_message_port_ids.size() == new_routing_ids.size());
244
245 for (size_t i = 0; i < sent_message_port_ids.size(); ++i) {
246 new_routing_ids[i] = next_route_id->Run();
247 MessagePortDispatcher::GetInstance()->UpdateMessagePort(
248 sent_message_port_ids[i], sender, new_routing_ids[i], next_route_id);
249 }
250
251 sender->Send(new WorkerMsg_PostMessage(
252 route_id, msg, sent_message_port_ids, new_routing_ids));
253
254 // Send any queued messages to the sent message ports. We can only do this
255 // after sending the above message, since it's the one that sets up the
256 // message port route which the queued messages are sent to.
257 for (size_t i = 0; i < sent_message_port_ids.size(); ++i) {
258 MessagePortDispatcher::GetInstance()->
259 SendQueuedMessagesIfPossible(sent_message_port_ids[i]);
260 }
261 } else if (message.type() == WorkerMsg_Connect::ID) {
262 // Crack the SharedWorker Connect message to setup routing for the port.
263 int sent_message_port_id;
264 int new_routing_id;
265 if (!WorkerMsg_Connect::Read(
266 &message, &sent_message_port_id, &new_routing_id)) {
267 return;
268 }
269 new_routing_id = next_route_id->Run();
270 MessagePortDispatcher::GetInstance()->UpdateMessagePort(
271 sent_message_port_id, sender, new_routing_id, next_route_id);
272
273 // Resend the message with the new routing id.
274 sender->Send(new WorkerMsg_Connect(
275 route_id, sent_message_port_id, new_routing_id));
276
277 // Send any queued messages for the sent port.
278 MessagePortDispatcher::GetInstance()->SendQueuedMessagesIfPossible(
279 sent_message_port_id);
280 } else {
233 IPC::Message* new_message = new IPC::Message(message); 281 IPC::Message* new_message = new IPC::Message(message);
234 new_message->set_routing_id(route_id); 282 new_message->set_routing_id(route_id);
235 sender->Send(new_message); 283 sender->Send(new_message);
236 return; 284 return;
237 } 285 }
238
239 // We want to send the receiver a routing id for the new channel, so
240 // crack the message first.
241 string16 msg;
242 std::vector<int> sent_message_port_ids;
243 std::vector<int> new_routing_ids;
244 if (!WorkerMsg_PostMessage::Read(
245 &message, &msg, &sent_message_port_ids, &new_routing_ids)) {
246 return;
247 }
248 DCHECK(sent_message_port_ids.size() == new_routing_ids.size());
249
250 for (size_t i = 0; i < sent_message_port_ids.size(); ++i) {
251 new_routing_ids[i] = next_route_id->Run();
252 MessagePortDispatcher::GetInstance()->UpdateMessagePort(
253 sent_message_port_ids[i], sender, new_routing_ids[i], next_route_id);
254 }
255
256 sender->Send(new WorkerMsg_PostMessage(
257 route_id, msg, sent_message_port_ids, new_routing_ids));
258
259 // Send any queued messages to the sent message ports. We can only do this
260 // after sending the above message, since it's the one that sets up the
261 // message port route which the queued messages are sent to.
262 for (size_t i = 0; i < sent_message_port_ids.size(); ++i) {
263 MessagePortDispatcher::GetInstance()->
264 SendQueuedMessagesIfPossible(sent_message_port_ids[i]);
265 }
266 } 286 }
267 287
268 void WorkerProcessHost::SenderShutdown(IPC::Message::Sender* sender) { 288 void WorkerProcessHost::SenderShutdown(IPC::Message::Sender* sender) {
269 for (Instances::iterator i = instances_.begin(); i != instances_.end();) { 289 for (Instances::iterator i = instances_.begin(); i != instances_.end();) {
270 if (i->sender == sender) { 290 if (i->sender == sender) {
271 Send(new WorkerMsg_TerminateWorkerContext(i->worker_route_id)); 291 Send(new WorkerMsg_TerminateWorkerContext(i->worker_route_id));
272 i = instances_.erase(i); 292 i = instances_.erase(i);
273 } else { 293 } else {
274 ++i; 294 ++i;
275 } 295 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 instances_.front().render_view_route_id, this, id(), *route_id); 331 instances_.front().render_view_route_id, this, id(), *route_id);
312 } 332 }
313 333
314 void WorkerProcessHost::OnCancelCreateDedicatedWorker(int route_id) { 334 void WorkerProcessHost::OnCancelCreateDedicatedWorker(int route_id) {
315 WorkerService::GetInstance()->CancelCreateDedicatedWorker(id(), route_id); 335 WorkerService::GetInstance()->CancelCreateDedicatedWorker(id(), route_id);
316 } 336 }
317 337
318 void WorkerProcessHost::OnForwardToWorker(const IPC::Message& message) { 338 void WorkerProcessHost::OnForwardToWorker(const IPC::Message& message) {
319 WorkerService::GetInstance()->ForwardMessage(message, id()); 339 WorkerService::GetInstance()->ForwardMessage(message, id());
320 } 340 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698