summaryrefslogtreecommitdiffstats
path: root/webkit/quota
diff options
context:
space:
mode:
authordmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-19 05:26:06 +0000
committerdmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-19 05:26:06 +0000
commit257bc75092b39171b23d374a00f50f9373df169b (patch)
tree62c1acff2014e269889ff93d6a30cadd18e3fc98 /webkit/quota
parent8c9d342df31426c4ad03029fdb9bc657b22a3a81 (diff)
downloadchromium_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.h1
-rw-r--r--webkit/quota/quota_manager.cc68
-rw-r--r--webkit/quota/quota_manager.h36
-rw-r--r--webkit/quota/quota_manager_unittest.cc55
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