summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/platform/loader/fetch/resource.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/loader/fetch/resource.cc')
-rw-r--r--chromium/third_party/blink/renderer/platform/loader/fetch/resource.cc137
1 files changed, 30 insertions, 107 deletions
diff --git a/chromium/third_party/blink/renderer/platform/loader/fetch/resource.cc b/chromium/third_party/blink/renderer/platform/loader/fetch/resource.cc
index 335f6c1218d..a20c89be899 100644
--- a/chromium/third_party/blink/renderer/platform/loader/fetch/resource.cc
+++ b/chromium/third_party/blink/renderer/platform/loader/fetch/resource.cc
@@ -31,6 +31,7 @@
#include <memory>
#include "base/single_thread_task_runner.h"
+#include "base/stl_util.h"
#include "build/build_config.h"
#include "services/network/public/mojom/fetch_api.mojom-blink.h"
#include "third_party/blink/public/platform/platform.h"
@@ -69,6 +70,12 @@ void NotifyFinishObservers(
observer->NotifyFinished();
}
+blink::mojom::CodeCacheType ToCodeCacheType(ResourceType resource_type) {
+ return resource_type == ResourceType::kRaw
+ ? blink::mojom::CodeCacheType::kWebAssembly
+ : blink::mojom::CodeCacheType::kJavascript;
+}
+
} // namespace
// These response headers are not copied from a revalidated response to the
@@ -99,12 +106,12 @@ const char* const kHeaderPrefixesToIgnoreAfterRevalidation[] = {
static inline bool ShouldUpdateHeaderAfterRevalidation(
const AtomicString& header) {
- for (size_t i = 0; i < arraysize(kHeadersToIgnoreAfterRevalidation); i++) {
+ for (size_t i = 0; i < base::size(kHeadersToIgnoreAfterRevalidation); i++) {
if (DeprecatedEqualIgnoringCase(header,
kHeadersToIgnoreAfterRevalidation[i]))
return false;
}
- for (size_t i = 0; i < arraysize(kHeaderPrefixesToIgnoreAfterRevalidation);
+ for (size_t i = 0; i < base::size(kHeaderPrefixesToIgnoreAfterRevalidation);
i++) {
if (header.StartsWithIgnoringASCIICase(
kHeaderPrefixesToIgnoreAfterRevalidation[i]))
@@ -113,78 +120,6 @@ static inline bool ShouldUpdateHeaderAfterRevalidation(
return true;
}
-// This is a CachedMetadataSender implementation for normal responses.
-class CachedMetadataSenderImpl : public CachedMetadataSender {
- public:
- CachedMetadataSenderImpl(const Resource*);
- ~CachedMetadataSenderImpl() override = default;
-
- void Send(const char*, size_t) override;
- bool IsServedFromCacheStorage() override { return false; }
-
- private:
- const KURL response_url_;
- const Time response_time_;
- const ResourceType resource_type_;
-};
-
-CachedMetadataSenderImpl::CachedMetadataSenderImpl(const Resource* resource)
- : response_url_(resource->GetResponse().Url()),
- response_time_(resource->GetResponse().ResponseTime()),
- resource_type_(resource->GetType()) {
- DCHECK(resource->GetResponse().CacheStorageCacheName().IsNull());
-}
-
-void CachedMetadataSenderImpl::Send(const char* data, size_t size) {
- Platform::Current()->CacheMetadata(
- Resource::ResourceTypeToCodeCacheType(resource_type_), response_url_,
- response_time_, data, size);
-}
-
-// This is a CachedMetadataSender implementation that does nothing.
-class NullCachedMetadataSender : public CachedMetadataSender {
- public:
- NullCachedMetadataSender() = default;
- ~NullCachedMetadataSender() override = default;
-
- void Send(const char*, size_t) override {}
- bool IsServedFromCacheStorage() override { return false; }
-};
-
-// This is a CachedMetadataSender implementation for responses that are served
-// by a ServiceWorker from cache storage.
-class ServiceWorkerCachedMetadataSender : public CachedMetadataSender {
- public:
- ServiceWorkerCachedMetadataSender(const Resource*, const SecurityOrigin*);
- ~ServiceWorkerCachedMetadataSender() override = default;
-
- void Send(const char*, size_t) override;
- bool IsServedFromCacheStorage() override { return true; }
-
- private:
- const KURL response_url_;
- const Time response_time_;
- const String cache_storage_cache_name_;
- scoped_refptr<const SecurityOrigin> security_origin_;
-};
-
-ServiceWorkerCachedMetadataSender::ServiceWorkerCachedMetadataSender(
- const Resource* resource,
- const SecurityOrigin* security_origin)
- : response_url_(resource->GetResponse().Url()),
- response_time_(resource->GetResponse().ResponseTime()),
- cache_storage_cache_name_(
- resource->GetResponse().CacheStorageCacheName()),
- security_origin_(security_origin) {
- DCHECK(!cache_storage_cache_name_.IsNull());
-}
-
-void ServiceWorkerCachedMetadataSender::Send(const char* data, size_t size) {
- Platform::Current()->CacheMetadataInCacheStorage(
- response_url_, response_time_, data, size,
- WebSecurityOrigin(security_origin_), cache_storage_cache_name_);
-}
-
Resource::Resource(const ResourceRequest& request,
ResourceType type,
const ResourceLoaderOptions& options)
@@ -350,7 +285,7 @@ static bool NeedsSynchronousCacheHit(ResourceType type,
if (options.synchronous_policy == kRequestSynchronously)
return true;
// Some resources types default to return data synchronously. For most of
- // these, it's because there are layout tests that expect data to return
+ // these, it's because there are web tests that expect data to return
// synchronously in case of cache hit. In the case of fonts, there was a
// performance regression.
// FIXME: Get to the point where we don't need to special-case sync/async
@@ -452,13 +387,13 @@ static double FreshnessLifetime(const ResourceResponse& response,
double response_timestamp) {
#if !defined(OS_ANDROID)
// On desktop, local files should be reloaded in case they change.
- if (response.Url().IsLocalFile())
+ if (response.CurrentRequestUrl().IsLocalFile())
return 0;
#endif
// Cache other non-http / non-filesystem resources liberally.
- if (!response.Url().ProtocolIsInHTTPFamily() &&
- !response.Url().ProtocolIs("filesystem"))
+ if (!response.CurrentRequestUrl().ProtocolIsInHTTPFamily() &&
+ !response.CurrentRequestUrl().ProtocolIs("filesystem"))
return std::numeric_limits<double>::max();
// RFC2616 13.2.4
@@ -539,27 +474,14 @@ void Resource::SetResponse(const ResourceResponse& response) {
// Currently we support the metadata caching only for HTTP family.
if (!GetResourceRequest().Url().ProtocolIsInHTTPFamily() ||
- !GetResponse().Url().ProtocolIsInHTTPFamily()) {
+ !GetResponse().CurrentRequestUrl().ProtocolIsInHTTPFamily()) {
cache_handler_.Clear();
return;
}
- cache_handler_ = CreateCachedMetadataHandler(CreateCachedMetadataSender());
-}
-
-std::unique_ptr<CachedMetadataSender> Resource::CreateCachedMetadataSender()
- const {
- if (GetResponse().WasFetchedViaServiceWorker()) {
- scoped_refptr<const SecurityOrigin> origin =
- GetResourceRequest().RequestorOrigin();
- // TODO(leszeks): Check whether it's correct that |origin| can be nullptr.
- if (!origin || GetResponse().CacheStorageCacheName().IsNull()) {
- return std::make_unique<NullCachedMetadataSender>();
- }
- return std::make_unique<ServiceWorkerCachedMetadataSender>(this,
- origin.get());
- }
- return std::make_unique<CachedMetadataSenderImpl>(this);
+ cache_handler_ = CreateCachedMetadataHandler(
+ CachedMetadataSender::Create(GetResponse(), ToCodeCacheType(GetType()),
+ GetResourceRequest().RequestorOrigin()));
}
void Resource::ResponseReceived(const ResourceResponse& response,
@@ -578,7 +500,7 @@ void Resource::ResponseReceived(const ResourceResponse& response,
SetEncoding(encoding);
}
-void Resource::SetSerializedCachedMetadata(const char* data, size_t size) {
+void Resource::SetSerializedCachedMetadata(const uint8_t* data, size_t size) {
DCHECK(!is_revalidating_);
DCHECK(!GetResponse().IsNull());
}
@@ -1021,8 +943,9 @@ void Resource::ClearRangeRequestHeader() {
void Resource::RevalidationSucceeded(
const ResourceResponse& validating_response) {
SECURITY_CHECK(redirect_chain_.IsEmpty());
- SECURITY_CHECK(EqualIgnoringFragmentIdentifier(validating_response.Url(),
- GetResponse().Url()));
+ SECURITY_CHECK(
+ EqualIgnoringFragmentIdentifier(validating_response.CurrentRequestUrl(),
+ GetResponse().CurrentRequestUrl()));
response_.SetResourceLoadTiming(validating_response.GetResourceLoadTiming());
// RFC2616 10.3.5
@@ -1265,15 +1188,15 @@ const char* Resource::ResourceTypeToString(
// static
blink::mojom::CodeCacheType Resource::ResourceTypeToCodeCacheType(
ResourceType resource_type) {
- // Cacheable WebAssembly modules are fetched, so raw resource type.
- if (resource_type == ResourceType::kRaw)
- return blink::mojom::CodeCacheType::kWebAssembly;
- // Cacheable Javascript is a script or a document resource. Also accept mock
- // resources for testing.
- DCHECK(resource_type == ResourceType::kScript ||
- resource_type == ResourceType::kMainResource ||
- resource_type == ResourceType::kMock);
- return blink::mojom::CodeCacheType::kJavascript;
+ DCHECK(
+ // Cacheable WebAssembly modules are fetched, so raw resource type.
+ resource_type == ResourceType::kRaw ||
+ // Cacheable Javascript is a script or a document resource.
+ resource_type == ResourceType::kScript ||
+ resource_type == ResourceType::kMainResource ||
+ // Also accept mock resources for testing.
+ resource_type == ResourceType::kMock);
+ return ToCodeCacheType(resource_type);
}
bool Resource::ShouldBlockLoadEvent() const {