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

Side by Side Diff: webkit/quota/quota_manager.cc

Issue 7839029: QuotaManager::DeleteOriginData now allows deletion of specific QuotaClients (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 3 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
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/quota/quota_manager.h" 5 #include "webkit/quota/quota_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <deque> 8 #include <deque>
9 #include <set> 9 #include <set>
10 10
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 NOTREACHED(); 372 NOTREACHED();
373 } 373 }
374 return NULL; 374 return NULL;
375 } 375 }
376 376
377 class QuotaManager::OriginDataDeleter : public QuotaTask { 377 class QuotaManager::OriginDataDeleter : public QuotaTask {
378 public: 378 public:
379 OriginDataDeleter(QuotaManager* manager, 379 OriginDataDeleter(QuotaManager* manager,
380 const GURL& origin, 380 const GURL& origin,
381 StorageType type, 381 StorageType type,
382 int quota_client_mask,
382 StatusCallback* callback) 383 StatusCallback* callback)
383 : QuotaTask(manager), 384 : QuotaTask(manager),
384 origin_(origin), 385 origin_(origin),
385 type_(type), 386 type_(type),
387 quota_client_mask_(quota_client_mask),
386 error_count_(0), 388 error_count_(0),
387 remaining_clients_(-1), 389 remaining_clients_(-1),
390 skipped_clients_(0),
388 callback_(callback), 391 callback_(callback),
389 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} 392 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {}
390 393
391 protected: 394 protected:
392 virtual void Run() OVERRIDE { 395 virtual void Run() OVERRIDE {
393 error_count_ = 0; 396 error_count_ = 0;
394 remaining_clients_ = manager()->clients_.size(); 397 remaining_clients_ = manager()->clients_.size();
395 for (QuotaClientList::iterator iter = manager()->clients_.begin(); 398 for (QuotaClientList::iterator iter = manager()->clients_.begin();
396 iter != manager()->clients_.end(); ++iter) { 399 iter != manager()->clients_.end(); ++iter) {
397 (*iter)->DeleteOriginData(origin_, type_, callback_factory_.NewCallback( 400 if (quota_client_mask_ & (*iter)->id()) {
398 &OriginDataDeleter::DidDeleteOriginData)); 401 (*iter)->DeleteOriginData(origin_, type_, callback_factory_.NewCallback(
402 &OriginDataDeleter::DidDeleteOriginData));
403 } else {
404 ++skipped_clients_;
405 if (--remaining_clients_ == 0)
406 CallCompleted();
407 }
399 } 408 }
400 } 409 }
401 410
402 virtual void Completed() OVERRIDE { 411 virtual void Completed() OVERRIDE {
403 if (error_count_ == 0) { 412 if (error_count_ == 0) {
404 manager()->DeleteOriginFromDatabase(origin_, type_); 413 if (remaining_clients_ == 0)
414 manager()->DeleteOriginFromDatabase(origin_, type_);
405 callback_->Run(kQuotaStatusOk); 415 callback_->Run(kQuotaStatusOk);
406 } else { 416 } else {
407 callback_->Run(kQuotaErrorInvalidModification); 417 callback_->Run(kQuotaErrorInvalidModification);
408 } 418 }
409 DeleteSoon(); 419 DeleteSoon();
410 } 420 }
411 421
412 virtual void Aborted() OVERRIDE { 422 virtual void Aborted() OVERRIDE {
413 callback_->Run(kQuotaErrorAbort); 423 callback_->Run(kQuotaErrorAbort);
414 DeleteSoon(); 424 DeleteSoon();
415 } 425 }
416 426
417 void DidDeleteOriginData(QuotaStatusCode status) { 427 void DidDeleteOriginData(QuotaStatusCode status) {
418 DCHECK_GT(remaining_clients_, 0); 428 DCHECK_GT(remaining_clients_, 0);
419 429
420 if (status != kQuotaStatusOk) 430 if (status != kQuotaStatusOk)
421 ++error_count_; 431 ++error_count_;
422 432
423 if (--remaining_clients_ == 0) 433 if (--remaining_clients_ == 0)
424 CallCompleted(); 434 CallCompleted();
425 } 435 }
426 436
427 QuotaManager* manager() const { 437 QuotaManager* manager() const {
428 return static_cast<QuotaManager*>(observer()); 438 return static_cast<QuotaManager*>(observer());
429 } 439 }
430 440
431 GURL origin_; 441 GURL origin_;
432 StorageType type_; 442 StorageType type_;
443 int quota_client_mask_;
433 int error_count_; 444 int error_count_;
434 int remaining_clients_; 445 int remaining_clients_;
446 int skipped_clients_;
435 scoped_ptr<StatusCallback> callback_; 447 scoped_ptr<StatusCallback> callback_;
436 448
437 ScopedCallbackFactory<OriginDataDeleter> callback_factory_; 449 ScopedCallbackFactory<OriginDataDeleter> callback_factory_;
438 DISALLOW_COPY_AND_ASSIGN(OriginDataDeleter); 450 DISALLOW_COPY_AND_ASSIGN(OriginDataDeleter);
439 }; 451 };
440 452
441 class QuotaManager::DatabaseTaskBase : public QuotaThreadTask { 453 class QuotaManager::DatabaseTaskBase : public QuotaThreadTask {
442 public: 454 public:
443 explicit DatabaseTaskBase(QuotaManager* manager) 455 explicit DatabaseTaskBase(QuotaManager* manager)
444 : QuotaThreadTask(manager, manager->db_thread_), 456 : QuotaThreadTask(manager, manager->db_thread_),
(...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after
1159 } 1171 }
1160 1172
1161 void QuotaManager::NotifyOriginNoLongerInUse(const GURL& origin) { 1173 void QuotaManager::NotifyOriginNoLongerInUse(const GURL& origin) {
1162 DCHECK(io_thread_->BelongsToCurrentThread()); 1174 DCHECK(io_thread_->BelongsToCurrentThread());
1163 DCHECK(IsOriginInUse(origin)); 1175 DCHECK(IsOriginInUse(origin));
1164 int& count = origins_in_use_[origin]; 1176 int& count = origins_in_use_[origin];
1165 if (--count == 0) 1177 if (--count == 0)
1166 origins_in_use_.erase(origin); 1178 origins_in_use_.erase(origin);
1167 } 1179 }
1168 1180
1169 void QuotaManager::DeleteOriginData( 1181 void QuotaManager::DeleteOriginData(const GURL& origin, StorageType type,
1170 const GURL& origin, StorageType type, StatusCallback* callback) { 1182 int quota_client_mask, StatusCallback* callback) {
1171 LazyInitialize(); 1183 LazyInitialize();
1172 1184
1173 if (origin.is_empty() || clients_.empty()) { 1185 if (origin.is_empty() || clients_.empty() ||
1186 quota_client_mask == QuotaClient::kUnknown) {
1174 callback->Run(kQuotaStatusOk); 1187 callback->Run(kQuotaStatusOk);
1175 delete callback; 1188 delete callback;
1176 return; 1189 return;
1177 } 1190 }
1178 1191
1179 OriginDataDeleter* deleter = 1192 OriginDataDeleter* deleter =
1180 new OriginDataDeleter(this, origin, type, callback); 1193 new OriginDataDeleter(this, origin, type, quota_client_mask, callback);
1181 deleter->Start(); 1194 deleter->Start();
1182 } 1195 }
1183 1196
1184 bool QuotaManager::ResetUsageTracker(StorageType type) { 1197 bool QuotaManager::ResetUsageTracker(StorageType type) {
1185 switch (type) { 1198 switch (type) {
1186 case kStorageTypeTemporary: 1199 case kStorageTypeTemporary:
1187 if (temporary_usage_tracker_->IsWorking()) 1200 if (temporary_usage_tracker_->IsWorking())
1188 return false; 1201 return false;
1189 temporary_usage_tracker_.reset( 1202 temporary_usage_tracker_.reset(
1190 new UsageTracker(clients_, kStorageTypeTemporary, 1203 new UsageTracker(clients_, kStorageTypeTemporary,
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
1320 const GURL& origin, 1333 const GURL& origin,
1321 StorageType type, 1334 StorageType type,
1322 EvictOriginDataCallback* callback) { 1335 EvictOriginDataCallback* callback) {
1323 DCHECK(io_thread_->BelongsToCurrentThread()); 1336 DCHECK(io_thread_->BelongsToCurrentThread());
1324 DCHECK_EQ(type, kStorageTypeTemporary); 1337 DCHECK_EQ(type, kStorageTypeTemporary);
1325 1338
1326 eviction_context_.evicted_origin = origin; 1339 eviction_context_.evicted_origin = origin;
1327 eviction_context_.evicted_type = type; 1340 eviction_context_.evicted_type = type;
1328 eviction_context_.evict_origin_data_callback.reset(callback); 1341 eviction_context_.evict_origin_data_callback.reset(callback);
1329 1342
1330 DeleteOriginData(origin, type, callback_factory_.NewCallback( 1343 DeleteOriginData(origin, type, QuotaClient::kAllClientsMask,
1331 &QuotaManager::DidOriginDataEvicted)); 1344 callback_factory_.NewCallback(&QuotaManager::DidOriginDataEvicted));
1332 } 1345 }
1333 1346
1334 void QuotaManager::DidGetAvailableSpaceForEviction( 1347 void QuotaManager::DidGetAvailableSpaceForEviction(
1335 QuotaStatusCode status, 1348 QuotaStatusCode status,
1336 int64 available_space) { 1349 int64 available_space) {
1337 eviction_context_.get_usage_and_quota_callback->Run(status, 1350 eviction_context_.get_usage_and_quota_callback->Run(status,
1338 eviction_context_.usage, 1351 eviction_context_.usage,
1339 eviction_context_.unlimited_usage, 1352 eviction_context_.unlimited_usage,
1340 eviction_context_.quota, available_space); 1353 eviction_context_.quota, available_space);
1341 eviction_context_.get_usage_and_quota_callback.reset(); 1354 eviction_context_.get_usage_and_quota_callback.reset();
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1567 1580
1568 QuotaManagerProxy::QuotaManagerProxy( 1581 QuotaManagerProxy::QuotaManagerProxy(
1569 QuotaManager* manager, base::MessageLoopProxy* io_thread) 1582 QuotaManager* manager, base::MessageLoopProxy* io_thread)
1570 : manager_(manager), io_thread_(io_thread) { 1583 : manager_(manager), io_thread_(io_thread) {
1571 } 1584 }
1572 1585
1573 QuotaManagerProxy::~QuotaManagerProxy() { 1586 QuotaManagerProxy::~QuotaManagerProxy() {
1574 } 1587 }
1575 1588
1576 } // namespace quota 1589 } // namespace quota
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698