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

Side by Side 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: Added more tests. Created 5 years, 3 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/browsing_data/storage_partition_http_cache_data_remover.h" 5 #include "components/browsing_data/storage_partition_http_cache_data_remover.h"
6 6
7 #include "content/public/browser/browser_thread.h" 7 #include "content/public/browser/browser_thread.h"
8 #include "content/public/browser/storage_partition.h" 8 #include "content/public/browser/storage_partition.h"
9 #include "net/base/sdch_manager.h" 9 #include "net/base/sdch_manager.h"
10 #include "net/disk_cache/blockfile/backend_impl.h"
10 #include "net/disk_cache/disk_cache.h" 11 #include "net/disk_cache/disk_cache.h"
12 #include "net/disk_cache/memory/mem_backend_impl.h"
13 #include "net/disk_cache/simple/simple_backend_impl.h"
11 #include "net/http/http_cache.h" 14 #include "net/http/http_cache.h"
12 #include "net/url_request/url_request_context.h" 15 #include "net/url_request/url_request_context.h"
13 #include "net/url_request/url_request_context_getter.h" 16 #include "net/url_request/url_request_context_getter.h"
14 17
15 using content::BrowserThread; 18 using content::BrowserThread;
16 19
17 namespace browsing_data { 20 namespace browsing_data {
18 21
19 StoragePartitionHttpCacheDataRemover::StoragePartitionHttpCacheDataRemover( 22 StoragePartitionHttpCacheDataRemover::StoragePartitionHttpCacheDataRemover(
20 base::Time delete_begin, 23 base::Time delete_begin,
21 base::Time delete_end, 24 base::Time delete_end,
22 net::URLRequestContextGetter* main_context_getter, 25 net::URLRequestContextGetter* main_context_getter,
23 net::URLRequestContextGetter* media_context_getter) 26 net::URLRequestContextGetter* media_context_getter)
24 : delete_begin_(delete_begin), 27 : delete_begin_(delete_begin),
25 delete_end_(delete_end), 28 delete_end_(delete_end),
26 main_context_getter_(main_context_getter), 29 main_context_getter_(main_context_getter),
27 media_context_getter_(media_context_getter), 30 media_context_getter_(media_context_getter),
28 next_cache_state_(STATE_NONE), 31 next_cache_state_(STATE_NONE),
29 cache_(nullptr) { 32 cache_(nullptr),
33 calculation_result_(0) {
30 } 34 }
31 35
32 StoragePartitionHttpCacheDataRemover::~StoragePartitionHttpCacheDataRemover() { 36 StoragePartitionHttpCacheDataRemover::~StoragePartitionHttpCacheDataRemover() {
33 } 37 }
34 38
35 // static. 39 // static.
36 StoragePartitionHttpCacheDataRemover* 40 StoragePartitionHttpCacheDataRemover*
37 StoragePartitionHttpCacheDataRemover::CreateForRange( 41 StoragePartitionHttpCacheDataRemover::CreateForRange(
38 content::StoragePartition* storage_partition, 42 content::StoragePartition* storage_partition,
39 base::Time delete_begin, 43 base::Time delete_begin,
40 base::Time delete_end) { 44 base::Time delete_end) {
41 return new StoragePartitionHttpCacheDataRemover( 45 return new StoragePartitionHttpCacheDataRemover(
42 delete_begin, delete_end, storage_partition->GetURLRequestContext(), 46 delete_begin, delete_end, storage_partition->GetURLRequestContext(),
43 storage_partition->GetMediaURLRequestContext()); 47 storage_partition->GetMediaURLRequestContext());
44 } 48 }
45 49
46 void StoragePartitionHttpCacheDataRemover::Remove( 50 void StoragePartitionHttpCacheDataRemover::Remove(
47 const base::Closure& done_callback) { 51 const base::Closure& done_callback) {
48 DCHECK_CURRENTLY_ON(BrowserThread::UI); 52 DCHECK_CURRENTLY_ON(BrowserThread::UI);
49 DCHECK(!done_callback.is_null()); 53 DCHECK(!done_callback.is_null());
50 done_callback_ = done_callback; 54 done_callback_ = done_callback;
51 55
52 BrowserThread::PostTask( 56 BrowserThread::PostTask(
53 BrowserThread::IO, FROM_HERE, 57 BrowserThread::IO, FROM_HERE,
54 base::Bind( 58 base::Bind(
55 &StoragePartitionHttpCacheDataRemover::ClearHttpCacheOnIOThread, 59 &StoragePartitionHttpCacheDataRemover::ClearHttpCacheOnIOThread,
56 base::Unretained(this))); 60 base::Unretained(this)));
57 } 61 }
58 62
63 void StoragePartitionHttpCacheDataRemover::Count(
64 const net::Int64CompletionCallback& result_callback) {
65 DCHECK_CURRENTLY_ON(BrowserThread::UI);
66 DCHECK(!result_callback.is_null());
67 result_callback_ = result_callback;
68 calculation_result_ = 0;
69
70 BrowserThread::PostTask(
71 BrowserThread::IO, FROM_HERE,
72 base::Bind(
73 &StoragePartitionHttpCacheDataRemover::CountHttpCacheOnIOThread,
74 base::Unretained(this)));
75 }
76
59 void StoragePartitionHttpCacheDataRemover::ClearHttpCacheOnIOThread() { 77 void StoragePartitionHttpCacheDataRemover::ClearHttpCacheOnIOThread() {
60 DCHECK_CURRENTLY_ON(BrowserThread::IO); 78 DCHECK_CURRENTLY_ON(BrowserThread::IO);
61 next_cache_state_ = STATE_NONE; 79 next_cache_state_ = STATE_NONE;
62 DCHECK_EQ(STATE_NONE, next_cache_state_); 80 DCHECK_EQ(STATE_NONE, next_cache_state_);
63 DCHECK(main_context_getter_.get()); 81 DCHECK(main_context_getter_.get());
64 DCHECK(media_context_getter_.get()); 82 DCHECK(media_context_getter_.get());
65 83
66 next_cache_state_ = STATE_CREATE_MAIN; 84 next_cache_state_ = STATE_CREATE_MAIN;
67 DoClearCache(net::OK); 85 DoClearCache(net::OK);
68 } 86 }
69 87
88 void StoragePartitionHttpCacheDataRemover::CountHttpCacheOnIOThread() {
89 DCHECK_CURRENTLY_ON(BrowserThread::IO);
90 next_cache_state_ = STATE_NONE;
91 DCHECK_EQ(STATE_NONE, next_cache_state_);
92 DCHECK(main_context_getter_.get());
93 DCHECK(media_context_getter_.get());
94
95 next_cache_state_ = STATE_CREATE_MAIN;
96 DoCountCache(net::OK);
97 }
98
70 void StoragePartitionHttpCacheDataRemover::ClearedHttpCache() { 99 void StoragePartitionHttpCacheDataRemover::ClearedHttpCache() {
71 DCHECK_CURRENTLY_ON(BrowserThread::UI); 100 DCHECK_CURRENTLY_ON(BrowserThread::UI);
72 done_callback_.Run(); 101 done_callback_.Run();
73 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); 102 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
74 } 103 }
75 104
105 void StoragePartitionHttpCacheDataRemover::CountedHttpCache() {
106 DCHECK_CURRENTLY_ON(BrowserThread::UI);
107 result_callback_.Run(calculation_result_);
108 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
109 }
110
76 // The expected state sequence is STATE_NONE --> STATE_CREATE_MAIN --> 111 // The expected state sequence is STATE_NONE --> STATE_CREATE_MAIN -->
77 // STATE_DELETE_MAIN --> STATE_CREATE_MEDIA --> STATE_DELETE_MEDIA --> 112 // STATE_PROCESS_MAIN --> STATE_CREATE_MEDIA --> STATE_PROCESS_MEDIA -->
78 // STATE_DONE, and any errors are ignored. 113 // STATE_DONE, and any errors are ignored.
79 void StoragePartitionHttpCacheDataRemover::DoClearCache(int rv) { 114 void StoragePartitionHttpCacheDataRemover::DoClearCache(int rv) {
80 DCHECK_NE(STATE_NONE, next_cache_state_); 115 DCHECK_NE(STATE_NONE, next_cache_state_);
81 116
82 while (rv != net::ERR_IO_PENDING && next_cache_state_ != STATE_NONE) { 117 while (rv != net::ERR_IO_PENDING && next_cache_state_ != STATE_NONE) {
83 switch (next_cache_state_) { 118 switch (next_cache_state_) {
84 case STATE_CREATE_MAIN: 119 case STATE_CREATE_MAIN:
85 case STATE_CREATE_MEDIA: { 120 case STATE_CREATE_MEDIA: {
86 // Get a pointer to the cache. 121 // Get a pointer to the cache.
87 net::URLRequestContextGetter* getter = 122 net::URLRequestContextGetter* getter =
88 (next_cache_state_ == STATE_CREATE_MAIN) 123 (next_cache_state_ == STATE_CREATE_MAIN)
89 ? main_context_getter_.get() 124 ? main_context_getter_.get()
90 : media_context_getter_.get(); 125 : media_context_getter_.get();
91 net::HttpCache* http_cache = getter->GetURLRequestContext() 126 net::HttpCache* http_cache = getter->GetURLRequestContext()
92 ->http_transaction_factory() 127 ->http_transaction_factory()
93 ->GetCache(); 128 ->GetCache();
94 129
95 next_cache_state_ = (next_cache_state_ == STATE_CREATE_MAIN) 130 next_cache_state_ = (next_cache_state_ == STATE_CREATE_MAIN)
96 ? STATE_DELETE_MAIN 131 ? STATE_PROCESS_MAIN
97 : STATE_DELETE_MEDIA; 132 : STATE_PROCESS_MEDIA;
98 133
99 // Clear QUIC server information from memory and the disk cache. 134 // Clear QUIC server information from memory and the disk cache.
100 http_cache->GetSession() 135 http_cache->GetSession()
101 ->quic_stream_factory() 136 ->quic_stream_factory()
102 ->ClearCachedStatesInCryptoConfig(); 137 ->ClearCachedStatesInCryptoConfig();
103 138
104 // Clear SDCH dictionary state. 139 // Clear SDCH dictionary state.
105 net::SdchManager* sdch_manager = 140 net::SdchManager* sdch_manager =
106 getter->GetURLRequestContext()->sdch_manager(); 141 getter->GetURLRequestContext()->sdch_manager();
107 // The test is probably overkill, since chrome should always have an 142 // The test is probably overkill, since chrome should always have an
108 // SdchManager. But in general the URLRequestContext is *not* 143 // SdchManager. But in general the URLRequestContext is *not*
109 // guaranteed to have an SdchManager, so checking is wise. 144 // guaranteed to have an SdchManager, so checking is wise.
110 if (sdch_manager) 145 if (sdch_manager)
111 sdch_manager->ClearData(); 146 sdch_manager->ClearData();
112 147
113 rv = http_cache->GetBackend( 148 rv = http_cache->GetBackend(
114 &cache_, 149 &cache_,
115 base::Bind(&StoragePartitionHttpCacheDataRemover::DoClearCache, 150 base::Bind(&StoragePartitionHttpCacheDataRemover::DoClearCache,
116 base::Unretained(this))); 151 base::Unretained(this)));
117 break; 152 break;
118 } 153 }
119 case STATE_DELETE_MAIN: 154 case STATE_PROCESS_MAIN:
120 case STATE_DELETE_MEDIA: { 155 case STATE_PROCESS_MEDIA: {
121 next_cache_state_ = (next_cache_state_ == STATE_DELETE_MAIN) 156 next_cache_state_ = (next_cache_state_ == STATE_PROCESS_MAIN)
122 ? STATE_CREATE_MEDIA 157 ? STATE_CREATE_MEDIA
123 : STATE_DONE; 158 : STATE_DONE;
124 159
125 // |cache_| can be null if it cannot be initialized. 160 // |cache_| can be null if it cannot be initialized.
126 if (cache_) { 161 if (cache_) {
127 if (delete_begin_.is_null()) { 162 if (delete_begin_.is_null() && delete_end_.is_max()) {
msramek 2015/09/02 19:22:25 I changed this to check both delete_begin_ and del
128 rv = cache_->DoomAllEntries( 163 rv = cache_->DoomAllEntries(base::Bind(
129 base::Bind(&StoragePartitionHttpCacheDataRemover::DoClearCache, 164 &StoragePartitionHttpCacheDataRemover::DoClearCache,
130 base::Unretained(this))); 165 base::Unretained(this)));
131 } else { 166 } else {
132 rv = cache_->DoomEntriesBetween( 167 rv = cache_->DoomEntriesBetween(
133 delete_begin_, delete_end_, 168 delete_begin_, delete_end_,
134 base::Bind(&StoragePartitionHttpCacheDataRemover::DoClearCache, 169 base::Bind(
135 base::Unretained(this))); 170 &StoragePartitionHttpCacheDataRemover::DoClearCache,
171 base::Unretained(this)));
136 } 172 }
137 cache_ = NULL; 173 cache_ = NULL;
138 } 174 }
139 break; 175 break;
140 } 176 }
141 case STATE_DONE: { 177 case STATE_DONE: {
142 cache_ = NULL; 178 cache_ = NULL;
143 next_cache_state_ = STATE_NONE; 179 next_cache_state_ = STATE_NONE;
144 180
145 // Notify the UI thread that we are done. 181 // Notify the UI thread that we are done.
146 BrowserThread::PostTask( 182 BrowserThread::PostTask(
147 BrowserThread::UI, FROM_HERE, 183 BrowserThread::UI, FROM_HERE,
148 base::Bind(&StoragePartitionHttpCacheDataRemover::ClearedHttpCache, 184 base::Bind(&StoragePartitionHttpCacheDataRemover::ClearedHttpCache,
149 base::Unretained(this))); 185 base::Unretained(this)));
150 return; 186 return;
151 } 187 }
152 default: { 188 default: {
153 NOTREACHED() << "bad state"; 189 NOTREACHED() << "bad state";
154 next_cache_state_ = STATE_NONE; // Stop looping. 190 next_cache_state_ = STATE_NONE; // Stop looping.
155 return; 191 return;
156 } 192 }
157 } 193 }
158 } 194 }
159 } 195 }
160 196
197 // The expected state sequence is STATE_NONE --> STATE_CREATE_MAIN -->
198 // STATE_PROCESS_MAIN --> STATE_CREATE_MEDIA --> STATE_PROCESS_MEDIA -->
199 // STATE_DONE. On error, we jump directly to STATE_DONE.
200 void StoragePartitionHttpCacheDataRemover::DoCountCache(int rv) {
201 DCHECK_NE(STATE_NONE, next_cache_state_);
202
203 while (rv != net::ERR_IO_PENDING && next_cache_state_ != STATE_NONE) {
204 // On error, finish and return the error code. A valid result value might
205 // be of two types - either net::OK from the CREATE states, or the result
206 // of calculation from the PROCESS states. Since net::OK == 0, it is valid
207 // to simply add the value to the final calculation result.
208 if (rv < 0) {
209 calculation_result_ = rv;
210 next_cache_state_ = STATE_DONE;
211 } else {
212 DCHECK_EQ(0, net::OK);
213 calculation_result_ += rv;
214 }
215
216 switch (next_cache_state_) {
217 case STATE_CREATE_MAIN:
218 case STATE_CREATE_MEDIA: {
219 // Get a pointer to the cache.
220 net::URLRequestContextGetter* getter =
221 (next_cache_state_ == STATE_CREATE_MAIN)
222 ? main_context_getter_.get()
223 : media_context_getter_.get();
224 net::HttpCache* http_cache = getter->GetURLRequestContext()
225 ->http_transaction_factory()
226 ->GetCache();
227
228 next_cache_state_ = (next_cache_state_ == STATE_CREATE_MAIN)
229 ? STATE_PROCESS_MAIN
230 : STATE_PROCESS_MEDIA;
231
232 rv = http_cache->GetBackend(
233 &cache_,
234 base::Bind(&StoragePartitionHttpCacheDataRemover::DoClearCache,
235 base::Unretained(this)));
236 break;
237 }
238 case STATE_PROCESS_MAIN:
239 case STATE_PROCESS_MEDIA: {
240 next_cache_state_ = (next_cache_state_ == STATE_PROCESS_MAIN)
241 ? STATE_CREATE_MEDIA
242 : STATE_DONE;
243
244 // |cache_| can be null if it cannot be initialized.
245 if (cache_) {
246 if (delete_begin_.is_null() && delete_end_.is_max()) {
247 // TODO(msramek): Implement analogous |CalculateSizeOfAllEntries|.
248 rv = cache_->CalculateSizeOfEntriesBetween(
249 base::Time(), base::Time::Max(),
250 base::Bind(
251 &StoragePartitionHttpCacheDataRemover::DoCountCache,
252 base::Unretained(this)));
253 } else {
254 rv = cache_->CalculateSizeOfEntriesBetween(
255 delete_begin_, delete_end_,
256 base::Bind(
257 &StoragePartitionHttpCacheDataRemover::DoCountCache,
258 base::Unretained(this)));
259 }
260 cache_ = NULL;
261 }
262 break;
263 }
264 case STATE_DONE: {
265 cache_ = NULL;
266 next_cache_state_ = STATE_NONE;
267
268 // Notify the UI thread that we are done.
269 BrowserThread::PostTask(
270 BrowserThread::UI, FROM_HERE,
271 base::Bind(&StoragePartitionHttpCacheDataRemover::CountedHttpCache,
272 base::Unretained(this)));
273 return;
274 }
275 default: {
276 NOTREACHED() << "bad state";
277 next_cache_state_ = STATE_NONE; // Stop looping.
278 return;
279 }
280 }
281 }
282 }
283
161 } // namespace browsing_data 284 } // namespace browsing_data
OLDNEW
« no previous file with comments | « components/browsing_data/storage_partition_http_cache_data_remover.h ('k') | net/disk_cache/blockfile/backend_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698