| 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 |