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..f8519fe3a8a1fccadc21836798e43d15006be7b1 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,9 @@ StoragePartitionHttpCacheDataRemover::StoragePartitionHttpCacheDataRemover( |
main_context_getter_(main_context_getter), |
media_context_getter_(media_context_getter), |
next_cache_state_(STATE_NONE), |
- cache_(nullptr) { |
+ cache_(nullptr), |
+ count_only_(false), |
+ calculation_result_(0) { |
} |
StoragePartitionHttpCacheDataRemover::~StoragePartitionHttpCacheDataRemover() { |
@@ -48,6 +53,22 @@ void StoragePartitionHttpCacheDataRemover::Remove( |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
DCHECK(!done_callback.is_null()); |
done_callback_ = done_callback; |
+ count_only_ = false; |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind( |
+ &StoragePartitionHttpCacheDataRemover::ClearHttpCacheOnIOThread, |
+ 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; |
+ count_only_ = true; |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, |
@@ -69,7 +90,10 @@ void StoragePartitionHttpCacheDataRemover::ClearHttpCacheOnIOThread() { |
void StoragePartitionHttpCacheDataRemover::ClearedHttpCache() { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- done_callback_.Run(); |
+ if (count_only_) |
+ result_callback_.Run(calculation_result_); |
+ else |
+ done_callback_.Run(); |
base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
} |
@@ -96,19 +120,21 @@ void StoragePartitionHttpCacheDataRemover::DoClearCache(int rv) { |
? STATE_DELETE_MAIN |
: STATE_DELETE_MEDIA; |
- // Clear QUIC server information from memory and the disk cache. |
- http_cache->GetSession() |
- ->quic_stream_factory() |
- ->ClearCachedStatesInCryptoConfig(); |
- |
- // Clear SDCH dictionary state. |
- net::SdchManager* sdch_manager = |
- getter->GetURLRequestContext()->sdch_manager(); |
- // The test is probably overkill, since chrome should always have an |
- // SdchManager. But in general the URLRequestContext is *not* |
- // guaranteed to have an SdchManager, so checking is wise. |
- if (sdch_manager) |
- sdch_manager->ClearData(); |
+ if (!count_only_) { |
+ // Clear QUIC server information from memory and the disk cache. |
+ http_cache->GetSession() |
+ ->quic_stream_factory() |
+ ->ClearCachedStatesInCryptoConfig(); |
+ |
+ // Clear SDCH dictionary state. |
+ net::SdchManager* sdch_manager = |
+ getter->GetURLRequestContext()->sdch_manager(); |
+ // The test is probably overkill, since chrome should always have an |
+ // SdchManager. But in general the URLRequestContext is *not* |
+ // guaranteed to have an SdchManager, so checking is wise. |
+ if (sdch_manager) |
+ sdch_manager->ClearData(); |
+ } |
rv = http_cache->GetBackend( |
&cache_, |
@@ -125,14 +151,34 @@ void StoragePartitionHttpCacheDataRemover::DoClearCache(int rv) { |
// |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 (count_only_) { |
+ // TODO(msramek): Implement analogous |CalculateSizeOfAllEntries|. |
+ rv = cache_->CalculateSizeOfEntriesBetween( |
+ base::Time(), base::Time::Max(), |
+ base::Bind( |
+ &StoragePartitionHttpCacheDataRemover:: |
+ OnCalculationComplete, |
+ base::Unretained(this))); |
+ } else { |
+ 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))); |
+ if (count_only_) { |
+ rv = cache_->CalculateSizeOfEntriesBetween( |
+ delete_begin_, delete_end_, |
+ base::Bind( |
+ &StoragePartitionHttpCacheDataRemover:: |
+ OnCalculationComplete, |
+ base::Unretained(this))); |
+ } else { |
+ rv = cache_->DoomEntriesBetween( |
+ delete_begin_, delete_end_, |
+ base::Bind( |
+ &StoragePartitionHttpCacheDataRemover::DoClearCache, |
+ base::Unretained(this))); |
+ } |
} |
cache_ = NULL; |
} |
@@ -158,4 +204,17 @@ void StoragePartitionHttpCacheDataRemover::DoClearCache(int rv) { |
} |
} |
+void StoragePartitionHttpCacheDataRemover::OnCalculationComplete(int rv) { |
+ // If the calculation was successful, add the size to the sum. If it was not, |
+ // finish and return the error code. |
+ if (rv < 0) { |
+ calculation_result_ = rv; |
+ next_cache_state_ = STATE_DONE; |
+ DoClearCache(rv); |
+ } else { |
+ calculation_result_ += rv; |
+ DoClearCache(net::OK); |
+ } |
+} |
+ |
} // namespace browsing_data |