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 a0bbc665b4cbcdbdb437d04c5d49de1439778830..af12757efc9008d8640b60a8bede0390cb855e53 100644 |
| --- a/content/browser/service_worker/service_worker_context_core.cc |
| +++ b/content/browser/service_worker/service_worker_context_core.cc |
| @@ -32,6 +32,7 @@ |
| #include "content/browser/service_worker/service_worker_register_job.h" |
| #include "content/browser/service_worker/service_worker_registration.h" |
| #include "content/browser/service_worker/service_worker_storage.h" |
| +#include "content/browser/service_worker/service_worker_version.h" |
| #include "content/common/service_worker/service_worker_utils.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "ipc/ipc_message.h" |
| @@ -43,6 +44,26 @@ |
| namespace content { |
| namespace { |
| +void CheckFetchHandlerOfInstalledServiceWorker( |
| + const ServiceWorkerContext::CheckHasServiceWorkerCallback callback, |
| + scoped_refptr<ServiceWorkerRegistration> registration) { |
| + // Waiting Service Worker is a newer version, prefer that if available; |
|
falken
2017/03/21 01:53:24
nit: trailing semi-colon :)
piotrs
2017/03/21 02:12:49
Done.
|
| + ServiceWorkerVersion* preferred_version = |
| + registration->waiting_version() ? registration->waiting_version() |
| + : registration->active_version(); |
| + |
| + DCHECK(preferred_version); |
| + |
| + ServiceWorkerVersion::FetchHandlerExistence existence = |
| + preferred_version->fetch_handler_existence(); |
| + |
| + DCHECK_NE(existence, ServiceWorkerVersion::FetchHandlerExistence::UNKNOWN); |
| + |
| + callback.Run(existence == ServiceWorkerVersion::FetchHandlerExistence::EXISTS |
| + ? ServiceWorkerCapability::SERVICE_WORKER_WITH_FETCH_HANDLER |
| + : ServiceWorkerCapability::SERVICE_WORKER_NO_FETCH_HANDLER); |
| +} |
| + |
| void SuccessCollectorCallback(const base::Closure& done_closure, |
| bool* overall_success, |
| ServiceWorkerStatusCode status) { |
| @@ -856,17 +877,17 @@ void ServiceWorkerContextCore::DidFindRegistrationForCheckHasServiceWorker( |
| ServiceWorkerStatusCode status, |
| scoped_refptr<ServiceWorkerRegistration> registration) { |
| if (status != SERVICE_WORKER_OK) { |
| - callback.Run(false); |
| + callback.Run(ServiceWorkerCapability::NO_SERVICE_WORKER); |
| return; |
| } |
| if (!ServiceWorkerUtils::ScopeMatches(registration->pattern(), other_url)) { |
| - callback.Run(false); |
| + callback.Run(ServiceWorkerCapability::NO_SERVICE_WORKER); |
| return; |
| } |
| if (registration->is_uninstalling() || registration->is_uninstalled()) { |
| - callback.Run(false); |
| + callback.Run(ServiceWorkerCapability::NO_SERVICE_WORKER); |
| return; |
| } |
| @@ -878,14 +899,18 @@ void ServiceWorkerContextCore::DidFindRegistrationForCheckHasServiceWorker( |
| return; |
| } |
| - callback.Run(true); |
| + CheckFetchHandlerOfInstalledServiceWorker(callback, registration); |
| } |
| void ServiceWorkerContextCore::OnRegistrationFinishedForCheckHasServiceWorker( |
| const ServiceWorkerContext::CheckHasServiceWorkerCallback callback, |
| scoped_refptr<ServiceWorkerRegistration> registration) { |
| - callback.Run(registration->active_version() || |
| - registration->waiting_version()); |
| + if (!registration->active_version() && !registration->waiting_version()) { |
| + callback.Run(ServiceWorkerCapability::NO_SERVICE_WORKER); |
| + return; |
| + } |
| + |
| + CheckFetchHandlerOfInstalledServiceWorker(callback, registration); |
| } |
| } // namespace content |