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 05af9497195ce3039210d337f13a1f1aa7ffb4e9..89d9c97a27a3203333a9dd9f3e58755611259863 100644 |
--- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
+++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
@@ -101,6 +101,19 @@ bool IsCrossOrigin(const KURL& a, const KURL& b) { |
return !originB->isSameSchemeHostPort(originA.get()); |
} |
+void mayActivateCacheAwareLoading(ResourceRequest& request) { |
+ switch (request.getCachePolicy()) { |
+ case WebCachePolicy::BypassingCache: |
+ case WebCachePolicy::ReturnCacheDataDontLoad: |
+ return; |
+ case WebCachePolicy::UseProtocolCachePolicy: |
+ case WebCachePolicy::ValidatingCacheData: |
+ case WebCachePolicy::ReturnCacheDataElseLoad: |
+ break; |
+ } |
+ request.activateCacheAwareLoading(); |
+} |
+ |
} // namespace |
static void RecordSriResourceIntegrityMismatchEvent( |
@@ -722,6 +735,9 @@ Resource* ResourceFetcher::createResourceForLoading( |
RESOURCE_LOADING_DVLOG(1) << "Loading Resource for " |
<< request.resourceRequest().url().elidedString(); |
+ if (request.isCacheAwareLoadingEnabled()) |
+ mayActivateCacheAwareLoading(request.mutableResourceRequest()); |
+ |
Resource* resource = |
factory.create(request.resourceRequest(), request.options(), charset); |
resource->setLinkPreload(request.isLinkPreload()); |
@@ -1113,6 +1129,9 @@ void ResourceFetcher::didFinishLoading(Resource* resource, |
TRACE_EVENT_ASYNC_END0("blink.net", "Resource", resource->identifier()); |
DCHECK(resource); |
+ if (resource->resourceRequest().isCacheAwareLoadingActivated()) |
+ resource->deactivateCacheAwareLoading(); |
+ |
// When loading a multipart resource, make the loader non-block when finishing |
// loading the first part. |
if (finishReason == DidFinishFirstPartInMultipart) |
@@ -1160,6 +1179,16 @@ void ResourceFetcher::didFinishLoading(Resource* resource, |
void ResourceFetcher::didFailLoading(Resource* resource, |
const ResourceError& error) { |
+ if (resource->resourceRequest().isCacheAwareLoadingActivated() && |
+ error.isCacheMiss()) { |
+ resource->deactivateCacheAwareLoading(); |
+ resource->willReloadAfterDiskCacheMiss(); |
+ resource->loader()->start(resource->resourceRequest(), |
+ context().loadingTaskRunner(), |
+ context().defersLoading()); |
+ return; |
+ } |
+ |
TRACE_EVENT_ASYNC_END0("blink.net", "Resource", resource->identifier()); |
removeResourceLoader(resource->loader()); |
m_resourceTimingInfoMap.take(const_cast<Resource*>(resource)); |
@@ -1273,6 +1302,9 @@ bool ResourceFetcher::startLoad(Resource* resource) { |
if (sourceOrigin && sourceOrigin->hasSuborigin()) |
request.setSkipServiceWorker(WebURLRequest::SkipServiceWorker::All); |
+ // TODO(632580): Workaround to persist cache-aware state, remove after fixed. |
+ resource->setResourceRequest(request); |
+ |
ResourceLoader* loader = ResourceLoader::create(this, resource); |
if (resource->shouldBlockLoadEvent()) |
m_loaders.add(loader); |