| 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/callback.h" | 10 #include "base/callback.h" |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 WorkerProcessHost::WorkerProcessHost( | 68 WorkerProcessHost::WorkerProcessHost( |
| 69 ResourceDispatcherHost* resource_dispatcher_host, | 69 ResourceDispatcherHost* resource_dispatcher_host, |
| 70 ChromeURLRequestContext *request_context) | 70 ChromeURLRequestContext *request_context) |
| 71 : BrowserChildProcessHost(WORKER_PROCESS, resource_dispatcher_host), | 71 : BrowserChildProcessHost(WORKER_PROCESS, resource_dispatcher_host), |
| 72 request_context_(request_context) { | 72 request_context_(request_context) { |
| 73 next_route_id_callback_.reset(NewCallbackWithReturnValue( | 73 next_route_id_callback_.reset(NewCallbackWithReturnValue( |
| 74 WorkerService::GetInstance(), &WorkerService::next_worker_route_id)); | 74 WorkerService::GetInstance(), &WorkerService::next_worker_route_id)); |
| 75 } | 75 } |
| 76 | 76 |
| 77 WorkerProcessHost::~WorkerProcessHost() { | 77 WorkerProcessHost::~WorkerProcessHost() { |
| 78 for (size_t i = 0; i < filters_.size(); ++i) { | |
| 79 filters_[i]->OnChannelClosing(); | |
| 80 filters_[i]->OnFilterRemoved(); | |
| 81 } | |
| 82 | |
| 83 // Let interested observers know we are being deleted. | 78 // Let interested observers know we are being deleted. |
| 84 NotificationService::current()->Notify( | 79 NotificationService::current()->Notify( |
| 85 NotificationType::WORKER_PROCESS_HOST_SHUTDOWN, | 80 NotificationType::WORKER_PROCESS_HOST_SHUTDOWN, |
| 86 Source<WorkerProcessHost>(this), | 81 Source<WorkerProcessHost>(this), |
| 87 NotificationService::NoDetails()); | 82 NotificationService::NoDetails()); |
| 88 | 83 |
| 89 // If we crashed, tell the RenderViewHosts. | 84 // If we crashed, tell the RenderViewHosts. |
| 90 for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) { | 85 for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) { |
| 91 const WorkerDocumentSet::DocumentInfoSet& parents = | 86 const WorkerDocumentSet::DocumentInfoSet& parents = |
| 92 i->worker_document_set()->documents(); | 87 i->worker_document_set()->documents(); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 base::PLATFORM_FILE_TRUNCATE | | 185 base::PLATFORM_FILE_TRUNCATE | |
| 191 base::PLATFORM_FILE_WRITE_ATTRIBUTES); | 186 base::PLATFORM_FILE_WRITE_ATTRIBUTES); |
| 192 } | 187 } |
| 193 | 188 |
| 194 CreateMessageFilters(); | 189 CreateMessageFilters(); |
| 195 | 190 |
| 196 return true; | 191 return true; |
| 197 } | 192 } |
| 198 | 193 |
| 199 void WorkerProcessHost::CreateMessageFilters() { | 194 void WorkerProcessHost::CreateMessageFilters() { |
| 200 filters_.push_back(new AppCacheDispatcherHost(request_context_, id())); | 195 AddFilter(new AppCacheDispatcherHost(request_context_, id())); |
| 201 filters_.push_back(new FileSystemDispatcherHost(request_context_)); | 196 AddFilter(new FileSystemDispatcherHost(request_context_)); |
| 202 filters_.push_back(new FileUtilitiesMessageFilter(id())); | 197 AddFilter(new FileUtilitiesMessageFilter(id())); |
| 203 filters_.push_back( | 198 AddFilter( |
| 204 new BlobMessageFilter(id(), request_context_->blob_storage_context())); | 199 new BlobMessageFilter(id(), request_context_->blob_storage_context())); |
| 205 filters_.push_back(new MimeRegistryMessageFilter()); | 200 AddFilter(new MimeRegistryMessageFilter()); |
| 206 filters_.push_back(new DatabaseMessageFilter( | 201 AddFilter(new DatabaseMessageFilter( |
| 207 request_context_->database_tracker(), | 202 request_context_->database_tracker(), |
| 208 request_context_->host_content_settings_map())); | 203 request_context_->host_content_settings_map())); |
| 209 filters_.push_back(new SocketStreamDispatcherHost()); | 204 AddFilter(new SocketStreamDispatcherHost()); |
| 210 | |
| 211 for (size_t i = 0; i < filters_.size(); ++i) | |
| 212 filters_[i]->OnFilterAdded(channel()); | |
| 213 } | 205 } |
| 214 | 206 |
| 215 void WorkerProcessHost::CreateWorker(const WorkerInstance& instance) { | 207 void WorkerProcessHost::CreateWorker(const WorkerInstance& instance) { |
| 216 ChildProcessSecurityPolicy::GetInstance()->GrantRequestURL( | 208 ChildProcessSecurityPolicy::GetInstance()->GrantRequestURL( |
| 217 id(), instance.url()); | 209 id(), instance.url()); |
| 218 | 210 |
| 219 instances_.push_back(instance); | 211 instances_.push_back(instance); |
| 220 | 212 |
| 221 WorkerProcessMsg_CreateWorker_Params params; | 213 WorkerProcessMsg_CreateWorker_Params params; |
| 222 params.url = instance.url(); | 214 params.url = instance.url(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 246 if (!i->closed() && i->HasSender(sender, message.routing_id())) { | 238 if (!i->closed() && i->HasSender(sender, message.routing_id())) { |
| 247 RelayMessage( | 239 RelayMessage( |
| 248 message, this, i->worker_route_id(), next_route_id_callback_.get()); | 240 message, this, i->worker_route_id(), next_route_id_callback_.get()); |
| 249 return true; | 241 return true; |
| 250 } | 242 } |
| 251 } | 243 } |
| 252 | 244 |
| 253 return false; | 245 return false; |
| 254 } | 246 } |
| 255 | 247 |
| 256 URLRequestContext* WorkerProcessHost::GetRequestContext( | |
| 257 uint32 request_id, | |
| 258 const ViewHostMsg_Resource_Request& request_data) { | |
| 259 return request_context_; | |
| 260 } | |
| 261 | |
| 262 // Sent to notify the browser process when a worker context invokes close(), so | 248 // Sent to notify the browser process when a worker context invokes close(), so |
| 263 // no new connections are sent to shared workers. | 249 // no new connections are sent to shared workers. |
| 264 void WorkerProcessHost::OnWorkerContextClosed(int worker_route_id) { | 250 void WorkerProcessHost::OnWorkerContextClosed(int worker_route_id) { |
| 265 for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) { | 251 for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) { |
| 266 if (i->worker_route_id() == worker_route_id) { | 252 if (i->worker_route_id() == worker_route_id) { |
| 267 // Set the closed flag - this will stop any further messages from | 253 // Set the closed flag - this will stop any further messages from |
| 268 // being sent to the worker (messages can still be sent from the worker, | 254 // being sent to the worker (messages can still be sent from the worker, |
| 269 // for exception reporting, etc). | 255 // for exception reporting, etc). |
| 270 i->set_closed(true); | 256 i->set_closed(true); |
| 271 break; | 257 break; |
| 272 } | 258 } |
| 273 } | 259 } |
| 274 } | 260 } |
| 275 | 261 |
| 276 void WorkerProcessHost::OnMessageReceived(const IPC::Message& message) { | 262 void WorkerProcessHost::OnMessageReceived(const IPC::Message& message) { |
| 277 for (size_t i = 0; i < filters_.size(); ++i) { | |
| 278 if (filters_[i]->OnMessageReceived(message)) | |
| 279 return; | |
| 280 } | |
| 281 | |
| 282 bool msg_is_ok = true; | 263 bool msg_is_ok = true; |
| 283 bool handled = | 264 bool handled = |
| 284 MessagePortDispatcher::GetInstance()->OnMessageReceived( | 265 MessagePortDispatcher::GetInstance()->OnMessageReceived( |
| 285 message, this, next_route_id_callback_.get(), &msg_is_ok); | 266 message, this, next_route_id_callback_.get(), &msg_is_ok); |
| 286 | 267 |
| 287 if (!handled) { | 268 if (!handled) { |
| 288 handled = true; | 269 handled = true; |
| 289 IPC_BEGIN_MESSAGE_MAP_EX(WorkerProcessHost, message, msg_is_ok) | 270 IPC_BEGIN_MESSAGE_MAP_EX(WorkerProcessHost, message, msg_is_ok) |
| 290 IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWorker, OnCreateWorker) | 271 IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWorker, OnCreateWorker) |
| 291 IPC_MESSAGE_HANDLER(ViewHostMsg_LookupSharedWorker, OnLookupSharedWorker) | 272 IPC_MESSAGE_HANDLER(ViewHostMsg_LookupSharedWorker, OnLookupSharedWorker) |
| (...skipping 30 matching lines...) Expand all Loading... |
| 322 | 303 |
| 323 if (message.type() == WorkerHostMsg_WorkerContextDestroyed::ID) { | 304 if (message.type() == WorkerHostMsg_WorkerContextDestroyed::ID) { |
| 324 instances_.erase(i); | 305 instances_.erase(i); |
| 325 UpdateTitle(); | 306 UpdateTitle(); |
| 326 } | 307 } |
| 327 break; | 308 break; |
| 328 } | 309 } |
| 329 } | 310 } |
| 330 } | 311 } |
| 331 | 312 |
| 332 void WorkerProcessHost::OnChannelConnected(int32 peer_pid) { | |
| 333 for (size_t i = 0; i < filters_.size(); ++i) | |
| 334 filters_[i]->OnChannelConnected(peer_pid); | |
| 335 } | |
| 336 | |
| 337 void WorkerProcessHost::OnChannelError() { | |
| 338 for (size_t i = 0; i < filters_.size(); ++i) | |
| 339 filters_[i]->OnChannelError(); | |
| 340 } | |
| 341 | |
| 342 void WorkerProcessHost::OnProcessLaunched() { | 313 void WorkerProcessHost::OnProcessLaunched() { |
| 343 } | 314 } |
| 344 | 315 |
| 345 CallbackWithReturnValue<int>::Type* WorkerProcessHost::GetNextRouteIdCallback( | 316 CallbackWithReturnValue<int>::Type* WorkerProcessHost::GetNextRouteIdCallback( |
| 346 IPC::Message::Sender* sender) { | 317 IPC::Message::Sender* sender) { |
| 347 // We don't keep callbacks for senders associated with workers, so figure out | 318 // We don't keep callbacks for senders associated with workers, so figure out |
| 348 // what kind of sender this is, and cast it to the correct class to get the | 319 // what kind of sender this is, and cast it to the correct class to get the |
| 349 // callback. | 320 // callback. |
| 350 for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS); | 321 for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS); |
| 351 !iter.Done(); ++iter) { | 322 !iter.Done(); ++iter) { |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 } | 661 } |
| 691 } | 662 } |
| 692 return false; | 663 return false; |
| 693 } | 664 } |
| 694 | 665 |
| 695 WorkerProcessHost::WorkerInstance::SenderInfo | 666 WorkerProcessHost::WorkerInstance::SenderInfo |
| 696 WorkerProcessHost::WorkerInstance::GetSender() const { | 667 WorkerProcessHost::WorkerInstance::GetSender() const { |
| 697 DCHECK(NumSenders() == 1); | 668 DCHECK(NumSenders() == 1); |
| 698 return *senders_.begin(); | 669 return *senders_.begin(); |
| 699 } | 670 } |
| OLD | NEW |