| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/cache_storage/cache_storage.h" | 5 #include "content/browser/cache_storage/cache_storage.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/barrier_closure.h" | 12 #include "base/barrier_closure.h" |
| 13 #include "base/files/file_util.h" | 13 #include "base/files/file_util.h" |
| 14 #include "base/files/memory_mapped_file.h" | 14 #include "base/files/memory_mapped_file.h" |
| 15 #include "base/guid.h" | 15 #include "base/guid.h" |
| 16 #include "base/location.h" | 16 #include "base/location.h" |
| 17 #include "base/memory/ref_counted.h" | 17 #include "base/memory/ref_counted.h" |
| 18 #include "base/metrics/histogram_macros.h" | 18 #include "base/metrics/histogram_macros.h" |
| 19 #include "base/numerics/safe_conversions.h" | 19 #include "base/numerics/safe_conversions.h" |
| 20 #include "base/sha1.h" | 20 #include "base/sha1.h" |
| 21 #include "base/single_thread_task_runner.h" | 21 #include "base/single_thread_task_runner.h" |
| 22 #include "base/stl_util.h" | 22 #include "base/stl_util.h" |
| 23 #include "base/strings/string16.h" |
| 23 #include "base/strings/string_number_conversions.h" | 24 #include "base/strings/string_number_conversions.h" |
| 24 #include "base/strings/string_util.h" | 25 #include "base/strings/string_util.h" |
| 26 #include "base/strings/utf_string_conversions.h" |
| 25 #include "base/thread_task_runner_handle.h" | 27 #include "base/thread_task_runner_handle.h" |
| 26 #include "content/browser/cache_storage/cache_storage.pb.h" | 28 #include "content/browser/cache_storage/cache_storage.pb.h" |
| 27 #include "content/browser/cache_storage/cache_storage_cache.h" | 29 #include "content/browser/cache_storage/cache_storage_cache.h" |
| 28 #include "content/browser/cache_storage/cache_storage_scheduler.h" | 30 #include "content/browser/cache_storage/cache_storage_scheduler.h" |
| 29 #include "content/public/browser/browser_thread.h" | 31 #include "content/public/browser/browser_thread.h" |
| 30 #include "net/base/directory_lister.h" | 32 #include "net/base/directory_lister.h" |
| 31 #include "net/base/net_errors.h" | 33 #include "net/base/net_errors.h" |
| 32 #include "net/url_request/url_request_context_getter.h" | 34 #include "net/url_request/url_request_context_getter.h" |
| 33 #include "storage/browser/blob/blob_storage_context.h" | 35 #include "storage/browser/blob/blob_storage_context.h" |
| 34 #include "storage/browser/quota/quota_manager_proxy.h" | 36 #include "storage/browser/quota/quota_manager_proxy.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 63 } // namespace | 65 } // namespace |
| 64 | 66 |
| 65 const char CacheStorage::kIndexFileName[] = "index.txt"; | 67 const char CacheStorage::kIndexFileName[] = "index.txt"; |
| 66 | 68 |
| 67 // Handles the loading and clean up of CacheStorageCache objects. | 69 // Handles the loading and clean up of CacheStorageCache objects. |
| 68 class CacheStorage::CacheLoader { | 70 class CacheStorage::CacheLoader { |
| 69 public: | 71 public: |
| 70 typedef base::Callback<void(const scoped_refptr<CacheStorageCache>&)> | 72 typedef base::Callback<void(const scoped_refptr<CacheStorageCache>&)> |
| 71 CacheCallback; | 73 CacheCallback; |
| 72 typedef base::Callback<void(bool)> BoolCallback; | 74 typedef base::Callback<void(bool)> BoolCallback; |
| 73 typedef base::Callback<void(scoped_ptr<std::vector<std::string>>)> | 75 typedef base::Callback<void(scoped_ptr<std::vector<base::string16>>)> |
| 74 StringVectorCallback; | 76 StringVectorCallback; |
| 75 | 77 |
| 76 CacheLoader( | 78 CacheLoader( |
| 77 base::SequencedTaskRunner* cache_task_runner, | 79 base::SequencedTaskRunner* cache_task_runner, |
| 78 const scoped_refptr<net::URLRequestContextGetter>& request_context_getter, | 80 const scoped_refptr<net::URLRequestContextGetter>& request_context_getter, |
| 79 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy, | 81 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy, |
| 80 base::WeakPtr<storage::BlobStorageContext> blob_context, | 82 base::WeakPtr<storage::BlobStorageContext> blob_context, |
| 81 const GURL& origin) | 83 const GURL& origin) |
| 82 : cache_task_runner_(cache_task_runner), | 84 : cache_task_runner_(cache_task_runner), |
| 83 request_context_getter_(request_context_getter), | 85 request_context_getter_(request_context_getter), |
| 84 quota_manager_proxy_(quota_manager_proxy), | 86 quota_manager_proxy_(quota_manager_proxy), |
| 85 blob_context_(blob_context), | 87 blob_context_(blob_context), |
| 86 origin_(origin) { | 88 origin_(origin) { |
| 87 DCHECK(!origin_.is_empty()); | 89 DCHECK(!origin_.is_empty()); |
| 88 } | 90 } |
| 89 | 91 |
| 90 virtual ~CacheLoader() {} | 92 virtual ~CacheLoader() {} |
| 91 | 93 |
| 92 // Creates a CacheStorageCache with the given name. It does not attempt to | 94 // Creates a CacheStorageCache with the given name. It does not attempt to |
| 93 // load the backend, that happens lazily when the cache is used. | 95 // load the backend, that happens lazily when the cache is used. |
| 94 virtual scoped_refptr<CacheStorageCache> CreateCache( | 96 virtual scoped_refptr<CacheStorageCache> CreateCache( |
| 95 const std::string& cache_name) = 0; | 97 const base::string16& cache_name) = 0; |
| 96 | 98 |
| 97 // Deletes any pre-existing cache of the same name and then loads it. | 99 // Deletes any pre-existing cache of the same name and then loads it. |
| 98 virtual void PrepareNewCacheDestination(const std::string& cache_name, | 100 virtual void PrepareNewCacheDestination(const base::string16& cache_name, |
| 99 const CacheCallback& callback) = 0; | 101 const CacheCallback& callback) = 0; |
| 100 | 102 |
| 101 // After the backend has been deleted, do any extra house keeping such as | 103 // After the backend has been deleted, do any extra house keeping such as |
| 102 // removing the cache's directory. | 104 // removing the cache's directory. |
| 103 virtual void CleanUpDeletedCache(const std::string& key, | 105 virtual void CleanUpDeletedCache(const base::string16& cache_name, |
| 104 const BoolCallback& callback) = 0; | 106 const BoolCallback& callback) = 0; |
| 105 | 107 |
| 106 // Writes the cache names (and sizes) to disk if applicable. | 108 // Writes the cache names (and sizes) to disk if applicable. |
| 107 virtual void WriteIndex(const StringVector& cache_names, | 109 virtual void WriteIndex(const StringVector& cache_names, |
| 108 const BoolCallback& callback) = 0; | 110 const BoolCallback& callback) = 0; |
| 109 | 111 |
| 110 // Loads the cache names from disk if applicable. | 112 // Loads the cache names from disk if applicable. |
| 111 virtual void LoadIndex(scoped_ptr<std::vector<std::string>> cache_names, | 113 virtual void LoadIndex(scoped_ptr<std::vector<base::string16>> cache_names, |
| 112 const StringVectorCallback& callback) = 0; | 114 const StringVectorCallback& callback) = 0; |
| 113 | 115 |
| 114 protected: | 116 protected: |
| 115 scoped_refptr<base::SequencedTaskRunner> cache_task_runner_; | 117 scoped_refptr<base::SequencedTaskRunner> cache_task_runner_; |
| 116 scoped_refptr<net::URLRequestContextGetter> request_context_getter_; | 118 scoped_refptr<net::URLRequestContextGetter> request_context_getter_; |
| 117 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy_; | 119 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy_; |
| 118 base::WeakPtr<storage::BlobStorageContext> blob_context_; | 120 base::WeakPtr<storage::BlobStorageContext> blob_context_; |
| 119 GURL origin_; | 121 GURL origin_; |
| 120 }; | 122 }; |
| 121 | 123 |
| 122 // Creates memory-only ServiceWorkerCaches. Because these caches have no | 124 // Creates memory-only ServiceWorkerCaches. Because these caches have no |
| 123 // persistent storage it is not safe to free them from memory if they might be | 125 // persistent storage it is not safe to free them from memory if they might be |
| 124 // used again. Therefore this class holds a reference to each cache until the | 126 // used again. Therefore this class holds a reference to each cache until the |
| 125 // cache is deleted. | 127 // cache is deleted. |
| 126 class CacheStorage::MemoryLoader : public CacheStorage::CacheLoader { | 128 class CacheStorage::MemoryLoader : public CacheStorage::CacheLoader { |
| 127 public: | 129 public: |
| 128 MemoryLoader( | 130 MemoryLoader( |
| 129 base::SequencedTaskRunner* cache_task_runner, | 131 base::SequencedTaskRunner* cache_task_runner, |
| 130 const scoped_refptr<net::URLRequestContextGetter>& request_context, | 132 const scoped_refptr<net::URLRequestContextGetter>& request_context, |
| 131 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy, | 133 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy, |
| 132 base::WeakPtr<storage::BlobStorageContext> blob_context, | 134 base::WeakPtr<storage::BlobStorageContext> blob_context, |
| 133 const GURL& origin) | 135 const GURL& origin) |
| 134 : CacheLoader(cache_task_runner, | 136 : CacheLoader(cache_task_runner, |
| 135 request_context, | 137 request_context, |
| 136 quota_manager_proxy, | 138 quota_manager_proxy, |
| 137 blob_context, | 139 blob_context, |
| 138 origin) {} | 140 origin) {} |
| 139 | 141 |
| 140 scoped_refptr<CacheStorageCache> CreateCache( | 142 scoped_refptr<CacheStorageCache> CreateCache( |
| 141 const std::string& cache_name) override { | 143 const base::string16& cache_name) override { |
| 142 return CacheStorageCache::CreateMemoryCache( | 144 return CacheStorageCache::CreateMemoryCache( |
| 143 origin_, request_context_getter_, quota_manager_proxy_, blob_context_); | 145 origin_, request_context_getter_, quota_manager_proxy_, blob_context_); |
| 144 } | 146 } |
| 145 | 147 |
| 146 void PrepareNewCacheDestination(const std::string& cache_name, | 148 void PrepareNewCacheDestination(const base::string16& cache_name, |
| 147 const CacheCallback& callback) override { | 149 const CacheCallback& callback) override { |
| 148 scoped_refptr<CacheStorageCache> cache = CreateCache(cache_name); | 150 scoped_refptr<CacheStorageCache> cache = CreateCache(cache_name); |
| 149 cache_refs_.insert(std::make_pair(cache_name, cache)); | 151 cache_refs_.insert(std::make_pair(cache_name, cache)); |
| 150 callback.Run(cache); | 152 callback.Run(cache); |
| 151 } | 153 } |
| 152 | 154 |
| 153 void CleanUpDeletedCache(const std::string& cache_name, | 155 void CleanUpDeletedCache(const base::string16& cache_name, |
| 154 const BoolCallback& callback) override { | 156 const BoolCallback& callback) override { |
| 155 CacheRefMap::iterator it = cache_refs_.find(cache_name); | 157 CacheRefMap::iterator it = cache_refs_.find(cache_name); |
| 156 DCHECK(it != cache_refs_.end()); | 158 DCHECK(it != cache_refs_.end()); |
| 157 cache_refs_.erase(it); | 159 cache_refs_.erase(it); |
| 158 callback.Run(true); | 160 callback.Run(true); |
| 159 } | 161 } |
| 160 | 162 |
| 161 void WriteIndex(const StringVector& cache_names, | 163 void WriteIndex(const StringVector& cache_names, |
| 162 const BoolCallback& callback) override { | 164 const BoolCallback& callback) override { |
| 163 callback.Run(false); | 165 callback.Run(false); |
| 164 } | 166 } |
| 165 | 167 |
| 166 void LoadIndex(scoped_ptr<std::vector<std::string>> cache_names, | 168 void LoadIndex(scoped_ptr<std::vector<base::string16>> cache_names, |
| 167 const StringVectorCallback& callback) override { | 169 const StringVectorCallback& callback) override { |
| 168 callback.Run(std::move(cache_names)); | 170 callback.Run(std::move(cache_names)); |
| 169 } | 171 } |
| 170 | 172 |
| 171 private: | 173 private: |
| 172 typedef std::map<std::string, scoped_refptr<CacheStorageCache>> CacheRefMap; | 174 typedef std::map<base::string16, scoped_refptr<CacheStorageCache>> |
| 175 CacheRefMap; |
| 173 ~MemoryLoader() override {} | 176 ~MemoryLoader() override {} |
| 174 | 177 |
| 175 // Keep a reference to each cache to ensure that it's not freed before the | 178 // Keep a reference to each cache to ensure that it's not freed before the |
| 176 // client calls CacheStorage::Delete or the CacheStorage is | 179 // client calls CacheStorage::Delete or the CacheStorage is |
| 177 // freed. | 180 // freed. |
| 178 CacheRefMap cache_refs_; | 181 CacheRefMap cache_refs_; |
| 179 }; | 182 }; |
| 180 | 183 |
| 181 class CacheStorage::SimpleCacheLoader : public CacheStorage::CacheLoader { | 184 class CacheStorage::SimpleCacheLoader : public CacheStorage::CacheLoader { |
| 182 public: | 185 public: |
| 183 SimpleCacheLoader( | 186 SimpleCacheLoader( |
| 184 const base::FilePath& origin_path, | 187 const base::FilePath& origin_path, |
| 185 base::SequencedTaskRunner* cache_task_runner, | 188 base::SequencedTaskRunner* cache_task_runner, |
| 186 const scoped_refptr<net::URLRequestContextGetter>& request_context, | 189 const scoped_refptr<net::URLRequestContextGetter>& request_context, |
| 187 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy, | 190 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy, |
| 188 base::WeakPtr<storage::BlobStorageContext> blob_context, | 191 base::WeakPtr<storage::BlobStorageContext> blob_context, |
| 189 const GURL& origin) | 192 const GURL& origin) |
| 190 : CacheLoader(cache_task_runner, | 193 : CacheLoader(cache_task_runner, |
| 191 request_context, | 194 request_context, |
| 192 quota_manager_proxy, | 195 quota_manager_proxy, |
| 193 blob_context, | 196 blob_context, |
| 194 origin), | 197 origin), |
| 195 origin_path_(origin_path), | 198 origin_path_(origin_path), |
| 196 weak_ptr_factory_(this) {} | 199 weak_ptr_factory_(this) {} |
| 197 | 200 |
| 198 scoped_refptr<CacheStorageCache> CreateCache( | 201 scoped_refptr<CacheStorageCache> CreateCache( |
| 199 const std::string& cache_name) override { | 202 const base::string16& cache_name) override { |
| 200 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 203 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 201 DCHECK(ContainsKey(cache_name_to_cache_dir_, cache_name)); | 204 DCHECK(ContainsKey(cache_name_to_cache_dir_, cache_name)); |
| 202 | 205 |
| 203 std::string cache_dir = cache_name_to_cache_dir_[cache_name]; | 206 std::string cache_dir = cache_name_to_cache_dir_[cache_name]; |
| 204 base::FilePath cache_path = origin_path_.AppendASCII(cache_dir); | 207 base::FilePath cache_path = origin_path_.AppendASCII(cache_dir); |
| 205 return CacheStorageCache::CreatePersistentCache( | 208 return CacheStorageCache::CreatePersistentCache( |
| 206 origin_, cache_path, request_context_getter_, quota_manager_proxy_, | 209 origin_, cache_path, request_context_getter_, quota_manager_proxy_, |
| 207 blob_context_); | 210 blob_context_); |
| 208 } | 211 } |
| 209 | 212 |
| 210 void PrepareNewCacheDestination(const std::string& cache_name, | 213 void PrepareNewCacheDestination(const base::string16& cache_name, |
| 211 const CacheCallback& callback) override { | 214 const CacheCallback& callback) override { |
| 212 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 215 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 213 | 216 |
| 214 PostTaskAndReplyWithResult( | 217 PostTaskAndReplyWithResult( |
| 215 cache_task_runner_.get(), FROM_HERE, | 218 cache_task_runner_.get(), FROM_HERE, |
| 216 base::Bind(&SimpleCacheLoader::PrepareNewCacheDirectoryInPool, | 219 base::Bind(&SimpleCacheLoader::PrepareNewCacheDirectoryInPool, |
| 217 origin_path_), | 220 origin_path_), |
| 218 base::Bind(&SimpleCacheLoader::PrepareNewCacheCreateCache, | 221 base::Bind(&SimpleCacheLoader::PrepareNewCacheCreateCache, |
| 219 weak_ptr_factory_.GetWeakPtr(), cache_name, callback)); | 222 weak_ptr_factory_.GetWeakPtr(), cache_name, callback)); |
| 220 } | 223 } |
| 221 | 224 |
| 222 // Runs on the cache_task_runner_. | 225 // Runs on the cache_task_runner_. |
| 223 static std::string PrepareNewCacheDirectoryInPool( | 226 static std::string PrepareNewCacheDirectoryInPool( |
| 224 const base::FilePath& origin_path) { | 227 const base::FilePath& origin_path) { |
| 225 std::string cache_dir; | 228 std::string cache_dir; |
| 226 base::FilePath cache_path; | 229 base::FilePath cache_path; |
| 227 do { | 230 do { |
| 228 cache_dir = base::GenerateGUID(); | 231 cache_dir = base::GenerateGUID(); |
| 229 cache_path = origin_path.AppendASCII(cache_dir); | 232 cache_path = origin_path.AppendASCII(cache_dir); |
| 230 } while (base::PathExists(cache_path)); | 233 } while (base::PathExists(cache_path)); |
| 231 | 234 |
| 232 return base::CreateDirectory(cache_path) ? cache_dir : ""; | 235 return base::CreateDirectory(cache_path) ? cache_dir : ""; |
| 233 } | 236 } |
| 234 | 237 |
| 235 void PrepareNewCacheCreateCache(const std::string& cache_name, | 238 void PrepareNewCacheCreateCache(const base::string16& cache_name, |
| 236 const CacheCallback& callback, | 239 const CacheCallback& callback, |
| 237 const std::string& cache_dir) { | 240 const std::string& cache_dir) { |
| 238 if (cache_dir.empty()) { | 241 if (cache_dir.empty()) { |
| 239 callback.Run(scoped_refptr<CacheStorageCache>()); | 242 callback.Run(scoped_refptr<CacheStorageCache>()); |
| 240 return; | 243 return; |
| 241 } | 244 } |
| 242 | 245 |
| 243 cache_name_to_cache_dir_[cache_name] = cache_dir; | 246 cache_name_to_cache_dir_[cache_name] = cache_dir; |
| 244 callback.Run(CreateCache(cache_name)); | 247 callback.Run(CreateCache(cache_name)); |
| 245 } | 248 } |
| 246 | 249 |
| 247 void CleanUpDeletedCache(const std::string& cache_name, | 250 void CleanUpDeletedCache(const base::string16& cache_name, |
| 248 const BoolCallback& callback) override { | 251 const BoolCallback& callback) override { |
| 249 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 252 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 250 DCHECK(ContainsKey(cache_name_to_cache_dir_, cache_name)); | 253 DCHECK(ContainsKey(cache_name_to_cache_dir_, cache_name)); |
| 251 | 254 |
| 252 base::FilePath cache_path = | 255 base::FilePath cache_path = |
| 253 origin_path_.AppendASCII(cache_name_to_cache_dir_[cache_name]); | 256 origin_path_.AppendASCII(cache_name_to_cache_dir_[cache_name]); |
| 254 cache_name_to_cache_dir_.erase(cache_name); | 257 cache_name_to_cache_dir_.erase(cache_name); |
| 255 | 258 |
| 256 cache_task_runner_->PostTask( | 259 cache_task_runner_->PostTask( |
| 257 FROM_HERE, | 260 FROM_HERE, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 274 // 1. Create the index file as a string. (WriteIndex) | 277 // 1. Create the index file as a string. (WriteIndex) |
| 275 // 2. Write the file to disk. (WriteIndexWriteToFileInPool) | 278 // 2. Write the file to disk. (WriteIndexWriteToFileInPool) |
| 276 | 279 |
| 277 CacheStorageIndex index; | 280 CacheStorageIndex index; |
| 278 index.set_origin(origin_.spec()); | 281 index.set_origin(origin_.spec()); |
| 279 | 282 |
| 280 for (size_t i = 0u, max = cache_names.size(); i < max; ++i) { | 283 for (size_t i = 0u, max = cache_names.size(); i < max; ++i) { |
| 281 DCHECK(ContainsKey(cache_name_to_cache_dir_, cache_names[i])); | 284 DCHECK(ContainsKey(cache_name_to_cache_dir_, cache_names[i])); |
| 282 | 285 |
| 283 CacheStorageIndex::Cache* index_cache = index.add_cache(); | 286 CacheStorageIndex::Cache* index_cache = index.add_cache(); |
| 284 index_cache->set_name(cache_names[i]); | 287 // We use |name_utf16| to store the cache name. But we set |name| here for |
| 288 // forward compatibility. |
| 289 // TODO(horo): Stop setting |name| when M51 becomes stable. |
| 290 index_cache->set_name(base::UTF16ToUTF8(cache_names[i])); |
| 285 index_cache->set_cache_dir(cache_name_to_cache_dir_[cache_names[i]]); | 291 index_cache->set_cache_dir(cache_name_to_cache_dir_[cache_names[i]]); |
| 292 index_cache->set_name_utf16( |
| 293 cache_names[i].data(), |
| 294 cache_names[i].length() * sizeof(base::char16)); |
| 286 } | 295 } |
| 287 | 296 |
| 288 std::string serialized; | 297 std::string serialized; |
| 289 bool success = index.SerializeToString(&serialized); | 298 bool success = index.SerializeToString(&serialized); |
| 290 DCHECK(success); | 299 DCHECK(success); |
| 291 | 300 |
| 292 base::FilePath tmp_path = origin_path_.AppendASCII("index.txt.tmp"); | 301 base::FilePath tmp_path = origin_path_.AppendASCII("index.txt.tmp"); |
| 293 base::FilePath index_path = | 302 base::FilePath index_path = |
| 294 origin_path_.AppendASCII(CacheStorage::kIndexFileName); | 303 origin_path_.AppendASCII(CacheStorage::kIndexFileName); |
| 295 | 304 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 309 if (bytes_written != base::checked_cast<int>(data.size())) { | 318 if (bytes_written != base::checked_cast<int>(data.size())) { |
| 310 base::DeleteFile(tmp_path, /* recursive */ false); | 319 base::DeleteFile(tmp_path, /* recursive */ false); |
| 311 original_task_runner->PostTask(FROM_HERE, base::Bind(callback, false)); | 320 original_task_runner->PostTask(FROM_HERE, base::Bind(callback, false)); |
| 312 } | 321 } |
| 313 | 322 |
| 314 // Atomically rename the temporary index file to become the real one. | 323 // Atomically rename the temporary index file to become the real one. |
| 315 bool rv = base::ReplaceFile(tmp_path, index_path, NULL); | 324 bool rv = base::ReplaceFile(tmp_path, index_path, NULL); |
| 316 original_task_runner->PostTask(FROM_HERE, base::Bind(callback, rv)); | 325 original_task_runner->PostTask(FROM_HERE, base::Bind(callback, rv)); |
| 317 } | 326 } |
| 318 | 327 |
| 319 void LoadIndex(scoped_ptr<std::vector<std::string>> names, | 328 void LoadIndex(scoped_ptr<std::vector<base::string16>> names, |
| 320 const StringVectorCallback& callback) override { | 329 const StringVectorCallback& callback) override { |
| 321 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 330 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 322 | 331 |
| 323 // 1. Read the file from disk. (LoadIndexReadFileInPool) | 332 // 1. Read the file from disk. (LoadIndexReadFileInPool) |
| 324 // 2. Parse file and return the names of the caches (LoadIndexDidReadFile) | 333 // 2. Parse file and return the names of the caches (LoadIndexDidReadFile) |
| 325 | 334 |
| 326 base::FilePath index_path = | 335 base::FilePath index_path = |
| 327 origin_path_.AppendASCII(CacheStorage::kIndexFileName); | 336 origin_path_.AppendASCII(CacheStorage::kIndexFileName); |
| 328 | 337 |
| 329 PostTaskAndReplyWithResult( | 338 PostTaskAndReplyWithResult( |
| 330 cache_task_runner_.get(), FROM_HERE, | 339 cache_task_runner_.get(), FROM_HERE, |
| 331 base::Bind(&SimpleCacheLoader::ReadAndMigrateIndexInPool, index_path), | 340 base::Bind(&SimpleCacheLoader::ReadAndMigrateIndexInPool, index_path), |
| 332 base::Bind(&SimpleCacheLoader::LoadIndexDidReadFile, | 341 base::Bind(&SimpleCacheLoader::LoadIndexDidReadFile, |
| 333 weak_ptr_factory_.GetWeakPtr(), base::Passed(&names), | 342 weak_ptr_factory_.GetWeakPtr(), base::Passed(&names), |
| 334 callback)); | 343 callback)); |
| 335 } | 344 } |
| 336 | 345 |
| 337 void LoadIndexDidReadFile(scoped_ptr<std::vector<std::string>> names, | 346 void LoadIndexDidReadFile(scoped_ptr<std::vector<base::string16>> names, |
| 338 const StringVectorCallback& callback, | 347 const StringVectorCallback& callback, |
| 339 const std::string& serialized) { | 348 const std::string& serialized) { |
| 340 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 349 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 341 | 350 |
| 342 scoped_ptr<std::set<std::string>> cache_dirs(new std::set<std::string>); | 351 scoped_ptr<std::set<std::string>> cache_dirs(new std::set<std::string>); |
| 343 | 352 |
| 344 CacheStorageIndex index; | 353 CacheStorageIndex index; |
| 345 if (index.ParseFromString(serialized)) { | 354 if (index.ParseFromString(serialized)) { |
| 346 for (int i = 0, max = index.cache_size(); i < max; ++i) { | 355 for (int i = 0, max = index.cache_size(); i < max; ++i) { |
| 347 const CacheStorageIndex::Cache& cache = index.cache(i); | 356 const CacheStorageIndex::Cache& cache = index.cache(i); |
| 348 DCHECK(cache.has_cache_dir()); | 357 DCHECK(cache.has_cache_dir()); |
| 349 names->push_back(cache.name()); | 358 // After M51 we use |name_utf16| instead of |name|. We check |name| |
| 350 cache_name_to_cache_dir_[cache.name()] = cache.cache_dir(); | 359 // first for backward compatibility. |
| 360 base::string16 cache_name(base::UTF8ToUTF16(cache.name())); |
| 361 if (cache.has_name_utf16()) { |
| 362 cache_name = base::string16( |
| 363 reinterpret_cast<const base::char16*>(cache.name_utf16().data()), |
| 364 cache.name_utf16().size() / sizeof(base::char16)); |
| 365 } |
| 366 names->push_back(cache_name); |
| 367 cache_name_to_cache_dir_[cache_name] = cache.cache_dir(); |
| 351 cache_dirs->insert(cache.cache_dir()); | 368 cache_dirs->insert(cache.cache_dir()); |
| 352 } | 369 } |
| 353 } | 370 } |
| 354 | 371 |
| 355 cache_task_runner_->PostTask( | 372 cache_task_runner_->PostTask( |
| 356 FROM_HERE, base::Bind(&DeleteUnreferencedCachesInPool, origin_path_, | 373 FROM_HERE, base::Bind(&DeleteUnreferencedCachesInPool, origin_path_, |
| 357 base::Passed(&cache_dirs))); | 374 base::Passed(&cache_dirs))); |
| 358 callback.Run(std::move(names)); | 375 callback.Run(std::move(names)); |
| 359 } | 376 } |
| 360 | 377 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 // Runs on cache_task_runner_ | 452 // Runs on cache_task_runner_ |
| 436 static std::string ReadAndMigrateIndexInPool( | 453 static std::string ReadAndMigrateIndexInPool( |
| 437 const base::FilePath& index_path) { | 454 const base::FilePath& index_path) { |
| 438 std::string body; | 455 std::string body; |
| 439 base::ReadFileToString(index_path, &body); | 456 base::ReadFileToString(index_path, &body); |
| 440 | 457 |
| 441 return MigrateCachesIfNecessaryInPool(body, index_path); | 458 return MigrateCachesIfNecessaryInPool(body, index_path); |
| 442 } | 459 } |
| 443 | 460 |
| 444 const base::FilePath origin_path_; | 461 const base::FilePath origin_path_; |
| 445 std::map<std::string, std::string> cache_name_to_cache_dir_; | 462 std::map<base::string16, std::string> cache_name_to_cache_dir_; |
| 446 | 463 |
| 447 base::WeakPtrFactory<SimpleCacheLoader> weak_ptr_factory_; | 464 base::WeakPtrFactory<SimpleCacheLoader> weak_ptr_factory_; |
| 448 }; | 465 }; |
| 449 | 466 |
| 450 CacheStorage::CacheStorage( | 467 CacheStorage::CacheStorage( |
| 451 const base::FilePath& path, | 468 const base::FilePath& path, |
| 452 bool memory_only, | 469 bool memory_only, |
| 453 base::SequencedTaskRunner* cache_task_runner, | 470 base::SequencedTaskRunner* cache_task_runner, |
| 454 const scoped_refptr<net::URLRequestContextGetter>& request_context, | 471 const scoped_refptr<net::URLRequestContextGetter>& request_context, |
| 455 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy, | 472 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 470 blob_context, origin)); | 487 blob_context, origin)); |
| 471 else | 488 else |
| 472 cache_loader_.reset(new SimpleCacheLoader( | 489 cache_loader_.reset(new SimpleCacheLoader( |
| 473 origin_path_, cache_task_runner_.get(), request_context, | 490 origin_path_, cache_task_runner_.get(), request_context, |
| 474 quota_manager_proxy, blob_context, origin)); | 491 quota_manager_proxy, blob_context, origin)); |
| 475 } | 492 } |
| 476 | 493 |
| 477 CacheStorage::~CacheStorage() { | 494 CacheStorage::~CacheStorage() { |
| 478 } | 495 } |
| 479 | 496 |
| 480 void CacheStorage::OpenCache(const std::string& cache_name, | 497 void CacheStorage::OpenCache(const base::string16& cache_name, |
| 481 const CacheAndErrorCallback& callback) { | 498 const CacheAndErrorCallback& callback) { |
| 482 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 499 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 483 | 500 |
| 484 if (!initialized_) | 501 if (!initialized_) |
| 485 LazyInit(); | 502 LazyInit(); |
| 486 | 503 |
| 487 CacheAndErrorCallback pending_callback = | 504 CacheAndErrorCallback pending_callback = |
| 488 base::Bind(&CacheStorage::PendingCacheAndErrorCallback, | 505 base::Bind(&CacheStorage::PendingCacheAndErrorCallback, |
| 489 weak_factory_.GetWeakPtr(), callback); | 506 weak_factory_.GetWeakPtr(), callback); |
| 490 scheduler_->ScheduleOperation(base::Bind(&CacheStorage::OpenCacheImpl, | 507 scheduler_->ScheduleOperation(base::Bind(&CacheStorage::OpenCacheImpl, |
| 491 weak_factory_.GetWeakPtr(), | 508 weak_factory_.GetWeakPtr(), |
| 492 cache_name, pending_callback)); | 509 cache_name, pending_callback)); |
| 493 } | 510 } |
| 494 | 511 |
| 495 void CacheStorage::HasCache(const std::string& cache_name, | 512 void CacheStorage::HasCache(const base::string16& cache_name, |
| 496 const BoolAndErrorCallback& callback) { | 513 const BoolAndErrorCallback& callback) { |
| 497 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 514 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 498 | 515 |
| 499 if (!initialized_) | 516 if (!initialized_) |
| 500 LazyInit(); | 517 LazyInit(); |
| 501 | 518 |
| 502 BoolAndErrorCallback pending_callback = | 519 BoolAndErrorCallback pending_callback = |
| 503 base::Bind(&CacheStorage::PendingBoolAndErrorCallback, | 520 base::Bind(&CacheStorage::PendingBoolAndErrorCallback, |
| 504 weak_factory_.GetWeakPtr(), callback); | 521 weak_factory_.GetWeakPtr(), callback); |
| 505 scheduler_->ScheduleOperation(base::Bind(&CacheStorage::HasCacheImpl, | 522 scheduler_->ScheduleOperation(base::Bind(&CacheStorage::HasCacheImpl, |
| 506 weak_factory_.GetWeakPtr(), | 523 weak_factory_.GetWeakPtr(), |
| 507 cache_name, pending_callback)); | 524 cache_name, pending_callback)); |
| 508 } | 525 } |
| 509 | 526 |
| 510 void CacheStorage::DeleteCache(const std::string& cache_name, | 527 void CacheStorage::DeleteCache(const base::string16& cache_name, |
| 511 const BoolAndErrorCallback& callback) { | 528 const BoolAndErrorCallback& callback) { |
| 512 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 529 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 513 | 530 |
| 514 if (!initialized_) | 531 if (!initialized_) |
| 515 LazyInit(); | 532 LazyInit(); |
| 516 | 533 |
| 517 BoolAndErrorCallback pending_callback = | 534 BoolAndErrorCallback pending_callback = |
| 518 base::Bind(&CacheStorage::PendingBoolAndErrorCallback, | 535 base::Bind(&CacheStorage::PendingBoolAndErrorCallback, |
| 519 weak_factory_.GetWeakPtr(), callback); | 536 weak_factory_.GetWeakPtr(), callback); |
| 520 scheduler_->ScheduleOperation(base::Bind(&CacheStorage::DeleteCacheImpl, | 537 scheduler_->ScheduleOperation(base::Bind(&CacheStorage::DeleteCacheImpl, |
| 521 weak_factory_.GetWeakPtr(), | 538 weak_factory_.GetWeakPtr(), |
| 522 cache_name, pending_callback)); | 539 cache_name, pending_callback)); |
| 523 } | 540 } |
| 524 | 541 |
| 525 void CacheStorage::EnumerateCaches(const StringsAndErrorCallback& callback) { | 542 void CacheStorage::EnumerateCaches(const StringsAndErrorCallback& callback) { |
| 526 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 543 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 527 | 544 |
| 528 if (!initialized_) | 545 if (!initialized_) |
| 529 LazyInit(); | 546 LazyInit(); |
| 530 | 547 |
| 531 StringsAndErrorCallback pending_callback = | 548 StringsAndErrorCallback pending_callback = |
| 532 base::Bind(&CacheStorage::PendingStringsAndErrorCallback, | 549 base::Bind(&CacheStorage::PendingStringsAndErrorCallback, |
| 533 weak_factory_.GetWeakPtr(), callback); | 550 weak_factory_.GetWeakPtr(), callback); |
| 534 scheduler_->ScheduleOperation(base::Bind(&CacheStorage::EnumerateCachesImpl, | 551 scheduler_->ScheduleOperation(base::Bind(&CacheStorage::EnumerateCachesImpl, |
| 535 weak_factory_.GetWeakPtr(), | 552 weak_factory_.GetWeakPtr(), |
| 536 pending_callback)); | 553 pending_callback)); |
| 537 } | 554 } |
| 538 | 555 |
| 539 void CacheStorage::MatchCache( | 556 void CacheStorage::MatchCache( |
| 540 const std::string& cache_name, | 557 const base::string16& cache_name, |
| 541 scoped_ptr<ServiceWorkerFetchRequest> request, | 558 scoped_ptr<ServiceWorkerFetchRequest> request, |
| 542 const CacheStorageCache::ResponseCallback& callback) { | 559 const CacheStorageCache::ResponseCallback& callback) { |
| 543 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 560 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 544 | 561 |
| 545 if (!initialized_) | 562 if (!initialized_) |
| 546 LazyInit(); | 563 LazyInit(); |
| 547 | 564 |
| 548 CacheStorageCache::ResponseCallback pending_callback = | 565 CacheStorageCache::ResponseCallback pending_callback = |
| 549 base::Bind(&CacheStorage::PendingResponseCallback, | 566 base::Bind(&CacheStorage::PendingResponseCallback, |
| 550 weak_factory_.GetWeakPtr(), callback); | 567 weak_factory_.GetWeakPtr(), callback); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 622 void CacheStorage::LazyInitImpl() { | 639 void CacheStorage::LazyInitImpl() { |
| 623 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 640 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 624 DCHECK(!initialized_); | 641 DCHECK(!initialized_); |
| 625 DCHECK(initializing_); | 642 DCHECK(initializing_); |
| 626 | 643 |
| 627 // 1. Get the list of cache names (async call) | 644 // 1. Get the list of cache names (async call) |
| 628 // 2. For each cache name, load the cache (async call) | 645 // 2. For each cache name, load the cache (async call) |
| 629 // 3. Once each load is complete, update the map variables. | 646 // 3. Once each load is complete, update the map variables. |
| 630 // 4. Call the list of waiting callbacks. | 647 // 4. Call the list of waiting callbacks. |
| 631 | 648 |
| 632 scoped_ptr<std::vector<std::string>> indexed_cache_names( | 649 scoped_ptr<std::vector<base::string16>> indexed_cache_names( |
| 633 new std::vector<std::string>()); | 650 new std::vector<base::string16>()); |
| 634 | 651 |
| 635 cache_loader_->LoadIndex(std::move(indexed_cache_names), | 652 cache_loader_->LoadIndex(std::move(indexed_cache_names), |
| 636 base::Bind(&CacheStorage::LazyInitDidLoadIndex, | 653 base::Bind(&CacheStorage::LazyInitDidLoadIndex, |
| 637 weak_factory_.GetWeakPtr())); | 654 weak_factory_.GetWeakPtr())); |
| 638 } | 655 } |
| 639 | 656 |
| 640 void CacheStorage::LazyInitDidLoadIndex( | 657 void CacheStorage::LazyInitDidLoadIndex( |
| 641 scoped_ptr<std::vector<std::string>> indexed_cache_names) { | 658 scoped_ptr<std::vector<base::string16>> indexed_cache_names) { |
| 642 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 659 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 643 | 660 |
| 644 for (size_t i = 0u, max = indexed_cache_names->size(); i < max; ++i) { | 661 for (size_t i = 0u, max = indexed_cache_names->size(); i < max; ++i) { |
| 645 cache_map_.insert(std::make_pair(indexed_cache_names->at(i), | 662 cache_map_.insert(std::make_pair(indexed_cache_names->at(i), |
| 646 base::WeakPtr<CacheStorageCache>())); | 663 base::WeakPtr<CacheStorageCache>())); |
| 647 ordered_cache_names_.push_back(indexed_cache_names->at(i)); | 664 ordered_cache_names_.push_back(indexed_cache_names->at(i)); |
| 648 } | 665 } |
| 649 | 666 |
| 650 initializing_ = false; | 667 initializing_ = false; |
| 651 initialized_ = true; | 668 initialized_ = true; |
| 652 | 669 |
| 653 scheduler_->CompleteOperationAndRunNext(); | 670 scheduler_->CompleteOperationAndRunNext(); |
| 654 } | 671 } |
| 655 | 672 |
| 656 void CacheStorage::OpenCacheImpl(const std::string& cache_name, | 673 void CacheStorage::OpenCacheImpl(const base::string16& cache_name, |
| 657 const CacheAndErrorCallback& callback) { | 674 const CacheAndErrorCallback& callback) { |
| 658 scoped_refptr<CacheStorageCache> cache = GetLoadedCache(cache_name); | 675 scoped_refptr<CacheStorageCache> cache = GetLoadedCache(cache_name); |
| 659 if (cache.get()) { | 676 if (cache.get()) { |
| 660 callback.Run(cache, CACHE_STORAGE_OK); | 677 callback.Run(cache, CACHE_STORAGE_OK); |
| 661 return; | 678 return; |
| 662 } | 679 } |
| 663 | 680 |
| 664 cache_loader_->PrepareNewCacheDestination( | 681 cache_loader_->PrepareNewCacheDestination( |
| 665 cache_name, base::Bind(&CacheStorage::CreateCacheDidCreateCache, | 682 cache_name, base::Bind(&CacheStorage::CreateCacheDidCreateCache, |
| 666 weak_factory_.GetWeakPtr(), cache_name, callback)); | 683 weak_factory_.GetWeakPtr(), cache_name, callback)); |
| 667 } | 684 } |
| 668 | 685 |
| 669 void CacheStorage::CreateCacheDidCreateCache( | 686 void CacheStorage::CreateCacheDidCreateCache( |
| 670 const std::string& cache_name, | 687 const base::string16& cache_name, |
| 671 const CacheAndErrorCallback& callback, | 688 const CacheAndErrorCallback& callback, |
| 672 const scoped_refptr<CacheStorageCache>& cache) { | 689 const scoped_refptr<CacheStorageCache>& cache) { |
| 673 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 690 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 674 | 691 |
| 675 UMA_HISTOGRAM_BOOLEAN("ServiceWorkerCache.CreateCacheStorageResult", | 692 UMA_HISTOGRAM_BOOLEAN("ServiceWorkerCache.CreateCacheStorageResult", |
| 676 cache != nullptr); | 693 cache != nullptr); |
| 677 | 694 |
| 678 if (!cache.get()) { | 695 if (!cache.get()) { |
| 679 callback.Run(scoped_refptr<CacheStorageCache>(), | 696 callback.Run(scoped_refptr<CacheStorageCache>(), |
| 680 CACHE_STORAGE_ERROR_STORAGE); | 697 CACHE_STORAGE_ERROR_STORAGE); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 697 const scoped_refptr<CacheStorageCache>& cache, | 714 const scoped_refptr<CacheStorageCache>& cache, |
| 698 bool success) { | 715 bool success) { |
| 699 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 716 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 700 DCHECK(cache.get()); | 717 DCHECK(cache.get()); |
| 701 | 718 |
| 702 // TODO(jkarlin): Handle !success. | 719 // TODO(jkarlin): Handle !success. |
| 703 | 720 |
| 704 callback.Run(cache, CACHE_STORAGE_OK); | 721 callback.Run(cache, CACHE_STORAGE_OK); |
| 705 } | 722 } |
| 706 | 723 |
| 707 void CacheStorage::HasCacheImpl(const std::string& cache_name, | 724 void CacheStorage::HasCacheImpl(const base::string16& cache_name, |
| 708 const BoolAndErrorCallback& callback) { | 725 const BoolAndErrorCallback& callback) { |
| 709 bool has_cache = ContainsKey(cache_map_, cache_name); | 726 bool has_cache = ContainsKey(cache_map_, cache_name); |
| 710 callback.Run(has_cache, CACHE_STORAGE_OK); | 727 callback.Run(has_cache, CACHE_STORAGE_OK); |
| 711 } | 728 } |
| 712 | 729 |
| 713 void CacheStorage::DeleteCacheImpl(const std::string& cache_name, | 730 void CacheStorage::DeleteCacheImpl(const base::string16& cache_name, |
| 714 const BoolAndErrorCallback& callback) { | 731 const BoolAndErrorCallback& callback) { |
| 715 scoped_refptr<CacheStorageCache> cache = GetLoadedCache(cache_name); | 732 scoped_refptr<CacheStorageCache> cache = GetLoadedCache(cache_name); |
| 716 if (!cache.get()) { | 733 if (!cache.get()) { |
| 717 base::ThreadTaskRunnerHandle::Get()->PostTask( | 734 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 718 FROM_HERE, base::Bind(callback, false, CACHE_STORAGE_ERROR_NOT_FOUND)); | 735 FROM_HERE, base::Bind(callback, false, CACHE_STORAGE_ERROR_NOT_FOUND)); |
| 719 return; | 736 return; |
| 720 } | 737 } |
| 721 | 738 |
| 722 CacheMap::iterator map_iter = cache_map_.find(cache_name); | 739 CacheMap::iterator map_iter = cache_map_.find(cache_name); |
| 723 cache_map_.erase(map_iter); | 740 cache_map_.erase(map_iter); |
| 724 | 741 |
| 725 // Delete the name from ordered_cache_names_. | 742 // Delete the name from ordered_cache_names_. |
| 726 StringVector::iterator iter = std::find( | 743 StringVector::iterator iter = std::find( |
| 727 ordered_cache_names_.begin(), ordered_cache_names_.end(), cache_name); | 744 ordered_cache_names_.begin(), ordered_cache_names_.end(), cache_name); |
| 728 DCHECK(iter != ordered_cache_names_.end()); | 745 DCHECK(iter != ordered_cache_names_.end()); |
| 729 ordered_cache_names_.erase(iter); | 746 ordered_cache_names_.erase(iter); |
| 730 | 747 |
| 731 cache->GetSizeThenClose(base::Bind(&CacheStorage::DeleteCacheDidClose, | 748 cache->GetSizeThenClose(base::Bind(&CacheStorage::DeleteCacheDidClose, |
| 732 weak_factory_.GetWeakPtr(), cache_name, | 749 weak_factory_.GetWeakPtr(), cache_name, |
| 733 callback, ordered_cache_names_, cache)); | 750 callback, ordered_cache_names_, cache)); |
| 734 } | 751 } |
| 735 | 752 |
| 736 void CacheStorage::DeleteCacheDidClose( | 753 void CacheStorage::DeleteCacheDidClose( |
| 737 const std::string& cache_name, | 754 const base::string16& cache_name, |
| 738 const BoolAndErrorCallback& callback, | 755 const BoolAndErrorCallback& callback, |
| 739 const StringVector& ordered_cache_names, | 756 const StringVector& ordered_cache_names, |
| 740 const scoped_refptr<CacheStorageCache>& cache, | 757 const scoped_refptr<CacheStorageCache>& cache, |
| 741 int64_t cache_size) { | 758 int64_t cache_size) { |
| 742 cache_loader_->WriteIndex( | 759 cache_loader_->WriteIndex( |
| 743 ordered_cache_names, | 760 ordered_cache_names, |
| 744 base::Bind(&CacheStorage::DeleteCacheDidWriteIndex, | 761 base::Bind(&CacheStorage::DeleteCacheDidWriteIndex, |
| 745 weak_factory_.GetWeakPtr(), cache_name, callback, cache_size)); | 762 weak_factory_.GetWeakPtr(), cache_name, callback, cache_size)); |
| 746 } | 763 } |
| 747 | 764 |
| 748 void CacheStorage::DeleteCacheDidWriteIndex( | 765 void CacheStorage::DeleteCacheDidWriteIndex( |
| 749 const std::string& cache_name, | 766 const base::string16& cache_name, |
| 750 const BoolAndErrorCallback& callback, | 767 const BoolAndErrorCallback& callback, |
| 751 int cache_size, | 768 int cache_size, |
| 752 bool success) { | 769 bool success) { |
| 753 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 770 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 754 | 771 |
| 755 quota_manager_proxy_->NotifyStorageModified( | 772 quota_manager_proxy_->NotifyStorageModified( |
| 756 storage::QuotaClient::kServiceWorkerCache, origin_, | 773 storage::QuotaClient::kServiceWorkerCache, origin_, |
| 757 storage::kStorageTypeTemporary, -1 * cache_size); | 774 storage::kStorageTypeTemporary, -1 * cache_size); |
| 758 | 775 |
| 759 cache_loader_->CleanUpDeletedCache( | 776 cache_loader_->CleanUpDeletedCache( |
| 760 cache_name, base::Bind(&CacheStorage::DeleteCacheDidCleanUp, | 777 cache_name, base::Bind(&CacheStorage::DeleteCacheDidCleanUp, |
| 761 weak_factory_.GetWeakPtr(), callback)); | 778 weak_factory_.GetWeakPtr(), callback)); |
| 762 } | 779 } |
| 763 | 780 |
| 764 void CacheStorage::DeleteCacheDidCleanUp(const BoolAndErrorCallback& callback, | 781 void CacheStorage::DeleteCacheDidCleanUp(const BoolAndErrorCallback& callback, |
| 765 bool success) { | 782 bool success) { |
| 766 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 783 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 767 | 784 |
| 768 callback.Run(true, CACHE_STORAGE_OK); | 785 callback.Run(true, CACHE_STORAGE_OK); |
| 769 } | 786 } |
| 770 | 787 |
| 771 void CacheStorage::EnumerateCachesImpl( | 788 void CacheStorage::EnumerateCachesImpl( |
| 772 const StringsAndErrorCallback& callback) { | 789 const StringsAndErrorCallback& callback) { |
| 773 callback.Run(ordered_cache_names_, CACHE_STORAGE_OK); | 790 callback.Run(ordered_cache_names_, CACHE_STORAGE_OK); |
| 774 } | 791 } |
| 775 | 792 |
| 776 void CacheStorage::MatchCacheImpl( | 793 void CacheStorage::MatchCacheImpl( |
| 777 const std::string& cache_name, | 794 const base::string16& cache_name, |
| 778 scoped_ptr<ServiceWorkerFetchRequest> request, | 795 scoped_ptr<ServiceWorkerFetchRequest> request, |
| 779 const CacheStorageCache::ResponseCallback& callback) { | 796 const CacheStorageCache::ResponseCallback& callback) { |
| 780 scoped_refptr<CacheStorageCache> cache = GetLoadedCache(cache_name); | 797 scoped_refptr<CacheStorageCache> cache = GetLoadedCache(cache_name); |
| 781 | 798 |
| 782 if (!cache.get()) { | 799 if (!cache.get()) { |
| 783 callback.Run(CACHE_STORAGE_ERROR_CACHE_NAME_NOT_FOUND, | 800 callback.Run(CACHE_STORAGE_ERROR_CACHE_NAME_NOT_FOUND, |
| 784 scoped_ptr<ServiceWorkerResponse>(), | 801 scoped_ptr<ServiceWorkerResponse>(), |
| 785 scoped_ptr<storage::BlobDataHandle>()); | 802 scoped_ptr<storage::BlobDataHandle>()); |
| 786 return; | 803 return; |
| 787 } | 804 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 808 scoped_ptr<CacheStorageCache::ResponseCallback> callback_copy( | 825 scoped_ptr<CacheStorageCache::ResponseCallback> callback_copy( |
| 809 new CacheStorageCache::ResponseCallback(callback)); | 826 new CacheStorageCache::ResponseCallback(callback)); |
| 810 | 827 |
| 811 CacheStorageCache::ResponseCallback* callback_ptr = callback_copy.get(); | 828 CacheStorageCache::ResponseCallback* callback_ptr = callback_copy.get(); |
| 812 base::Closure barrier_closure = | 829 base::Closure barrier_closure = |
| 813 base::BarrierClosure(ordered_cache_names_.size(), | 830 base::BarrierClosure(ordered_cache_names_.size(), |
| 814 base::Bind(&CacheStorage::MatchAllCachesDidMatchAll, | 831 base::Bind(&CacheStorage::MatchAllCachesDidMatchAll, |
| 815 weak_factory_.GetWeakPtr(), | 832 weak_factory_.GetWeakPtr(), |
| 816 base::Passed(std::move(callback_copy)))); | 833 base::Passed(std::move(callback_copy)))); |
| 817 | 834 |
| 818 for (const std::string& cache_name : ordered_cache_names_) { | 835 for (const base::string16& cache_name : ordered_cache_names_) { |
| 819 scoped_refptr<CacheStorageCache> cache = GetLoadedCache(cache_name); | 836 scoped_refptr<CacheStorageCache> cache = GetLoadedCache(cache_name); |
| 820 DCHECK(cache.get()); | 837 DCHECK(cache.get()); |
| 821 | 838 |
| 822 cache->Match(make_scoped_ptr(new ServiceWorkerFetchRequest(*request)), | 839 cache->Match(make_scoped_ptr(new ServiceWorkerFetchRequest(*request)), |
| 823 base::Bind(&CacheStorage::MatchAllCachesDidMatch, | 840 base::Bind(&CacheStorage::MatchAllCachesDidMatch, |
| 824 weak_factory_.GetWeakPtr(), cache, barrier_closure, | 841 weak_factory_.GetWeakPtr(), cache, barrier_closure, |
| 825 callback_ptr)); | 842 callback_ptr)); |
| 826 } | 843 } |
| 827 } | 844 } |
| 828 | 845 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 846 void CacheStorage::MatchAllCachesDidMatchAll( | 863 void CacheStorage::MatchAllCachesDidMatchAll( |
| 847 scoped_ptr<CacheStorageCache::ResponseCallback> callback) { | 864 scoped_ptr<CacheStorageCache::ResponseCallback> callback) { |
| 848 if (!callback->is_null()) { | 865 if (!callback->is_null()) { |
| 849 callback->Run(CACHE_STORAGE_ERROR_NOT_FOUND, | 866 callback->Run(CACHE_STORAGE_ERROR_NOT_FOUND, |
| 850 scoped_ptr<ServiceWorkerResponse>(), | 867 scoped_ptr<ServiceWorkerResponse>(), |
| 851 scoped_ptr<storage::BlobDataHandle>()); | 868 scoped_ptr<storage::BlobDataHandle>()); |
| 852 } | 869 } |
| 853 } | 870 } |
| 854 | 871 |
| 855 scoped_refptr<CacheStorageCache> CacheStorage::GetLoadedCache( | 872 scoped_refptr<CacheStorageCache> CacheStorage::GetLoadedCache( |
| 856 const std::string& cache_name) { | 873 const base::string16& cache_name) { |
| 857 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 874 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 858 DCHECK(initialized_); | 875 DCHECK(initialized_); |
| 859 | 876 |
| 860 CacheMap::iterator map_iter = cache_map_.find(cache_name); | 877 CacheMap::iterator map_iter = cache_map_.find(cache_name); |
| 861 if (map_iter == cache_map_.end()) | 878 if (map_iter == cache_map_.end()) |
| 862 return scoped_refptr<CacheStorageCache>(); | 879 return scoped_refptr<CacheStorageCache>(); |
| 863 | 880 |
| 864 base::WeakPtr<CacheStorageCache> cache = map_iter->second; | 881 base::WeakPtr<CacheStorageCache> cache = map_iter->second; |
| 865 | 882 |
| 866 if (!cache) { | 883 if (!cache) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 907 DCHECK(initialized_); | 924 DCHECK(initialized_); |
| 908 | 925 |
| 909 scoped_ptr<int64_t> accumulator(new int64_t(0)); | 926 scoped_ptr<int64_t> accumulator(new int64_t(0)); |
| 910 int64_t* accumulator_ptr = accumulator.get(); | 927 int64_t* accumulator_ptr = accumulator.get(); |
| 911 | 928 |
| 912 base::Closure barrier_closure = base::BarrierClosure( | 929 base::Closure barrier_closure = base::BarrierClosure( |
| 913 ordered_cache_names_.size(), | 930 ordered_cache_names_.size(), |
| 914 base::Bind(&SizeRetrievedFromAllCaches, | 931 base::Bind(&SizeRetrievedFromAllCaches, |
| 915 base::Passed(std::move(accumulator)), callback)); | 932 base::Passed(std::move(accumulator)), callback)); |
| 916 | 933 |
| 917 for (const std::string& cache_name : ordered_cache_names_) { | 934 for (const base::string16& cache_name : ordered_cache_names_) { |
| 918 scoped_refptr<CacheStorageCache> cache = GetLoadedCache(cache_name); | 935 scoped_refptr<CacheStorageCache> cache = GetLoadedCache(cache_name); |
| 919 cache->GetSizeThenClose(base::Bind(&SizeRetrievedFromCache, cache, | 936 cache->GetSizeThenClose(base::Bind(&SizeRetrievedFromCache, cache, |
| 920 barrier_closure, accumulator_ptr)); | 937 barrier_closure, accumulator_ptr)); |
| 921 } | 938 } |
| 922 } | 939 } |
| 923 | 940 |
| 924 void CacheStorage::SizeImpl(const SizeCallback& callback) { | 941 void CacheStorage::SizeImpl(const SizeCallback& callback) { |
| 925 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 942 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 926 DCHECK(initialized_); | 943 DCHECK(initialized_); |
| 927 | 944 |
| 928 scoped_ptr<int64_t> accumulator(new int64_t(0)); | 945 scoped_ptr<int64_t> accumulator(new int64_t(0)); |
| 929 int64_t* accumulator_ptr = accumulator.get(); | 946 int64_t* accumulator_ptr = accumulator.get(); |
| 930 | 947 |
| 931 base::Closure barrier_closure = base::BarrierClosure( | 948 base::Closure barrier_closure = base::BarrierClosure( |
| 932 ordered_cache_names_.size(), | 949 ordered_cache_names_.size(), |
| 933 base::Bind(&SizeRetrievedFromAllCaches, | 950 base::Bind(&SizeRetrievedFromAllCaches, |
| 934 base::Passed(std::move(accumulator)), callback)); | 951 base::Passed(std::move(accumulator)), callback)); |
| 935 | 952 |
| 936 for (const std::string& cache_name : ordered_cache_names_) { | 953 for (const base::string16& cache_name : ordered_cache_names_) { |
| 937 scoped_refptr<CacheStorageCache> cache = GetLoadedCache(cache_name); | 954 scoped_refptr<CacheStorageCache> cache = GetLoadedCache(cache_name); |
| 938 cache->Size(base::Bind(&SizeRetrievedFromCache, cache, barrier_closure, | 955 cache->Size(base::Bind(&SizeRetrievedFromCache, cache, barrier_closure, |
| 939 accumulator_ptr)); | 956 accumulator_ptr)); |
| 940 } | 957 } |
| 941 } | 958 } |
| 942 | 959 |
| 943 void CacheStorage::PendingClosure(const base::Closure& callback) { | 960 void CacheStorage::PendingClosure(const base::Closure& callback) { |
| 944 base::WeakPtr<CacheStorage> cache_storage = weak_factory_.GetWeakPtr(); | 961 base::WeakPtr<CacheStorage> cache_storage = weak_factory_.GetWeakPtr(); |
| 945 | 962 |
| 946 callback.Run(); | 963 callback.Run(); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 996 void CacheStorage::PendingSizeCallback(const SizeCallback& callback, | 1013 void CacheStorage::PendingSizeCallback(const SizeCallback& callback, |
| 997 int64_t size) { | 1014 int64_t size) { |
| 998 base::WeakPtr<CacheStorage> cache_storage = weak_factory_.GetWeakPtr(); | 1015 base::WeakPtr<CacheStorage> cache_storage = weak_factory_.GetWeakPtr(); |
| 999 | 1016 |
| 1000 callback.Run(size); | 1017 callback.Run(size); |
| 1001 if (cache_storage) | 1018 if (cache_storage) |
| 1002 scheduler_->CompleteOperationAndRunNext(); | 1019 scheduler_->CompleteOperationAndRunNext(); |
| 1003 } | 1020 } |
| 1004 | 1021 |
| 1005 } // namespace content | 1022 } // namespace content |
| OLD | NEW |