summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/loader/resource/script_resource.cc
diff options
context:
space:
mode:
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.cc48
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