| Index: content/browser/cache_storage/cache_storage.cc
|
| diff --git a/content/browser/cache_storage/cache_storage.cc b/content/browser/cache_storage/cache_storage.cc
|
| index 705894a40f8150ed71ba413f46b634407fe3cd95..d9653f49551f5a8f137f22079b0d28a18cc2f762 100644
|
| --- a/content/browser/cache_storage/cache_storage.cc
|
| +++ b/content/browser/cache_storage/cache_storage.cc
|
| @@ -64,6 +64,15 @@ void SizeRetrievedFromAllCaches(scoped_ptr<int64_t> accumulator,
|
|
|
| const char CacheStorage::kIndexFileName[] = "index.txt";
|
|
|
| +struct CacheStorage::CacheMatchResponse {
|
| + CacheMatchResponse() = default;
|
| + ~CacheMatchResponse() = default;
|
| +
|
| + CacheStorageError error;
|
| + scoped_ptr<ServiceWorkerResponse> service_worker_response;
|
| + scoped_ptr<storage::BlobDataHandle> blob_data_handle;
|
| +};
|
| +
|
| // Handles the loading and clean up of CacheStorageCache objects.
|
| class CacheStorage::CacheLoader {
|
| public:
|
| @@ -828,51 +837,55 @@ void CacheStorage::MatchCacheDidMatch(
|
| void CacheStorage::MatchAllCachesImpl(
|
| scoped_ptr<ServiceWorkerFetchRequest> request,
|
| const CacheStorageCache::ResponseCallback& callback) {
|
| - scoped_ptr<CacheStorageCache::ResponseCallback> callback_copy(
|
| - new CacheStorageCache::ResponseCallback(callback));
|
| + std::vector<CacheMatchResponse>* match_responses =
|
| + new std::vector<CacheMatchResponse>(ordered_cache_names_.size());
|
|
|
| - CacheStorageCache::ResponseCallback* callback_ptr = callback_copy.get();
|
| - base::Closure barrier_closure =
|
| - base::BarrierClosure(ordered_cache_names_.size(),
|
| - base::Bind(&CacheStorage::MatchAllCachesDidMatchAll,
|
| - weak_factory_.GetWeakPtr(),
|
| - base::Passed(std::move(callback_copy))));
|
| + base::Closure barrier_closure = base::BarrierClosure(
|
| + ordered_cache_names_.size(),
|
| + base::Bind(&CacheStorage::MatchAllCachesDidMatchAll,
|
| + weak_factory_.GetWeakPtr(),
|
| + base::Passed(make_scoped_ptr(match_responses)), callback));
|
|
|
| - for (const std::string& cache_name : ordered_cache_names_) {
|
| - scoped_refptr<CacheStorageCache> cache = GetLoadedCache(cache_name);
|
| + for (size_t i = 0, max = ordered_cache_names_.size(); i < max; ++i) {
|
| + scoped_refptr<CacheStorageCache> cache =
|
| + GetLoadedCache(ordered_cache_names_[i]);
|
| DCHECK(cache.get());
|
|
|
| cache->Match(make_scoped_ptr(new ServiceWorkerFetchRequest(*request)),
|
| base::Bind(&CacheStorage::MatchAllCachesDidMatch,
|
| - weak_factory_.GetWeakPtr(), cache, barrier_closure,
|
| - callback_ptr));
|
| + weak_factory_.GetWeakPtr(), cache,
|
| + &match_responses->at(i), barrier_closure));
|
| }
|
| }
|
|
|
| void CacheStorage::MatchAllCachesDidMatch(
|
| scoped_refptr<CacheStorageCache> cache,
|
| + CacheMatchResponse* out_match_response,
|
| const base::Closure& barrier_closure,
|
| - CacheStorageCache::ResponseCallback* callback,
|
| CacheStorageError error,
|
| - scoped_ptr<ServiceWorkerResponse> response,
|
| + scoped_ptr<ServiceWorkerResponse> service_worker_response,
|
| scoped_ptr<storage::BlobDataHandle> handle) {
|
| - if (callback->is_null() || error == CACHE_STORAGE_ERROR_NOT_FOUND) {
|
| - barrier_closure.Run();
|
| - return;
|
| - }
|
| - callback->Run(error, std::move(response), std::move(handle));
|
| - callback->Reset(); // Only call the callback once.
|
| -
|
| + out_match_response->error = error;
|
| + out_match_response->service_worker_response =
|
| + std::move(service_worker_response);
|
| + out_match_response->blob_data_handle = std::move(handle);
|
| barrier_closure.Run();
|
| }
|
|
|
| void CacheStorage::MatchAllCachesDidMatchAll(
|
| - scoped_ptr<CacheStorageCache::ResponseCallback> callback) {
|
| - if (!callback->is_null()) {
|
| - callback->Run(CACHE_STORAGE_ERROR_NOT_FOUND,
|
| - scoped_ptr<ServiceWorkerResponse>(),
|
| - scoped_ptr<storage::BlobDataHandle>());
|
| + scoped_ptr<std::vector<CacheMatchResponse>> match_responses,
|
| + const CacheStorageCache::ResponseCallback& callback) {
|
| + for (CacheMatchResponse& match_response : *match_responses) {
|
| + if (match_response.error == CACHE_STORAGE_ERROR_NOT_FOUND)
|
| + continue;
|
| + callback.Run(match_response.error,
|
| + std::move(match_response.service_worker_response),
|
| + std::move(match_response.blob_data_handle));
|
| + return;
|
| }
|
| + callback.Run(CACHE_STORAGE_ERROR_NOT_FOUND,
|
| + scoped_ptr<ServiceWorkerResponse>(),
|
| + scoped_ptr<storage::BlobDataHandle>());
|
| }
|
|
|
| scoped_refptr<CacheStorageCache> CacheStorage::GetLoadedCache(
|
|
|