OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "content/browser/worker_host/worker_process_host.h" | 5 #include "content/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 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 base::PLATFORM_FILE_CREATE_ALWAYS | | 194 base::PLATFORM_FILE_CREATE_ALWAYS | |
195 base::PLATFORM_FILE_READ | | 195 base::PLATFORM_FILE_READ | |
196 base::PLATFORM_FILE_WRITE | | 196 base::PLATFORM_FILE_WRITE | |
197 base::PLATFORM_FILE_EXCLUSIVE_READ | | 197 base::PLATFORM_FILE_EXCLUSIVE_READ | |
198 base::PLATFORM_FILE_EXCLUSIVE_WRITE | | 198 base::PLATFORM_FILE_EXCLUSIVE_WRITE | |
199 base::PLATFORM_FILE_ASYNC | | 199 base::PLATFORM_FILE_ASYNC | |
200 base::PLATFORM_FILE_TRUNCATE | | 200 base::PLATFORM_FILE_TRUNCATE | |
201 base::PLATFORM_FILE_WRITE_ATTRIBUTES); | 201 base::PLATFORM_FILE_WRITE_ATTRIBUTES); |
202 } | 202 } |
203 | 203 |
| 204 // Call the embedder first so that their IPC filters have priority. |
| 205 content::GetContentClient()->browser()->WorkerProcessHostCreated(this); |
204 CreateMessageFilters(render_process_id); | 206 CreateMessageFilters(render_process_id); |
205 | 207 |
206 content::GetContentClient()->browser()->WorkerProcessHostCreated(this); | |
207 | |
208 return true; | 208 return true; |
209 } | 209 } |
210 | 210 |
211 void WorkerProcessHost::CreateMessageFilters(int render_process_id) { | 211 void WorkerProcessHost::CreateMessageFilters(int render_process_id) { |
212 DCHECK(resource_context_); | 212 DCHECK(resource_context_); |
213 net::URLRequestContext* request_context = | 213 net::URLRequestContext* request_context = |
214 resource_context_->request_context(); | 214 resource_context_->request_context(); |
215 | 215 |
216 ResourceMessageFilter* resource_message_filter = new ResourceMessageFilter( | 216 ResourceMessageFilter* resource_message_filter = new ResourceMessageFilter( |
217 id(), WORKER_PROCESS, resource_context_, | 217 id(), WORKER_PROCESS, resource_context_, |
218 new URLRequestContextSelector(request_context), | 218 new URLRequestContextSelector(request_context), |
219 resource_dispatcher_host_); | 219 resource_dispatcher_host_); |
220 AddFilter(resource_message_filter); | 220 AddFilter(resource_message_filter); |
221 | 221 |
222 worker_message_filter_ = new WorkerMessageFilter( | 222 worker_message_filter_ = new WorkerMessageFilter( |
223 render_process_id, | 223 render_process_id, |
224 resource_context_, | 224 resource_context_, |
225 resource_dispatcher_host_, | 225 resource_dispatcher_host_, |
226 NewCallbackWithReturnValue( | 226 NewCallbackWithReturnValue( |
227 WorkerService::GetInstance(), &WorkerService::next_worker_route_id)); | 227 WorkerService::GetInstance(), &WorkerService::next_worker_route_id)); |
228 AddFilter(worker_message_filter_); | 228 AddFilter(worker_message_filter_); |
229 AddFilter(new AppCacheDispatcherHost(resource_context_, id())); | 229 AddFilter(new AppCacheDispatcherHost(resource_context_, id())); |
230 AddFilter(new FileSystemDispatcherHost( | 230 AddFilter(new FileSystemDispatcherHost( |
231 request_context, | 231 request_context, resource_context_->file_system_context())); |
232 resource_context_->host_content_settings_map(), | |
233 resource_context_->file_system_context())); | |
234 AddFilter(new FileUtilitiesMessageFilter(id())); | 232 AddFilter(new FileUtilitiesMessageFilter(id())); |
235 AddFilter( | 233 AddFilter( |
236 new BlobMessageFilter(id(), resource_context_->blob_storage_context())); | 234 new BlobMessageFilter(id(), resource_context_->blob_storage_context())); |
237 AddFilter(new MimeRegistryMessageFilter()); | 235 AddFilter(new MimeRegistryMessageFilter()); |
238 AddFilter(new DatabaseMessageFilter( | 236 AddFilter(new DatabaseMessageFilter( |
239 resource_context_->database_tracker())); | 237 resource_context_->database_tracker())); |
240 | 238 |
241 SocketStreamDispatcherHost* socket_stream_dispatcher_host = | 239 SocketStreamDispatcherHost* socket_stream_dispatcher_host = |
242 new SocketStreamDispatcherHost( | 240 new SocketStreamDispatcherHost( |
243 new URLRequestContextSelector(request_context)); | 241 new URLRequestContextSelector(request_context)); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 | 284 |
287 void WorkerProcessHost::OnProcessLaunched() { | 285 void WorkerProcessHost::OnProcessLaunched() { |
288 } | 286 } |
289 | 287 |
290 bool WorkerProcessHost::OnMessageReceived(const IPC::Message& message) { | 288 bool WorkerProcessHost::OnMessageReceived(const IPC::Message& message) { |
291 bool msg_is_ok = true; | 289 bool msg_is_ok = true; |
292 bool handled = true; | 290 bool handled = true; |
293 IPC_BEGIN_MESSAGE_MAP_EX(WorkerProcessHost, message, msg_is_ok) | 291 IPC_BEGIN_MESSAGE_MAP_EX(WorkerProcessHost, message, msg_is_ok) |
294 IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerContextClosed, | 292 IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerContextClosed, |
295 OnWorkerContextClosed) | 293 OnWorkerContextClosed) |
| 294 IPC_MESSAGE_HANDLER(WorkerProcessHostMsg_AllowDatabase, OnAllowDatabase) |
| 295 IPC_MESSAGE_HANDLER(WorkerProcessHostMsg_AllowFileSystem, OnAllowFileSystem) |
296 IPC_MESSAGE_UNHANDLED(handled = false) | 296 IPC_MESSAGE_UNHANDLED(handled = false) |
297 IPC_END_MESSAGE_MAP_EX() | 297 IPC_END_MESSAGE_MAP_EX() |
298 | 298 |
299 if (!msg_is_ok) { | 299 if (!msg_is_ok) { |
300 NOTREACHED(); | 300 NOTREACHED(); |
301 UserMetrics::RecordAction(UserMetricsAction("BadMessageTerminate_WPH")); | 301 UserMetrics::RecordAction(UserMetricsAction("BadMessageTerminate_WPH")); |
302 base::KillProcess(handle(), ResultCodes::KILLED_BAD_MESSAGE, false); | 302 base::KillProcess(handle(), ResultCodes::KILLED_BAD_MESSAGE, false); |
303 } | 303 } |
304 | 304 |
305 if (handled) | 305 if (handled) |
(...skipping 25 matching lines...) Expand all Loading... |
331 if (i->worker_route_id() == worker_route_id) { | 331 if (i->worker_route_id() == worker_route_id) { |
332 // Set the closed flag - this will stop any further messages from | 332 // Set the closed flag - this will stop any further messages from |
333 // being sent to the worker (messages can still be sent from the worker, | 333 // being sent to the worker (messages can still be sent from the worker, |
334 // for exception reporting, etc). | 334 // for exception reporting, etc). |
335 i->set_closed(true); | 335 i->set_closed(true); |
336 break; | 336 break; |
337 } | 337 } |
338 } | 338 } |
339 } | 339 } |
340 | 340 |
| 341 void WorkerProcessHost::OnAllowDatabase(int worker_route_id, |
| 342 const GURL& url, |
| 343 const string16& name, |
| 344 const string16& display_name, |
| 345 unsigned long estimated_size, |
| 346 bool* result) { |
| 347 *result = true; |
| 348 } |
| 349 |
| 350 void WorkerProcessHost::OnAllowFileSystem(int worker_route_id, |
| 351 const GURL& url, |
| 352 bool* result) { |
| 353 *result = true; |
| 354 } |
| 355 |
341 void WorkerProcessHost::RelayMessage( | 356 void WorkerProcessHost::RelayMessage( |
342 const IPC::Message& message, | 357 const IPC::Message& message, |
343 WorkerMessageFilter* filter, | 358 WorkerMessageFilter* filter, |
344 int route_id) { | 359 int route_id) { |
345 if (message.type() == WorkerMsg_PostMessage::ID) { | 360 if (message.type() == WorkerMsg_PostMessage::ID) { |
346 // We want to send the receiver a routing id for the new channel, so | 361 // We want to send the receiver a routing id for the new channel, so |
347 // crack the message first. | 362 // crack the message first. |
348 string16 msg; | 363 string16 msg; |
349 std::vector<int> sent_message_port_ids; | 364 std::vector<int> sent_message_port_ids; |
350 std::vector<int> new_routing_ids; | 365 std::vector<int> new_routing_ids; |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
601 } | 616 } |
602 } | 617 } |
603 return false; | 618 return false; |
604 } | 619 } |
605 | 620 |
606 WorkerProcessHost::WorkerInstance::FilterInfo | 621 WorkerProcessHost::WorkerInstance::FilterInfo |
607 WorkerProcessHost::WorkerInstance::GetFilter() const { | 622 WorkerProcessHost::WorkerInstance::GetFilter() const { |
608 DCHECK(NumFilters() == 1); | 623 DCHECK(NumFilters() == 1); |
609 return *filters_.begin(); | 624 return *filters_.begin(); |
610 } | 625 } |
OLD | NEW |