diff options
author | dmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-19 05:26:06 +0000 |
---|---|---|
committer | dmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-19 05:26:06 +0000 |
commit | 257bc75092b39171b23d374a00f50f9373df169b (patch) | |
tree | 62c1acff2014e269889ff93d6a30cadd18e3fc98 /webkit/quota | |
parent | 8c9d342df31426c4ad03029fdb9bc657b22a3a81 (diff) | |
download | chromium_src-257bc75092b39171b23d374a00f50f9373df169b.zip chromium_src-257bc75092b39171b23d374a00f50f9373df169b.tar.gz chromium_src-257bc75092b39171b23d374a00f50f9373df169b.tar.bz2 |
Implement GetUsageAndQuotaForEviction in QuotaManager.
This change includes :
* Merge EvictOriginData members into EvictionContext.
* Fix GetAvailableSpaceTest.
BUG=61676
TEST=QuotaManagerTest.GetUsageANdQuotaForEviction.
Review URL: http://codereview.chromium.org/7039006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@85874 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/quota')
-rw-r--r-- | webkit/quota/quota_client.h | 1 | ||||
-rw-r--r-- | webkit/quota/quota_manager.cc | 68 | ||||
-rw-r--r-- | webkit/quota/quota_manager.h | 36 | ||||
-rw-r--r-- | webkit/quota/quota_manager_unittest.cc | 55 |
4 files changed, 136 insertions, 24 deletions
diff --git a/webkit/quota/quota_client.h b/webkit/quota/quota_client.h index d9499eb..f3ebbad 100644 --- a/webkit/quota/quota_client.h +++ b/webkit/quota/quota_client.h @@ -66,6 +66,7 @@ class QuotaClient { DeletionCallback* callback) = 0; }; +// TODO(dmikurube): Replace it to std::vector for efficiency. typedef std::list<QuotaClient*> QuotaClientList; } // namespace quota diff --git a/webkit/quota/quota_manager.cc b/webkit/quota/quota_manager.cc index ecfdef54..123fb50 100644 --- a/webkit/quota/quota_manager.cc +++ b/webkit/quota/quota_manager.cc @@ -524,8 +524,6 @@ QuotaManager::QuotaManager(bool is_incognito, db_disabled_(false), io_thread_(io_thread), db_thread_(db_thread), - num_eviction_requested_clients_(0), - num_evicted_clients_(0), temporary_global_quota_(-1), callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { } @@ -781,17 +779,22 @@ void QuotaManager::DidOriginDataEvicted( DCHECK(io_thread_->BelongsToCurrentThread()); if (status != kQuotaStatusOk) { - // TODO(dmikurube): Handle error. + ++eviction_context_.num_eviction_error; + // TODO(dmikurube): The origin with some error should have lower priority in + // the next eviction? } - ++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; + ++eviction_context_.num_evicted_clients; + DCHECK(eviction_context_.num_evicted_clients <= + eviction_context_.num_eviction_requested_clients); + if (eviction_context_.num_evicted_clients == + eviction_context_.num_eviction_requested_clients) { + eviction_context_.num_eviction_requested_clients = 0; + eviction_context_.num_evicted_clients = 0; - evict_origin_data_callback_->Run(kQuotaStatusOk); - evict_origin_data_callback_.reset(); + // TODO(dmikurube): Call DeleteOriginFromDatabase here. + eviction_context_.evict_origin_data_callback->Run(kQuotaStatusOk); + eviction_context_.evict_origin_data_callback.reset(); } } @@ -801,7 +804,7 @@ void QuotaManager::EvictOriginData( EvictOriginDataCallback* callback) { DCHECK(io_thread_->BelongsToCurrentThread()); DCHECK(database_.get()); - DCHECK(num_eviction_requested_clients_ == 0); + DCHECK(eviction_context_.num_eviction_requested_clients == 0); DCHECK(type == kStorageTypeTemporary); int num_clients = clients_.size(); @@ -812,10 +815,10 @@ void QuotaManager::EvictOriginData( return; } - num_eviction_requested_clients_ = num_clients; - num_evicted_clients_ = 0; + eviction_context_.num_eviction_requested_clients = num_clients; + eviction_context_.num_evicted_clients = 0; - evict_origin_data_callback_.reset(callback); + eviction_context_.evict_origin_data_callback.reset(callback); for (QuotaClientList::iterator p = clients_.begin(); p != clients_.end(); ++p) { @@ -824,9 +827,44 @@ void QuotaManager::EvictOriginData( } } +void QuotaManager::DidGetAvailableSpaceForEviction( + QuotaStatusCode status, + int64 available_space) { + eviction_context_.get_usage_and_quota_callback->Run(status, + eviction_context_.usage, eviction_context_.quota, available_space); + eviction_context_.get_usage_and_quota_callback.reset(); +} + +void QuotaManager::DidGetGlobalQuotaForEviction( + QuotaStatusCode status, + int64 quota) { + if (status != kQuotaStatusOk) { + eviction_context_.get_usage_and_quota_callback->Run(status, + eviction_context_.usage, quota, 0); + eviction_context_.get_usage_and_quota_callback.reset(); + return; + } + + eviction_context_.quota = quota; + GetAvailableSpace(callback_factory_. + NewCallback(&QuotaManager::DidGetAvailableSpaceForEviction)); +} + +void QuotaManager::DidGetGlobalUsageForEviction(int64 usage) { + eviction_context_.usage = usage; + GetTemporaryGlobalQuota(callback_factory_. + NewCallback(&QuotaManager::DidGetGlobalQuotaForEviction)); +} + void QuotaManager::GetUsageAndQuotaForEviction( GetUsageAndQuotaForEvictionCallback* callback) { - // TODO(dmikurube): Implement it. + DCHECK(io_thread_->BelongsToCurrentThread()); + DCHECK(!eviction_context_.get_usage_and_quota_callback.get()); + + eviction_context_.get_usage_and_quota_callback.reset(callback); + // TODO(dmikurube): Make kStorageTypeTemporary an argument. + GetGlobalUsage(kStorageTypeTemporary, callback_factory_. + NewCallback(&QuotaManager::DidGetGlobalUsageForEviction)); } void QuotaManager::DeleteOnCorrectThread() const { diff --git a/webkit/quota/quota_manager.h b/webkit/quota/quota_manager.h index b48ce7a..ad993cc 100644 --- a/webkit/quota/quota_manager.h +++ b/webkit/quota/quota_manager.h @@ -56,6 +56,9 @@ class QuotaEvictionHandler { virtual void GetUsageAndQuotaForEviction( GetUsageAndQuotaForEvictionCallback* callback) = 0; + + protected: + virtual ~QuotaEvictionHandler() {} }; // The quota manager class. This class is instantiated per profile and @@ -154,6 +157,26 @@ class QuotaManager : public QuotaTaskObserver, class AvailableSpaceQueryTask; + struct EvictionContext { + EvictionContext() + : num_eviction_requested_clients(0), + num_evicted_clients(0), + num_eviction_error(0), + usage(0), + quota(0) {} + virtual ~EvictionContext() {} + + scoped_ptr<EvictOriginDataCallback> evict_origin_data_callback; + int num_eviction_requested_clients; + int num_evicted_clients; + int num_eviction_error; + + scoped_ptr<GetUsageAndQuotaForEvictionCallback> + get_usage_and_quota_callback; + int64 usage; + int64 quota; + }; + typedef std::pair<std::string, StorageType> HostAndType; typedef std::map<HostAndType, UsageAndQuotaDispatcherTask*> UsageAndQuotaDispatcherTaskMap; @@ -181,6 +204,13 @@ class QuotaManager : public QuotaTaskObserver, void DeleteOriginFromDatabase(const GURL& origin, StorageType type); void DidOriginDataEvicted(QuotaStatusCode status); + void DidGetAvailableSpaceForEviction( + QuotaStatusCode status, + int64 available_space); + void DidGetGlobalQuotaForEviction( + QuotaStatusCode status, + int64 quota); + void DidGetGlobalUsageForEviction(int64 usage); virtual void GetLRUOrigin( StorageType type, @@ -208,11 +238,9 @@ class QuotaManager : public QuotaTaskObserver, scoped_ptr<UsageTracker> temporary_usage_tracker_; scoped_ptr<UsageTracker> persistent_usage_tracker_; - UsageAndQuotaDispatcherTaskMap usage_and_quota_dispatchers_; + EvictionContext eviction_context_; - scoped_ptr<EvictOriginDataCallback> evict_origin_data_callback_; - int num_eviction_requested_clients_; - int num_evicted_clients_; + UsageAndQuotaDispatcherTaskMap usage_and_quota_dispatchers_; int64 temporary_global_quota_; QuotaCallbackQueue temporary_global_quota_callbacks_; diff --git a/webkit/quota/quota_manager_unittest.cc b/webkit/quota/quota_manager_unittest.cc index 697b0d6..ad32304 100644 --- a/webkit/quota/quota_manager_unittest.cc +++ b/webkit/quota/quota_manager_unittest.cc @@ -151,10 +151,20 @@ class QuotaManagerTest : public testing::Test { void GetAvailableSpace() { quota_status_ = kQuotaStatusUnknown; - quota_ = -1; + available_space_ = -1; quota_manager_->GetAvailableSpace( callback_factory_.NewCallback( - &QuotaManagerTest::DidGetQuota)); + &QuotaManagerTest::DidGetAvailableSpace)); + } + + void GetUsageAndQuotaForEviction() { + quota_status_ = kQuotaStatusUnknown; + usage_ = -1; + quota_ = -1; + available_space_ = -1; + quota_manager_->GetUsageAndQuotaForEviction( + callback_factory_.NewCallback( + &QuotaManagerTest::DidGetUsageAndQuotaForEviction)); } void DidGetUsageAndQuota(QuotaStatusCode status, int64 usage, int64 quota) { @@ -168,6 +178,11 @@ class QuotaManagerTest : public testing::Test { quota_ = quota; } + void DidGetAvailableSpace(QuotaStatusCode status, int64 available_space) { + quota_status_ = status; + available_space_ = available_space; + } + void DidGetHostQuota(QuotaStatusCode status, const std::string& host, int64 quota) { quota_status_ = status; @@ -191,6 +206,14 @@ class QuotaManagerTest : public testing::Test { quota_status_ = status; } + void DidGetUsageAndQuotaForEviction(QuotaStatusCode status, + int64 usage, int64 quota, int64 available_space) { + quota_status_ = status; + usage_ = usage; + quota_ = quota; + available_space_ = available_space; + } + void set_additional_callback_count(int c) { additional_callback_count_ = c; } int additional_callback_count() const { return additional_callback_count_; } void DidGetUsageAndQuotaAdditional( @@ -206,6 +229,7 @@ class QuotaManagerTest : public testing::Test { QuotaStatusCode status() const { return quota_status_; } int64 usage() const { return usage_; } int64 quota() const { return quota_; } + int64 available_space() const { return available_space_; } FilePath profile_path() const { return data_dir_.path(); } private: @@ -218,6 +242,7 @@ class QuotaManagerTest : public testing::Test { std::string host_; int64 usage_; int64 quota_; + int64 available_space_; int additional_callback_count_; @@ -745,9 +770,7 @@ TEST_F(QuotaManagerTest, GetAvailableSpaceTest) { GetAvailableSpace(); MessageLoop::current()->RunAllPending(); EXPECT_EQ(kQuotaStatusOk, status()); - EXPECT_LE(0, quota()); - int64 direct_called = base::SysInfo::AmountOfFreeDiskSpace(profile_path()); - EXPECT_EQ(direct_called, quota()); + EXPECT_LE(0, available_space()); } TEST_F(QuotaManagerTest, EvictOriginData) { @@ -797,4 +820,26 @@ TEST_F(QuotaManagerTest, EvictOriginData) { EXPECT_EQ(predelete_host_pers, usage()); } +TEST_F(QuotaManagerTest, GetUsageAndQuotaForEviction) { + static const MockOriginData kData[] = { + { "http://foo.com/", kStorageTypeTemporary, 1 }, + { "http://foo.com:1/", kStorageTypeTemporary, 20 }, + { "http://foo.com/", kStorageTypePersistent, 300 }, + { "http://bar.com/", kStorageTypeTemporary, 4000 }, + }; + + MockStorageClient* client = CreateClient(kData, ARRAYSIZE_UNSAFE(kData)); + RegisterClient(client); + + SetTemporaryGlobalQuota(10000000); + MessageLoop::current()->RunAllPending(); + + GetUsageAndQuotaForEviction(); + MessageLoop::current()->RunAllPending(); + EXPECT_EQ(kQuotaStatusOk, status()); + EXPECT_EQ(4021, usage()); + EXPECT_EQ(10000000, quota()); + EXPECT_LE(0, available_space()); +} + } // namespace quota |