summaryrefslogtreecommitdiffstats
path: root/webkit
diff options
context:
space:
mode:
authordmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-18 09:52:24 +0000
committerdmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-18 09:52:24 +0000
commite05500525e82f823cf9a7a48ab01fe6c26621d50 (patch)
treeaffb2f9f9adfc042690f8a1f08b2b9c89d64dea8 /webkit
parent051dd1f34e3c0ea11808b5de5f373572e37c511a (diff)
downloadchromium_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.cc48
-rw-r--r--webkit/quota/quota_manager.h9
-rw-r--r--webkit/quota/quota_manager_unittest.cc69
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