diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/core/loader/resource/script_resource.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/core/loader/resource/script_resource.cc | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/chromium/third_party/blink/renderer/core/loader/resource/script_resource.cc b/chromium/third_party/blink/renderer/core/loader/resource/script_resource.cc index 80238ec76ed..22d6955f59d 100644 --- a/chromium/third_party/blink/renderer/core/loader/resource/script_resource.cc +++ b/chromium/third_party/blink/renderer/core/loader/resource/script_resource.cc @@ -48,6 +48,7 @@ #include "third_party/blink/renderer/platform/loader/fetch/text_resource_decoder_options.h" #include "third_party/blink/renderer/platform/loader/subresource_integrity.h" #include "third_party/blink/renderer/platform/network/mime/mime_type_registry.h" +#include "third_party/blink/renderer/platform/weborigin/scheme_registry.h" #include "third_party/blink/renderer/platform/wtf/functional.h" #include "third_party/blink/renderer/platform/wtf/shared_buffer.h" @@ -200,10 +201,24 @@ void ScriptResource::SetSerializedCachedMetadata(mojo_base::BigBuffer data) { } } +bool ScriptResource::CodeCacheHashRequired() const { + if (cached_metadata_handler_) { + bool result = cached_metadata_handler_->HashRequired(); + if (result) { + DCHECK(SchemeRegistry::SchemeSupportsCodeCacheWithHashing( + GetResourceRequest().Url().Protocol())); + } + return result; + } + return false; +} + void ScriptResource::DestroyDecodedDataIfPossible() { if (cached_metadata_handler_) { + // Since we are clearing locally we don't need a CodeCacheHost interface + // here. It just clears the data in the cached_metadata_handler. cached_metadata_handler_->ClearCachedMetadata( - CachedMetadataHandler::kClearLocally); + /*code_cache_host*/ nullptr, CachedMetadataHandler::kClearLocally); } } @@ -259,14 +274,29 @@ void ScriptResource::ResponseReceived(const ResourceResponse& response) { } cached_metadata_handler_ = nullptr; - // Currently we support the metadata caching only for HTTP family. - if (GetResourceRequest().Url().ProtocolIsInHTTPFamily() && - response.CurrentRequestUrl().ProtocolIsInHTTPFamily()) { - cached_metadata_handler_ = - MakeGarbageCollected<ScriptCachedMetadataHandler>( - Encoding(), CachedMetadataSender::Create( - response, mojom::blink::CodeCacheType::kJavascript, - GetResourceRequest().RequestorOrigin())); + // Currently we support the metadata caching only for HTTP family and any + // schemes defined by SchemeRegistry as requiring a hash check. + bool http_family = GetResourceRequest().Url().ProtocolIsInHTTPFamily() && + response.CurrentRequestUrl().ProtocolIsInHTTPFamily(); + bool code_cache_with_hashing_supported = + SchemeRegistry::SchemeSupportsCodeCacheWithHashing( + GetResourceRequest().Url().Protocol()) && + GetResourceRequest().Url().ProtocolIs( + response.CurrentRequestUrl().Protocol()); + bool code_cache_supported = http_family || code_cache_with_hashing_supported; + if (code_cache_supported) { + std::unique_ptr<CachedMetadataSender> sender = CachedMetadataSender::Create( + response, mojom::blink::CodeCacheType::kJavascript, + GetResourceRequest().RequestorOrigin()); + if (code_cache_with_hashing_supported) { + cached_metadata_handler_ = + MakeGarbageCollected<ScriptCachedMetadataHandlerWithHashing>( + Encoding(), std::move(sender)); + } else { + cached_metadata_handler_ = + MakeGarbageCollected<ScriptCachedMetadataHandler>(Encoding(), + std::move(sender)); + } } } // namespace blink |