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 a5abf968b70cd1ccec54445659d6c09802916e8c..2dbe9bbb6be2a777d91134ee91a3b7169ed2306d 100644 |
--- a/content/browser/service_worker/service_worker_context_core.cc |
+++ b/content/browser/service_worker/service_worker_context_core.cc |
@@ -4,6 +4,9 @@ |
#include "content/browser/service_worker/service_worker_context_core.h" |
+#include "base/barrier_closure.h" |
+#include "base/bind.h" |
+#include "base/bind_helpers.h" |
#include "base/files/file_path.h" |
#include "base/single_thread_task_runner.h" |
#include "base/strings/string_util.h" |
@@ -211,6 +214,76 @@ void ServiceWorkerContextCore::UnregisterServiceWorker( |
callback)); |
} |
+void ServiceWorkerContextCore::UnregisterServiceWorkers( |
+ const GURL& origin, |
+ const UnregistrationCallback& callback) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ if (storage()->IsDisabled()) { |
+ callback.Run(SERVICE_WORKER_ERROR_ABORT); |
jsbell
2014/10/13 20:54:25
Should this be posted instead of running synchrono
dmurph
2014/10/14 00:16:31
Not changing to match implementations above, as di
|
+ return; |
+ } |
+ |
+ storage()->GetAllRegistrations(base::Bind( |
+ &ServiceWorkerContextCore::DidGetAllRegistrationsForUnregisterForOrigin, |
+ AsWeakPtr(), |
+ callback, |
+ origin)); |
+} |
+ |
+namespace { |
michaeln
2014/10/14 00:50:31
please put the anon namespace helpers up at the to
dmurph
2014/10/14 21:04:50
Done.
|
+void SuccessCollectorCallback(const base::Closure& done_closure, |
+ bool* overall_success, |
+ ServiceWorkerStatusCode status) { |
+ if (status != ServiceWorkerStatusCode::SERVICE_WORKER_OK) { |
+ *overall_success = false; |
+ } |
+ done_closure.Run(); |
+} |
+ |
+void SuccessReportingCallback( |
+ const bool* success, |
+ const ServiceWorkerContextCore::UnregistrationCallback& callback) { |
+ if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
michaeln
2014/10/14 00:50:31
You should be able to DCHECK_CURRENTLY_ON(IO) righ
dmurph
2014/10/14 21:04:50
It's a bug then. This callback is called from the
|
+ BrowserThread::PostTask( |
+ BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(&SuccessReportingCallback, success, callback)); |
+ return; |
+ } |
+ |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ bool result = *success; |
+ callback.Run(result ? ServiceWorkerStatusCode::SERVICE_WORKER_OK |
+ : ServiceWorkerStatusCode::SERVICE_WORKER_ERROR_FAILED); |
+} |
+} // namespace |
+ |
+void ServiceWorkerContextCore::DidGetAllRegistrationsForUnregisterForOrigin( |
+ const UnregistrationCallback& result, |
+ const GURL& origin, |
+ const std::vector<ServiceWorkerRegistrationInfo>& registrations) { |
+ std::set<GURL> scopes; |
+ for (std::vector<ServiceWorkerRegistrationInfo>::const_iterator it = |
jsbell
2014/10/13 20:54:25
This looks like a great place to use range-based f
dmurph
2014/10/14 00:16:31
Done.
|
+ registrations.begin(); |
+ it != registrations.end(); |
+ ++it) { |
+ const ServiceWorkerRegistrationInfo& registration_info = *it; |
+ if (origin == registration_info.pattern.GetOrigin()) { |
+ scopes.insert(registration_info.pattern); |
+ } |
+ } |
+ bool* overall_success = new bool(true); |
+ base::Closure barrier = base::BarrierClosure( |
+ scopes.size(), |
+ base::Bind( |
+ &SuccessReportingCallback, base::Owned(overall_success), result)); |
+ |
+ for (const GURL& scope : scopes) { |
+ job_coordinator_->Unregister( |
michaeln
2014/10/14 00:50:31
The core::unreg() method does some work upon compl
dmurph
2014/10/14 21:04:50
Done.
|
+ scope, base::Bind(&SuccessCollectorCallback, barrier, overall_success)); |
+ } |
+} |
+ |
void ServiceWorkerContextCore::UpdateServiceWorker( |
ServiceWorkerRegistration* registration) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |