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 |