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 b135a85056b3bed00f969ae7059a047f2803fc7a..f22a604e9ef918acc5716a595b85d50a17da208e 100644 |
--- a/content/browser/service_worker/service_worker_context_wrapper.cc |
+++ b/content/browser/service_worker/service_worker_context_wrapper.cc |
@@ -7,6 +7,7 @@ |
#include <map> |
#include "base/barrier_closure.h" |
+#include "base/callback_helpers.h" |
#include "base/files/file_path.h" |
#include "base/logging.h" |
#include "base/threading/sequenced_worker_pool.h" |
@@ -160,6 +161,22 @@ void ServiceWorkerContextWrapper::Terminate() { |
process_manager_->Shutdown(); |
} |
+void ServiceWorkerContextWrapper::CombineUsageInfo( |
+ std::vector<ServiceWorkerUsageInfo>* usage_info, |
+ std::map<GURL, int64>* usage_map, |
+ const GetUsageInfoCallback& callback) { |
+ DCHECK(usage_info); |
+ DCHECK(usage_map); |
+ for (auto& info : *usage_info) { |
+ auto it = usage_map->find(info.origin); |
+ info.total_size_bytes = it != usage_map->end() ? it->second : 0; |
+ } |
+ // We own usage_info, so as soon as we go out of scope it will be destroyed. |
+ // Since we are explicitly calling Run here, we should be good, as the |
+ // usage callback will be fully run before this callback is destroyed. |
+ callback.Run(*usage_info); |
+} |
+ |
void ServiceWorkerContextWrapper::GetAllOriginsInfo( |
const GetUsageInfoCallback& callback) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
@@ -171,16 +188,34 @@ void ServiceWorkerContextWrapper::GetAllOriginsInfo( |
base::Bind(callback, std::vector<ServiceWorkerUsageInfo>())); |
return; |
} |
+ auto* info_out = new std::vector<ServiceWorkerUsageInfo>(); |
+ auto* usage_map_out = new std::map<GURL, int64>(); |
michaeln
2014/10/24 23:15:47
It took me a while to understand the reason for th
dmurph
2014/10/27 21:37:06
I talked to Josh about this for a while, and we de
michaeln
2014/10/28 22:00:40
There don't seem to be many places where these are
|
+ base::Closure barrier = base::BarrierClosure( |
+ 2, |
+ base::Bind(&ServiceWorkerContextWrapper::CombineUsageInfo, |
+ this, |
+ base::Owned(info_out), |
+ base::Owned(usage_map_out), |
+ callback)); |
context()->storage()->GetAllRegistrations(base::Bind( |
&ServiceWorkerContextWrapper::DidGetAllRegistrationsForGetAllOrigins, |
this, |
- callback)); |
+ barrier, |
+ base::Unretained(info_out))); |
+ context()->storage()->GetAllUsageByOrigin( |
+ base::Bind(&ServiceWorkerContextWrapper::DidGetUsageForAllOrigins, |
+ this, |
+ barrier, |
+ base::Unretained(usage_map_out))); |
} |
void ServiceWorkerContextWrapper::DidGetAllRegistrationsForGetAllOrigins( |
- const GetUsageInfoCallback& callback, |
+ const base::Closure& closure, |
+ std::vector<ServiceWorkerUsageInfo>* registrations_out, |
const std::vector<ServiceWorkerRegistrationInfo>& registrations) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ DCHECK(registrations_out); |
+ base::ScopedClosureRunner closureRunner(closure); |
std::vector<ServiceWorkerUsageInfo> usage_infos; |
std::map<GURL, ServiceWorkerUsageInfo> origins; |
@@ -203,8 +238,18 @@ void ServiceWorkerContextWrapper::DidGetAllRegistrationsForGetAllOrigins( |
++it) { |
usage_infos.push_back(it->second); |
} |
+ usage_infos.swap(*registrations_out); |
+} |
- callback.Run(usage_infos); |
+void ServiceWorkerContextWrapper::DidGetUsageForAllOrigins( |
+ const base::Closure& closure, |
+ std::map<GURL, int64>* usage_out, |
+ const std::map<GURL, int64>& usage_map) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ DCHECK(usage_out); |
+ base::ScopedClosureRunner closureRunner(closure); |
+ usage_out->clear(); |
+ usage_out->insert(usage_map.begin(), usage_map.end()); |
} |
namespace { |