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 bb5d2dedf23143e92054e6d3e1dc720bac54169c..230f14398f2283917786be4616f7b05f9e014dcc 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/service_worker_context_core.h" |
#include "content/browser/service_worker/service_worker_context_observer.h" |
#include "content/browser/service_worker/service_worker_process_manager.h" |
@@ -29,9 +30,11 @@ |
#include "content/common/service_worker/service_worker_utils.h" |
#include "content/public/browser/browser_context.h" |
#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/render_process_host.h" |
#include "net/base/url_util.h" |
#include "storage/browser/quota/quota_manager_proxy.h" |
#include "storage/browser/quota/special_storage_policy.h" |
+#include "third_party/WebKit/public/platform/WebNavigationHintType.h" |
namespace content { |
@@ -81,6 +84,21 @@ void SkipWaitingWorkerOnIO( |
registration->ActivateWaitingVersionWhenReady(); |
} |
+ServiceWorkerMetrics::EventType GetNavigationHintEventType( |
+ blink::WebNavigationHintType type) { |
+ switch (type) { |
+ case blink::WebNavigationHintType::LinkMouseDown: |
+ return ServiceWorkerMetrics::EventType::NAVIGATION_HINT_LINK_MOUSE_DOWN; |
+ case blink::WebNavigationHintType::LinkTapUnconfirmed: |
+ return ServiceWorkerMetrics::EventType:: |
+ NAVIGATION_HINT_LINK_TAP_UNCONFIRMED; |
+ case blink::WebNavigationHintType::LinkTapDown: |
+ return ServiceWorkerMetrics::EventType::NAVIGATION_HINT_LINK_TAP_DOWN; |
+ } |
+ NOTREACHED() << "Unexpected navigation hint" << static_cast<int>(type); |
+ return ServiceWorkerMetrics::EventType::UNKNOWN; |
+} |
+ |
} // namespace |
void ServiceWorkerContext::AddExcludedHeadersForFetchEvent( |
@@ -282,6 +300,84 @@ void ServiceWorkerContextWrapper::UpdateRegistration(const GURL& pattern) { |
this)); |
} |
+void ServiceWorkerContextWrapper::StartServiceWorkerForNavigationHint( |
+ const GURL& document_url, |
+ blink::WebNavigationHintType type, |
+ int render_process_id, |
+ const ResultCallback& callback) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ RenderProcessHost* host = RenderProcessHost::FromID(render_process_id); |
+ if (!host || |
+ !RenderProcessHostImpl::IsSuitableHost(host, host->GetBrowserContext(), |
+ document_url)) { |
+ callback.Run(false); |
+ return; |
+ } |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind( |
+ &ServiceWorkerContextWrapper::DidCheckRenderProcessForNavigationHint, |
+ this, document_url, type, render_process_id, callback)); |
+} |
+ |
+void ServiceWorkerContextWrapper::DidCheckRenderProcessForNavigationHint( |
+ const GURL& document_url, |
+ blink::WebNavigationHintType type, |
+ int render_process_id, |
+ const ResultCallback& callback) { |
+ 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::DidFindRegistrationForNavigationHint, |
+ this, type, render_process_id, callback)); |
+} |
+ |
+void ServiceWorkerContextWrapper::DidFindRegistrationForNavigationHint( |
+ blink::WebNavigationHintType type, |
+ int render_process_id, |
+ const ResultCallback& callback, |
+ ServiceWorkerStatusCode status, |
+ scoped_refptr<ServiceWorkerRegistration> registration) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ if (status != SERVICE_WORKER_OK || !registration->active_version()) { |
+ 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( |
+ GetNavigationHintEventType(type), |
+ base::Bind( |
+ &ServiceWorkerContextWrapper::DidStartServiceWorkerForNavigationHint, |
+ this, registration->pattern(), render_process_id, callback)); |
+} |
+ |
+void ServiceWorkerContextWrapper::DidStartServiceWorkerForNavigationHint( |
+ const GURL& pattern, |
+ int render_process_id, |
+ const ResultCallback& callback, |
+ ServiceWorkerStatusCode code) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ |
+ // Remove the process reference added in DidFindRegistrationForNavigationHint. |
+ context_core_->process_manager()->RemoveProcessReferenceFromPattern( |
+ pattern, render_process_id); |
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
+ base::Bind(callback, code == SERVICE_WORKER_OK)); |
+} |
+ |
void ServiceWorkerContextWrapper::StartServiceWorker( |
const GURL& pattern, |
const StatusCallback& callback) { |