diff options
author | dmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-18 09:52:24 +0000 |
---|---|---|
committer | dmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-18 09:52:24 +0000 |
commit | e05500525e82f823cf9a7a48ab01fe6c26621d50 (patch) | |
tree | affb2f9f9adfc042690f8a1f08b2b9c89d64dea8 /webkit | |
parent | 051dd1f34e3c0ea11808b5de5f373572e37c511a (diff) | |
download | chromium_src-e05500525e82f823cf9a7a48ab01fe6c26621d50.zip chromium_src-e05500525e82f823cf9a7a48ab01fe6c26621d50.tar.gz chromium_src-e05500525e82f823cf9a7a48ab01fe6c26621d50.tar.bz2 |
Implement EvictOriginData in QuotaManager.
BUG=61676
TEST=QuotaManagerTest.EvictOriginData
Review URL: http://codereview.chromium.org/7029007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@85750 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r-- | webkit/quota/quota_manager.cc | 48 | ||||
-rw-r--r-- | webkit/quota/quota_manager.h | 9 | ||||
-rw-r--r-- | webkit/quota/quota_manager_unittest.cc | 69 |
3 files changed, 120 insertions, 6 deletions
diff --git a/webkit/quota/quota_manager.cc b/webkit/quota/quota_manager.cc index 6bd37bd..ecfdef54 100644 --- a/webkit/quota/quota_manager.cc +++ b/webkit/quota/quota_manager.cc @@ -524,7 +524,10 @@ QuotaManager::QuotaManager(bool is_incognito, db_disabled_(false), io_thread_(io_thread), db_thread_(db_thread), - temporary_global_quota_(-1) { + num_eviction_requested_clients_(0), + num_evicted_clients_(0), + temporary_global_quota_(-1), + callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { } QuotaManager::~QuotaManager() { @@ -773,11 +776,52 @@ void QuotaManager::GetLRUOrigin( task->Start(); } +void QuotaManager::DidOriginDataEvicted( + QuotaStatusCode status) { + DCHECK(io_thread_->BelongsToCurrentThread()); + + if (status != kQuotaStatusOk) { + // TODO(dmikurube): Handle error. + } + + ++num_evicted_clients_; + DCHECK(num_evicted_clients_ <= num_eviction_requested_clients_); + if (num_evicted_clients_ == num_eviction_requested_clients_) { + num_eviction_requested_clients_ = 0; + num_evicted_clients_ = 0; + + evict_origin_data_callback_->Run(kQuotaStatusOk); + evict_origin_data_callback_.reset(); + } +} + void QuotaManager::EvictOriginData( const GURL& origin, StorageType type, EvictOriginDataCallback* callback) { - // TODO(dmikurube): Implement it. + DCHECK(io_thread_->BelongsToCurrentThread()); + DCHECK(database_.get()); + DCHECK(num_eviction_requested_clients_ == 0); + DCHECK(type == kStorageTypeTemporary); + + int num_clients = clients_.size(); + + if (origin.is_empty() || num_clients == 0) { + callback->Run(kQuotaStatusOk); + delete callback; + return; + } + + num_eviction_requested_clients_ = num_clients; + num_evicted_clients_ = 0; + + evict_origin_data_callback_.reset(callback); + for (QuotaClientList::iterator p = clients_.begin(); + p != clients_.end(); + ++p) { + (*p)->DeleteOriginData(origin, type, callback_factory_. + NewCallback(&QuotaManager::DidOriginDataEvicted)); + } } void QuotaManager::GetUsageAndQuotaForEviction( diff --git a/webkit/quota/quota_manager.h b/webkit/quota/quota_manager.h index ff199d0..b48ce7a 100644 --- a/webkit/quota/quota_manager.h +++ b/webkit/quota/quota_manager.h @@ -160,6 +160,7 @@ class QuotaManager : public QuotaTaskObserver, friend struct QuotaManagerDeleter; friend class QuotaManagerProxy; + friend class QuotaManagerTest; // This initialization method is lazily called on the IO thread // when the first quota manager API is called. @@ -179,6 +180,8 @@ class QuotaManager : public QuotaTaskObserver, // Methods for eviction logic. void DeleteOriginFromDatabase(const GURL& origin, StorageType type); + void DidOriginDataEvicted(QuotaStatusCode status); + virtual void GetLRUOrigin( StorageType type, GetLRUOriginCallback* callback) OVERRIDE; @@ -207,12 +210,18 @@ class QuotaManager : public QuotaTaskObserver, UsageAndQuotaDispatcherTaskMap usage_and_quota_dispatchers_; + scoped_ptr<EvictOriginDataCallback> evict_origin_data_callback_; + int num_eviction_requested_clients_; + int num_evicted_clients_; + int64 temporary_global_quota_; QuotaCallbackQueue temporary_global_quota_callbacks_; // Map from origin to count. std::map<GURL, int> origins_in_use_; + base::ScopedCallbackFactory<QuotaManager> callback_factory_; + DISALLOW_COPY_AND_ASSIGN(QuotaManager); }; diff --git a/webkit/quota/quota_manager_unittest.cc b/webkit/quota/quota_manager_unittest.cc index 7d09c3c..697b0d6 100644 --- a/webkit/quota/quota_manager_unittest.cc +++ b/webkit/quota/quota_manager_unittest.cc @@ -132,13 +132,21 @@ class QuotaManagerTest : public testing::Test { &QuotaManagerTest::DidGetUsageAndQuotaAdditional)); } - void DeleteOriginData(QuotaClient* client, + void DeleteClientOriginData(QuotaClient* client, const GURL& origin, StorageType type) { quota_status_ = kQuotaStatusUnknown; client->DeleteOriginData(origin, type, callback_factory_.NewCallback( - &QuotaManagerTest::DidDelete)); + &QuotaManagerTest::DidDeleteClientOriginData)); + } + + void EvictOriginData(const GURL& origin, + StorageType type) { + quota_status_ = kQuotaStatusUnknown; + quota_manager_->EvictOriginData(origin, type, + callback_factory_.NewCallback( + &QuotaManagerTest::DidEvictOriginData)); } void GetAvailableSpace() { @@ -175,7 +183,11 @@ class QuotaManagerTest : public testing::Test { usage_ = usage; } - void DidDelete(QuotaStatusCode status) { + void DidDeleteClientOriginData(QuotaStatusCode status) { + quota_status_ = status; + } + + void DidEvictOriginData(QuotaStatusCode status) { quota_status_ = status; } @@ -711,7 +723,8 @@ TEST_F(QuotaManagerTest, GetUsage_WithDeleteOrigin) { MessageLoop::current()->RunAllPending(); int64 predelete_host_pers = usage(); - DeleteOriginData(client, GURL("http://foo.com/"), kStorageTypeTemporary); + DeleteClientOriginData(client, GURL("http://foo.com/"), + kStorageTypeTemporary); MessageLoop::current()->RunAllPending(); EXPECT_EQ(kQuotaStatusOk, status()); @@ -736,4 +749,52 @@ TEST_F(QuotaManagerTest, GetAvailableSpaceTest) { int64 direct_called = base::SysInfo::AmountOfFreeDiskSpace(profile_path()); EXPECT_EQ(direct_called, quota()); } + +TEST_F(QuotaManagerTest, EvictOriginData) { + static const MockOriginData kData1[] = { + { "http://foo.com/", kStorageTypeTemporary, 1 }, + { "http://foo.com:1/", kStorageTypeTemporary, 20 }, + { "http://foo.com/", kStorageTypePersistent, 300 }, + { "http://bar.com/", kStorageTypeTemporary, 4000 }, + }; + static const MockOriginData kData2[] = { + { "http://foo.com/", kStorageTypeTemporary, 50000 }, + { "http://foo.com:1/", kStorageTypeTemporary, 6000 }, + { "http://foo.com/", kStorageTypePersistent, 700 }, + { "https://foo.com/", kStorageTypeTemporary, 80 }, + { "http://bar.com/", kStorageTypeTemporary, 9 }, + }; + MockStorageClient* client1 = CreateClient(kData1, ARRAYSIZE_UNSAFE(kData1)); + MockStorageClient* client2 = CreateClient(kData2, ARRAYSIZE_UNSAFE(kData2)); + RegisterClient(client1); + RegisterClient(client2); + + GetGlobalUsage(kStorageTypeTemporary); + MessageLoop::current()->RunAllPending(); + int64 predelete_global_tmp = usage(); + + GetHostUsage("foo.com", kStorageTypeTemporary); + MessageLoop::current()->RunAllPending(); + int64 predelete_host_tmp = usage(); + + GetHostUsage("foo.com", kStorageTypePersistent); + MessageLoop::current()->RunAllPending(); + int64 predelete_host_pers = usage(); + + EvictOriginData(GURL("http://foo.com/"), kStorageTypeTemporary); + MessageLoop::current()->RunAllPending(); + + GetGlobalUsage(kStorageTypeTemporary); + MessageLoop::current()->RunAllPending(); + EXPECT_EQ(predelete_global_tmp - (1 + 50000), usage()); + + GetHostUsage("foo.com", kStorageTypeTemporary); + MessageLoop::current()->RunAllPending(); + EXPECT_EQ(predelete_host_tmp - (1 + 50000), usage()); + + GetHostUsage("foo.com", kStorageTypePersistent); + MessageLoop::current()->RunAllPending(); + EXPECT_EQ(predelete_host_pers, usage()); +} + } // namespace quota |