diff options
author | mnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-19 13:58:14 +0000 |
---|---|---|
committer | mnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-19 13:58:14 +0000 |
commit | be9324e03918d6c0591c844cd1a7a4d7b8f45452 (patch) | |
tree | 2e27427e0d337021c8575d3878f35dee855ed2be /webkit/quota/quota_manager.cc | |
parent | 8420c6fecff8b4ce7be0187cb2a7df0306594521 (diff) | |
download | chromium_src-be9324e03918d6c0591c844cd1a7a4d7b8f45452.zip chromium_src-be9324e03918d6c0591c844cd1a7a4d7b8f45452.tar.gz chromium_src-be9324e03918d6c0591c844cd1a7a4d7b8f45452.tar.bz2 |
QuotaManager: add a method to delete host data.
Added QuotaManager::DeleteHostData method that takes host name
and deletes data for all origins related to the host.
As it is planned to provide quota manager users with a list
of hosts, they would not be able to delete host data, as
currently it is only possible to delete data by origin.
R=kinuko@chromium.org
BUG=none
TEST=QuotaManagerTest.DeleteHostData*
Review URL: http://codereview.chromium.org/8349032
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@106278 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/quota/quota_manager.cc')
-rw-r--r-- | webkit/quota/quota_manager.cc | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/webkit/quota/quota_manager.cc b/webkit/quota/quota_manager.cc index 5392054..655dade 100644 --- a/webkit/quota/quota_manager.cc +++ b/webkit/quota/quota_manager.cc @@ -522,6 +522,101 @@ class QuotaManager::OriginDataDeleter : public QuotaTask { DISALLOW_COPY_AND_ASSIGN(OriginDataDeleter); }; +class QuotaManager::HostDataDeleter : public QuotaTask { + public: + HostDataDeleter(QuotaManager* manager, + const std::string& host, + StorageType type, + const StatusCallback& callback) + : QuotaTask(manager), + host_(host), + type_(type), + error_count_(0), + remaining_clients_(-1), + remaining_deleters_(-1), + callback_(callback), + weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} + + protected: + virtual void Run() OVERRIDE { + error_count_ = 0; + remaining_clients_ = manager()->clients_.size(); + for (QuotaClientList::iterator iter = manager()->clients_.begin(); + iter != manager()->clients_.end(); ++iter) { + (*iter)->GetOriginsForHost( + type_, host_, + base::Bind(&HostDataDeleter::DidGetOriginsForHost, + weak_factory_.GetWeakPtr())); + } + } + + virtual void Completed() OVERRIDE { + if (error_count_ == 0) { + callback_.Run(kQuotaStatusOk); + } else { + callback_.Run(kQuotaErrorInvalidModification); + } + DeleteSoon(); + } + + virtual void Aborted() OVERRIDE { + callback_.Run(kQuotaErrorAbort); + DeleteSoon(); + } + + void DidGetOriginsForHost(const std::set<GURL>& origins, StorageType type) { + DCHECK_GT(remaining_clients_, 0); + + origins_.insert(origins.begin(), origins.end()); + + if (--remaining_clients_ == 0) { + if (!origins_.empty()) + ScheduleOriginsDeletion(); + else + CallCompleted(); + } + } + + void ScheduleOriginsDeletion() { + remaining_deleters_ = origins_.size(); + for (std::set<GURL>::const_iterator p = origins_.begin(); + p != origins_.end(); + ++p) { + OriginDataDeleter* deleter = + new OriginDataDeleter( + manager(), *p, type_, + base::Bind(&HostDataDeleter::DidDeleteOriginData, + weak_factory_.GetWeakPtr())); + deleter->Start(); + } + } + + void DidDeleteOriginData(QuotaStatusCode status) { + DCHECK_GT(remaining_deleters_, 0); + + if (status != kQuotaStatusOk) + ++error_count_; + + if (--remaining_deleters_ == 0) + CallCompleted(); + } + + QuotaManager* manager() const { + return static_cast<QuotaManager*>(observer()); + } + + std::string host_; + StorageType type_; + std::set<GURL> origins_; + int error_count_; + int remaining_clients_; + int remaining_deleters_; + StatusCallback callback_; + + base::WeakPtrFactory<HostDataDeleter> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(HostDataDeleter); +}; + class QuotaManager::DatabaseTaskBase : public QuotaThreadTask { public: explicit DatabaseTaskBase(QuotaManager* manager) @@ -1233,6 +1328,22 @@ void QuotaManager::DeleteOriginData( deleter->Start(); } +void QuotaManager::DeleteHostData(const std::string& host, + StorageType type, + const StatusCallback& callback) { + + LazyInitialize(); + + if (host.empty() || clients_.empty()) { + callback.Run(kQuotaStatusOk); + return; + } + + HostDataDeleter* deleter = + new HostDataDeleter(this, host, type, callback); + deleter->Start(); +} + bool QuotaManager::ResetUsageTracker(StorageType type) { switch (type) { case kStorageTypeTemporary: |