Index: webkit/appcache/appcache_service.cc |
=================================================================== |
--- webkit/appcache/appcache_service.cc (revision 88615) |
+++ webkit/appcache/appcache_service.cc (working copy) |
@@ -9,6 +9,7 @@ |
#include "base/stl_util-inl.h" |
#include "webkit/appcache/appcache_backend_impl.h" |
#include "webkit/appcache/appcache_entry.h" |
+#include "webkit/appcache/appcache_quota_client.h" |
#include "webkit/appcache/appcache_storage_impl.h" |
#include "webkit/quota/quota_manager.h" |
#include "webkit/quota/special_storage_policy.h" |
@@ -58,7 +59,10 @@ |
}; |
void AppCacheService::AsyncHelper::Cancel() { |
- CallCallback(net::ERR_ABORTED); |
+ if (callback_) { |
+ callback_->Run(net::ERR_ABORTED); |
+ callback_ = NULL; |
+ } |
service_->storage()->CancelDelegateCallbacks(this); |
service_ = NULL; |
} |
@@ -143,6 +147,95 @@ |
delete this; |
} |
+// DeleteOriginHelper ------- |
+ |
+class AppCacheService::DeleteOriginHelper : public AsyncHelper { |
+ public: |
+ DeleteOriginHelper( |
+ AppCacheService* service, const GURL& origin, |
+ net::CompletionCallback* callback) |
+ : AsyncHelper(service, callback), origin_(origin), |
+ successes_(0), failures_(0) { |
+ } |
+ |
+ virtual void Start() { |
+ // We start by listing all caches, continues in OnAllInfo(). |
+ service_->storage()->GetAllInfo(this); |
+ } |
+ |
+ private: |
+ // AppCacheStorage::Delegate methods |
+ virtual void OnAllInfo(AppCacheInfoCollection* collection); |
+ virtual void OnGroupLoaded( |
+ appcache::AppCacheGroup* group, const GURL& manifest_url); |
+ virtual void OnGroupMadeObsolete( |
+ appcache::AppCacheGroup* group, bool success); |
+ |
+ void CacheCompleted(bool success); |
+ |
+ GURL origin_; |
+ AppCacheInfoVector caches_to_delete_; |
+ int successes_; |
+ int failures_; |
+ DISALLOW_COPY_AND_ASSIGN(DeleteOriginHelper); |
+}; |
+ |
+void AppCacheService::DeleteOriginHelper::OnAllInfo( |
+ AppCacheInfoCollection* collection) { |
+ if (!collection) { |
+ // Failed to get a listing. |
+ CallCallback(net::ERR_FAILED); |
+ delete this; |
+ return; |
+ } |
+ std::map<GURL, AppCacheInfoVector>::iterator found = |
+ collection->infos_by_origin.find(origin_); |
+ if (found == collection->infos_by_origin.end() || found->second.empty()) { |
+ // No caches for this origin. |
+ CallCallback(net::OK); |
+ delete this; |
+ return; |
+ } |
+ |
+ // We have some caches to delete. |
+ caches_to_delete_.swap(found->second); |
+ successes_ = 0; |
+ failures_ = 0; |
+ for (AppCacheInfoVector::iterator iter = caches_to_delete_.begin(); |
+ iter != caches_to_delete_.end(); ++iter) { |
+ service_->storage()->LoadOrCreateGroup(iter->manifest_url, this); |
+ } |
+} |
+ |
+void AppCacheService::DeleteOriginHelper::OnGroupLoaded( |
+ appcache::AppCacheGroup* group, const GURL& manifest_url) { |
+ if (group) { |
+ group->set_being_deleted(true); |
+ group->CancelUpdate(); |
+ service_->storage()->MakeGroupObsolete(group, this); |
+ } else { |
+ CacheCompleted(false); |
+ } |
+} |
+ |
+void AppCacheService::DeleteOriginHelper::OnGroupMadeObsolete( |
+ appcache::AppCacheGroup* group, bool success) { |
+ CacheCompleted(success); |
+} |
+ |
+void AppCacheService::DeleteOriginHelper::CacheCompleted(bool success) { |
+ if (success) |
+ ++successes_; |
+ else |
+ ++failures_; |
+ if ((successes_ + failures_) < static_cast<int>(caches_to_delete_.size())) |
+ return; |
+ |
+ CallCallback(!failures_ ? net::OK : net::ERR_FAILED); |
+ delete this; |
+} |
+ |
+ |
// GetInfoHelper ------- |
class AppCacheService::GetInfoHelper : AsyncHelper { |
@@ -177,9 +270,13 @@ |
// AppCacheService ------- |
AppCacheService::AppCacheService(quota::QuotaManagerProxy* quota_manager_proxy) |
- : appcache_policy_(NULL), quota_manager_proxy_(quota_manager_proxy), |
+ : appcache_policy_(NULL), quota_client_(NULL), |
+ quota_manager_proxy_(quota_manager_proxy), |
request_context_(NULL) { |
- // TODO(michaeln): Create and register our QuotaClient. |
+ if (quota_manager_proxy_) { |
+ quota_client_ = new AppCacheQuotaClient(this); |
+ quota_manager_proxy_->RegisterClient(quota_client_); |
+ } |
} |
AppCacheService::~AppCacheService() { |
@@ -188,6 +285,8 @@ |
pending_helpers_.end(), |
std::mem_fun(&AsyncHelper::Cancel)); |
STLDeleteElements(&pending_helpers_); |
+ if (quota_client_) |
+ quota_client_->NotifyAppCacheDestroyed(); |
} |
void AppCacheService::Initialize(const FilePath& cache_directory, |
@@ -219,6 +318,12 @@ |
helper->Start(); |
} |
+void AppCacheService::DeleteAppCachesForOrigin( |
+ const GURL& origin, net::CompletionCallback* callback) { |
+ DeleteOriginHelper* helper = new DeleteOriginHelper(this, origin, callback); |
+ helper->Start(); |
+} |
+ |
void AppCacheService::set_special_storage_policy( |
quota::SpecialStoragePolicy* policy) { |
special_storage_policy_ = policy; |