| Index: third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
|
| diff --git a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
|
| index 5105488d1075419512ef874a4c21adde757db359..1de2c730abec0cfe274340cf2efcf8bf6c92fa82 100644
|
| --- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
|
| +++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
|
| @@ -488,6 +488,8 @@ Resource* ResourceFetcher::requestResource(
|
| DCHECK(request.options().synchronousPolicy == RequestAsynchronously ||
|
| factory.type() == Resource::Raw ||
|
| factory.type() == Resource::XSLStyleSheet);
|
| + TRACE_EVENT1("blink", "ResourceFetcher::requestResource", "url",
|
| + urlForTraceEvent(request.url()));
|
|
|
| context().populateRequestData(request.mutableResourceRequest());
|
| if (request.resourceRequest().httpHeaderField("Upgrade-Insecure-Requests") !=
|
| @@ -497,13 +499,30 @@ Resource* ResourceFetcher::requestResource(
|
| context().addClientHintsIfNecessary(request);
|
| context().addCSPHeaderIfNecessary(factory.type(), request);
|
|
|
| - TRACE_EVENT1("blink", "ResourceFetcher::requestResource", "url",
|
| - urlForTraceEvent(request.url()));
|
| -
|
| if (!request.url().isValid())
|
| return nullptr;
|
|
|
| unsigned long identifier = createUniqueIdentifier();
|
| +
|
| + // Potentially early return if this request matches a preload. We need to be
|
| + // careful to ensure that the preload request matches the various security
|
| + // properties of the load.
|
| + Resource* originalResource(nullptr);
|
| + originalResource =
|
| + memoryCache()->resourceForURL(request.url(), getCacheIdentifier());
|
| + if (originalResource) {
|
| + const RevalidationPolicy policy = determineRevalidationPolicy(
|
| + factory.type(), request, originalResource, false);
|
| + if (policy == Use) {
|
| + if (originalResource->isLinkPreload() && !request.isLinkPreload())
|
| + originalResource->setLinkPreload(false);
|
| + moveCachedNonBlockingResourceToBlocking(originalResource, request);
|
| + requestLoadStarted(identifier, originalResource, request,
|
| + ResourceLoadingFromCache, false);
|
| + return originalResource;
|
| + }
|
| + }
|
| +
|
| request.mutableResourceRequest().setPriority(computeLoadPriority(
|
| factory.type(), request, ResourcePriority::NotVisible));
|
| initializeResourceRequest(request.mutableResourceRequest(), factory.type(),
|
| @@ -555,9 +574,16 @@ Resource* ResourceFetcher::requestResource(
|
| if (!resource && !isDataUrl && m_archive)
|
| return nullptr;
|
| }
|
| +
|
| + // Only retrieve the Resource from MemoryCache if the url has been changed
|
| + // by the embedder.
|
| if (!resource) {
|
| - resource =
|
| - memoryCache()->resourceForURL(request.url(), getCacheIdentifier());
|
| + if (!originalResource || request.url() != originalResource->url()) {
|
| + resource =
|
| + memoryCache()->resourceForURL(request.url(), getCacheIdentifier());
|
| + } else {
|
| + resource = originalResource;
|
| + }
|
| }
|
|
|
| // See if we can use an existing resource from the cache. If so, we need to
|
| @@ -808,10 +834,6 @@ ResourceFetcher::determineRevalidationPolicy(Resource::Type type,
|
| if (existingResource->response().wasFallbackRequiredByServiceWorker())
|
| return Reload;
|
|
|
| - // We already have a preload going for this URL.
|
| - if (fetchRequest.forPreload() && existingResource->isPreloaded())
|
| - return Use;
|
| -
|
| // If the same URL has been loaded as a different type, we need to reload.
|
| if (existingResource->getType() != type) {
|
| // FIXME: If existingResource is a Preload and the new type is LinkPrefetch
|
| @@ -823,6 +845,10 @@ ResourceFetcher::determineRevalidationPolicy(Resource::Type type,
|
| return Reload;
|
| }
|
|
|
| + // We already have a preload going for this URL.
|
| + if (fetchRequest.forPreload() && existingResource->isPreloaded())
|
| + return Use;
|
| +
|
| // Do not load from cache if images are not enabled. There are two general
|
| // cases:
|
| //
|
|
|