| 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 6c5881189fa43ed89a803e5713a44b2945f2cf9e..acd175b0ad76298f6ad7df83eda70ce08999dd51 100644
|
| --- a/content/browser/service_worker/service_worker_context_wrapper.cc
|
| +++ b/content/browser/service_worker/service_worker_context_wrapper.cc
|
| @@ -12,6 +12,7 @@
|
|
|
| #include "base/barrier_closure.h"
|
| #include "base/bind.h"
|
| +#include "base/bind_helpers.h"
|
| #include "base/files/file_path.h"
|
| #include "base/lazy_instance.h"
|
| #include "base/location.h"
|
| @@ -101,6 +102,11 @@ ServiceWorkerMetrics::EventType GetNavigationHintEventType(
|
| return ServiceWorkerMetrics::EventType::UNKNOWN;
|
| }
|
|
|
| +void StatusCallbackRunner(const base::Closure& callback,
|
| + ServiceWorkerStatusCode status) {
|
| + callback.Run();
|
| +}
|
| +
|
| } // namespace
|
|
|
| void ServiceWorkerContext::AddExcludedHeadersForFetchEvent(
|
| @@ -490,21 +496,38 @@ void ServiceWorkerContextWrapper::DidCheckHasServiceWorker(
|
|
|
| void ServiceWorkerContextWrapper::StopAllServiceWorkersForOrigin(
|
| const GURL& origin) {
|
| + StopAllServiceWorkersForOriginWithCallback(origin,
|
| + base::Bind(&base::DoNothing));
|
| +}
|
| +
|
| +void ServiceWorkerContextWrapper::StopAllServiceWorkersForOriginWithCallback(
|
| + const GURL& origin,
|
| + const base::Closure& callback) {
|
| if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&ServiceWorkerContextWrapper::StopAllServiceWorkersForOrigin,
|
| - this, origin));
|
| + base::Bind(&ServiceWorkerContextWrapper::
|
| + StopAllServiceWorkersForOriginWithCallback,
|
| + this, origin, callback));
|
| return;
|
| }
|
| if (!context_core_.get()) {
|
| return;
|
| }
|
| std::vector<ServiceWorkerVersionInfo> live_versions = GetAllLiveVersionInfo();
|
| + std::vector<ServiceWorkerVersion*> versions_to_stop;
|
| for (const ServiceWorkerVersionInfo& info : live_versions) {
|
| ServiceWorkerVersion* version = GetLiveVersion(info.version_id);
|
| if (version && version->scope().GetOrigin() == origin)
|
| - version->StopWorker(base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
|
| + versions_to_stop.push_back(version);
|
| + }
|
| + if (!versions_to_stop.empty()) {
|
| + base::Closure barrier_closure =
|
| + BarrierClosure(versions_to_stop.size(), callback);
|
| + for (ServiceWorkerVersion* version : versions_to_stop)
|
| + version->StopWorker(base::Bind(&StatusCallbackRunner, barrier_closure));
|
| + } else {
|
| + RunSoon(callback);
|
| }
|
| }
|
|
|
|
|