Index: content/browser/service_worker/service_worker_dispatcher_host.cc |
diff --git a/content/browser/service_worker/service_worker_dispatcher_host.cc b/content/browser/service_worker/service_worker_dispatcher_host.cc |
index eb65e4e2be475a2b65c4a3f6dc2020cd8ad7bd13..f09b25ba6ffe8d86ed13db234fe4fd5ad5a0fa73 100644 |
--- a/content/browser/service_worker/service_worker_dispatcher_host.cc |
+++ b/content/browser/service_worker/service_worker_dispatcher_host.cc |
@@ -727,10 +727,26 @@ void ServiceWorkerDispatcherHost::OnProviderCreated( |
bad_message::SWDH_PROVIDER_CREATED_NO_HOST); |
return; |
} |
- scoped_ptr<ServiceWorkerProviderHost> provider_host( |
- new ServiceWorkerProviderHost(render_process_id_, route_id, provider_id, |
- provider_type, GetContext()->AsWeakPtr(), |
- this)); |
+ |
+ scoped_ptr<ServiceWorkerProviderHost> provider_host; |
+ if (ServiceWorkerUtils::IsBrowserAssignedProviderId(provider_id)) { |
+ // PlzNavigate |
+ // Retrieve the provider host previously created for navigation requests. |
+ provider_host = GetContext()->TakeNavigationProviderHost(provider_id); |
+ if (provider_host == nullptr) { |
+ bad_message::ReceivedBadMessage( |
+ this, bad_message::SWDH_PROVIDER_CREATED_NO_HOST); |
+ return; |
+ } |
+ DCHECK_EQ(SERVICE_WORKER_PROVIDER_FOR_WINDOW, provider_type); |
+ provider_host->CompleteNavigationInitialized(render_process_id_, route_id, |
+ this); |
+ } else { |
+ provider_host = |
+ scoped_ptr<ServiceWorkerProviderHost>(new ServiceWorkerProviderHost( |
+ render_process_id_, route_id, provider_id, provider_type, |
+ GetContext()->AsWeakPtr(), this)); |
+ } |
GetContext()->AddProviderHost(provider_host.Pass()); |
} |