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..111f832c7b607690011688b786d6a49745d4e069 100644 |
--- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
+++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
@@ -730,6 +730,9 @@ Resource* ResourceFetcher::createResourceForLoading( |
RESOURCE_LOADING_DVLOG(1) << "Loading Resource for " |
<< request.resourceRequest().url().elidedString(); |
+ if (request.isCacheAwareLoadingEnabled()) |
+ request.mutableResourceRequest().mayActivateCacheAwareLoading(); |
+ |
Resource* resource = |
factory.create(request.resourceRequest(), request.options(), charset); |
resource->setLinkPreload(request.isLinkPreload()); |
@@ -1121,6 +1124,10 @@ void ResourceFetcher::didFinishLoading(Resource* resource, |
TRACE_EVENT_ASYNC_END0("blink.net", "Resource", resource->identifier()); |
DCHECK(resource); |
+ // Restore original cache policy if cache-aware loading was activated. |
+ 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) |
@@ -1168,6 +1175,17 @@ void ResourceFetcher::didFinishLoading(Resource* resource, |
void ResourceFetcher::didFailLoading(Resource* resource, |
const ResourceError& error) { |
+ if (resource->resourceRequest().isCacheAwareLoadingActivated() && |
+ error.isCacheMiss()) { |
+ // Loading from disk cache fails, restore original cache policy and retry. |
+ 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)); |
@@ -1282,6 +1300,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); |