summaryrefslogtreecommitdiffstats
path: root/webkit/quota/quota_manager.cc
diff options
context:
space:
mode:
authormnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-19 13:58:14 +0000
committermnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-19 13:58:14 +0000
commitbe9324e03918d6c0591c844cd1a7a4d7b8f45452 (patch)
tree2e27427e0d337021c8575d3878f35dee855ed2be /webkit/quota/quota_manager.cc
parent8420c6fecff8b4ce7be0187cb2a7df0306594521 (diff)
downloadchromium_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.cc111
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: