mirror of
https://github.com/uazo/cromite.git
synced 2025-12-28 07:54:50 +00:00
276 lines
14 KiB
Diff
276 lines
14 KiB
Diff
From: uazo <uazo@users.noreply.github.com>
|
|
Date: Wed, 13 Jul 2022 14:51:09 +0000
|
|
Subject: Partition Blink memory cache
|
|
|
|
Blink's in-memory cache is not partitioned (see also: http://crbug.com/1127971)
|
|
This patch partitions it by the top-level site.
|
|
This mitigation is effective in case the rendering process is re-used, because
|
|
on such case the cache would be re-used as well and transfer information between
|
|
different contexts.
|
|
|
|
See also:
|
|
* https://github.com/bromite/bromite/pull/2173
|
|
|
|
Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
|
|
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
|
|
---
|
|
.../core/html/parser/html_srcset_parser.cc | 3 +-
|
|
.../core/inspector/inspector_network_agent.cc | 2 +-
|
|
.../core/inspector/inspector_page_agent.cc | 2 +-
|
|
.../renderer/core/loader/image_loader.cc | 3 +-
|
|
.../platform/loader/fetch/memory_cache.cc | 8 +--
|
|
.../platform/loader/fetch/memory_cache.h | 5 +-
|
|
.../platform/loader/fetch/resource_fetcher.cc | 62 +++++++++++++++----
|
|
.../platform/loader/fetch/resource_fetcher.h | 10 ++-
|
|
.../platform/runtime_enabled_features.json5 | 4 +-
|
|
9 files changed, 71 insertions(+), 28 deletions(-)
|
|
|
|
diff --git a/third_party/blink/renderer/core/html/parser/html_srcset_parser.cc b/third_party/blink/renderer/core/html/parser/html_srcset_parser.cc
|
|
--- a/third_party/blink/renderer/core/html/parser/html_srcset_parser.cc
|
|
+++ b/third_party/blink/renderer/core/html/parser/html_srcset_parser.cc
|
|
@@ -426,7 +426,8 @@ static unsigned AvoidDownloadIfHigherDensityResourceIsInCache(
|
|
auto* resource = MemoryCache::Get()->ResourceForURL(
|
|
url,
|
|
document->Fetcher()->GetCacheIdentifier(url,
|
|
- /*skip_service_worker=*/false));
|
|
+ /*skip_service_worker=*/false,
|
|
+ document->TopFrameOrigin()));
|
|
if (resource && resource->IsLoaded()) {
|
|
UseCounter::Count(document,
|
|
WebFeature::kSrcSetUsedHigherDensityImageFromCache);
|
|
diff --git a/third_party/blink/renderer/core/inspector/inspector_network_agent.cc b/third_party/blink/renderer/core/inspector/inspector_network_agent.cc
|
|
--- a/third_party/blink/renderer/core/inspector/inspector_network_agent.cc
|
|
+++ b/third_party/blink/renderer/core/inspector/inspector_network_agent.cc
|
|
@@ -2747,7 +2747,7 @@ bool InspectorNetworkAgent::FetchResourceContent(Document* document,
|
|
if (!cached_resource) {
|
|
cached_resource = MemoryCache::Get()->ResourceForURL(
|
|
url, document->Fetcher()->GetCacheIdentifier(
|
|
- url, /*skip_service_worker=*/false));
|
|
+ url, /*skip_service_worker=*/false, document->TopFrameOrigin()));
|
|
}
|
|
if (cached_resource &&
|
|
InspectorPageAgent::CachedResourceContent(cached_resource, content,
|
|
diff --git a/third_party/blink/renderer/core/inspector/inspector_page_agent.cc b/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
|
|
--- a/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
|
|
+++ b/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
|
|
@@ -179,7 +179,7 @@ Resource* CachedResource(LocalFrame* frame,
|
|
if (!cached_resource) {
|
|
cached_resource = MemoryCache::Get()->ResourceForURL(
|
|
url, document->Fetcher()->GetCacheIdentifier(
|
|
- url, /*skip_service_worker=*/false));
|
|
+ url, /*skip_service_worker=*/false, document->TopFrameOrigin()));
|
|
}
|
|
if (!cached_resource) {
|
|
cached_resource = loader->ResourceForURL(url);
|
|
diff --git a/third_party/blink/renderer/core/loader/image_loader.cc b/third_party/blink/renderer/core/loader/image_loader.cc
|
|
--- a/third_party/blink/renderer/core/loader/image_loader.cc
|
|
+++ b/third_party/blink/renderer/core/loader/image_loader.cc
|
|
@@ -735,7 +735,8 @@ bool ImageLoader::ShouldLoadImmediately(const KURL& url) const {
|
|
if (!url.IsNull()) {
|
|
Resource* resource = MemoryCache::Get()->ResourceForURL(
|
|
url, element_->GetDocument().Fetcher()->GetCacheIdentifier(
|
|
- url, /*skip_service_worker=*/false));
|
|
+ url, /*skip_service_worker=*/false,
|
|
+ element_->GetDocument().TopFrameOrigin()));
|
|
|
|
if (resource && !resource->ErrorOccurred() &&
|
|
CanReuseFromListOfAvailableImages(
|
|
diff --git a/third_party/blink/renderer/platform/loader/fetch/memory_cache.cc b/third_party/blink/renderer/platform/loader/fetch/memory_cache.cc
|
|
--- a/third_party/blink/renderer/platform/loader/fetch/memory_cache.cc
|
|
+++ b/third_party/blink/renderer/platform/loader/fetch/memory_cache.cc
|
|
@@ -343,7 +343,7 @@ void MemoryCache::RemoveInternal(ResourceMap* resource_map,
|
|
}
|
|
|
|
bool MemoryCache::Contains(const Resource* resource) const {
|
|
- if (!resource || resource->Url().IsEmpty())
|
|
+ if (!resource || resource->Url().IsEmpty() || resource->CacheIdentifier().empty())
|
|
return false;
|
|
|
|
const auto resource_maps_it =
|
|
@@ -359,13 +359,9 @@ bool MemoryCache::Contains(const Resource* resource) const {
|
|
return resource == resources_it->value->GetResource();
|
|
}
|
|
|
|
-Resource* MemoryCache::ResourceForURLForTesting(
|
|
- const KURL& resource_url) const {
|
|
- return ResourceForURL(resource_url, DefaultCacheIdentifier());
|
|
-}
|
|
-
|
|
Resource* MemoryCache::ResourceForURL(const KURL& resource_url,
|
|
const String& cache_identifier) const {
|
|
+ if (cache_identifier.empty()) return nullptr;
|
|
DCHECK(IsMainThread());
|
|
if (!resource_url.IsValid() || resource_url.IsNull())
|
|
return nullptr;
|
|
diff --git a/third_party/blink/renderer/platform/loader/fetch/memory_cache.h b/third_party/blink/renderer/platform/loader/fetch/memory_cache.h
|
|
--- a/third_party/blink/renderer/platform/loader/fetch/memory_cache.h
|
|
+++ b/third_party/blink/renderer/platform/loader/fetch/memory_cache.h
|
|
@@ -124,10 +124,7 @@ class PLATFORM_EXPORT MemoryCache final : public GarbageCollected<MemoryCache>,
|
|
// Do not use this method outside test purposes.
|
|
// A resourfe URL is not enough to do a correct MemoryCache lookup, and
|
|
// relying on the method would likely yield wrong results.
|
|
- Resource* ResourceForURLForTesting(const KURL&) const;
|
|
-
|
|
Resource* ResourceForURL(const KURL&, const String& cache_identifier) const;
|
|
- HeapVector<Member<Resource>> ResourcesForURL(const KURL&) const;
|
|
|
|
void Add(Resource*);
|
|
void Remove(Resource*);
|
|
@@ -173,6 +170,8 @@ class PLATFORM_EXPORT MemoryCache final : public GarbageCollected<MemoryCache>,
|
|
void OnUpdateMemoryLimit() override;
|
|
|
|
private:
|
|
+ HeapVector<Member<Resource>> ResourcesForURL(const KURL&) const;
|
|
+
|
|
// A URL-based map of all resources that are in the cache (including the
|
|
// freshest version of objects that are currently being referenced by a Web
|
|
// page). removeFragmentIdentifierIfNeeded() should be called for the url
|
|
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
|
|
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
|
|
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
|
|
@@ -1032,7 +1032,8 @@ Resource* ResourceFetcher::CreateResourceForStaticData(
|
|
|
|
const String cache_identifier =
|
|
GetCacheIdentifier(factory.GetType(), url,
|
|
- params.GetResourceRequest().GetSkipServiceWorker());
|
|
+ params.GetResourceRequest().GetSkipServiceWorker(),
|
|
+ params.GetResourceRequest());
|
|
|
|
// Most off-main-thread resource fetches use Resource::kRaw and don't reach
|
|
// this point, but off-main-thread module fetches might.
|
|
@@ -1466,7 +1467,8 @@ Resource* ResourceFetcher::RequestResource(FetchParameters& params,
|
|
} else if (IsMainThread()) {
|
|
const String cache_identifier = GetCacheIdentifier(
|
|
resource_type, params.GetResourceRequest().Url(),
|
|
- params.GetResourceRequest().GetSkipServiceWorker());
|
|
+ params.GetResourceRequest().GetSkipServiceWorker(),
|
|
+ params.GetResourceRequest());
|
|
|
|
resource =
|
|
MemoryCache::Get()->ResourceForURL(params.Url(), cache_identifier);
|
|
@@ -1790,7 +1792,8 @@ Resource* ResourceFetcher::CreateResourceForLoading(
|
|
const ResourceFactory& factory) {
|
|
const String cache_identifier =
|
|
GetCacheIdentifier(factory.GetType(), params.GetResourceRequest().Url(),
|
|
- params.GetResourceRequest().GetSkipServiceWorker());
|
|
+ params.GetResourceRequest().GetSkipServiceWorker(),
|
|
+ params.GetResourceRequest());
|
|
DCHECK(!IsMainThread() || params.IsStaleRevalidation() ||
|
|
!MemoryCache::Get()->ResourceForURL(params.GetResourceRequest().Url(),
|
|
cache_identifier));
|
|
@@ -2930,11 +2933,47 @@ void ResourceFetcher::UpdateImagePrioritiesAndSpeculativeDecodes() {
|
|
}
|
|
|
|
String ResourceFetcher::GetCacheIdentifier(const KURL& url,
|
|
- bool skip_service_worker) const {
|
|
- if (!skip_service_worker &&
|
|
- properties_->GetControllerServiceWorkerMode() !=
|
|
- mojom::ControllerServiceWorkerMode::kNoController) {
|
|
- return String::Number(properties_->ServiceWorkerId());
|
|
+ bool skip_service_worker,
|
|
+ const ResourceRequest& resource_request) const {
|
|
+ if (const scoped_refptr<const SecurityOrigin> top_origin =
|
|
+ resource_request.TopFrameOrigin()) {
|
|
+ String origin_url = top_origin ? top_origin->ToRawString() : "";
|
|
+ String cache_identifier = ResourceFetcher::GetCacheIdentifier(
|
|
+ url, skip_service_worker, origin_url);
|
|
+ // LOG(INFO) << "---t (" << cache_identifier << ") "
|
|
+ // << url.GetString() << "='" << origin_url << "'";
|
|
+ return cache_identifier;
|
|
+ }
|
|
+ // service workers cannot use the memory cache
|
|
+ // } else if (resource_request.GetRequestContext() ==
|
|
+ // mojom::blink::RequestContextType::SERVICE_WORKER) {
|
|
+ // const scoped_refptr<const SecurityOrigin> requestor_origin =
|
|
+ // resource_request.RequestorOrigin();
|
|
+ // String origin_url = requestor_origin
|
|
+ // ? requestor_origin->ToRawString()
|
|
+ // : ""; //context_.Url()->ToRawString();
|
|
+ // String cache_identifier = ResourceFetcher::GetCacheIdentifier(
|
|
+ // url, skip_service_worker, origin_url);
|
|
+ // LOG(INFO) << "---o (" << cache_identifier << ") "
|
|
+ // << url.GetString() << "='" << origin_url << "'";
|
|
+ // return cache_identifier;
|
|
+ // }
|
|
+ return MemoryCache::DefaultCacheIdentifier();
|
|
+}
|
|
+
|
|
+String ResourceFetcher::GetCacheIdentifier(const KURL& url,
|
|
+ bool skip_service_worker,
|
|
+ scoped_refptr<const blink::SecurityOrigin> origin) const {
|
|
+ String origin_url = origin ? origin->ToRawString() : "";
|
|
+ return ResourceFetcher::GetCacheIdentifier(url, skip_service_worker, origin_url);
|
|
+}
|
|
+
|
|
+String ResourceFetcher::GetCacheIdentifier(const KURL& url,
|
|
+ bool skip_service_worker,
|
|
+ const String origin_url) const {
|
|
+ if (!skip_service_worker && properties_->GetControllerServiceWorkerMode() !=
|
|
+ mojom::ControllerServiceWorkerMode::kNoController) {
|
|
+ return origin_url + " " + String::Number(properties_->ServiceWorkerId());
|
|
}
|
|
|
|
// Requests that can be satisfied via `archive_` (i.e. MHTML) or
|
|
@@ -2949,12 +2988,13 @@ String ResourceFetcher::GetCacheIdentifier(const KURL& url,
|
|
return bundle->GetCacheIdentifier();
|
|
}
|
|
|
|
- return MemoryCache::DefaultCacheIdentifier();
|
|
+ return origin_url;
|
|
}
|
|
|
|
String ResourceFetcher::GetCacheIdentifier(ResourceType type,
|
|
const KURL& url,
|
|
- bool skip_service_worker) const {
|
|
+ bool skip_service_worker,
|
|
+ const ResourceRequest& resource_request) const {
|
|
// For SVG resource documents, use the SVG-specific cache identifier when the
|
|
// feature is enabled and a cache identifier is available from the fetch
|
|
// context.
|
|
@@ -2967,7 +3007,7 @@ String ResourceFetcher::GetCacheIdentifier(ResourceType type,
|
|
}
|
|
|
|
// Fallback to the standard cache identifier logic.
|
|
- return GetCacheIdentifier(url, skip_service_worker);
|
|
+ return GetCacheIdentifier(url, skip_service_worker, resource_request);
|
|
}
|
|
|
|
std::optional<base::UnguessableToken>
|
|
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
|
|
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
|
|
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
|
|
@@ -287,10 +287,16 @@ class PLATFORM_EXPORT ResourceFetcher
|
|
// `url` is used for finding a matching WebBundle.
|
|
// If `skip_service_worker` is true, the identifier won't be a ServiceWorker's
|
|
// identifier to keep the cache separated.
|
|
- String GetCacheIdentifier(const KURL& url, bool skip_service_worker) const;
|
|
+ String GetCacheIdentifier(const KURL& url, bool skip_service_worker,
|
|
+ const ResourceRequest& resource_request) const;
|
|
+ String GetCacheIdentifier(const KURL& url, bool skip_service_worker,
|
|
+ scoped_refptr<const blink::SecurityOrigin> origin) const;
|
|
+ String GetCacheIdentifier(const KURL& url, bool skip_service_worker,
|
|
+ const String origin_url) const;
|
|
String GetCacheIdentifier(ResourceType type,
|
|
const KURL& url,
|
|
- bool skip_service_worker) const;
|
|
+ bool skip_service_worker,
|
|
+ const ResourceRequest& resource_request) const;
|
|
|
|
// If `url` exists as a resource in a subresource bundle in this frame,
|
|
// returns its UnguessableToken; otherwise, returns std::nullopt.
|
|
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
|
|
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
|
|
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
|
|
@@ -4901,8 +4901,8 @@
|
|
status: "test",
|
|
},
|
|
{
|
|
- name: "SvgPartitionSVGDocumentResourcesInMemoryCache",
|
|
- status: "experimental",
|
|
+ name: "SvgPartitionSVGDocumentResourcesInMemoryCache", status: "experimental",
|
|
+
|
|
},
|
|
{
|
|
name: "SvgScriptElementAsyncAttribute",
|
|
--
|