| 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" | 
| 11 #include "base/command_line.h" | 11 #include "base/command_line.h" | 
| 12 #include "base/message_loop.h" | 12 #include "base/message_loop.h" | 
| 13 #include "base/string_util.h" | 13 #include "base/string_util.h" | 
| 14 #include "base/utf_string_conversions.h" | 14 #include "base/utf_string_conversions.h" | 
| 15 #include "chrome/browser/metrics/user_metrics.h" | 15 #include "chrome/browser/metrics/user_metrics.h" | 
| 16 #include "content/common/content_switches.h" | 16 #include "content/common/content_switches.h" | 
| 17 #include "content/browser/appcache/appcache_dispatcher_host.h" | 17 #include "content/browser/appcache/appcache_dispatcher_host.h" | 
| 18 #include "content/browser/browser_thread.h" | 18 #include "content/browser/browser_thread.h" | 
| 19 #include "content/browser/child_process_security_policy.h" | 19 #include "content/browser/child_process_security_policy.h" | 
| 20 #include "content/browser/file_system/file_system_dispatcher_host.h" | 20 #include "content/browser/file_system/file_system_dispatcher_host.h" | 
| 21 #include "content/browser/mime_registry_message_filter.h" | 21 #include "content/browser/mime_registry_message_filter.h" | 
| 22 #include "content/browser/renderer_host/blob_message_filter.h" | 22 #include "content/browser/renderer_host/blob_message_filter.h" | 
| 23 #include "content/browser/renderer_host/database_message_filter.h" | 23 #include "content/browser/renderer_host/database_message_filter.h" | 
| 24 #include "content/browser/renderer_host/file_utilities_message_filter.h" | 24 #include "content/browser/renderer_host/file_utilities_message_filter.h" | 
| 25 #include "content/browser/renderer_host/render_view_host.h" | 25 #include "content/browser/renderer_host/render_view_host.h" | 
| 26 #include "content/browser/renderer_host/render_view_host_delegate.h" | 26 #include "content/browser/renderer_host/render_view_host_delegate.h" | 
| 27 #include "content/browser/renderer_host/render_view_host_notification_task.h" | 27 #include "content/browser/renderer_host/render_view_host_notification_task.h" | 
| 28 #include "content/browser/renderer_host/socket_stream_dispatcher_host.h" | 28 #include "content/browser/renderer_host/socket_stream_dispatcher_host.h" | 
|  | 29 #include "content/browser/resource_context.h" | 
| 29 #include "content/browser/worker_host/message_port_service.h" | 30 #include "content/browser/worker_host/message_port_service.h" | 
| 30 #include "content/browser/worker_host/worker_message_filter.h" | 31 #include "content/browser/worker_host/worker_message_filter.h" | 
| 31 #include "content/browser/worker_host/worker_service.h" | 32 #include "content/browser/worker_host/worker_service.h" | 
| 32 #include "content/common/debug_flags.h" | 33 #include "content/common/debug_flags.h" | 
| 33 #include "content/common/result_codes.h" | 34 #include "content/common/result_codes.h" | 
| 34 #include "content/common/view_messages.h" | 35 #include "content/common/view_messages.h" | 
| 35 #include "content/common/worker_messages.h" | 36 #include "content/common/worker_messages.h" | 
| 36 #include "net/base/mime_util.h" | 37 #include "net/base/mime_util.h" | 
| 37 #include "ipc/ipc_switches.h" | 38 #include "ipc/ipc_switches.h" | 
| 38 #include "net/base/registry_controlled_domain.h" | 39 #include "net/base/registry_controlled_domain.h" | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 77     if (host) | 78     if (host) | 
| 78       host->delegate()->WorkerCrashed(); | 79       host->delegate()->WorkerCrashed(); | 
| 79   } | 80   } | 
| 80 | 81 | 
| 81  private: | 82  private: | 
| 82   int render_process_unique_id_; | 83   int render_process_unique_id_; | 
| 83   int render_view_id_; | 84   int render_view_id_; | 
| 84 }; | 85 }; | 
| 85 | 86 | 
| 86 WorkerProcessHost::WorkerProcessHost( | 87 WorkerProcessHost::WorkerProcessHost( | 
| 87     ResourceDispatcherHost* resource_dispatcher_host, | 88     net::URLRequestContextGetter* request_context_getter, | 
| 88     net::URLRequestContextGetter* request_context) | 89     const content::ResourceContext& resource_context) | 
| 89     : BrowserChildProcessHost(WORKER_PROCESS, resource_dispatcher_host), | 90     : BrowserChildProcessHost(WORKER_PROCESS), | 
| 90       request_context_(request_context) { | 91       request_context_getter_(request_context_getter), | 
|  | 92       resource_context_(&resource_context) { | 
|  | 93   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
|  | 94   DCHECK(request_context_getter); | 
| 91 } | 95 } | 
| 92 | 96 | 
| 93 WorkerProcessHost::~WorkerProcessHost() { | 97 WorkerProcessHost::~WorkerProcessHost() { | 
| 94   // If we crashed, tell the RenderViewHosts. | 98   // If we crashed, tell the RenderViewHosts. | 
| 95   for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) { | 99   for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) { | 
| 96     const WorkerDocumentSet::DocumentInfoSet& parents = | 100     const WorkerDocumentSet::DocumentInfoSet& parents = | 
| 97         i->worker_document_set()->documents(); | 101         i->worker_document_set()->documents(); | 
| 98     for (WorkerDocumentSet::DocumentInfoSet::const_iterator parent_iter = | 102     for (WorkerDocumentSet::DocumentInfoSet::const_iterator parent_iter = | 
| 99              parents.begin(); parent_iter != parents.end(); ++parent_iter) { | 103              parents.begin(); parent_iter != parents.end(); ++parent_iter) { | 
| 100       BrowserThread::PostTask( | 104       BrowserThread::PostTask( | 
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 194           base::PLATFORM_FILE_TRUNCATE | | 198           base::PLATFORM_FILE_TRUNCATE | | 
| 195           base::PLATFORM_FILE_WRITE_ATTRIBUTES); | 199           base::PLATFORM_FILE_WRITE_ATTRIBUTES); | 
| 196   } | 200   } | 
| 197 | 201 | 
| 198   CreateMessageFilters(render_process_id); | 202   CreateMessageFilters(render_process_id); | 
| 199 | 203 | 
| 200   return true; | 204   return true; | 
| 201 } | 205 } | 
| 202 | 206 | 
| 203 void WorkerProcessHost::CreateMessageFilters(int render_process_id) { | 207 void WorkerProcessHost::CreateMessageFilters(int render_process_id) { | 
|  | 208   DCHECK(resource_context_); | 
| 204   ChromeURLRequestContext* chrome_url_context = GetChromeURLRequestContext(); | 209   ChromeURLRequestContext* chrome_url_context = GetChromeURLRequestContext(); | 
| 205 | 210 | 
| 206   worker_message_filter_= new WorkerMessageFilter( | 211   worker_message_filter_ = new WorkerMessageFilter( | 
| 207       render_process_id, | 212       render_process_id, | 
| 208       request_context_, | 213       request_context_getter_, | 
|  | 214       *resource_context_, | 
| 209       resource_dispatcher_host(), | 215       resource_dispatcher_host(), | 
| 210       NewCallbackWithReturnValue( | 216       NewCallbackWithReturnValue( | 
| 211           WorkerService::GetInstance(), &WorkerService::next_worker_route_id)); | 217           WorkerService::GetInstance(), &WorkerService::next_worker_route_id)); | 
| 212   AddFilter(worker_message_filter_); | 218   AddFilter(worker_message_filter_); | 
| 213   AddFilter(new AppCacheDispatcherHost(chrome_url_context, id())); | 219   AddFilter(new AppCacheDispatcherHost(chrome_url_context, id())); | 
| 214   AddFilter(new FileSystemDispatcherHost(chrome_url_context)); | 220   AddFilter(new FileSystemDispatcherHost(chrome_url_context)); | 
| 215   AddFilter(new FileUtilitiesMessageFilter(id())); | 221   AddFilter(new FileUtilitiesMessageFilter(id())); | 
| 216   AddFilter( | 222   AddFilter( | 
| 217       new BlobMessageFilter(id(), chrome_url_context->blob_storage_context())); | 223       new BlobMessageFilter(id(), chrome_url_context->blob_storage_context())); | 
| 218   AddFilter(new MimeRegistryMessageFilter()); | 224   AddFilter(new MimeRegistryMessageFilter()); | 
| 219   AddFilter(new DatabaseMessageFilter( | 225   AddFilter(new DatabaseMessageFilter( | 
| 220       chrome_url_context->database_tracker(), | 226       resource_context_->database_tracker(), | 
| 221       chrome_url_context->host_content_settings_map())); | 227       chrome_url_context->host_content_settings_map())); | 
| 222 | 228 | 
| 223   SocketStreamDispatcherHost* socket_stream_dispatcher_host = | 229   SocketStreamDispatcherHost* socket_stream_dispatcher_host = | 
| 224       new SocketStreamDispatcherHost(); | 230       new SocketStreamDispatcherHost(); | 
| 225   socket_stream_dispatcher_host->set_url_request_context_override( | 231   socket_stream_dispatcher_host->set_url_request_context_override( | 
| 226       new URLRequestContextOverride(chrome_url_context)); | 232       new URLRequestContextOverride(chrome_url_context)); | 
| 227   AddFilter(socket_stream_dispatcher_host); | 233   AddFilter(socket_stream_dispatcher_host); | 
| 228 } | 234 } | 
| 229 | 235 | 
| 230 void WorkerProcessHost::CreateWorker(const WorkerInstance& instance) { | 236 void WorkerProcessHost::CreateWorker(const WorkerInstance& instance) { | 
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 466     if (!display_title.empty()) | 472     if (!display_title.empty()) | 
| 467       display_title += ", "; | 473       display_title += ", "; | 
| 468     display_title += *i; | 474     display_title += *i; | 
| 469   } | 475   } | 
| 470 | 476 | 
| 471   set_name(ASCIIToWide(display_title)); | 477   set_name(ASCIIToWide(display_title)); | 
| 472 } | 478 } | 
| 473 | 479 | 
| 474 ChromeURLRequestContext* WorkerProcessHost::GetChromeURLRequestContext() { | 480 ChromeURLRequestContext* WorkerProcessHost::GetChromeURLRequestContext() { | 
| 475   return static_cast<ChromeURLRequestContext*>( | 481   return static_cast<ChromeURLRequestContext*>( | 
| 476       request_context_->GetURLRequestContext()); | 482       request_context_getter_->GetURLRequestContext()); | 
| 477 } | 483 } | 
| 478 | 484 | 
| 479 void WorkerProcessHost::DocumentDetached(WorkerMessageFilter* filter, | 485 void WorkerProcessHost::DocumentDetached(WorkerMessageFilter* filter, | 
| 480                                          unsigned long long document_id) { | 486                                          unsigned long long document_id) { | 
| 481   // Walk all instances and remove the document from their document set. | 487   // Walk all instances and remove the document from their document set. | 
| 482   for (Instances::iterator i = instances_.begin(); i != instances_.end();) { | 488   for (Instances::iterator i = instances_.begin(); i != instances_.end();) { | 
| 483     if (!i->shared()) { | 489     if (!i->shared()) { | 
| 484       ++i; | 490       ++i; | 
| 485     } else { | 491     } else { | 
| 486       i->worker_document_set()->Remove(filter, document_id); | 492       i->worker_document_set()->Remove(filter, document_id); | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 497 | 503 | 
| 498 WorkerProcessHost::WorkerInstance::WorkerInstance( | 504 WorkerProcessHost::WorkerInstance::WorkerInstance( | 
| 499     const GURL& url, | 505     const GURL& url, | 
| 500     bool shared, | 506     bool shared, | 
| 501     bool incognito, | 507     bool incognito, | 
| 502     const string16& name, | 508     const string16& name, | 
| 503     int worker_route_id, | 509     int worker_route_id, | 
| 504     int parent_process_id, | 510     int parent_process_id, | 
| 505     int parent_appcache_host_id, | 511     int parent_appcache_host_id, | 
| 506     int64 main_resource_appcache_id, | 512     int64 main_resource_appcache_id, | 
| 507     net::URLRequestContextGetter* request_context) | 513     net::URLRequestContextGetter* request_context_getter, | 
|  | 514     const content::ResourceContext& resource_context) | 
| 508     : url_(url), | 515     : url_(url), | 
| 509       shared_(shared), | 516       shared_(shared), | 
| 510       incognito_(incognito), | 517       incognito_(incognito), | 
| 511       closed_(false), | 518       closed_(false), | 
| 512       name_(name), | 519       name_(name), | 
| 513       worker_route_id_(worker_route_id), | 520       worker_route_id_(worker_route_id), | 
| 514       parent_process_id_(parent_process_id), | 521       parent_process_id_(parent_process_id), | 
| 515       parent_appcache_host_id_(parent_appcache_host_id), | 522       parent_appcache_host_id_(parent_appcache_host_id), | 
| 516       main_resource_appcache_id_(main_resource_appcache_id), | 523       main_resource_appcache_id_(main_resource_appcache_id), | 
| 517       request_context_(request_context), | 524       request_context_getter_(request_context_getter), | 
| 518       worker_document_set_(new WorkerDocumentSet()) { | 525       worker_document_set_(new WorkerDocumentSet()), | 
|  | 526       resource_context_(&resource_context) { | 
|  | 527   DCHECK(request_context_getter_); | 
|  | 528   DCHECK(resource_context_); | 
|  | 529 } | 
|  | 530 | 
|  | 531 WorkerProcessHost::WorkerInstance::WorkerInstance( | 
|  | 532     const GURL& url, | 
|  | 533     bool shared, | 
|  | 534     bool incognito, | 
|  | 535     const string16& name) | 
|  | 536     : url_(url), | 
|  | 537       shared_(shared), | 
|  | 538       incognito_(incognito), | 
|  | 539       closed_(false), | 
|  | 540       name_(name), | 
|  | 541       worker_route_id_(MSG_ROUTING_NONE), | 
|  | 542       parent_process_id_(0), | 
|  | 543       parent_appcache_host_id_(0), | 
|  | 544       main_resource_appcache_id_(0), | 
|  | 545       request_context_getter_(NULL), | 
|  | 546       worker_document_set_(new WorkerDocumentSet()), | 
|  | 547       resource_context_(NULL) { | 
| 519 } | 548 } | 
| 520 | 549 | 
| 521 WorkerProcessHost::WorkerInstance::~WorkerInstance() { | 550 WorkerProcessHost::WorkerInstance::~WorkerInstance() { | 
| 522 } | 551 } | 
| 523 | 552 | 
| 524 // Compares an instance based on the algorithm in the WebWorkers spec - an | 553 // Compares an instance based on the algorithm in the WebWorkers spec - an | 
| 525 // instance matches if the origins of the URLs match, and: | 554 // instance matches if the origins of the URLs match, and: | 
| 526 // a) the names are non-empty and equal | 555 // a) the names are non-empty and equal | 
| 527 // -or- | 556 // -or- | 
| 528 // b) the names are both empty, and the urls are equal | 557 // b) the names are both empty, and the urls are equal | 
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 601     } | 630     } | 
| 602   } | 631   } | 
| 603   return false; | 632   return false; | 
| 604 } | 633 } | 
| 605 | 634 | 
| 606 WorkerProcessHost::WorkerInstance::FilterInfo | 635 WorkerProcessHost::WorkerInstance::FilterInfo | 
| 607 WorkerProcessHost::WorkerInstance::GetFilter() const { | 636 WorkerProcessHost::WorkerInstance::GetFilter() const { | 
| 608   DCHECK(NumFilters() == 1); | 637   DCHECK(NumFilters() == 1); | 
| 609   return *filters_.begin(); | 638   return *filters_.begin(); | 
| 610 } | 639 } | 
| OLD | NEW | 
|---|