summaryrefslogtreecommitdiff
path: root/chromium/content/browser/cache_storage/cache_storage_cache.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/browser/cache_storage/cache_storage_cache.cc')
-rw-r--r--chromium/content/browser/cache_storage/cache_storage_cache.cc168
1 files changed, 108 insertions, 60 deletions
diff --git a/chromium/content/browser/cache_storage/cache_storage_cache.cc b/chromium/content/browser/cache_storage/cache_storage_cache.cc
index a4e3aa14d58..72f27bb164f 100644
--- a/chromium/content/browser/cache_storage/cache_storage_cache.cc
+++ b/chromium/content/browser/cache_storage/cache_storage_cache.cc
@@ -29,6 +29,8 @@
#include "content/browser/cache_storage/cache_storage_blob_to_disk_cache.h"
#include "content/browser/cache_storage/cache_storage_cache_handle.h"
#include "content/browser/cache_storage/cache_storage_cache_observer.h"
+#include "content/browser/cache_storage/cache_storage_histogram_utils.h"
+#include "content/browser/cache_storage/cache_storage_manager.h"
#include "content/browser/cache_storage/cache_storage_quota_client.h"
#include "content/browser/cache_storage/cache_storage_scheduler.h"
#include "content/public/browser/browser_thread.h"
@@ -50,6 +52,7 @@
#include "storage/browser/quota/quota_manager_proxy.h"
#include "storage/common/blob_storage/blob_handle.h"
#include "storage/common/storage_histograms.h"
+#include "third_party/blink/public/common/blob/blob_utils.h"
#include "third_party/blink/public/common/cache_storage/cache_storage_utils.h"
#include "third_party/blink/public/mojom/quota/quota_types.mojom.h"
@@ -83,10 +86,6 @@ const int32_t kCachePaddingAlgorithmVersion = 2;
using MetadataCallback =
base::OnceCallback<void(std::unique_ptr<proto::CacheMetadata>)>;
-// The maximum size of each cache. Ultimately, cache size
-// is controlled per-origin by the QuotaManager.
-const int kMaxCacheBytes = std::numeric_limits<int>::max();
-
network::mojom::FetchResponseType ProtoResponseTypeToFetchResponseType(
proto::CacheResponse::ResponseType response_type) {
switch (response_type) {
@@ -152,9 +151,8 @@ bool VaryMatches(const ServiceWorkerHeaderMap& request,
if (trimmed == "*")
return false;
- ServiceWorkerHeaderMap::const_iterator request_iter = request.find(trimmed);
- ServiceWorkerHeaderMap::const_iterator cached_request_iter =
- cached_request.find(trimmed);
+ auto request_iter = request.find(trimmed);
+ auto cached_request_iter = cached_request.find(trimmed);
// If the header exists in one but not the other, no match.
if ((request_iter == request.end()) !=
@@ -258,8 +256,9 @@ GURL RemoveQueryParam(const GURL& url) {
void ReadMetadata(disk_cache::Entry* entry, MetadataCallback callback) {
DCHECK(entry);
- scoped_refptr<net::IOBufferWithSize> buffer(new net::IOBufferWithSize(
- entry->GetDataSize(CacheStorageCache::INDEX_HEADERS)));
+ scoped_refptr<net::IOBufferWithSize> buffer =
+ base::MakeRefCounted<net::IOBufferWithSize>(
+ entry->GetDataSize(CacheStorageCache::INDEX_HEADERS));
net::CompletionCallback read_header_callback =
base::AdaptCallbackForRepeating(base::BindOnce(
@@ -446,19 +445,25 @@ struct CacheStorageCache::PutContext {
PutContext(std::unique_ptr<ServiceWorkerFetchRequest> request,
blink::mojom::FetchAPIResponsePtr response,
blink::mojom::BlobPtr blob,
+ uint64_t blob_size,
blink::mojom::BlobPtr side_data_blob,
+ uint64_t side_data_blob_size,
CacheStorageCache::ErrorCallback callback)
: request(std::move(request)),
response(std::move(response)),
blob(std::move(blob)),
+ blob_size(blob_size),
side_data_blob(std::move(side_data_blob)),
+ side_data_blob_size(side_data_blob_size),
callback(std::move(callback)) {}
// Input parameters to the Put function.
std::unique_ptr<ServiceWorkerFetchRequest> request;
blink::mojom::FetchAPIResponsePtr response;
blink::mojom::BlobPtr blob;
+ uint64_t blob_size;
blink::mojom::BlobPtr side_data_blob;
+ uint64_t side_data_blob_size;
CacheStorageCache::ErrorCallback callback;
disk_cache::ScopedEntryPtr cache_entry;
@@ -566,7 +571,8 @@ void CacheStorageCache::Match(
blink::mojom::QueryParamsPtr match_params,
ResponseCallback callback) {
if (backend_state_ == BACKEND_CLOSED) {
- std::move(callback).Run(CacheStorageError::kErrorStorage, nullptr);
+ std::move(callback).Run(
+ MakeErrorStorage(ErrorStorageType::kMatchBackendClosed), nullptr);
return;
}
@@ -581,8 +587,9 @@ void CacheStorageCache::MatchAll(
blink::mojom::QueryParamsPtr match_params,
ResponsesCallback callback) {
if (backend_state_ == BACKEND_CLOSED) {
- std::move(callback).Run(CacheStorageError::kErrorStorage,
- std::vector<blink::mojom::FetchAPIResponsePtr>());
+ std::move(callback).Run(
+ MakeErrorStorage(ErrorStorageType::kMatchAllBackendClosed),
+ std::vector<blink::mojom::FetchAPIResponsePtr>());
return;
}
@@ -600,7 +607,9 @@ void CacheStorageCache::WriteSideData(ErrorCallback callback,
if (backend_state_ == BACKEND_CLOSED) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
- base::BindOnce(std::move(callback), CacheStorageError::kErrorStorage));
+ base::BindOnce(
+ std::move(callback),
+ MakeErrorStorage(ErrorStorageType::kWriteSideDataBackendClosed)));
return;
}
@@ -626,10 +635,12 @@ void CacheStorageCache::BatchOperation(
if (backend_state_ == BACKEND_CLOSED) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(std::move(callback),
- CacheStorageVerboseError::New(
- CacheStorageError::kErrorStorage,
- std::move(message))));
+ FROM_HERE,
+ base::BindOnce(
+ std::move(callback),
+ CacheStorageVerboseError::New(
+ MakeErrorStorage(ErrorStorageType::kBatchBackendClosed),
+ std::move(message))));
return;
}
@@ -689,10 +700,12 @@ void CacheStorageCache::BatchOperation(
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, std::move(bad_message_callback));
base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(std::move(callback),
- CacheStorageVerboseError::New(
- CacheStorageError::kErrorStorage,
- std::move(message))));
+ FROM_HERE,
+ base::BindOnce(
+ std::move(callback),
+ CacheStorageVerboseError::New(
+ MakeErrorStorage(ErrorStorageType::kBatchInvalidSpace),
+ std::move(message))));
return;
}
uint64_t space_required = safe_space_required.ValueOrDie();
@@ -739,10 +752,13 @@ void CacheStorageCache::BatchDidGetUsageAndQuota(
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, std::move(bad_message_callback));
base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(std::move(callback),
- CacheStorageVerboseError::New(
- CacheStorageError::kErrorStorage,
- std::move(message))));
+ FROM_HERE,
+ base::BindOnce(
+ std::move(callback),
+ CacheStorageVerboseError::New(
+ MakeErrorStorage(
+ ErrorStorageType::kBatchDidGetUsageAndQuotaInvalidSpace),
+ std::move(message))));
return;
}
if (status_code != blink::mojom::QuotaStatusCode::kOk ||
@@ -793,7 +809,8 @@ void CacheStorageCache::BatchDidGetUsageAndQuota(
NOTREACHED();
// TODO(nhiroki): This should return "TypeError".
// http://crbug.com/425505
- completion_callback.Run(CacheStorageError::kErrorStorage);
+ completion_callback.Run(MakeErrorStorage(
+ ErrorStorageType::kBatchDidGetUsageAndQuotaUndefinedOp));
break;
}
}
@@ -827,7 +844,8 @@ void CacheStorageCache::Keys(std::unique_ptr<ServiceWorkerFetchRequest> request,
blink::mojom::QueryParamsPtr options,
RequestsCallback callback) {
if (backend_state_ == BACKEND_CLOSED) {
- std::move(callback).Run(CacheStorageError::kErrorStorage, nullptr);
+ std::move(callback).Run(
+ MakeErrorStorage(ErrorStorageType::kKeysBackendClosed), nullptr);
return;
}
@@ -911,7 +929,7 @@ CacheStorageCache::CacheStorageCache(
cache_observer_(nullptr),
memory_only_(path.empty()),
weak_ptr_factory_(this) {
- DCHECK(!origin_.unique());
+ DCHECK(!origin_.opaque());
DCHECK(quota_manager_proxy_.get());
DCHECK(cache_padding_key_.get());
@@ -933,11 +951,13 @@ void CacheStorageCache::QueryCache(
QUERY_CACHE_ENTRIES | QUERY_CACHE_RESPONSES_WITH_BODIES,
query_types & (QUERY_CACHE_ENTRIES | QUERY_CACHE_RESPONSES_WITH_BODIES));
if (backend_state_ == BACKEND_CLOSED) {
- std::move(callback).Run(CacheStorageError::kErrorStorage, nullptr);
+ std::move(callback).Run(
+ MakeErrorStorage(ErrorStorageType::kQueryCacheBackendClosed), nullptr);
return;
}
- if ((!options || !options->ignore_method) && request &&
+ if (owner_ != CacheStorageOwner::kBackgroundFetch &&
+ (!options || !options->ignore_method) && request &&
!request->method.empty() && request->method != "GET") {
std::move(callback).Run(CacheStorageError::kSuccess,
std::make_unique<QueryCacheResults>());
@@ -1025,7 +1045,7 @@ void CacheStorageCache::QueryCacheFilterEntry(
if (rv < 0) {
std::move(query_cache_context->callback)
- .Run(CacheStorageError::kErrorStorage,
+ .Run(MakeErrorStorage(ErrorStorageType::kQueryCacheFilterEntryFailed),
std::move(query_cache_context->matches));
return;
}
@@ -1127,7 +1147,9 @@ void CacheStorageCache::QueryCacheDidReadMetadata(
if (!blob_storage_context_) {
std::move(query_cache_context->callback)
- .Run(CacheStorageError::kErrorStorage, nullptr);
+ .Run(MakeErrorStorage(
+ ErrorStorageType::kQueryCacheDidReadMetadataNullBlobContext),
+ nullptr);
return;
}
@@ -1214,8 +1236,9 @@ void CacheStorageCache::MatchAllImpl(
ResponsesCallback callback) {
DCHECK_NE(BACKEND_UNINITIALIZED, backend_state_);
if (backend_state_ != BACKEND_OPEN) {
- std::move(callback).Run(CacheStorageError::kErrorStorage,
- std::vector<blink::mojom::FetchAPIResponsePtr>());
+ std::move(callback).Run(
+ MakeErrorStorage(ErrorStorageType::kStorageMatchAllBackendClosed),
+ std::vector<blink::mojom::FetchAPIResponsePtr>());
return;
}
@@ -1277,7 +1300,8 @@ void CacheStorageCache::WriteSideDataImpl(ErrorCallback callback,
int buf_len) {
DCHECK_NE(BACKEND_UNINITIALIZED, backend_state_);
if (backend_state_ != BACKEND_OPEN) {
- std::move(callback).Run(CacheStorageError::kErrorStorage);
+ std::move(callback).Run(
+ MakeErrorStorage(ErrorStorageType::kWriteSideDataImplBackendClosed));
return;
}
@@ -1405,19 +1429,25 @@ void CacheStorageCache::Put(std::unique_ptr<ServiceWorkerFetchRequest> request,
DCHECK(BACKEND_OPEN == backend_state_ || initializing_);
blink::mojom::BlobPtr blob;
+ uint64_t blob_size = blink::BlobUtils::kUnknownSize;
blink::mojom::BlobPtr side_data_blob;
+ uint64_t side_data_blob_size = blink::BlobUtils::kUnknownSize;
- if (response->blob)
+ if (response->blob) {
blob.Bind(std::move(response->blob->blob));
- if (response->side_data_blob)
+ blob_size = response->blob->size;
+ }
+ if (response->side_data_blob) {
side_data_blob.Bind(std::move(response->side_data_blob->blob));
+ side_data_blob_size = response->side_data_blob->size;
+ }
UMA_HISTOGRAM_ENUMERATION("ServiceWorkerCache.Cache.AllWritesResponseType",
response->response_type);
auto put_context = std::make_unique<PutContext>(
- std::move(request), std::move(response), std::move(blob),
- std::move(side_data_blob),
+ std::move(request), std::move(response), std::move(blob), blob_size,
+ std::move(side_data_blob), side_data_blob_size,
scheduler_->WrapCallbackToRunNext(std::move(callback)));
scheduler_->ScheduleOperation(base::BindOnce(&CacheStorageCache::PutImpl,
@@ -1428,7 +1458,8 @@ void CacheStorageCache::Put(std::unique_ptr<ServiceWorkerFetchRequest> request,
void CacheStorageCache::PutImpl(std::unique_ptr<PutContext> put_context) {
DCHECK_NE(BACKEND_UNINITIALIZED, backend_state_);
if (backend_state_ != BACKEND_OPEN) {
- std::move(put_context->callback).Run(CacheStorageError::kErrorStorage);
+ std::move(put_context->callback)
+ .Run(MakeErrorStorage(ErrorStorageType::kPutImplBackendClosed));
return;
}
@@ -1454,7 +1485,9 @@ void CacheStorageCache::PutDidDeleteEntry(
std::unique_ptr<PutContext> put_context,
CacheStorageError error) {
if (backend_state_ != BACKEND_OPEN) {
- std::move(put_context->callback).Run(CacheStorageError::kErrorStorage);
+ std::move(put_context->callback)
+ .Run(MakeErrorStorage(
+ ErrorStorageType::kPutDidDeleteEntryBackendClosed));
return;
}
@@ -1530,12 +1563,13 @@ void CacheStorageCache::PutDidCreateEntry(
std::unique_ptr<std::string> serialized(new std::string());
if (!metadata.SerializeToString(serialized.get())) {
- std::move(put_context->callback).Run(CacheStorageError::kErrorStorage);
+ std::move(put_context->callback)
+ .Run(MakeErrorStorage(ErrorStorageType::kMetadataSerializationFailed));
return;
}
- scoped_refptr<net::StringIOBuffer> buffer(
- new net::StringIOBuffer(std::move(serialized)));
+ scoped_refptr<net::StringIOBuffer> buffer =
+ base::MakeRefCounted<net::StringIOBuffer>(std::move(serialized));
// Get a temporary copy of the entry pointer before passing it in base::Bind.
disk_cache::Entry* temp_entry_ptr = put_context->cache_entry.get();
@@ -1560,7 +1594,8 @@ void CacheStorageCache::PutDidWriteHeaders(
int rv) {
if (rv != expected_bytes) {
put_context->cache_entry->Doom();
- std::move(put_context->callback).Run(CacheStorageError::kErrorStorage);
+ std::move(put_context->callback)
+ .Run(MakeErrorStorage(ErrorStorageType::kPutDidWriteHeadersWrongBytes));
return;
}
@@ -1594,6 +1629,10 @@ void CacheStorageCache::PutWriteBlobToCache(
: std::move(put_context->side_data_blob);
DCHECK(blob);
+ int64_t blob_size = disk_cache_body_index == INDEX_RESPONSE_BODY
+ ? put_context->blob_size
+ : put_context->side_data_blob_size;
+
disk_cache::ScopedEntryPtr entry(std::move(put_context->cache_entry));
put_context->cache_entry = nullptr;
@@ -1603,7 +1642,7 @@ void CacheStorageCache::PutWriteBlobToCache(
active_blob_to_disk_cache_writers_.Add(std::move(blob_to_cache));
blob_to_cache_raw->StreamBlobToCache(
- std::move(entry), disk_cache_body_index, std::move(blob),
+ std::move(entry), disk_cache_body_index, std::move(blob), blob_size,
base::BindOnce(&CacheStorageCache::PutDidWriteBlobToCache,
weak_ptr_factory_.GetWeakPtr(), std::move(put_context),
blob_to_cache_key));
@@ -1621,7 +1660,8 @@ void CacheStorageCache::PutDidWriteBlobToCache(
if (!success) {
put_context->cache_entry->Doom();
- std::move(put_context->callback).Run(CacheStorageError::kErrorStorage);
+ std::move(put_context->callback)
+ .Run(MakeErrorStorage(ErrorStorageType::kPutDidWriteBlobToCacheFailed));
return;
}
@@ -1636,19 +1676,19 @@ void CacheStorageCache::PutDidWriteBlobToCache(
void CacheStorageCache::CalculateCacheSizePadding(
SizePaddingCallback got_sizes_callback) {
- net::CompletionCallback got_size_callback =
+ net::Int64CompletionCallback got_size_callback =
base::AdaptCallbackForRepeating(base::BindOnce(
&CacheStorageCache::CalculateCacheSizePaddingGotSize,
weak_ptr_factory_.GetWeakPtr(), std::move(got_sizes_callback)));
- int rv = backend_->CalculateSizeOfAllEntries(got_size_callback);
+ int64_t rv = backend_->CalculateSizeOfAllEntries(got_size_callback);
if (rv != net::ERR_IO_PENDING)
std::move(got_size_callback).Run(rv);
}
void CacheStorageCache::CalculateCacheSizePaddingGotSize(
SizePaddingCallback callback,
- int cache_size) {
+ int64_t cache_size) {
// Enumerating entries is only done during cache initialization and only if
// necessary.
DCHECK_EQ(backend_state_, BACKEND_UNINITIALIZED);
@@ -1664,7 +1704,7 @@ void CacheStorageCache::CalculateCacheSizePaddingGotSize(
void CacheStorageCache::PaddingDidQueryCache(
SizePaddingCallback callback,
- int cache_size,
+ int64_t cache_size,
CacheStorageError error,
std::unique_ptr<QueryCacheResults> query_cache_results) {
int64_t cache_padding = 0;
@@ -1683,8 +1723,8 @@ void CacheStorageCache::PaddingDidQueryCache(
}
void CacheStorageCache::CalculateCacheSize(
- const net::CompletionCallback& callback) {
- int rv = backend_->CalculateSizeOfAllEntries(callback);
+ const net::Int64CompletionCallback& callback) {
+ int64_t rv = backend_->CalculateSizeOfAllEntries(callback);
if (rv != net::ERR_IO_PENDING)
callback.Run(rv);
}
@@ -1705,7 +1745,7 @@ void CacheStorageCache::UpdateCacheSize(base::OnceClosure callback) {
void CacheStorageCache::UpdateCacheSizeGotSize(
CacheStorageCacheHandle cache_handle,
base::OnceClosure callback,
- int current_cache_size) {
+ int64_t current_cache_size) {
DCHECK_NE(current_cache_size, CacheStorage::kSizeUnknown);
cache_size_ = current_cache_size;
int64_t size_delta = PaddedCacheSize() - last_reported_size_;
@@ -1747,7 +1787,8 @@ void CacheStorageCache::DeleteImpl(
ErrorCallback callback) {
DCHECK_NE(BACKEND_UNINITIALIZED, backend_state_);
if (backend_state_ != BACKEND_OPEN) {
- std::move(callback).Run(CacheStorageError::kErrorStorage);
+ std::move(callback).Run(
+ MakeErrorStorage(ErrorStorageType::kDeleteImplBackendClosed));
return;
}
@@ -1792,7 +1833,8 @@ void CacheStorageCache::KeysImpl(
RequestsCallback callback) {
DCHECK_NE(BACKEND_UNINITIALIZED, backend_state_);
if (backend_state_ != BACKEND_OPEN) {
- std::move(callback).Run(CacheStorageError::kErrorStorage, nullptr);
+ std::move(callback).Run(
+ MakeErrorStorage(ErrorStorageType::kKeysImplBackendClosed), nullptr);
return;
}
@@ -1862,6 +1904,11 @@ void CacheStorageCache::CreateBackend(ErrorCallback callback) {
// Use APP_CACHE as opposed to DISK_CACHE to prevent cache eviction.
net::CacheType cache_type = memory_only_ ? net::MEMORY_CACHE : net::APP_CACHE;
+ // The maximum size of each cache. Ultimately, cache size
+ // is controlled per-origin by the QuotaManager.
+ uint64_t max_bytes = memory_only_ ? std::numeric_limits<int>::max()
+ : std::numeric_limits<int64_t>::max();
+
std::unique_ptr<ScopedBackendPtr> backend_ptr(new ScopedBackendPtr());
// Temporary pointer so that backend_ptr can be Pass()'d in Bind below.
@@ -1874,7 +1921,7 @@ void CacheStorageCache::CreateBackend(ErrorCallback callback) {
std::move(backend_ptr)));
int rv = disk_cache::CreateCacheBackend(
- cache_type, net::CACHE_BACKEND_SIMPLE, path_, kMaxCacheBytes,
+ cache_type, net::CACHE_BACKEND_SIMPLE, path_, max_bytes,
false, /* force */
nullptr, backend,
base::BindOnce(&CacheStorageCache::DeleteBackendCompletedIO,
@@ -1889,7 +1936,8 @@ void CacheStorageCache::CreateBackendDidCreate(
std::unique_ptr<ScopedBackendPtr> backend_ptr,
int rv) {
if (rv != net::OK) {
- std::move(callback).Run(CacheStorageError::kErrorStorage);
+ std::move(callback).Run(
+ MakeErrorStorage(ErrorStorageType::kCreateBackendDidCreateFailed));
return;
}
@@ -1921,7 +1969,7 @@ void CacheStorageCache::InitDidCreateBackend(
auto calculate_size_callback =
base::AdaptCallbackForRepeating(std::move(callback));
- int rv = backend_->CalculateSizeOfAllEntries(base::BindOnce(
+ int64_t rv = backend_->CalculateSizeOfAllEntries(base::BindOnce(
&CacheStorageCache::InitGotCacheSize, weak_ptr_factory_.GetWeakPtr(),
calculate_size_callback, cache_create_error));
@@ -1932,7 +1980,7 @@ void CacheStorageCache::InitDidCreateBackend(
void CacheStorageCache::InitGotCacheSize(base::OnceClosure callback,
CacheStorageError cache_create_error,
- int cache_size) {
+ int64_t cache_size) {
if (cache_create_error != CacheStorageError::kSuccess) {
InitGotCacheSizeAndPadding(std::move(callback), cache_create_error, 0, 0);
return;