OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "content/browser/cache_storage/cache_storage_cache.h" | 5 #include "content/browser/cache_storage/cache_storage_cache.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <algorithm> | 8 #include <algorithm> |
9 #include <limits> | 9 #include <limits> |
10 #include <memory> | 10 #include <memory> |
11 #include <string> | 11 #include <string> |
12 #include <utility> | 12 #include <utility> |
13 | 13 |
14 #include "base/barrier_closure.h" | 14 #include "base/barrier_closure.h" |
15 #include "base/bind_helpers.h" | 15 #include "base/bind_helpers.h" |
16 #include "base/files/file_path.h" | 16 #include "base/files/file_path.h" |
17 #include "base/guid.h" | 17 #include "base/guid.h" |
18 #include "base/macros.h" | 18 #include "base/macros.h" |
19 #include "base/memory/ptr_util.h" | 19 #include "base/memory/ptr_util.h" |
20 #include "base/metrics/histogram_macros.h" | 20 #include "base/metrics/histogram_macros.h" |
21 #include "base/strings/string_split.h" | 21 #include "base/strings/string_split.h" |
22 #include "base/strings/string_util.h" | 22 #include "base/strings/string_util.h" |
23 #include "base/threading/thread_task_runner_handle.h" | 23 #include "base/threading/thread_task_runner_handle.h" |
24 #include "content/browser/cache_storage/cache_storage.pb.h" | 24 #include "content/browser/cache_storage/cache_storage.pb.h" |
25 #include "content/browser/cache_storage/cache_storage_blob_to_disk_cache.h" | 25 #include "content/browser/cache_storage/cache_storage_blob_to_disk_cache.h" |
26 #include "content/browser/cache_storage/cache_storage_cache_handle.h" | 26 #include "content/browser/cache_storage/cache_storage_cache_handle.h" |
| 27 #include "content/browser/cache_storage/cache_storage_cache_observer.h" |
27 #include "content/browser/cache_storage/cache_storage_scheduler.h" | 28 #include "content/browser/cache_storage/cache_storage_scheduler.h" |
28 #include "content/public/browser/browser_thread.h" | 29 #include "content/public/browser/browser_thread.h" |
29 #include "content/public/common/referrer.h" | 30 #include "content/public/common/referrer.h" |
30 #include "net/base/completion_callback.h" | 31 #include "net/base/completion_callback.h" |
31 #include "net/base/io_buffer.h" | 32 #include "net/base/io_buffer.h" |
32 #include "net/base/net_errors.h" | 33 #include "net/base/net_errors.h" |
33 #include "net/disk_cache/disk_cache.h" | 34 #include "net/disk_cache/disk_cache.h" |
34 #include "net/url_request/url_request_context_getter.h" | 35 #include "net/url_request/url_request_context_getter.h" |
35 #include "storage/browser/blob/blob_data_builder.h" | 36 #include "storage/browser/blob/blob_data_builder.h" |
36 #include "storage/browser/blob/blob_data_handle.h" | 37 #include "storage/browser/blob/blob_data_handle.h" |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 std::unique_ptr<CacheStorageCache> CacheStorageCache::CreateMemoryCache( | 259 std::unique_ptr<CacheStorageCache> CacheStorageCache::CreateMemoryCache( |
259 const GURL& origin, | 260 const GURL& origin, |
260 const std::string& cache_name, | 261 const std::string& cache_name, |
261 CacheStorage* cache_storage, | 262 CacheStorage* cache_storage, |
262 scoped_refptr<net::URLRequestContextGetter> request_context_getter, | 263 scoped_refptr<net::URLRequestContextGetter> request_context_getter, |
263 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy, | 264 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy, |
264 base::WeakPtr<storage::BlobStorageContext> blob_context) { | 265 base::WeakPtr<storage::BlobStorageContext> blob_context) { |
265 CacheStorageCache* cache = | 266 CacheStorageCache* cache = |
266 new CacheStorageCache(origin, cache_name, base::FilePath(), cache_storage, | 267 new CacheStorageCache(origin, cache_name, base::FilePath(), cache_storage, |
267 std::move(request_context_getter), | 268 std::move(request_context_getter), |
268 std::move(quota_manager_proxy), blob_context); | 269 std::move(quota_manager_proxy), blob_context, 0); |
269 cache->InitBackend(); | 270 cache->SetObserver(cache_storage), cache->InitBackend(); |
270 return base::WrapUnique(cache); | 271 return base::WrapUnique(cache); |
271 } | 272 } |
272 | 273 |
273 // static | 274 // static |
274 std::unique_ptr<CacheStorageCache> CacheStorageCache::CreatePersistentCache( | 275 std::unique_ptr<CacheStorageCache> CacheStorageCache::CreatePersistentCache( |
275 const GURL& origin, | 276 const GURL& origin, |
276 const std::string& cache_name, | 277 const std::string& cache_name, |
277 CacheStorage* cache_storage, | 278 CacheStorage* cache_storage, |
278 const base::FilePath& path, | 279 const base::FilePath& path, |
279 scoped_refptr<net::URLRequestContextGetter> request_context_getter, | 280 scoped_refptr<net::URLRequestContextGetter> request_context_getter, |
280 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy, | 281 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy, |
281 base::WeakPtr<storage::BlobStorageContext> blob_context) { | 282 base::WeakPtr<storage::BlobStorageContext> blob_context, |
282 CacheStorageCache* cache = | 283 int64_t cache_size) { |
283 new CacheStorageCache(origin, cache_name, path, cache_storage, | 284 CacheStorageCache* cache = new CacheStorageCache( |
284 std::move(request_context_getter), | 285 origin, cache_name, path, cache_storage, |
285 std::move(quota_manager_proxy), blob_context); | 286 std::move(request_context_getter), std::move(quota_manager_proxy), |
286 cache->InitBackend(); | 287 blob_context, cache_size); |
| 288 cache->SetObserver(cache_storage), cache->InitBackend(); |
287 return base::WrapUnique(cache); | 289 return base::WrapUnique(cache); |
288 } | 290 } |
289 | 291 |
290 base::WeakPtr<CacheStorageCache> CacheStorageCache::AsWeakPtr() { | 292 base::WeakPtr<CacheStorageCache> CacheStorageCache::AsWeakPtr() { |
291 return weak_ptr_factory_.GetWeakPtr(); | 293 return weak_ptr_factory_.GetWeakPtr(); |
292 } | 294 } |
293 | 295 |
294 void CacheStorageCache::Match( | 296 void CacheStorageCache::Match( |
295 std::unique_ptr<ServiceWorkerFetchRequest> request, | 297 std::unique_ptr<ServiceWorkerFetchRequest> request, |
296 const CacheStorageCacheQueryParams& match_params, | 298 const CacheStorageCacheQueryParams& match_params, |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 return; | 492 return; |
491 } | 493 } |
492 | 494 |
493 scheduler_->ScheduleOperation( | 495 scheduler_->ScheduleOperation( |
494 base::Bind(&CacheStorageCache::SizeImpl, weak_ptr_factory_.GetWeakPtr(), | 496 base::Bind(&CacheStorageCache::SizeImpl, weak_ptr_factory_.GetWeakPtr(), |
495 base::Bind(&CacheStorageCache::GetSizeThenCloseDidGetSize, | 497 base::Bind(&CacheStorageCache::GetSizeThenCloseDidGetSize, |
496 weak_ptr_factory_.GetWeakPtr(), | 498 weak_ptr_factory_.GetWeakPtr(), |
497 scheduler_->WrapCallbackToRunNext(callback)))); | 499 scheduler_->WrapCallbackToRunNext(callback)))); |
498 } | 500 } |
499 | 501 |
| 502 void CacheStorageCache::SetObserver(CacheStorageCacheObserver* observer) { |
| 503 cache_observer_ = observer; |
| 504 } |
| 505 |
500 CacheStorageCache::~CacheStorageCache() { | 506 CacheStorageCache::~CacheStorageCache() { |
501 quota_manager_proxy_->NotifyOriginNoLongerInUse(origin_); | 507 quota_manager_proxy_->NotifyOriginNoLongerInUse(origin_); |
502 } | 508 } |
503 | 509 |
504 CacheStorageCache::CacheStorageCache( | 510 CacheStorageCache::CacheStorageCache( |
505 const GURL& origin, | 511 const GURL& origin, |
506 const std::string& cache_name, | 512 const std::string& cache_name, |
507 const base::FilePath& path, | 513 const base::FilePath& path, |
508 CacheStorage* cache_storage, | 514 CacheStorage* cache_storage, |
509 scoped_refptr<net::URLRequestContextGetter> request_context_getter, | 515 scoped_refptr<net::URLRequestContextGetter> request_context_getter, |
510 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy, | 516 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy, |
511 base::WeakPtr<storage::BlobStorageContext> blob_context) | 517 base::WeakPtr<storage::BlobStorageContext> blob_context, |
| 518 int64_t cache_size) |
512 : origin_(origin), | 519 : origin_(origin), |
513 cache_name_(cache_name), | 520 cache_name_(cache_name), |
514 path_(path), | 521 path_(path), |
515 cache_storage_(cache_storage), | 522 cache_storage_(cache_storage), |
516 request_context_getter_(std::move(request_context_getter)), | 523 request_context_getter_(std::move(request_context_getter)), |
517 quota_manager_proxy_(std::move(quota_manager_proxy)), | 524 quota_manager_proxy_(std::move(quota_manager_proxy)), |
518 blob_storage_context_(blob_context), | 525 blob_storage_context_(blob_context), |
519 scheduler_( | 526 scheduler_( |
520 new CacheStorageScheduler(CacheStorageSchedulerClient::CLIENT_CACHE)), | 527 new CacheStorageScheduler(CacheStorageSchedulerClient::CLIENT_CACHE)), |
| 528 cache_size_(cache_size), |
521 max_query_size_bytes_(kMaxQueryCacheResultBytes), | 529 max_query_size_bytes_(kMaxQueryCacheResultBytes), |
| 530 cache_observer_(nullptr), |
522 memory_only_(path.empty()), | 531 memory_only_(path.empty()), |
523 weak_ptr_factory_(this) { | 532 weak_ptr_factory_(this) { |
524 DCHECK(!origin_.is_empty()); | 533 DCHECK(!origin_.is_empty()); |
525 DCHECK(quota_manager_proxy_.get()); | 534 DCHECK(quota_manager_proxy_.get()); |
526 | 535 |
527 quota_manager_proxy_->NotifyOriginInUse(origin_); | 536 quota_manager_proxy_->NotifyOriginInUse(origin_); |
528 } | 537 } |
529 | 538 |
530 void CacheStorageCache::QueryCache( | 539 void CacheStorageCache::QueryCache( |
531 std::unique_ptr<ServiceWorkerFetchRequest> request, | 540 std::unique_ptr<ServiceWorkerFetchRequest> request, |
(...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1177 &CacheStorageCache::UpdateCacheSizeGotSize, | 1186 &CacheStorageCache::UpdateCacheSizeGotSize, |
1178 weak_ptr_factory_.GetWeakPtr(), base::Passed(CreateCacheHandle()))); | 1187 weak_ptr_factory_.GetWeakPtr(), base::Passed(CreateCacheHandle()))); |
1179 | 1188 |
1180 if (rv != net::ERR_IO_PENDING) | 1189 if (rv != net::ERR_IO_PENDING) |
1181 UpdateCacheSizeGotSize(CreateCacheHandle(), rv); | 1190 UpdateCacheSizeGotSize(CreateCacheHandle(), rv); |
1182 } | 1191 } |
1183 | 1192 |
1184 void CacheStorageCache::UpdateCacheSizeGotSize( | 1193 void CacheStorageCache::UpdateCacheSizeGotSize( |
1185 std::unique_ptr<CacheStorageCacheHandle> cache_handle, | 1194 std::unique_ptr<CacheStorageCacheHandle> cache_handle, |
1186 int current_cache_size) { | 1195 int current_cache_size) { |
| 1196 DCHECK_NE(current_cache_size, CacheStorage::kSizeUnknown); |
1187 int64_t old_cache_size = cache_size_; | 1197 int64_t old_cache_size = cache_size_; |
1188 cache_size_ = current_cache_size; | 1198 cache_size_ = current_cache_size; |
1189 | 1199 |
| 1200 int64_t size_delta = current_cache_size - old_cache_size; |
| 1201 |
1190 quota_manager_proxy_->NotifyStorageModified( | 1202 quota_manager_proxy_->NotifyStorageModified( |
1191 storage::QuotaClient::kServiceWorkerCache, origin_, | 1203 storage::QuotaClient::kServiceWorkerCache, origin_, |
1192 storage::kStorageTypeTemporary, current_cache_size - old_cache_size); | 1204 storage::kStorageTypeTemporary, size_delta); |
| 1205 |
| 1206 if (cache_observer_) |
| 1207 cache_observer_->CacheModified(this, size_delta); |
1193 } | 1208 } |
1194 | 1209 |
1195 void CacheStorageCache::Delete(const CacheStorageBatchOperation& operation, | 1210 void CacheStorageCache::Delete(const CacheStorageBatchOperation& operation, |
1196 const ErrorCallback& callback) { | 1211 const ErrorCallback& callback) { |
1197 DCHECK(BACKEND_OPEN == backend_state_ || initializing_); | 1212 DCHECK(BACKEND_OPEN == backend_state_ || initializing_); |
1198 DCHECK_EQ(CACHE_STORAGE_CACHE_OPERATION_TYPE_DELETE, | 1213 DCHECK_EQ(CACHE_STORAGE_CACHE_OPERATION_TYPE_DELETE, |
1199 operation.operation_type); | 1214 operation.operation_type); |
1200 | 1215 |
1201 std::unique_ptr<ServiceWorkerFetchRequest> request( | 1216 std::unique_ptr<ServiceWorkerFetchRequest> request( |
1202 new ServiceWorkerFetchRequest( | 1217 new ServiceWorkerFetchRequest( |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1367 base::Bind(&CacheStorageCache::InitGotCacheSize, | 1382 base::Bind(&CacheStorageCache::InitGotCacheSize, |
1368 weak_ptr_factory_.GetWeakPtr(), callback, cache_create_error)); | 1383 weak_ptr_factory_.GetWeakPtr(), callback, cache_create_error)); |
1369 | 1384 |
1370 if (rv != net::ERR_IO_PENDING) | 1385 if (rv != net::ERR_IO_PENDING) |
1371 InitGotCacheSize(callback, cache_create_error, rv); | 1386 InitGotCacheSize(callback, cache_create_error, rv); |
1372 } | 1387 } |
1373 | 1388 |
1374 void CacheStorageCache::InitGotCacheSize(const base::Closure& callback, | 1389 void CacheStorageCache::InitGotCacheSize(const base::Closure& callback, |
1375 CacheStorageError cache_create_error, | 1390 CacheStorageError cache_create_error, |
1376 int cache_size) { | 1391 int cache_size) { |
| 1392 if (cache_size_ != CacheStorage::kSizeUnknown) { |
| 1393 // If this check fails, either there is a flaw in how Chrome remembers the |
| 1394 // cache size, or the files in the cache have been modified. |
| 1395 DCHECK_EQ(cache_size_, cache_size); |
| 1396 } |
1377 cache_size_ = cache_size; | 1397 cache_size_ = cache_size; |
1378 initializing_ = false; | 1398 initializing_ = false; |
1379 backend_state_ = (cache_create_error == CACHE_STORAGE_OK && backend_ && | 1399 backend_state_ = (cache_create_error == CACHE_STORAGE_OK && backend_ && |
1380 backend_state_ == BACKEND_UNINITIALIZED) | 1400 backend_state_ == BACKEND_UNINITIALIZED) |
1381 ? BACKEND_OPEN | 1401 ? BACKEND_OPEN |
1382 : BACKEND_CLOSED; | 1402 : BACKEND_CLOSED; |
1383 | 1403 |
1384 UMA_HISTOGRAM_ENUMERATION("ServiceWorkerCache.InitBackendResult", | 1404 UMA_HISTOGRAM_ENUMERATION("ServiceWorkerCache.InitBackendResult", |
1385 cache_create_error, CACHE_STORAGE_ERROR_LAST + 1); | 1405 cache_create_error, CACHE_STORAGE_ERROR_LAST + 1); |
1386 | 1406 |
| 1407 if (cache_observer_) |
| 1408 cache_observer_->SetCacheSize(this, cache_size_); |
| 1409 |
1387 callback.Run(); | 1410 callback.Run(); |
1388 } | 1411 } |
1389 | 1412 |
1390 void CacheStorageCache::PopulateRequestFromMetadata( | 1413 void CacheStorageCache::PopulateRequestFromMetadata( |
1391 const CacheMetadata& metadata, | 1414 const CacheMetadata& metadata, |
1392 const GURL& request_url, | 1415 const GURL& request_url, |
1393 ServiceWorkerFetchRequest* request) { | 1416 ServiceWorkerFetchRequest* request) { |
1394 *request = | 1417 *request = |
1395 ServiceWorkerFetchRequest(request_url, metadata.request().method(), | 1418 ServiceWorkerFetchRequest(request_url, metadata.request().method(), |
1396 ServiceWorkerHeaderMap(), Referrer(), false); | 1419 ServiceWorkerHeaderMap(), Referrer(), false); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1442 temp_entry, INDEX_RESPONSE_BODY, INDEX_SIDE_DATA); | 1465 temp_entry, INDEX_RESPONSE_BODY, INDEX_SIDE_DATA); |
1443 return blob_storage_context_->AddFinishedBlob(&blob_data); | 1466 return blob_storage_context_->AddFinishedBlob(&blob_data); |
1444 } | 1467 } |
1445 | 1468 |
1446 std::unique_ptr<CacheStorageCacheHandle> | 1469 std::unique_ptr<CacheStorageCacheHandle> |
1447 CacheStorageCache::CreateCacheHandle() { | 1470 CacheStorageCache::CreateCacheHandle() { |
1448 return cache_storage_->CreateCacheHandle(this); | 1471 return cache_storage_->CreateCacheHandle(this); |
1449 } | 1472 } |
1450 | 1473 |
1451 } // namespace content | 1474 } // namespace content |
OLD | NEW |