| Index: content/browser/service_worker/service_worker_context_wrapper.cc
|
| diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc
|
| index a27d006e613c511fde81a788287217ff71b9bad5..ff9f587d0fc887424825f7f4d1e17fe3a42c8bed 100644
|
| --- a/content/browser/service_worker/service_worker_context_wrapper.cc
|
| +++ b/content/browser/service_worker/service_worker_context_wrapper.cc
|
| @@ -20,6 +20,7 @@
|
| #include "base/single_thread_task_runner.h"
|
| #include "base/threading/sequenced_worker_pool.h"
|
| #include "base/threading/thread_task_runner_handle.h"
|
| +#include "content/browser/renderer_host/render_process_host_impl.h"
|
| #include "content/browser/service_worker/embedded_worker_status.h"
|
| #include "content/browser/service_worker/service_worker_context_core.h"
|
| #include "content/browser/service_worker/service_worker_context_observer.h"
|
| @@ -826,6 +827,93 @@ void ServiceWorkerContextWrapper::DidDeleteAndStartOver(
|
| &ServiceWorkerContextObserver::OnStorageWiped);
|
| }
|
|
|
| +void ServiceWorkerContextWrapper::StartServiceWorkerForNavigationPreconnect(
|
| + const GURL& document_url,
|
| + RenderProcessHost* host,
|
| + const ResultCallback& callback) {
|
| + TRACE_EVENT1("ServiceWorker", "StartServiceWorkerForNavigationPreconnect",
|
| + "document_url", document_url.spec());
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + if (!host || !RenderProcessHostImpl::IsSuitableHost(
|
| + host, host->GetBrowserContext(), document_url)) {
|
| + callback.Run(false);
|
| + return;
|
| + }
|
| +
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&ServiceWorkerContextWrapper::
|
| + DidCheckRenderProcessForNavigationPreconnect,
|
| + this, document_url, host->GetID(), callback));
|
| +}
|
| +
|
| +void ServiceWorkerContextWrapper::DidCheckRenderProcessForNavigationPreconnect(
|
| + const GURL& document_url,
|
| + int render_process_id,
|
| + const ResultCallback& callback) {
|
| + TRACE_EVENT1("ServiceWorker", "DidCheckRenderProcessForNavigationPreconnect",
|
| + "document_url", document_url.spec());
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + if (!context_core_) {
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| + base::Bind(callback, false));
|
| + return;
|
| + }
|
| + FindReadyRegistrationForDocument(
|
| + document_url, base::Bind(&ServiceWorkerContextWrapper::
|
| + DidFindRegistrationForNavigationPreconnect,
|
| + this, render_process_id, callback));
|
| +}
|
| +
|
| +void ServiceWorkerContextWrapper::DidFindRegistrationForNavigationPreconnect(
|
| + int render_process_id,
|
| + const ResultCallback& callback,
|
| + ServiceWorkerStatusCode status,
|
| + scoped_refptr<ServiceWorkerRegistration> registration) {
|
| + TRACE_EVENT0("ServiceWorker", "DidFindRegistrationForNavigationPreconnect");
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + if (status != SERVICE_WORKER_OK || !registration->active_version()) {
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| + base::Bind(callback, false));
|
| + return;
|
| + }
|
| +
|
| + if (registration->active_version()->fetch_handler_existence() ==
|
| + ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST) {
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| + base::Bind(callback, false));
|
| + return;
|
| + }
|
| +
|
| + // Add the process reference of |render_process_id| not to launch a new
|
| + // renderer process for the service worker.
|
| + context_core_->process_manager()->AddProcessReferenceToPattern(
|
| + registration->pattern(), render_process_id);
|
| +
|
| + registration->active_version()->StartWorker(
|
| + ServiceWorkerMetrics::EventType::PRECONNECT,
|
| + base::Bind(&ServiceWorkerContextWrapper::
|
| + DidStartServiceWorkerForNavigationPreconnect,
|
| + this, registration->pattern(), render_process_id, callback));
|
| +}
|
| +
|
| +void ServiceWorkerContextWrapper::DidStartServiceWorkerForNavigationPreconnect(
|
| + const GURL& pattern,
|
| + int render_process_id,
|
| + const ResultCallback& callback,
|
| + ServiceWorkerStatusCode code) {
|
| + TRACE_EVENT1("ServiceWorker", "DidStartServiceWorkerForNavigationPreconnect",
|
| + "url", pattern.spec());
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| +
|
| + // Remove the process reference added in
|
| + // DidFindRegistrationForNavigationPreconnect.
|
| + context_core_->process_manager()->RemoveProcessReferenceFromPattern(
|
| + pattern, render_process_id);
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| + base::Bind(callback, code == SERVICE_WORKER_OK));
|
| +}
|
| +
|
| void ServiceWorkerContextWrapper::BindWorkerFetchContext(
|
| int render_process_id,
|
| int service_worker_provider_id,
|
|
|