Index: webkit/quota/quota_manager.cc |
diff --git a/webkit/quota/quota_manager.cc b/webkit/quota/quota_manager.cc |
index 60d7c323c682683a8c2b5fb6e90c7854c5c33eb2..cbfede0be0820a743480e9edee845d1f700272bb 100644 |
--- a/webkit/quota/quota_manager.cc |
+++ b/webkit/quota/quota_manager.cc |
@@ -379,12 +379,15 @@ class QuotaManager::OriginDataDeleter : public QuotaTask { |
OriginDataDeleter(QuotaManager* manager, |
const GURL& origin, |
StorageType type, |
+ int quota_client_mask, |
StatusCallback* callback) |
: QuotaTask(manager), |
origin_(origin), |
type_(type), |
+ quota_client_mask_(quota_client_mask), |
error_count_(0), |
remaining_clients_(-1), |
+ skipped_clients_(0), |
callback_(callback), |
callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} |
@@ -394,14 +397,21 @@ class QuotaManager::OriginDataDeleter : public QuotaTask { |
remaining_clients_ = manager()->clients_.size(); |
for (QuotaClientList::iterator iter = manager()->clients_.begin(); |
iter != manager()->clients_.end(); ++iter) { |
- (*iter)->DeleteOriginData(origin_, type_, callback_factory_.NewCallback( |
- &OriginDataDeleter::DidDeleteOriginData)); |
+ if (quota_client_mask_ & (*iter)->id()) { |
+ (*iter)->DeleteOriginData(origin_, type_, callback_factory_.NewCallback( |
+ &OriginDataDeleter::DidDeleteOriginData)); |
+ } else { |
+ ++skipped_clients_; |
+ if (--remaining_clients_ == 0) |
+ CallCompleted(); |
+ } |
} |
} |
virtual void Completed() OVERRIDE { |
if (error_count_ == 0) { |
- manager()->DeleteOriginFromDatabase(origin_, type_); |
+ if (remaining_clients_ == 0) |
+ manager()->DeleteOriginFromDatabase(origin_, type_); |
callback_->Run(kQuotaStatusOk); |
} else { |
callback_->Run(kQuotaErrorInvalidModification); |
@@ -430,8 +440,10 @@ class QuotaManager::OriginDataDeleter : public QuotaTask { |
GURL origin_; |
StorageType type_; |
+ int quota_client_mask_; |
int error_count_; |
int remaining_clients_; |
+ int skipped_clients_; |
scoped_ptr<StatusCallback> callback_; |
ScopedCallbackFactory<OriginDataDeleter> callback_factory_; |
@@ -1166,18 +1178,19 @@ void QuotaManager::NotifyOriginNoLongerInUse(const GURL& origin) { |
origins_in_use_.erase(origin); |
} |
-void QuotaManager::DeleteOriginData( |
- const GURL& origin, StorageType type, StatusCallback* callback) { |
+void QuotaManager::DeleteOriginData(const GURL& origin, StorageType type, |
+ int quota_client_mask, StatusCallback* callback) { |
LazyInitialize(); |
- if (origin.is_empty() || clients_.empty()) { |
+ if (origin.is_empty() || clients_.empty() || |
+ quota_client_mask == QuotaClient::kUnknown) { |
callback->Run(kQuotaStatusOk); |
delete callback; |
return; |
} |
OriginDataDeleter* deleter = |
- new OriginDataDeleter(this, origin, type, callback); |
+ new OriginDataDeleter(this, origin, type, quota_client_mask, callback); |
deleter->Start(); |
} |
@@ -1327,8 +1340,8 @@ void QuotaManager::EvictOriginData( |
eviction_context_.evicted_type = type; |
eviction_context_.evict_origin_data_callback.reset(callback); |
- DeleteOriginData(origin, type, callback_factory_.NewCallback( |
- &QuotaManager::DidOriginDataEvicted)); |
+ DeleteOriginData(origin, type, QuotaClient::kAllClientsMask, |
+ callback_factory_.NewCallback(&QuotaManager::DidOriginDataEvicted)); |
} |
void QuotaManager::DidGetAvailableSpaceForEviction( |