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 c086449473e90aeea1b75e0675e8063eada96283..f7cd97d2d74b1e8baa52602f56d6fa1d452bc305 100644 |
--- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
+++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
@@ -262,11 +262,7 @@ bool ResourceFetcher::resourceNeedsLoad(Resource* resource, const FetchRequest& |
{ |
if (FetchRequest::DeferredByClient == request.defer()) |
return false; |
- if (policy != Use) |
- return true; |
- if (resource->stillNeedsLoad()) |
- return true; |
- return request.options().synchronousPolicy == RequestSynchronously && resource->isLoading(); |
Nate Chapin
2016/03/10 18:46:01
I missed this clause on the first pass, which was
|
+ return policy != Use || resource->stillNeedsLoad(); |
} |
// Limit the number of URLs in m_validatedURLs to avoid memory bloat. |
@@ -689,6 +685,10 @@ ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy |
if (request.isConditional()) |
return Reload; |
+ // Don't try to reuse an in-progress async request for a new sync request. |
+ if (fetchRequest.options().synchronousPolicy == RequestSynchronously && existingResource->isLoading()) |
+ return Reload; |
+ |
// Don't reload resources while pasting. |
if (m_allowStaleResources) |
return Use; |
@@ -838,13 +838,6 @@ void ResourceFetcher::reloadImagesIfNotDeferred() |
} |
} |
-void ResourceFetcher::redirectReceived(Resource* resource, const ResourceResponse& redirectResponse) |
-{ |
- ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource); |
- if (it != m_resourceTimingInfoMap.end()) |
- it->value->addRedirect(redirectResponse); |
-} |
- |
void ResourceFetcher::didLoadResource(Resource* resource) |
{ |
context().didLoadResource(resource); |
@@ -958,11 +951,6 @@ void ResourceFetcher::didFailLoading(const Resource* resource, const ResourceErr |
context().dispatchDidFail(resource->identifier(), error, isInternalRequest); |
} |
-void ResourceFetcher::willSendRequest(unsigned long identifier, ResourceRequest& request, const ResourceResponse& redirectResponse, const FetchInitiatorInfo& initiatorInfo) |
-{ |
- context().dispatchWillSendRequest(identifier, request, redirectResponse, initiatorInfo); |
-} |
- |
void ResourceFetcher::didReceiveResponse(const Resource* resource, const ResourceResponse& response) |
{ |
// If the response is fetched via ServiceWorker, the original URL of the response could be different from the URL of the request. |
@@ -1004,7 +992,7 @@ void ResourceFetcher::subresourceLoaderFinishedLoadingOnePart(ResourceLoader* lo |
didLoadResource(loader->cachedResource()); |
} |
-void ResourceFetcher::didInitializeResourceLoader(ResourceLoader* loader) |
+void ResourceFetcher::willStartLoadingResource(Resource* resource, ResourceLoader* loader, ResourceRequest& request) |
{ |
if (loader->cachedResource()->shouldBlockLoadEvent()) { |
if (!m_loaders) |
@@ -1015,6 +1003,12 @@ void ResourceFetcher::didInitializeResourceLoader(ResourceLoader* loader) |
m_nonBlockingLoaders = ResourceLoaderSet::create(); |
m_nonBlockingLoaders->add(loader); |
} |
+ |
+ context().willStartLoadingResource(request); |
+ storeResourceTimingInitiatorInformation(resource); |
+ TRACE_EVENT_ASYNC_BEGIN2("blink.net", "Resource", resource, "url", resource->url().getString().ascii(), "priority", resource->resourceRequest().priority()); |
+ |
+ context().dispatchWillSendRequest(resource->identifier(), request, ResourceResponse(), resource->options().initiatorInfo); |
} |
void ResourceFetcher::willTerminateResourceLoader(ResourceLoader* loader) |
@@ -1027,13 +1021,6 @@ void ResourceFetcher::willTerminateResourceLoader(ResourceLoader* loader) |
ASSERT_NOT_REACHED(); |
} |
-void ResourceFetcher::willStartLoadingResource(Resource* resource, ResourceRequest& request) |
-{ |
- context().willStartLoadingResource(request); |
- storeResourceTimingInitiatorInformation(resource); |
- TRACE_EVENT_ASYNC_BEGIN2("blink.net", "Resource", resource, "url", resource->url().getString().ascii(), "priority", resource->resourceRequest().priority()); |
-} |
- |
void ResourceFetcher::stopFetching() |
{ |
if (m_nonBlockingLoaders) |
@@ -1060,25 +1047,37 @@ bool ResourceFetcher::defersLoading() const |
return context().defersLoading(); |
} |
-bool ResourceFetcher::canAccessRedirect(Resource* resource, ResourceRequest& newRequest, const ResourceResponse& redirectResponse, ResourceLoaderOptions& options) |
+static bool isManualRedirectFetchRequest(const ResourceRequest& request) |
{ |
- if (!context().canRequest(resource->getType(), newRequest, newRequest.url(), options, resource->isUnusedPreload(), FetchRequest::UseDefaultOriginRestrictionForType)) |
- return false; |
- if (options.corsEnabled == IsCORSEnabled) { |
- SecurityOrigin* sourceOrigin = options.securityOrigin.get(); |
- if (!sourceOrigin) |
- sourceOrigin = context().getSecurityOrigin(); |
- |
- String errorMessage; |
- StoredCredentials withCredentials = resource->lastResourceRequest().allowStoredCredentials() ? AllowStoredCredentials : DoNotAllowStoredCredentials; |
- if (!CrossOriginAccessControl::handleRedirect(sourceOrigin, newRequest, redirectResponse, withCredentials, options, errorMessage)) { |
- resource->setCORSFailed(); |
- context().addConsoleMessage(errorMessage); |
+ return request.fetchRedirectMode() == WebURLRequest::FetchRedirectModeManual && request.requestContext() == WebURLRequest::RequestContextFetch; |
+} |
+ |
+bool ResourceFetcher::willFollowRedirect(Resource* resource, ResourceRequest& newRequest, const ResourceResponse& redirectResponse) |
+{ |
+ if (!isManualRedirectFetchRequest(resource->resourceRequest())) { |
+ if (!context().canRequest(resource->getType(), newRequest, newRequest.url(), resource->options(), resource->isUnusedPreload(), FetchRequest::UseDefaultOriginRestrictionForType)) |
return false; |
+ if (resource->options().corsEnabled == IsCORSEnabled) { |
+ SecurityOrigin* sourceOrigin = resource->options().securityOrigin.get(); |
+ if (!sourceOrigin) |
+ sourceOrigin = context().getSecurityOrigin(); |
+ |
+ String errorMessage; |
+ StoredCredentials withCredentials = resource->lastResourceRequest().allowStoredCredentials() ? AllowStoredCredentials : DoNotAllowStoredCredentials; |
+ if (!CrossOriginAccessControl::handleRedirect(sourceOrigin, newRequest, redirectResponse, withCredentials, resource->mutableOptions(), errorMessage)) { |
+ resource->setCORSFailed(); |
+ context().addConsoleMessage(errorMessage); |
+ return false; |
+ } |
} |
+ if (resource->getType() == Resource::Image && shouldDeferImageLoad(newRequest.url())) |
+ return false; |
} |
- if (resource->getType() == Resource::Image && shouldDeferImageLoad(newRequest.url())) |
- return false; |
+ |
+ ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource); |
+ if (it != m_resourceTimingInfoMap.end()) |
+ it->value->addRedirect(redirectResponse); |
+ context().dispatchWillSendRequest(resource->identifier(), newRequest, redirectResponse, resource->options().initiatorInfo); |
return true; |
} |