Chromium Code Reviews| 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> |
| (...skipping 935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 946 operation.request.url, operation.request.method, | 946 operation.request.url, operation.request.method, |
| 947 operation.request.headers, operation.request.referrer, | 947 operation.request.headers, operation.request.referrer, |
| 948 operation.request.is_reload)); | 948 operation.request.is_reload)); |
| 949 | 949 |
| 950 // We don't support streaming for cache. | 950 // We don't support streaming for cache. |
| 951 DCHECK(operation.response.stream_url.is_empty()); | 951 DCHECK(operation.response.stream_url.is_empty()); |
| 952 // We don't support the body of redirect response. | 952 // We don't support the body of redirect response. |
| 953 DCHECK(!(operation.response.response_type == | 953 DCHECK(!(operation.response.response_type == |
| 954 blink::WebServiceWorkerResponseTypeOpaqueRedirect && | 954 blink::WebServiceWorkerResponseTypeOpaqueRedirect && |
| 955 operation.response.blob_size)); | 955 operation.response.blob_size)); |
| 956 std::unique_ptr<ServiceWorkerResponse> response(new ServiceWorkerResponse( | |
| 957 operation.response.url, operation.response.status_code, | |
| 958 operation.response.status_text, operation.response.response_type, | |
| 959 operation.response.headers, operation.response.blob_uuid, | |
| 960 operation.response.blob_size, operation.response.stream_url, | |
| 961 operation.response.error, operation.response.response_time, | |
| 962 false /* is_in_cache_storage */, | |
| 963 std::string() /* cache_storage_cache_name */, | |
| 964 operation.response.cors_exposed_header_names)); | |
| 965 | 956 |
| 957 std::unique_ptr<ServiceWorkerResponse> response( | |
| 958 new ServiceWorkerResponse(operation.response)); | |
| 966 std::unique_ptr<storage::BlobDataHandle> blob_data_handle; | 959 std::unique_ptr<storage::BlobDataHandle> blob_data_handle; |
| 967 | 960 |
| 968 if (!response->blob_uuid.empty()) { | 961 if (!response->blob_uuid.empty()) { |
| 969 if (!blob_storage_context_) { | 962 if (!blob_storage_context_) { |
| 970 callback.Run(CACHE_STORAGE_ERROR_STORAGE); | 963 callback.Run(CACHE_STORAGE_ERROR_STORAGE); |
| 971 return; | 964 return; |
| 972 } | 965 } |
| 973 blob_data_handle = | 966 blob_data_handle = |
| 974 blob_storage_context_->GetBlobDataFromUUID(response->blob_uuid); | 967 blob_storage_context_->GetBlobDataFromUUID(response->blob_uuid); |
| 975 if (!blob_data_handle) { | 968 if (!blob_data_handle) { |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1061 proto::CacheHeaderMap* header_map = request_metadata->add_headers(); | 1054 proto::CacheHeaderMap* header_map = request_metadata->add_headers(); |
| 1062 header_map->set_name(it->first); | 1055 header_map->set_name(it->first); |
| 1063 header_map->set_value(it->second); | 1056 header_map->set_value(it->second); |
| 1064 } | 1057 } |
| 1065 | 1058 |
| 1066 proto::CacheResponse* response_metadata = metadata.mutable_response(); | 1059 proto::CacheResponse* response_metadata = metadata.mutable_response(); |
| 1067 response_metadata->set_status_code(put_context->response->status_code); | 1060 response_metadata->set_status_code(put_context->response->status_code); |
| 1068 response_metadata->set_status_text(put_context->response->status_text); | 1061 response_metadata->set_status_text(put_context->response->status_text); |
| 1069 response_metadata->set_response_type( | 1062 response_metadata->set_response_type( |
| 1070 WebResponseTypeToProtoResponseType(put_context->response->response_type)); | 1063 WebResponseTypeToProtoResponseType(put_context->response->response_type)); |
| 1071 response_metadata->set_url(put_context->response->url.spec()); | 1064 for (const auto& url : put_context->response->url_list) |
| 1065 response_metadata->add_url_list(url.spec()); | |
| 1072 response_metadata->set_response_time( | 1066 response_metadata->set_response_time( |
| 1073 put_context->response->response_time.ToInternalValue()); | 1067 put_context->response->response_time.ToInternalValue()); |
| 1074 for (ServiceWorkerHeaderMap::const_iterator it = | 1068 for (ServiceWorkerHeaderMap::const_iterator it = |
| 1075 put_context->response->headers.begin(); | 1069 put_context->response->headers.begin(); |
| 1076 it != put_context->response->headers.end(); ++it) { | 1070 it != put_context->response->headers.end(); ++it) { |
| 1077 DCHECK_EQ(std::string::npos, it->first.find('\0')); | 1071 DCHECK_EQ(std::string::npos, it->first.find('\0')); |
| 1078 DCHECK_EQ(std::string::npos, it->second.find('\0')); | 1072 DCHECK_EQ(std::string::npos, it->second.find('\0')); |
| 1079 proto::CacheHeaderMap* header_map = response_metadata->add_headers(); | 1073 proto::CacheHeaderMap* header_map = response_metadata->add_headers(); |
| 1080 header_map->set_name(it->first); | 1074 header_map->set_name(it->first); |
| 1081 header_map->set_value(it->second); | 1075 header_map->set_value(it->second); |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1400 const proto::CacheHeaderMap header = metadata.request().headers(i); | 1394 const proto::CacheHeaderMap header = metadata.request().headers(i); |
| 1401 DCHECK_EQ(std::string::npos, header.name().find('\0')); | 1395 DCHECK_EQ(std::string::npos, header.name().find('\0')); |
| 1402 DCHECK_EQ(std::string::npos, header.value().find('\0')); | 1396 DCHECK_EQ(std::string::npos, header.value().find('\0')); |
| 1403 request->headers.insert(std::make_pair(header.name(), header.value())); | 1397 request->headers.insert(std::make_pair(header.name(), header.value())); |
| 1404 } | 1398 } |
| 1405 } | 1399 } |
| 1406 | 1400 |
| 1407 void CacheStorageCache::PopulateResponseMetadata( | 1401 void CacheStorageCache::PopulateResponseMetadata( |
| 1408 const proto::CacheMetadata& metadata, | 1402 const proto::CacheMetadata& metadata, |
| 1409 ServiceWorkerResponse* response) { | 1403 ServiceWorkerResponse* response) { |
| 1410 *response = ServiceWorkerResponse( | 1404 std::unique_ptr<std::vector<GURL>> url_list( |
| 1411 GURL(metadata.response().url()), metadata.response().status_code(), | 1405 base::MakeUnique<std::vector<GURL>>()); |
| 1412 metadata.response().status_text(), | 1406 // From Chrome 57, proto::CacheMetadata's url field was deprecated. |
| 1413 ProtoResponseTypeToWebResponseType(metadata.response().response_type()), | 1407 UMA_HISTOGRAM_BOOLEAN("ServiceWorkerCache.Response.HasDepricatedURL", |
|
falken
2016/11/30 14:57:37
s/Depricated/Deprecated
Given the size of this CL
horo
2016/12/01 07:42:13
Done.
Added TODO.
| |
| 1414 ServiceWorkerHeaderMap(), "", 0, GURL(), | 1408 metadata.response().has_url()); |
| 1415 blink::WebServiceWorkerResponseErrorUnknown, | 1409 if (metadata.response().has_url()) { |
| 1416 base::Time::FromInternalValue(metadata.response().response_time()), | 1410 url_list->push_back(GURL(metadata.response().url())); |
| 1417 true /* is_in_cache_storage */, cache_name_, | 1411 } else { |
| 1418 ServiceWorkerHeaderList( | 1412 url_list->reserve(metadata.response().url_list_size()); |
| 1419 metadata.response().cors_exposed_header_names().begin(), | 1413 for (int i = 0; i < metadata.response().url_list_size(); ++i) |
| 1420 metadata.response().cors_exposed_header_names().end())); | 1414 url_list->push_back(GURL(metadata.response().url_list(i))); |
| 1415 } | |
| 1421 | 1416 |
| 1417 std::unique_ptr<ServiceWorkerHeaderMap> headers( | |
| 1418 base::MakeUnique<ServiceWorkerHeaderMap>()); | |
| 1422 for (int i = 0; i < metadata.response().headers_size(); ++i) { | 1419 for (int i = 0; i < metadata.response().headers_size(); ++i) { |
| 1423 const proto::CacheHeaderMap header = metadata.response().headers(i); | 1420 const proto::CacheHeaderMap header = metadata.response().headers(i); |
| 1424 DCHECK_EQ(std::string::npos, header.name().find('\0')); | 1421 DCHECK_EQ(std::string::npos, header.name().find('\0')); |
| 1425 DCHECK_EQ(std::string::npos, header.value().find('\0')); | 1422 DCHECK_EQ(std::string::npos, header.value().find('\0')); |
| 1426 response->headers.insert(std::make_pair(header.name(), header.value())); | 1423 headers->insert(std::make_pair(header.name(), header.value())); |
| 1427 } | 1424 } |
| 1425 | |
| 1426 *response = ServiceWorkerResponse( | |
| 1427 std::move(url_list), metadata.response().status_code(), | |
| 1428 metadata.response().status_text(), | |
| 1429 ProtoResponseTypeToWebResponseType(metadata.response().response_type()), | |
| 1430 std::move(headers), "", 0, GURL(), | |
| 1431 blink::WebServiceWorkerResponseErrorUnknown, | |
| 1432 base::Time::FromInternalValue(metadata.response().response_time()), | |
| 1433 true /* is_in_cache_storage */, cache_name_, | |
| 1434 base::MakeUnique<ServiceWorkerHeaderList>( | |
| 1435 metadata.response().cors_exposed_header_names().begin(), | |
| 1436 metadata.response().cors_exposed_header_names().end())); | |
| 1428 } | 1437 } |
| 1429 | 1438 |
| 1430 std::unique_ptr<storage::BlobDataHandle> | 1439 std::unique_ptr<storage::BlobDataHandle> |
| 1431 CacheStorageCache::PopulateResponseBody(disk_cache::ScopedEntryPtr entry, | 1440 CacheStorageCache::PopulateResponseBody(disk_cache::ScopedEntryPtr entry, |
| 1432 ServiceWorkerResponse* response) { | 1441 ServiceWorkerResponse* response) { |
| 1433 DCHECK(blob_storage_context_); | 1442 DCHECK(blob_storage_context_); |
| 1434 | 1443 |
| 1435 // Create a blob with the response body data. | 1444 // Create a blob with the response body data. |
| 1436 response->blob_size = entry->GetDataSize(INDEX_RESPONSE_BODY); | 1445 response->blob_size = entry->GetDataSize(INDEX_RESPONSE_BODY); |
| 1437 response->blob_uuid = base::GenerateGUID(); | 1446 response->blob_uuid = base::GenerateGUID(); |
| 1438 storage::BlobDataBuilder blob_data(response->blob_uuid); | 1447 storage::BlobDataBuilder blob_data(response->blob_uuid); |
| 1439 | 1448 |
| 1440 disk_cache::Entry* temp_entry = entry.get(); | 1449 disk_cache::Entry* temp_entry = entry.get(); |
| 1441 blob_data.AppendDiskCacheEntryWithSideData( | 1450 blob_data.AppendDiskCacheEntryWithSideData( |
| 1442 new CacheStorageCacheDataHandle(CreateCacheHandle(), std::move(entry)), | 1451 new CacheStorageCacheDataHandle(CreateCacheHandle(), std::move(entry)), |
| 1443 temp_entry, INDEX_RESPONSE_BODY, INDEX_SIDE_DATA); | 1452 temp_entry, INDEX_RESPONSE_BODY, INDEX_SIDE_DATA); |
| 1444 return blob_storage_context_->AddFinishedBlob(&blob_data); | 1453 return blob_storage_context_->AddFinishedBlob(&blob_data); |
| 1445 } | 1454 } |
| 1446 | 1455 |
| 1447 std::unique_ptr<CacheStorageCacheHandle> | 1456 std::unique_ptr<CacheStorageCacheHandle> |
| 1448 CacheStorageCache::CreateCacheHandle() { | 1457 CacheStorageCache::CreateCacheHandle() { |
| 1449 return cache_storage_->CreateCacheHandle(this); | 1458 return cache_storage_->CreateCacheHandle(this); |
| 1450 } | 1459 } |
| 1451 | 1460 |
| 1452 } // namespace content | 1461 } // namespace content |
| OLD | NEW |