From 9961c7aa7718e189e8a38c4429c4ffd6fbdd9d7b Mon Sep 17 00:00:00 2001 From: Pedro Pontes Date: Mon, 6 Dec 2021 03:34:07 +0100 Subject: [PATCH] chore: cherry-pick 1fcfb942bd from chromium (#31929) Co-authored-by: Electron Bot --- patches/chromium/.patches | 1 + ...orage_store_partial_opaque_responses.patch | 94 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 patches/chromium/cachestorage_store_partial_opaque_responses.patch diff --git a/patches/chromium/.patches b/patches/chromium/.patches index 7c8334bb0edf3..8a7b8f0648ff4 100644 --- a/patches/chromium/.patches +++ b/patches/chromium/.patches @@ -167,4 +167,5 @@ cherry-pick-91dd4f79ab5b.patch introduce_crossthreadcopier_skbitmap.patch allow_null_skbitmap_to_be_transferred_across_threads.patch use_weakptrs_for_the_threadediconloader_s_background_tasks.patch +cachestorage_store_partial_opaque_responses.patch cherry-pick-a5f54612590d.patch diff --git a/patches/chromium/cachestorage_store_partial_opaque_responses.patch b/patches/chromium/cachestorage_store_partial_opaque_responses.patch new file mode 100644 index 0000000000000..e28796d2061c2 --- /dev/null +++ b/patches/chromium/cachestorage_store_partial_opaque_responses.patch @@ -0,0 +1,94 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Ben Kelly +Date: Fri, 5 Nov 2021 19:47:08 +0000 +Subject: CacheStorage: Store partial opaque responses. + +(cherry picked from commit 802faa035409ac7cbb58ad1a385bb8507fe99077) + +Fixed: 1260649 +Change-Id: If83156096e6aecec55490330d03c56c0c26120bc +Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3251749 +Reviewed-by: Marijn Kruisselbrink +Commit-Queue: Ben Kelly +Cr-Original-Commit-Position: refs/heads/main@{#937400} +Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3264366 +Bot-Commit: Rubber Stamper +Cr-Commit-Position: refs/branch-heads/4664@{#774} +Cr-Branched-From: 24dc4ee75e01a29d390d43c9c264372a169273a7-refs/heads/main@{#929512} + +diff --git a/content/browser/cache_storage/legacy/legacy_cache_storage_cache.cc b/content/browser/cache_storage/legacy/legacy_cache_storage_cache.cc +index 634d72af383e4b9a52ce04202388e13077754783..c5be9cd6e579ad11701c251d48966934e71e8069 100644 +--- a/content/browser/cache_storage/legacy/legacy_cache_storage_cache.cc ++++ b/content/browser/cache_storage/legacy/legacy_cache_storage_cache.cc +@@ -446,10 +446,10 @@ blink::mojom::FetchAPIResponsePtr CreateResponse( + padding = storage::ComputeRandomResponsePadding(); + } + +- // Note that |has_range_requested| can be safely set to false since it only +- // affects HTTP 206 (Partial) responses, which are blocked from cache storage. +- // See https://fetch.spec.whatwg.org/#main-fetch for usage of +- // |has_range_requested|. ++ // While we block most partial responses from being stored, we can have ++ // partial responses for bgfetch or opaque responses. ++ bool has_range_requested = headers.contains(net::HttpRequestHeaders::kRange); ++ + return blink::mojom::FetchAPIResponse::New( + url_list, metadata.response().status_code(), + metadata.response().status_text(), +@@ -467,7 +467,7 @@ blink::mojom::FetchAPIResponsePtr CreateResponse( + static_cast( + metadata.response().connection_info()), + alpn_negotiated_protocol, metadata.response().was_fetched_via_spdy(), +- /*has_range_requested=*/false, /*auth_challenge_info=*/base::nullopt); ++ has_range_requested, /*auth_challenge_info=*/base::nullopt); + } + + int64_t CalculateSideDataPadding( +@@ -1907,7 +1907,13 @@ void LegacyCacheStorageCache::PutDidCreateEntry( + } + + proto::CacheResponse* response_metadata = metadata.mutable_response(); +- DCHECK_NE(put_context->response->status_code, net::HTTP_PARTIAL_CONTENT); ++ if (owner_ != storage::mojom::CacheStorageOwner::kBackgroundFetch && ++ put_context->response->response_type != ++ network::mojom::FetchResponseType::kOpaque && ++ put_context->response->response_type != ++ network::mojom::FetchResponseType::kOpaqueRedirect) { ++ DCHECK_NE(put_context->response->status_code, net::HTTP_PARTIAL_CONTENT); ++ } + response_metadata->set_status_code(put_context->response->status_code); + response_metadata->set_status_text(put_context->response->status_text); + response_metadata->set_response_type(FetchResponseTypeToProtoResponseType( +diff --git a/third_party/blink/renderer/modules/cache_storage/cache.cc b/third_party/blink/renderer/modules/cache_storage/cache.cc +index 5482ce90e5a9f591016c784a0378b73b0520be03..0ec3a20cff2fdfc1ebd0f512cfdad4c991341d89 100644 +--- a/third_party/blink/renderer/modules/cache_storage/cache.cc ++++ b/third_party/blink/renderer/modules/cache_storage/cache.cc +@@ -101,7 +101,7 @@ void ValidateResponseForPut(const Response* response, + exception_state.ThrowTypeError("Vary header contains *"); + return; + } +- if (response->GetResponse()->InternalStatus() == 206) { ++ if (response->GetResponse()->Status() == 206) { + exception_state.ThrowTypeError( + "Partial response (status code 206) is unsupported"); + return; +diff --git a/third_party/blink/web_tests/external/wpt/service-workers/cache-storage/script-tests/cache-put.js b/third_party/blink/web_tests/external/wpt/service-workers/cache-storage/script-tests/cache-put.js +index b45910a3b8ba089e1724efa8b9e8a8d679c59320..f60c4b905ebcb61854b83177d59861ef92095624 100644 +--- a/third_party/blink/web_tests/external/wpt/service-workers/cache-storage/script-tests/cache-put.js ++++ b/third_party/blink/web_tests/external/wpt/service-workers/cache-storage/script-tests/cache-put.js +@@ -144,7 +144,14 @@ cache_test(function(cache, test) { + 'Test framework error: The status code should be 0 for an ' + + ' opaque-filtered response. This is actually HTTP 206.'); + response = fetch_result.clone(); +- return promise_rejects_js(test, TypeError, cache.put(request, fetch_result)); ++ return cache.put(request, fetch_result); ++ }) ++ .then(function() { ++ return cache.match(test_url); ++ }) ++ .then(function(result) { ++ assert_not_equals(result, undefined, ++ 'Cache.put should store an entry for the opaque response'); + }); + }, 'Cache.put with opaque-filtered HTTP 206 response'); +