Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(196)

Side by Side Diff: content/browser/service_worker/service_worker_cache_storage.cc

Issue 674873002: [ServiceWorkerCache] Call QuotaManager::NotifyStorageModified from Cache. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix refptr check Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/service_worker/service_worker_cache_storage.h" 5 #include "content/browser/service_worker/service_worker_cache_storage.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/files/file_util.h" 9 #include "base/files/file_util.h"
10 #include "base/files/memory_mapped_file.h" 10 #include "base/files/memory_mapped_file.h"
11 #include "base/memory/ref_counted.h" 11 #include "base/memory/ref_counted.h"
12 #include "base/sha1.h" 12 #include "base/sha1.h"
13 #include "base/stl_util.h" 13 #include "base/stl_util.h"
14 #include "base/strings/string_number_conversions.h" 14 #include "base/strings/string_number_conversions.h"
15 #include "base/strings/string_util.h" 15 #include "base/strings/string_util.h"
16 #include "content/browser/service_worker/service_worker_cache.h" 16 #include "content/browser/service_worker/service_worker_cache.h"
17 #include "content/browser/service_worker/service_worker_cache.pb.h" 17 #include "content/browser/service_worker/service_worker_cache.pb.h"
18 #include "content/public/browser/browser_thread.h" 18 #include "content/public/browser/browser_thread.h"
19 #include "net/base/directory_lister.h" 19 #include "net/base/directory_lister.h"
20 #include "net/base/net_errors.h" 20 #include "net/base/net_errors.h"
21 #include "storage/browser/blob/blob_storage_context.h" 21 #include "storage/browser/blob/blob_storage_context.h"
22 #include "storage/browser/quota/quota_manager_proxy.h"
22 23
23 namespace content { 24 namespace content {
24 25
25 const char ServiceWorkerCacheStorage::kIndexFileName[] = "index.txt"; 26 const char ServiceWorkerCacheStorage::kIndexFileName[] = "index.txt";
26 27
27 // Handles the loading and clean up of ServiceWorkerCache objects. The 28 // Handles the loading and clean up of ServiceWorkerCache objects. The
28 // callback of every public method is guaranteed to be called. 29 // callback of every public method is guaranteed to be called.
29 class ServiceWorkerCacheStorage::CacheLoader { 30 class ServiceWorkerCacheStorage::CacheLoader {
30 public: 31 public:
31 typedef base::Callback<void(const scoped_refptr<ServiceWorkerCache>&)> 32 typedef base::Callback<void(const scoped_refptr<ServiceWorkerCache>&)>
32 CacheCallback; 33 CacheCallback;
33 typedef base::Callback<void(bool)> BoolCallback; 34 typedef base::Callback<void(bool)> BoolCallback;
34 typedef base::Callback<void(scoped_ptr<std::vector<std::string> >)> 35 typedef base::Callback<void(scoped_ptr<std::vector<std::string> >)>
35 StringVectorCallback; 36 StringVectorCallback;
36 37
37 CacheLoader(base::SequencedTaskRunner* cache_task_runner, 38 CacheLoader(
38 net::URLRequestContext* request_context, 39 base::SequencedTaskRunner* cache_task_runner,
39 base::WeakPtr<storage::BlobStorageContext> blob_context, 40 net::URLRequestContext* request_context,
40 const GURL& origin) 41 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy,
42 base::WeakPtr<storage::BlobStorageContext> blob_context,
43 const GURL& origin)
41 : cache_task_runner_(cache_task_runner), 44 : cache_task_runner_(cache_task_runner),
42 request_context_(request_context), 45 request_context_(request_context),
46 quota_manager_proxy_(quota_manager_proxy),
43 blob_context_(blob_context), 47 blob_context_(blob_context),
44 origin_(origin) { 48 origin_(origin) {
45 DCHECK(!origin_.is_empty()); 49 DCHECK(!origin_.is_empty());
46 } 50 }
47 51
48 virtual ~CacheLoader() {} 52 virtual ~CacheLoader() {}
49 53
50 // Creates a ServiceWorkerCache with the given name. It does not attempt to 54 // Creates a ServiceWorkerCache with the given name. It does not attempt to
51 // load the backend, that happens lazily when the cache is used. 55 // load the backend, that happens lazily when the cache is used.
52 virtual scoped_refptr<ServiceWorkerCache> CreateServiceWorkerCache( 56 virtual scoped_refptr<ServiceWorkerCache> CreateServiceWorkerCache(
(...skipping 12 matching lines...) Expand all
65 virtual void WriteIndex(const StringVector& cache_names, 69 virtual void WriteIndex(const StringVector& cache_names,
66 const BoolCallback& callback) = 0; 70 const BoolCallback& callback) = 0;
67 71
68 // Loads the cache names from disk if applicable. 72 // Loads the cache names from disk if applicable.
69 virtual void LoadIndex(scoped_ptr<std::vector<std::string> > cache_names, 73 virtual void LoadIndex(scoped_ptr<std::vector<std::string> > cache_names,
70 const StringVectorCallback& callback) = 0; 74 const StringVectorCallback& callback) = 0;
71 75
72 protected: 76 protected:
73 scoped_refptr<base::SequencedTaskRunner> cache_task_runner_; 77 scoped_refptr<base::SequencedTaskRunner> cache_task_runner_;
74 net::URLRequestContext* request_context_; 78 net::URLRequestContext* request_context_;
79 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy_;
75 base::WeakPtr<storage::BlobStorageContext> blob_context_; 80 base::WeakPtr<storage::BlobStorageContext> blob_context_;
76 GURL origin_; 81 GURL origin_;
77 }; 82 };
78 83
79 // Creates memory-only ServiceWorkerCaches. Because these caches have no 84 // Creates memory-only ServiceWorkerCaches. Because these caches have no
80 // persistent storage it is not safe to free them from memory if they might be 85 // persistent storage it is not safe to free them from memory if they might be
81 // used again. Therefore this class holds a reference to each cache until the 86 // used again. Therefore this class holds a reference to each cache until the
82 // cache is deleted. 87 // cache is deleted.
83 class ServiceWorkerCacheStorage::MemoryLoader 88 class ServiceWorkerCacheStorage::MemoryLoader
84 : public ServiceWorkerCacheStorage::CacheLoader { 89 : public ServiceWorkerCacheStorage::CacheLoader {
85 public: 90 public:
86 MemoryLoader(base::SequencedTaskRunner* cache_task_runner, 91 MemoryLoader(
87 net::URLRequestContext* request_context, 92 base::SequencedTaskRunner* cache_task_runner,
88 base::WeakPtr<storage::BlobStorageContext> blob_context, 93 net::URLRequestContext* request_context,
89 const GURL& origin) 94 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy,
90 : CacheLoader(cache_task_runner, request_context, blob_context, origin) {} 95 base::WeakPtr<storage::BlobStorageContext> blob_context,
96 const GURL& origin)
97 : CacheLoader(cache_task_runner,
98 request_context,
99 quota_manager_proxy,
100 blob_context,
101 origin) {}
91 102
92 scoped_refptr<ServiceWorkerCache> CreateServiceWorkerCache( 103 scoped_refptr<ServiceWorkerCache> CreateServiceWorkerCache(
93 const std::string& cache_name) override { 104 const std::string& cache_name) override {
94 return ServiceWorkerCache::CreateMemoryCache(request_context_, 105 return ServiceWorkerCache::CreateMemoryCache(
95 blob_context_); 106 origin_, request_context_, quota_manager_proxy_, blob_context_);
96 } 107 }
97 108
98 void CreateCache(const std::string& cache_name, 109 void CreateCache(const std::string& cache_name,
99 const CacheCallback& callback) override { 110 const CacheCallback& callback) override {
100 scoped_refptr<ServiceWorkerCache> cache = 111 scoped_refptr<ServiceWorkerCache> cache =
101 ServiceWorkerCache::CreateMemoryCache(request_context_, blob_context_); 112 CreateServiceWorkerCache(cache_name);
102 cache_refs_.insert(std::make_pair(cache_name, cache)); 113 cache_refs_.insert(std::make_pair(cache_name, cache));
103 callback.Run(cache); 114 callback.Run(cache);
104 } 115 }
105 116
106 void CleanUpDeletedCache(const std::string& cache_name, 117 void CleanUpDeletedCache(const std::string& cache_name,
107 const BoolCallback& callback) override { 118 const BoolCallback& callback) override {
108 CacheRefMap::iterator it = cache_refs_.find(cache_name); 119 CacheRefMap::iterator it = cache_refs_.find(cache_name);
109 DCHECK(it != cache_refs_.end()); 120 DCHECK(it != cache_refs_.end());
110 cache_refs_.erase(it); 121 cache_refs_.erase(it);
111 callback.Run(true); 122 callback.Run(true);
(...skipping 15 matching lines...) Expand all
127 138
128 // Keep a reference to each cache to ensure that it's not freed before the 139 // Keep a reference to each cache to ensure that it's not freed before the
129 // client calls ServiceWorkerCacheStorage::Delete or the CacheStorage is 140 // client calls ServiceWorkerCacheStorage::Delete or the CacheStorage is
130 // freed. 141 // freed.
131 CacheRefMap cache_refs_; 142 CacheRefMap cache_refs_;
132 }; 143 };
133 144
134 class ServiceWorkerCacheStorage::SimpleCacheLoader 145 class ServiceWorkerCacheStorage::SimpleCacheLoader
135 : public ServiceWorkerCacheStorage::CacheLoader { 146 : public ServiceWorkerCacheStorage::CacheLoader {
136 public: 147 public:
137 SimpleCacheLoader(const base::FilePath& origin_path, 148 SimpleCacheLoader(
138 base::SequencedTaskRunner* cache_task_runner, 149 const base::FilePath& origin_path,
139 net::URLRequestContext* request_context, 150 base::SequencedTaskRunner* cache_task_runner,
140 base::WeakPtr<storage::BlobStorageContext> blob_context, 151 net::URLRequestContext* request_context,
141 const GURL& origin) 152 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy,
142 : CacheLoader(cache_task_runner, request_context, blob_context, origin), 153 base::WeakPtr<storage::BlobStorageContext> blob_context,
154 const GURL& origin)
155 : CacheLoader(cache_task_runner,
156 request_context,
157 quota_manager_proxy,
158 blob_context,
159 origin),
143 origin_path_(origin_path), 160 origin_path_(origin_path),
144 weak_ptr_factory_(this) {} 161 weak_ptr_factory_(this) {}
145 162
146 scoped_refptr<ServiceWorkerCache> CreateServiceWorkerCache( 163 scoped_refptr<ServiceWorkerCache> CreateServiceWorkerCache(
147 const std::string& cache_name) override { 164 const std::string& cache_name) override {
148 DCHECK_CURRENTLY_ON(BrowserThread::IO); 165 DCHECK_CURRENTLY_ON(BrowserThread::IO);
149 166
150 return ServiceWorkerCache::CreatePersistentCache( 167 return ServiceWorkerCache::CreatePersistentCache(
168 origin_,
151 CreatePersistentCachePath(origin_path_, cache_name), 169 CreatePersistentCachePath(origin_path_, cache_name),
152 request_context_, 170 request_context_,
171 quota_manager_proxy_,
153 blob_context_); 172 blob_context_);
154 } 173 }
155 174
156 void CreateCache(const std::string& cache_name, 175 void CreateCache(const std::string& cache_name,
157 const CacheCallback& callback) override { 176 const CacheCallback& callback) override {
158 DCHECK_CURRENTLY_ON(BrowserThread::IO); 177 DCHECK_CURRENTLY_ON(BrowserThread::IO);
159 178
160 // 1. Delete the cache's directory if it exists. 179 // 1. Delete the cache's directory if it exists.
161 // (CreateCacheDeleteFilesInPool) 180 // (CreateCacheDeleteFilesInPool)
162 // 2. Load the cache. (LoadCreateDirectoryInPool) 181 // 2. Load the cache. (LoadCreateDirectoryInPool)
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 const base::FilePath origin_path_; 357 const base::FilePath origin_path_;
339 358
340 base::WeakPtrFactory<SimpleCacheLoader> weak_ptr_factory_; 359 base::WeakPtrFactory<SimpleCacheLoader> weak_ptr_factory_;
341 }; 360 };
342 361
343 ServiceWorkerCacheStorage::ServiceWorkerCacheStorage( 362 ServiceWorkerCacheStorage::ServiceWorkerCacheStorage(
344 const base::FilePath& path, 363 const base::FilePath& path,
345 bool memory_only, 364 bool memory_only,
346 base::SequencedTaskRunner* cache_task_runner, 365 base::SequencedTaskRunner* cache_task_runner,
347 net::URLRequestContext* request_context, 366 net::URLRequestContext* request_context,
367 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy,
348 base::WeakPtr<storage::BlobStorageContext> blob_context, 368 base::WeakPtr<storage::BlobStorageContext> blob_context,
349 const GURL& origin) 369 const GURL& origin)
350 : initialized_(false), 370 : initialized_(false),
351 origin_path_(path), 371 origin_path_(path),
352 cache_task_runner_(cache_task_runner), 372 cache_task_runner_(cache_task_runner),
353 memory_only_(memory_only), 373 memory_only_(memory_only),
354 weak_factory_(this) { 374 weak_factory_(this) {
355 if (memory_only) 375 if (memory_only)
356 cache_loader_.reset(new MemoryLoader( 376 cache_loader_.reset(new MemoryLoader(cache_task_runner_.get(),
357 cache_task_runner_.get(), request_context, blob_context, origin)); 377 request_context,
378 quota_manager_proxy,
379 blob_context,
380 origin));
358 else 381 else
359 cache_loader_.reset(new SimpleCacheLoader(origin_path_, 382 cache_loader_.reset(new SimpleCacheLoader(origin_path_,
360 cache_task_runner_.get(), 383 cache_task_runner_.get(),
361 request_context, 384 request_context,
385 quota_manager_proxy,
362 blob_context, 386 blob_context,
363 origin)); 387 origin));
364 } 388 }
365 389
366 ServiceWorkerCacheStorage::~ServiceWorkerCacheStorage() { 390 ServiceWorkerCacheStorage::~ServiceWorkerCacheStorage() {
367 } 391 }
368 392
369 void ServiceWorkerCacheStorage::OpenCache( 393 void ServiceWorkerCacheStorage::OpenCache(
370 const std::string& cache_name, 394 const std::string& cache_name,
371 const CacheAndErrorCallback& callback) { 395 const CacheAndErrorCallback& callback) {
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
592 scoped_refptr<ServiceWorkerCache> new_cache = 616 scoped_refptr<ServiceWorkerCache> new_cache =
593 cache_loader_->CreateServiceWorkerCache(cache_name); 617 cache_loader_->CreateServiceWorkerCache(cache_name);
594 map_iter->second = new_cache->AsWeakPtr(); 618 map_iter->second = new_cache->AsWeakPtr();
595 return new_cache; 619 return new_cache;
596 } 620 }
597 621
598 return make_scoped_refptr(cache.get()); 622 return make_scoped_refptr(cache.get());
599 } 623 }
600 624
601 } // namespace content 625 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698