Chromium Code Reviews| 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 e18a9c95abc30e15dbf5eeff60fa8a504fa870d7..f6d32dc7d40d976ac51fd23e6d4ecebf82a63943 100644 |
| --- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
| +++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
| @@ -767,6 +767,10 @@ ResourceFetcher::RevalidationPolicy ResourceFetcher::determineRevalidationPolicy |
| return Use; |
| } |
| + // Don't try to reuse an in-progress async request for a new sync request. |
| + if (fetchRequest.options().synchronousPolicy == RequestSynchronously && existingResource->isLoading()) |
|
hiroshige
2016/03/10 00:24:38
This doesn't Reload in non-RawResource cases, beca
Nate Chapin
2016/03/10 18:46:01
Bumped priority up so that the only higher priorit
|
| + return Reload; |
| + |
| // CachePolicyReload always reloads |
| if (cachePolicy == CachePolicyReload) { |
| WTF_LOG(ResourceLoading, "ResourceFetcher::determineRevalidationPolicy reloading due to CachePolicyReload."); |
| @@ -858,13 +862,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); |
| @@ -978,11 +975,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. |
| @@ -1024,7 +1016,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) |
| @@ -1035,6 +1027,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) |
| @@ -1047,13 +1045,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) |
| @@ -1080,25 +1071,37 @@ bool ResourceFetcher::defersLoading() const |
| return context().defersLoading(); |
| } |
| -bool ResourceFetcher::canAccessRedirect(Resource* resource, ResourceRequest& newRequest, const ResourceResponse& redirectResponse, ResourceLoaderOptions& options) |
|
Nate Chapin
2016/03/09 22:35:54
I'm not sure whether it's better to merge canAcces
|
| +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().securityOrigin(); |
| - |
| - 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().securityOrigin(); |
| + |
| + 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; |
| } |