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

Side by Side Diff: webkit/appcache/appcache_service.cc

Issue 7031065: AppCache + Quota integration (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 6 months 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 | Annotate | Revision Log
« no previous file with comments | « webkit/appcache/appcache_service.h ('k') | webkit/appcache/appcache_service_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "webkit/appcache/appcache_service.h" 5 #include "webkit/appcache/appcache_service.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "base/stl_util-inl.h" 9 #include "base/stl_util-inl.h"
10 #include "webkit/appcache/appcache_backend_impl.h" 10 #include "webkit/appcache/appcache_backend_impl.h"
11 #include "webkit/appcache/appcache_entry.h" 11 #include "webkit/appcache/appcache_entry.h"
12 #include "webkit/appcache/appcache_quota_client.h"
12 #include "webkit/appcache/appcache_storage_impl.h" 13 #include "webkit/appcache/appcache_storage_impl.h"
13 #include "webkit/quota/quota_manager.h" 14 #include "webkit/quota/quota_manager.h"
14 #include "webkit/quota/special_storage_policy.h" 15 #include "webkit/quota/special_storage_policy.h"
15 16
16 namespace appcache { 17 namespace appcache {
17 18
18 AppCacheInfoCollection::AppCacheInfoCollection() {} 19 AppCacheInfoCollection::AppCacheInfoCollection() {}
19 20
20 AppCacheInfoCollection::~AppCacheInfoCollection() {} 21 AppCacheInfoCollection::~AppCacheInfoCollection() {}
21 22
(...skipping 29 matching lines...) Expand all
51 52
52 static void DeferredCallCallback(net::CompletionCallback* callback, int rv) { 53 static void DeferredCallCallback(net::CompletionCallback* callback, int rv) {
53 callback->Run(rv); 54 callback->Run(rv);
54 } 55 }
55 56
56 AppCacheService* service_; 57 AppCacheService* service_;
57 net::CompletionCallback* callback_; 58 net::CompletionCallback* callback_;
58 }; 59 };
59 60
60 void AppCacheService::AsyncHelper::Cancel() { 61 void AppCacheService::AsyncHelper::Cancel() {
61 CallCallback(net::ERR_ABORTED); 62 if (callback_) {
63 callback_->Run(net::ERR_ABORTED);
64 callback_ = NULL;
65 }
62 service_->storage()->CancelDelegateCallbacks(this); 66 service_->storage()->CancelDelegateCallbacks(this);
63 service_ = NULL; 67 service_ = NULL;
64 } 68 }
65 69
66 // CanHandleOfflineHelper ------- 70 // CanHandleOfflineHelper -------
67 71
68 class AppCacheService::CanHandleOfflineHelper : AsyncHelper { 72 class AppCacheService::CanHandleOfflineHelper : AsyncHelper {
69 public: 73 public:
70 CanHandleOfflineHelper( 74 CanHandleOfflineHelper(
71 AppCacheService* service, const GURL& url, 75 AppCacheService* service, const GURL& url,
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 delete this; 140 delete this;
137 } 141 }
138 } 142 }
139 143
140 void AppCacheService::DeleteHelper::OnGroupMadeObsolete( 144 void AppCacheService::DeleteHelper::OnGroupMadeObsolete(
141 appcache::AppCacheGroup* group, bool success) { 145 appcache::AppCacheGroup* group, bool success) {
142 CallCallback(success ? net::OK : net::ERR_FAILED); 146 CallCallback(success ? net::OK : net::ERR_FAILED);
143 delete this; 147 delete this;
144 } 148 }
145 149
150 // DeleteOriginHelper -------
151
152 class AppCacheService::DeleteOriginHelper : public AsyncHelper {
153 public:
154 DeleteOriginHelper(
155 AppCacheService* service, const GURL& origin,
156 net::CompletionCallback* callback)
157 : AsyncHelper(service, callback), origin_(origin),
158 successes_(0), failures_(0) {
159 }
160
161 virtual void Start() {
162 // We start by listing all caches, continues in OnAllInfo().
163 service_->storage()->GetAllInfo(this);
164 }
165
166 private:
167 // AppCacheStorage::Delegate methods
168 virtual void OnAllInfo(AppCacheInfoCollection* collection);
169 virtual void OnGroupLoaded(
170 appcache::AppCacheGroup* group, const GURL& manifest_url);
171 virtual void OnGroupMadeObsolete(
172 appcache::AppCacheGroup* group, bool success);
173
174 void CacheCompleted(bool success);
175
176 GURL origin_;
177 AppCacheInfoVector caches_to_delete_;
178 int successes_;
179 int failures_;
180 DISALLOW_COPY_AND_ASSIGN(DeleteOriginHelper);
181 };
182
183 void AppCacheService::DeleteOriginHelper::OnAllInfo(
184 AppCacheInfoCollection* collection) {
185 if (!collection) {
186 // Failed to get a listing.
187 CallCallback(net::ERR_FAILED);
188 delete this;
189 return;
190 }
191 std::map<GURL, AppCacheInfoVector>::iterator found =
192 collection->infos_by_origin.find(origin_);
193 if (found == collection->infos_by_origin.end() || found->second.empty()) {
194 // No caches for this origin.
195 CallCallback(net::OK);
196 delete this;
197 return;
198 }
199
200 // We have some caches to delete.
201 caches_to_delete_.swap(found->second);
202 successes_ = 0;
203 failures_ = 0;
204 for (AppCacheInfoVector::iterator iter = caches_to_delete_.begin();
205 iter != caches_to_delete_.end(); ++iter) {
206 service_->storage()->LoadOrCreateGroup(iter->manifest_url, this);
207 }
208 }
209
210 void AppCacheService::DeleteOriginHelper::OnGroupLoaded(
211 appcache::AppCacheGroup* group, const GURL& manifest_url) {
212 if (group) {
213 group->set_being_deleted(true);
214 group->CancelUpdate();
215 service_->storage()->MakeGroupObsolete(group, this);
216 } else {
217 CacheCompleted(false);
218 }
219 }
220
221 void AppCacheService::DeleteOriginHelper::OnGroupMadeObsolete(
222 appcache::AppCacheGroup* group, bool success) {
223 CacheCompleted(success);
224 }
225
226 void AppCacheService::DeleteOriginHelper::CacheCompleted(bool success) {
227 if (success)
228 ++successes_;
229 else
230 ++failures_;
231 if ((successes_ + failures_) < static_cast<int>(caches_to_delete_.size()))
232 return;
233
234 CallCallback(!failures_ ? net::OK : net::ERR_FAILED);
235 delete this;
236 }
237
238
146 // GetInfoHelper ------- 239 // GetInfoHelper -------
147 240
148 class AppCacheService::GetInfoHelper : AsyncHelper { 241 class AppCacheService::GetInfoHelper : AsyncHelper {
149 public: 242 public:
150 GetInfoHelper( 243 GetInfoHelper(
151 AppCacheService* service, AppCacheInfoCollection* collection, 244 AppCacheService* service, AppCacheInfoCollection* collection,
152 net::CompletionCallback* callback) 245 net::CompletionCallback* callback)
153 : AsyncHelper(service, callback), collection_(collection) { 246 : AsyncHelper(service, callback), collection_(collection) {
154 } 247 }
155 248
(...skipping 14 matching lines...) Expand all
170 if (collection) 263 if (collection)
171 collection->infos_by_origin.swap(collection_->infos_by_origin); 264 collection->infos_by_origin.swap(collection_->infos_by_origin);
172 CallCallback(collection ? net::OK : net::ERR_FAILED); 265 CallCallback(collection ? net::OK : net::ERR_FAILED);
173 delete this; 266 delete this;
174 } 267 }
175 268
176 269
177 // AppCacheService ------- 270 // AppCacheService -------
178 271
179 AppCacheService::AppCacheService(quota::QuotaManagerProxy* quota_manager_proxy) 272 AppCacheService::AppCacheService(quota::QuotaManagerProxy* quota_manager_proxy)
180 : appcache_policy_(NULL), quota_manager_proxy_(quota_manager_proxy), 273 : appcache_policy_(NULL), quota_client_(NULL),
274 quota_manager_proxy_(quota_manager_proxy),
181 request_context_(NULL) { 275 request_context_(NULL) {
182 // TODO(michaeln): Create and register our QuotaClient. 276 if (quota_manager_proxy_) {
277 quota_client_ = new AppCacheQuotaClient(this);
278 quota_manager_proxy_->RegisterClient(quota_client_);
279 }
183 } 280 }
184 281
185 AppCacheService::~AppCacheService() { 282 AppCacheService::~AppCacheService() {
186 DCHECK(backends_.empty()); 283 DCHECK(backends_.empty());
187 std::for_each(pending_helpers_.begin(), 284 std::for_each(pending_helpers_.begin(),
188 pending_helpers_.end(), 285 pending_helpers_.end(),
189 std::mem_fun(&AsyncHelper::Cancel)); 286 std::mem_fun(&AsyncHelper::Cancel));
190 STLDeleteElements(&pending_helpers_); 287 STLDeleteElements(&pending_helpers_);
288 if (quota_client_)
289 quota_client_->NotifyAppCacheDestroyed();
191 } 290 }
192 291
193 void AppCacheService::Initialize(const FilePath& cache_directory, 292 void AppCacheService::Initialize(const FilePath& cache_directory,
194 base::MessageLoopProxy* cache_thread) { 293 base::MessageLoopProxy* cache_thread) {
195 DCHECK(!storage_.get()); 294 DCHECK(!storage_.get());
196 AppCacheStorageImpl* storage = new AppCacheStorageImpl(this); 295 AppCacheStorageImpl* storage = new AppCacheStorageImpl(this);
197 storage->Initialize(cache_directory, cache_thread); 296 storage->Initialize(cache_directory, cache_thread);
198 storage_.reset(storage); 297 storage_.reset(storage);
199 } 298 }
200 299
(...skipping 11 matching lines...) Expand all
212 GetInfoHelper* helper = new GetInfoHelper(this, collection, callback); 311 GetInfoHelper* helper = new GetInfoHelper(this, collection, callback);
213 helper->Start(); 312 helper->Start();
214 } 313 }
215 314
216 void AppCacheService::DeleteAppCacheGroup(const GURL& manifest_url, 315 void AppCacheService::DeleteAppCacheGroup(const GURL& manifest_url,
217 net::CompletionCallback* callback) { 316 net::CompletionCallback* callback) {
218 DeleteHelper* helper = new DeleteHelper(this, manifest_url, callback); 317 DeleteHelper* helper = new DeleteHelper(this, manifest_url, callback);
219 helper->Start(); 318 helper->Start();
220 } 319 }
221 320
321 void AppCacheService::DeleteAppCachesForOrigin(
322 const GURL& origin, net::CompletionCallback* callback) {
323 DeleteOriginHelper* helper = new DeleteOriginHelper(this, origin, callback);
324 helper->Start();
325 }
326
222 void AppCacheService::set_special_storage_policy( 327 void AppCacheService::set_special_storage_policy(
223 quota::SpecialStoragePolicy* policy) { 328 quota::SpecialStoragePolicy* policy) {
224 special_storage_policy_ = policy; 329 special_storage_policy_ = policy;
225 } 330 }
226 331
227 void AppCacheService::RegisterBackend( 332 void AppCacheService::RegisterBackend(
228 AppCacheBackendImpl* backend_impl) { 333 AppCacheBackendImpl* backend_impl) {
229 DCHECK(backends_.find(backend_impl->process_id()) == backends_.end()); 334 DCHECK(backends_.find(backend_impl->process_id()) == backends_.end());
230 backends_.insert( 335 backends_.insert(
231 BackendMap::value_type(backend_impl->process_id(), backend_impl)); 336 BackendMap::value_type(backend_impl->process_id(), backend_impl));
232 } 337 }
233 338
234 void AppCacheService::UnregisterBackend( 339 void AppCacheService::UnregisterBackend(
235 AppCacheBackendImpl* backend_impl) { 340 AppCacheBackendImpl* backend_impl) {
236 backends_.erase(backend_impl->process_id()); 341 backends_.erase(backend_impl->process_id());
237 } 342 }
238 343
239 } // namespace appcache 344 } // namespace appcache
OLDNEW
« no previous file with comments | « webkit/appcache/appcache_service.h ('k') | webkit/appcache/appcache_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698