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

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: Back from the dead! Created 8 years, 11 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) 2012 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
11 #include "base/bind.h" 11 #include "base/bind.h"
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 NOTREACHED(); 454 NOTREACHED();
455 } 455 }
456 return NULL; 456 return NULL;
457 } 457 }
458 458
459 class QuotaManager::OriginDataDeleter : public QuotaTask { 459 class QuotaManager::OriginDataDeleter : public QuotaTask {
460 public: 460 public:
461 OriginDataDeleter(QuotaManager* manager, 461 OriginDataDeleter(QuotaManager* manager,
462 const GURL& origin, 462 const GURL& origin,
463 StorageType type, 463 StorageType type,
464 int quota_client_mask,
464 const StatusCallback& callback) 465 const StatusCallback& callback)
465 : QuotaTask(manager), 466 : QuotaTask(manager),
466 origin_(origin), 467 origin_(origin),
467 type_(type), 468 type_(type),
469 quota_client_mask_(quota_client_mask),
468 error_count_(0), 470 error_count_(0),
469 remaining_clients_(-1), 471 remaining_clients_(-1),
472 skipped_clients_(0),
470 callback_(callback), 473 callback_(callback),
471 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} 474 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {}
472 475
473 protected: 476 protected:
474 virtual void Run() OVERRIDE { 477 virtual void Run() OVERRIDE {
475 error_count_ = 0; 478 error_count_ = 0;
476 remaining_clients_ = manager()->clients_.size(); 479 remaining_clients_ = manager()->clients_.size();
477 for (QuotaClientList::iterator iter = manager()->clients_.begin(); 480 for (QuotaClientList::iterator iter = manager()->clients_.begin();
478 iter != manager()->clients_.end(); ++iter) { 481 iter != manager()->clients_.end(); ++iter) {
479 (*iter)->DeleteOriginData( 482 if (quota_client_mask_ & (*iter)->id() ||
480 origin_, type_, 483 quota_client_mask_ == QuotaClient::kAllClientsMask) {
michaeln 2012/01/18 23:07:48 is the second condition needed or will the first e
Mike West 2012/01/19 13:09:11 In an earlier review, Kinuko suggested using -1 fo
kinuko 2012/01/19 13:53:11 If quota_client_mask_ is kAllClientsMask (-1) the
Mike West 2012/01/19 16:51:00 ... I need to go back to bitwise-school. You're ri
481 base::Bind(&OriginDataDeleter::DidDeleteOriginData, 484 (*iter)->DeleteOriginData(
482 weak_factory_.GetWeakPtr())); 485 origin_, type_,
486 base::Bind(&OriginDataDeleter::DidDeleteOriginData,
487 weak_factory_.GetWeakPtr()));
488 } else {
489 ++skipped_clients_;
490 if (--remaining_clients_ == 0)
491 CallCompleted();
492 }
483 } 493 }
484 } 494 }
485 495
486 virtual void Completed() OVERRIDE { 496 virtual void Completed() OVERRIDE {
487 if (error_count_ == 0) { 497 if (error_count_ == 0) {
488 manager()->DeleteOriginFromDatabase(origin_, type_); 498 // Only remove the entire origin if we didn't skip any client types.
499 if (skipped_clients_ == 0)
500 manager()->DeleteOriginFromDatabase(origin_, type_);
489 callback_.Run(kQuotaStatusOk); 501 callback_.Run(kQuotaStatusOk);
490 } else { 502 } else {
491 callback_.Run(kQuotaErrorInvalidModification); 503 callback_.Run(kQuotaErrorInvalidModification);
492 } 504 }
493 DeleteSoon(); 505 DeleteSoon();
494 } 506 }
495 507
496 virtual void Aborted() OVERRIDE { 508 virtual void Aborted() OVERRIDE {
497 callback_.Run(kQuotaErrorAbort); 509 callback_.Run(kQuotaErrorAbort);
498 DeleteSoon(); 510 DeleteSoon();
499 } 511 }
500 512
501 void DidDeleteOriginData(QuotaStatusCode status) { 513 void DidDeleteOriginData(QuotaStatusCode status) {
502 DCHECK_GT(remaining_clients_, 0); 514 DCHECK_GT(remaining_clients_, 0);
503 515
504 if (status != kQuotaStatusOk) 516 if (status != kQuotaStatusOk)
505 ++error_count_; 517 ++error_count_;
506 518
507 if (--remaining_clients_ == 0) 519 if (--remaining_clients_ == 0)
508 CallCompleted(); 520 CallCompleted();
509 } 521 }
510 522
511 QuotaManager* manager() const { 523 QuotaManager* manager() const {
512 return static_cast<QuotaManager*>(observer()); 524 return static_cast<QuotaManager*>(observer());
513 } 525 }
514 526
515 GURL origin_; 527 GURL origin_;
516 StorageType type_; 528 StorageType type_;
529 int quota_client_mask_;
517 int error_count_; 530 int error_count_;
518 int remaining_clients_; 531 int remaining_clients_;
532 int skipped_clients_;
519 StatusCallback callback_; 533 StatusCallback callback_;
520 534
521 base::WeakPtrFactory<OriginDataDeleter> weak_factory_; 535 base::WeakPtrFactory<OriginDataDeleter> weak_factory_;
522 DISALLOW_COPY_AND_ASSIGN(OriginDataDeleter); 536 DISALLOW_COPY_AND_ASSIGN(OriginDataDeleter);
523 }; 537 };
524 538
525 class QuotaManager::HostDataDeleter : public QuotaTask { 539 class QuotaManager::HostDataDeleter : public QuotaTask {
526 public: 540 public:
527 HostDataDeleter(QuotaManager* manager, 541 HostDataDeleter(QuotaManager* manager,
528 const std::string& host, 542 const std::string& host,
529 StorageType type, 543 StorageType type,
544 int quota_client_mask,
530 const StatusCallback& callback) 545 const StatusCallback& callback)
531 : QuotaTask(manager), 546 : QuotaTask(manager),
532 host_(host), 547 host_(host),
533 type_(type), 548 type_(type),
549 quota_client_mask_(quota_client_mask),
534 error_count_(0), 550 error_count_(0),
535 remaining_clients_(-1), 551 remaining_clients_(-1),
536 remaining_deleters_(-1), 552 remaining_deleters_(-1),
537 callback_(callback), 553 callback_(callback),
538 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} 554 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {}
539 555
540 protected: 556 protected:
541 virtual void Run() OVERRIDE { 557 virtual void Run() OVERRIDE {
542 error_count_ = 0; 558 error_count_ = 0;
543 remaining_clients_ = manager()->clients_.size(); 559 remaining_clients_ = manager()->clients_.size();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 } 593 }
578 } 594 }
579 595
580 void ScheduleOriginsDeletion() { 596 void ScheduleOriginsDeletion() {
581 remaining_deleters_ = origins_.size(); 597 remaining_deleters_ = origins_.size();
582 for (std::set<GURL>::const_iterator p = origins_.begin(); 598 for (std::set<GURL>::const_iterator p = origins_.begin();
583 p != origins_.end(); 599 p != origins_.end();
584 ++p) { 600 ++p) {
585 OriginDataDeleter* deleter = 601 OriginDataDeleter* deleter =
586 new OriginDataDeleter( 602 new OriginDataDeleter(
587 manager(), *p, type_, 603 manager(), *p, type_, quota_client_mask_,
588 base::Bind(&HostDataDeleter::DidDeleteOriginData, 604 base::Bind(&HostDataDeleter::DidDeleteOriginData,
589 weak_factory_.GetWeakPtr())); 605 weak_factory_.GetWeakPtr()));
590 deleter->Start(); 606 deleter->Start();
591 } 607 }
592 } 608 }
593 609
594 void DidDeleteOriginData(QuotaStatusCode status) { 610 void DidDeleteOriginData(QuotaStatusCode status) {
595 DCHECK_GT(remaining_deleters_, 0); 611 DCHECK_GT(remaining_deleters_, 0);
596 612
597 if (status != kQuotaStatusOk) 613 if (status != kQuotaStatusOk)
598 ++error_count_; 614 ++error_count_;
599 615
600 if (--remaining_deleters_ == 0) 616 if (--remaining_deleters_ == 0)
601 CallCompleted(); 617 CallCompleted();
602 } 618 }
603 619
604 QuotaManager* manager() const { 620 QuotaManager* manager() const {
605 return static_cast<QuotaManager*>(observer()); 621 return static_cast<QuotaManager*>(observer());
606 } 622 }
607 623
608 std::string host_; 624 std::string host_;
609 StorageType type_; 625 StorageType type_;
626 int quota_client_mask_;
610 std::set<GURL> origins_; 627 std::set<GURL> origins_;
611 int error_count_; 628 int error_count_;
612 int remaining_clients_; 629 int remaining_clients_;
613 int remaining_deleters_; 630 int remaining_deleters_;
614 StatusCallback callback_; 631 StatusCallback callback_;
615 632
616 base::WeakPtrFactory<HostDataDeleter> weak_factory_; 633 base::WeakPtrFactory<HostDataDeleter> weak_factory_;
617 DISALLOW_COPY_AND_ASSIGN(HostDataDeleter); 634 DISALLOW_COPY_AND_ASSIGN(HostDataDeleter);
618 }; 635 };
619 636
(...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after
1306 1323
1307 void QuotaManager::NotifyOriginNoLongerInUse(const GURL& origin) { 1324 void QuotaManager::NotifyOriginNoLongerInUse(const GURL& origin) {
1308 DCHECK(io_thread_->BelongsToCurrentThread()); 1325 DCHECK(io_thread_->BelongsToCurrentThread());
1309 DCHECK(IsOriginInUse(origin)); 1326 DCHECK(IsOriginInUse(origin));
1310 int& count = origins_in_use_[origin]; 1327 int& count = origins_in_use_[origin];
1311 if (--count == 0) 1328 if (--count == 0)
1312 origins_in_use_.erase(origin); 1329 origins_in_use_.erase(origin);
1313 } 1330 }
1314 1331
1315 void QuotaManager::DeleteOriginData( 1332 void QuotaManager::DeleteOriginData(
1316 const GURL& origin, StorageType type, const StatusCallback& callback) { 1333 const GURL& origin, StorageType type, int quota_client_mask,
1334 const StatusCallback& callback) {
1317 LazyInitialize(); 1335 LazyInitialize();
1318 1336
1319 if (origin.is_empty() || clients_.empty()) { 1337 if (origin.is_empty() || clients_.empty() ||
1338 quota_client_mask == QuotaClient::kUnknown) {
1320 callback.Run(kQuotaStatusOk); 1339 callback.Run(kQuotaStatusOk);
1321 return; 1340 return;
1322 } 1341 }
1323 1342
1324 OriginDataDeleter* deleter = 1343 OriginDataDeleter* deleter =
1325 new OriginDataDeleter(this, origin, type, callback); 1344 new OriginDataDeleter(this, origin, type, quota_client_mask, callback);
1326 deleter->Start(); 1345 deleter->Start();
1327 } 1346 }
1328 1347
1329 void QuotaManager::DeleteHostData(const std::string& host, 1348 void QuotaManager::DeleteHostData(const std::string& host,
1330 StorageType type, 1349 StorageType type,
1350 int quota_client_mask,
1331 const StatusCallback& callback) { 1351 const StatusCallback& callback) {
1332 1352
1333 LazyInitialize(); 1353 LazyInitialize();
1334 1354
1335 if (host.empty() || clients_.empty()) { 1355 if (host.empty() || clients_.empty()) {
1336 callback.Run(kQuotaStatusOk); 1356 callback.Run(kQuotaStatusOk);
1337 return; 1357 return;
1338 } 1358 }
1339 1359
1340 HostDataDeleter* deleter = 1360 HostDataDeleter* deleter =
1341 new HostDataDeleter(this, host, type, callback); 1361 new HostDataDeleter(this, host, type, quota_client_mask, callback);
1342 deleter->Start(); 1362 deleter->Start();
1343 } 1363 }
1344 1364
1345 bool QuotaManager::ResetUsageTracker(StorageType type) { 1365 bool QuotaManager::ResetUsageTracker(StorageType type) {
1346 switch (type) { 1366 switch (type) {
1347 case kStorageTypeTemporary: 1367 case kStorageTypeTemporary:
1348 if (temporary_usage_tracker_->IsWorking()) 1368 if (temporary_usage_tracker_->IsWorking())
1349 return false; 1369 return false;
1350 temporary_usage_tracker_.reset( 1370 temporary_usage_tracker_.reset(
1351 new UsageTracker(clients_, kStorageTypeTemporary, 1371 new UsageTracker(clients_, kStorageTypeTemporary,
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
1520 const GURL& origin, 1540 const GURL& origin,
1521 StorageType type, 1541 StorageType type,
1522 const EvictOriginDataCallback& callback) { 1542 const EvictOriginDataCallback& callback) {
1523 DCHECK(io_thread_->BelongsToCurrentThread()); 1543 DCHECK(io_thread_->BelongsToCurrentThread());
1524 DCHECK_EQ(type, kStorageTypeTemporary); 1544 DCHECK_EQ(type, kStorageTypeTemporary);
1525 1545
1526 eviction_context_.evicted_origin = origin; 1546 eviction_context_.evicted_origin = origin;
1527 eviction_context_.evicted_type = type; 1547 eviction_context_.evicted_type = type;
1528 eviction_context_.evict_origin_data_callback = callback; 1548 eviction_context_.evict_origin_data_callback = callback;
1529 1549
1530 DeleteOriginData(origin, type, 1550
1551 DeleteOriginData(origin, type, QuotaClient::kAllClientsMask,
1531 base::Bind(&QuotaManager::DidOriginDataEvicted, 1552 base::Bind(&QuotaManager::DidOriginDataEvicted,
1532 weak_factory_.GetWeakPtr())); 1553 weak_factory_.GetWeakPtr()));
1533 } 1554 }
1534 1555
1535 void QuotaManager::GetUsageAndQuotaForEviction( 1556 void QuotaManager::GetUsageAndQuotaForEviction(
1536 const GetUsageAndQuotaForEvictionCallback& callback) { 1557 const GetUsageAndQuotaForEvictionCallback& callback) {
1537 DCHECK(io_thread_->BelongsToCurrentThread()); 1558 DCHECK(io_thread_->BelongsToCurrentThread());
1538 GetUsageAndQuotaInternal( 1559 GetUsageAndQuotaInternal(
1539 GURL(), kStorageTypeTemporary, true /* global */, callback); 1560 GURL(), kStorageTypeTemporary, true /* global */, callback);
1540 } 1561 }
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
1745 1766
1746 QuotaManagerProxy::QuotaManagerProxy( 1767 QuotaManagerProxy::QuotaManagerProxy(
1747 QuotaManager* manager, base::MessageLoopProxy* io_thread) 1768 QuotaManager* manager, base::MessageLoopProxy* io_thread)
1748 : manager_(manager), io_thread_(io_thread) { 1769 : manager_(manager), io_thread_(io_thread) {
1749 } 1770 }
1750 1771
1751 QuotaManagerProxy::~QuotaManagerProxy() { 1772 QuotaManagerProxy::~QuotaManagerProxy() {
1752 } 1773 }
1753 1774
1754 } // namespace quota 1775 } // namespace quota
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698