| 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 5765a890e7470a1e37487295829a5ac6fc990b1d..ffdeed14790b480406a32b477e7f8a4b4bf11761 100644
|
| --- a/content/browser/cache_storage/cache_storage.cc
|
| +++ b/content/browser/cache_storage/cache_storage.cc
|
| @@ -35,6 +35,8 @@ namespace content {
|
|
|
| namespace {
|
|
|
| +const int kCachePreservationInSecs = 30;
|
| +
|
| std::string HexedHash(const std::string& value) {
|
| std::string value_hash = base::SHA1HashString(value);
|
| std::string valued_hexed_hash = base::ToLowerASCII(
|
| @@ -671,6 +673,8 @@ void CacheStorage::CreateCacheDidCreateCache(
|
| cache_map_.insert(std::make_pair(cache_name, cache->AsWeakPtr()));
|
| ordered_cache_names_.push_back(cache_name);
|
|
|
| + TemporarilyPreserveCache(cache);
|
| +
|
| cache_loader_->WriteIndex(
|
| ordered_cache_names_,
|
| base::Bind(&CacheStorage::CreateCacheDidWriteIndex,
|
| @@ -853,12 +857,41 @@ scoped_refptr<CacheStorageCache> CacheStorage::GetLoadedCache(
|
| scoped_refptr<CacheStorageCache> new_cache =
|
| cache_loader_->CreateCache(cache_name);
|
| map_iter->second = new_cache->AsWeakPtr();
|
| +
|
| + TemporarilyPreserveCache(new_cache);
|
| return new_cache;
|
| }
|
|
|
| return make_scoped_refptr(cache.get());
|
| }
|
|
|
| +void CacheStorage::TemporarilyPreserveCache(
|
| + const scoped_refptr<CacheStorageCache>& cache) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + DCHECK(!ContainsKey(preserved_caches_, cache.get()));
|
| +
|
| + preserved_caches_[cache.get()] = cache;
|
| + SchedulePreservedCacheRemoval(base::Bind(&CacheStorage::RemovePreservedCache,
|
| + weak_factory_.GetWeakPtr(),
|
| + base::Unretained(cache.get())));
|
| +}
|
| +
|
| +void CacheStorage::SchedulePreservedCacheRemoval(
|
| + const base::Closure& callback) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| +
|
| + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
|
| + FROM_HERE, callback,
|
| + base::TimeDelta::FromSeconds(kCachePreservationInSecs));
|
| +}
|
| +
|
| +void CacheStorage::RemovePreservedCache(const CacheStorageCache* cache) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + DCHECK(ContainsKey(preserved_caches_, cache));
|
| +
|
| + preserved_caches_.erase(cache);
|
| +}
|
| +
|
| void CacheStorage::CloseAllCachesImpl(const base::Closure& callback) {
|
| int live_cache_count = 0;
|
| for (const auto& key_value : cache_map_) {
|
|
|