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

Unified Diff: components/browsing_data/storage_partition_http_cache_data_remover.cc

Issue 1304363013: Add a size estimation mechanism to StoragePartitionHttpCacheDataRemover. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: static_cast Created 5 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: components/browsing_data/storage_partition_http_cache_data_remover.cc
diff --git a/components/browsing_data/storage_partition_http_cache_data_remover.cc b/components/browsing_data/storage_partition_http_cache_data_remover.cc
index c53c0be6409300347be7e76bc47cb98a9f1d1032..a591e0cb3d084f44ac97f08b279b450a5f78c1ba 100644
--- a/components/browsing_data/storage_partition_http_cache_data_remover.cc
+++ b/components/browsing_data/storage_partition_http_cache_data_remover.cc
@@ -7,7 +7,10 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/storage_partition.h"
#include "net/base/sdch_manager.h"
+#include "net/disk_cache/blockfile/backend_impl.h"
#include "net/disk_cache/disk_cache.h"
+#include "net/disk_cache/memory/mem_backend_impl.h"
+#include "net/disk_cache/simple/simple_backend_impl.h"
#include "net/http/http_cache.h"
#include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_context_getter.h"
@@ -26,7 +29,8 @@ StoragePartitionHttpCacheDataRemover::StoragePartitionHttpCacheDataRemover(
main_context_getter_(main_context_getter),
media_context_getter_(media_context_getter),
next_cache_state_(STATE_NONE),
- cache_(nullptr) {
+ cache_(nullptr),
+ calculation_result_(0) {
}
StoragePartitionHttpCacheDataRemover::~StoragePartitionHttpCacheDataRemover() {
@@ -56,6 +60,20 @@ void StoragePartitionHttpCacheDataRemover::Remove(
base::Unretained(this)));
}
+void StoragePartitionHttpCacheDataRemover::Count(
+ const net::Int64CompletionCallback& result_callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ DCHECK(!result_callback.is_null());
+ result_callback_ = result_callback;
+ calculation_result_ = 0;
+
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(
+ &StoragePartitionHttpCacheDataRemover::CountHttpCacheOnIOThread,
+ base::Unretained(this)));
+}
+
void StoragePartitionHttpCacheDataRemover::ClearHttpCacheOnIOThread() {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
next_cache_state_ = STATE_NONE;
@@ -67,14 +85,31 @@ void StoragePartitionHttpCacheDataRemover::ClearHttpCacheOnIOThread() {
DoClearCache(net::OK);
}
+void StoragePartitionHttpCacheDataRemover::CountHttpCacheOnIOThread() {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ next_cache_state_ = STATE_NONE;
+ DCHECK_EQ(STATE_NONE, next_cache_state_);
+ DCHECK(main_context_getter_.get());
+ DCHECK(media_context_getter_.get());
+
+ next_cache_state_ = STATE_CREATE_MAIN;
+ DoCountCache(net::OK);
+}
+
void StoragePartitionHttpCacheDataRemover::ClearedHttpCache() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
done_callback_.Run();
base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
}
+void StoragePartitionHttpCacheDataRemover::CountedHttpCache() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ result_callback_.Run(calculation_result_);
+ base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
+}
+
// The expected state sequence is STATE_NONE --> STATE_CREATE_MAIN -->
-// STATE_DELETE_MAIN --> STATE_CREATE_MEDIA --> STATE_DELETE_MEDIA -->
+// STATE_PROCESS_MAIN --> STATE_CREATE_MEDIA --> STATE_PROCESS_MEDIA -->
// STATE_DONE, and any errors are ignored.
void StoragePartitionHttpCacheDataRemover::DoClearCache(int rv) {
DCHECK_NE(STATE_NONE, next_cache_state_);
@@ -93,8 +128,8 @@ void StoragePartitionHttpCacheDataRemover::DoClearCache(int rv) {
->GetCache();
next_cache_state_ = (next_cache_state_ == STATE_CREATE_MAIN)
- ? STATE_DELETE_MAIN
- : STATE_DELETE_MEDIA;
+ ? STATE_PROCESS_MAIN
+ : STATE_PROCESS_MEDIA;
// Clear QUIC server information from memory and the disk cache.
http_cache->GetSession()
@@ -116,23 +151,24 @@ void StoragePartitionHttpCacheDataRemover::DoClearCache(int rv) {
base::Unretained(this)));
break;
}
- case STATE_DELETE_MAIN:
- case STATE_DELETE_MEDIA: {
- next_cache_state_ = (next_cache_state_ == STATE_DELETE_MAIN)
+ case STATE_PROCESS_MAIN:
+ case STATE_PROCESS_MEDIA: {
+ next_cache_state_ = (next_cache_state_ == STATE_PROCESS_MAIN)
? STATE_CREATE_MEDIA
: STATE_DONE;
// |cache_| can be null if it cannot be initialized.
if (cache_) {
- if (delete_begin_.is_null()) {
- rv = cache_->DoomAllEntries(
- base::Bind(&StoragePartitionHttpCacheDataRemover::DoClearCache,
- base::Unretained(this)));
+ if (delete_begin_.is_null() && delete_end_.is_max()) {
+ rv = cache_->DoomAllEntries(base::Bind(
+ &StoragePartitionHttpCacheDataRemover::DoClearCache,
+ base::Unretained(this)));
} else {
rv = cache_->DoomEntriesBetween(
delete_begin_, delete_end_,
- base::Bind(&StoragePartitionHttpCacheDataRemover::DoClearCache,
- base::Unretained(this)));
+ base::Bind(
+ &StoragePartitionHttpCacheDataRemover::DoClearCache,
+ base::Unretained(this)));
}
cache_ = NULL;
}
@@ -158,4 +194,86 @@ void StoragePartitionHttpCacheDataRemover::DoClearCache(int rv) {
}
}
+// The expected state sequence is STATE_NONE --> STATE_CREATE_MAIN -->
+// STATE_PROCESS_MAIN --> STATE_CREATE_MEDIA --> STATE_PROCESS_MEDIA -->
+// STATE_DONE. On error, we jump directly to STATE_DONE.
+void StoragePartitionHttpCacheDataRemover::DoCountCache(int rv) {
+ DCHECK_NE(STATE_NONE, next_cache_state_);
+
+ while (rv != net::ERR_IO_PENDING && next_cache_state_ != STATE_NONE) {
+ // On error, finish and return the error code. A valid result value might
+ // be of two types - either net::OK from the CREATE states, or the result
+ // of calculation from the PROCESS states. Since net::OK == 0, it is valid
+ // to simply add the value to the final calculation result.
+ if (rv < 0) {
+ calculation_result_ = rv;
+ next_cache_state_ = STATE_DONE;
+ } else {
+ DCHECK_EQ(0, net::OK);
+ calculation_result_ += rv;
+ }
+
+ switch (next_cache_state_) {
+ case STATE_CREATE_MAIN:
+ case STATE_CREATE_MEDIA: {
+ // Get a pointer to the cache.
+ net::URLRequestContextGetter* getter =
+ (next_cache_state_ == STATE_CREATE_MAIN)
+ ? main_context_getter_.get()
+ : media_context_getter_.get();
+ net::HttpCache* http_cache = getter->GetURLRequestContext()
+ ->http_transaction_factory()
+ ->GetCache();
+
+ next_cache_state_ = (next_cache_state_ == STATE_CREATE_MAIN)
+ ? STATE_PROCESS_MAIN
+ : STATE_PROCESS_MEDIA;
+
+ rv = http_cache->GetBackend(
+ &cache_,
+ base::Bind(&StoragePartitionHttpCacheDataRemover::DoClearCache,
+ base::Unretained(this)));
+ break;
+ }
+ case STATE_PROCESS_MAIN:
+ case STATE_PROCESS_MEDIA: {
+ next_cache_state_ = (next_cache_state_ == STATE_PROCESS_MAIN)
+ ? STATE_CREATE_MEDIA
+ : STATE_DONE;
+
+ // |cache_| can be null if it cannot be initialized.
+ if (cache_) {
+ if (delete_begin_.is_null() && delete_end_.is_max()) {
+ rv = cache_->CalculateSizeOfAllEntries(
+ base::Bind(
+ &StoragePartitionHttpCacheDataRemover::DoCountCache,
+ base::Unretained(this)));
+ } else {
+ // TODO(msramek): Implement this when we need it.
+ DoCountCache(net::ERR_NOT_IMPLEMENTED);
+ }
+ cache_ = NULL;
+ }
+ break;
+ }
+ case STATE_DONE: {
+ cache_ = NULL;
+ next_cache_state_ = STATE_NONE;
+
+ // Notify the UI thread that we are done.
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&StoragePartitionHttpCacheDataRemover::CountedHttpCache,
+ base::Unretained(this)));
+ return;
+ }
+ default: {
+ NOTREACHED() << "bad state";
+ next_cache_state_ = STATE_NONE; // Stop looping.
+ return;
+ }
+ }
+ }
+}
+
} // namespace browsing_data

Powered by Google App Engine
This is Rietveld 408576698