OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |