Chromium Code Reviews| Index: content/browser/service_worker/service_worker_provider_host.cc |
| diff --git a/content/browser/service_worker/service_worker_provider_host.cc b/content/browser/service_worker/service_worker_provider_host.cc |
| index 0e83e84ce0cf87791c8e326e9e45a13914a4236c..a75e360af9083b9df8818295442ae58da965d8e0 100644 |
| --- a/content/browser/service_worker/service_worker_provider_host.cc |
| +++ b/content/browser/service_worker/service_worker_provider_host.cc |
| @@ -6,6 +6,7 @@ |
| #include <utility> |
| +#include "base/feature_list.h" |
| #include "base/guid.h" |
| #include "base/memory/ptr_util.h" |
| #include "base/stl_util.h" |
| @@ -26,7 +27,9 @@ |
| #include "content/public/common/browser_side_navigation_policy.h" |
| #include "content/public/common/child_process_host.h" |
| #include "content/public/common/content_client.h" |
| +#include "content/public/common/content_features.h" |
| #include "content/public/common/origin_util.h" |
| +#include "mojo/public/cpp/bindings/strong_associated_binding.h" |
| #include "net/base/url_util.h" |
| namespace content { |
| @@ -109,6 +112,31 @@ std::unique_ptr<ServiceWorkerProviderHost> ServiceWorkerProviderHost::Create( |
| info.is_parent_frame_secure, context, dispatcher_host)); |
| } |
| +void ServiceWorkerProviderHost::BindWorkerFetchContext( |
| + mojom::ServiceWorkerWorkerClientAssociatedPtrInfo client_ptr_info) { |
| + DCHECK(base::FeatureList::IsEnabled(features::kOffMainThreadFetch)); |
| + mojom::ServiceWorkerWorkerClientAssociatedPtr client; |
| + client.Bind(std::move(client_ptr_info)); |
| + client.set_connection_error_handler( |
| + base::Bind(&ServiceWorkerProviderHost::UnregisterWorkerFetchContext, |
| + base::Unretained(this), client.get())); |
| + |
| + if (controlling_version_) |
| + client->SetControllerServiceWorker(controlling_version_->version_id()); |
| + |
| + auto result = worker_clients_.insert( |
| + std::make_pair<mojom::ServiceWorkerWorkerClient*, |
| + mojom::ServiceWorkerWorkerClientAssociatedPtr>( |
| + client.get(), std::move(client))); |
| + DCHECK(result.second); |
| +} |
| + |
| +void ServiceWorkerProviderHost::UnregisterWorkerFetchContext( |
| + mojom::ServiceWorkerWorkerClient* client) { |
| + DCHECK(worker_clients_.count(client)); |
| + worker_clients_.erase(client); |
| +} |
| + |
| ServiceWorkerProviderHost::ServiceWorkerProviderHost( |
| int render_process_id, |
| int route_id, |
| @@ -244,8 +272,12 @@ void ServiceWorkerProviderHost::SetControllerVersionAttribute( |
| scoped_refptr<ServiceWorkerVersion> previous_version = controlling_version_; |
| controlling_version_ = version; |
| - if (version) |
| + if (version) { |
| version->AddControllee(this); |
| + for (auto it = worker_clients_.begin(); it != worker_clients_.end(); it++) { |
|
yhirano
2017/04/21 09:18:41
optional:
for (const auto& pair : worker_clients_
horo
2017/04/21 09:42:32
Done.
|
| + it->second->SetControllerServiceWorker(version->version_id()); |
| + } |
| + } |
| if (previous_version.get()) |
| previous_version->RemoveControllee(this); |