Index: content/browser/service_worker/service_worker_context_core.cc |
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc |
index 55d93d46e84a4443032afb878b5ebf51234c05c7..4fbaf45c1c246fbdb4562cce33fa91f946f7863a 100644 |
--- a/content/browser/service_worker/service_worker_context_core.cc |
+++ b/content/browser/service_worker/service_worker_context_core.cc |
@@ -24,6 +24,7 @@ |
#include "content/browser/service_worker/service_worker_context_observer.h" |
#include "content/browser/service_worker/service_worker_context_wrapper.h" |
#include "content/browser/service_worker/service_worker_database_task_manager.h" |
+#include "content/browser/service_worker/service_worker_dispatcher_host.h" |
#include "content/browser/service_worker/service_worker_info.h" |
#include "content/browser/service_worker/service_worker_job_coordinator.h" |
#include "content/browser/service_worker/service_worker_process_manager.h" |
@@ -220,8 +221,9 @@ ServiceWorkerContextCore::ServiceWorkerContextCore( |
base::ObserverListThreadSafe<ServiceWorkerContextObserver>* observer_list, |
ServiceWorkerContextWrapper* wrapper) |
: wrapper_(wrapper), |
- providers_(new ProcessToProviderMap), |
- provider_by_uuid_(new ProviderByClientUUIDMap), |
+ dispatcher_hosts_(base::MakeUnique<DispatcherHostMap>()), |
+ providers_(base::MakeUnique<ProcessToProviderMap>()), |
+ provider_by_uuid_(base::MakeUnique<ProviderByClientUUIDMap>()), |
force_update_on_page_load_(false), |
next_handle_id_(0), |
next_registration_handle_id_(0), |
@@ -241,6 +243,7 @@ ServiceWorkerContextCore::ServiceWorkerContextCore( |
ServiceWorkerContextCore* old_context, |
ServiceWorkerContextWrapper* wrapper) |
: wrapper_(wrapper), |
+ dispatcher_hosts_(old_context->dispatcher_hosts_.release()), |
providers_(old_context->providers_.release()), |
provider_by_uuid_(old_context->provider_by_uuid_.release()), |
next_handle_id_(old_context->next_handle_id_), |
@@ -268,12 +271,21 @@ ServiceWorkerContextCore::~ServiceWorkerContextCore() { |
weak_factory_.InvalidateWeakPtrs(); |
} |
-ServiceWorkerProviderHost* ServiceWorkerContextCore::GetProviderHost( |
- int process_id, int provider_id) { |
- ProviderMap* map = GetProviderMapForProcess(process_id); |
- if (!map) |
- return NULL; |
- return map->Lookup(provider_id); |
+void ServiceWorkerContextCore::AddDispatcherHost( |
+ int process_id, |
+ content::ServiceWorkerDispatcherHost* dispatcher_host) { |
+ DCHECK(!dispatcher_hosts_->Lookup(process_id)); |
+ dispatcher_hosts_->AddWithID(dispatcher_host, process_id); |
+ embedded_worker_registry()->AddChildProcessSender( |
+ process_id, dispatcher_host, |
+ dispatcher_host->message_port_message_filter()); |
falken
2017/01/26 05:15:42
Why does ServiceWorkerContextCore need dispatcher_
shimazu
2017/01/26 09:27:22
It's because I'm planning to use SWDispatcherHost
|
+} |
+ |
+void ServiceWorkerContextCore::RemoveDispatcherHost(int process_id) { |
+ DCHECK(dispatcher_hosts_->Lookup(process_id)); |
+ RemoveAllProviderHostsForProcess(process_id); |
+ embedded_worker_registry_->RemoveChildProcessSender(process_id); |
+ dispatcher_hosts_->Remove(process_id); |
} |
void ServiceWorkerContextCore::AddProviderHost( |
@@ -288,6 +300,25 @@ void ServiceWorkerContextCore::AddProviderHost( |
map->AddWithID(std::move(host), provider_id); |
} |
+void ServiceWorkerContextCore::AddProviderHost( |
+ int process_id, |
+ content::ServiceWorkerProviderHostInfo provider_host_info) { |
+ ServiceWorkerDispatcherHost* dispatcher_host = |
+ dispatcher_hosts_->Lookup(process_id); |
+ DCHECK(dispatcher_host); |
+ AddProviderHost(ServiceWorkerProviderHost::Create( |
+ process_id, std::move(provider_host_info), AsWeakPtr(), dispatcher_host)); |
+} |
+ |
+ServiceWorkerProviderHost* ServiceWorkerContextCore::GetProviderHost( |
+ int process_id, |
+ int provider_id) { |
+ ProviderMap* map = GetProviderMapForProcess(process_id); |
+ if (!map) |
+ return NULL; |
+ return map->Lookup(provider_id); |
+} |
+ |
void ServiceWorkerContextCore::RemoveProviderHost( |
int process_id, int provider_id) { |
ProviderMap* map = GetProviderMapForProcess(process_id); |
@@ -636,14 +667,7 @@ ServiceWorkerContextCore::TransferProviderHostOut(int process_id, |
ProviderMap* map = GetProviderMapForProcess(process_id); |
ServiceWorkerProviderHost* transferee = map->Lookup(provider_id); |
std::unique_ptr<ServiceWorkerProviderHost> replacement = |
- base::MakeUnique<ServiceWorkerProviderHost>( |
- process_id, transferee->frame_id(), provider_id, |
- transferee->provider_type(), |
- transferee->is_parent_frame_secure() |
- ? ServiceWorkerProviderHost::FrameSecurityLevel::SECURE |
- : ServiceWorkerProviderHost::FrameSecurityLevel::INSECURE, |
- AsWeakPtr(), transferee->dispatcher_host()); |
- transferee->PrepareForCrossSiteTransfer(); |
+ transferee->PrepareForCrossSiteTransfer(); |
return map->Replace(provider_id, std::move(replacement)); |
} |