Chromium Code Reviews| 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)); |
| } |