Chromium Code Reviews| Index: third_party/WebKit/Source/core/fetch/ResourceLoader.cpp |
| diff --git a/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp b/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp |
| index b44b22a8ae96bc5f3d06707c3e7d3c12045bad00..9eaac5515baafbf4f236cbac437077daafd180ed 100644 |
| --- a/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp |
| +++ b/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp |
| @@ -56,23 +56,21 @@ bool isManualRedirectFetchRequest(const ResourceRequest& request) |
| } // namespace |
| -ResourceLoader* ResourceLoader::create(ResourceFetcher* fetcher, Resource* resource, const ResourceRequest& request, const ResourceLoaderOptions& options) |
| +ResourceLoader* ResourceLoader::create(ResourceFetcher* fetcher, Resource* resource) |
| { |
| - ResourceLoader* loader = new ResourceLoader(fetcher, resource, options); |
| - loader->init(request); |
| - return loader; |
| + return new ResourceLoader(fetcher, resource); |
| } |
| -ResourceLoader::ResourceLoader(ResourceFetcher* fetcher, Resource* resource, const ResourceLoaderOptions& options) |
| +ResourceLoader::ResourceLoader(ResourceFetcher* fetcher, Resource* resource) |
| : m_fetcher(fetcher) |
| , m_notifiedLoadComplete(false) |
| , m_loadingMultipartContent(false) |
| - , m_options(options) |
| , m_resource(resource) |
| , m_state(ConnectionStateNew) |
| { |
| ASSERT(m_resource); |
| ASSERT(m_fetcher); |
| + m_fetcher->didInitializeResourceLoader(this); |
| } |
| ResourceLoader::~ResourceLoader() |
| @@ -105,21 +103,13 @@ void ResourceLoader::releaseResources() |
| m_fetcher.clear(); |
| } |
| -void ResourceLoader::init(const ResourceRequest& passedRequest) |
| -{ |
| - ResourceRequest request(passedRequest); |
| - m_fetcher->willSendRequest(m_resource->identifier(), request, ResourceResponse(), m_options.initiatorInfo); |
| - m_originalRequest = m_request = applyOptions(request); |
| - m_resource->updateRequest(request); |
|
Nate Chapin
2016/03/09 00:38:20
This call of updateRequest() is a no-op. When a Re
hiroshige
2016/03/09 02:01:56
I suspect this might not be a case when delayed lo
Nate Chapin
2016/03/09 22:35:54
Agreed. I had reached the same conclusion, but in
|
| - m_fetcher->didInitializeResourceLoader(this); |
| -} |
| - |
| -void ResourceLoader::start() |
| +void ResourceLoader::start(ResourceRequest& request) |
| { |
| ASSERT(!m_loader); |
| - ASSERT(!m_request.isNull()); |
| - m_fetcher->willStartLoadingResource(m_resource.get(), m_request); |
| + m_fetcher->willStartLoadingResource(m_resource.get(), request); |
| + m_fetcher->willSendRequest(m_resource->identifier(), request, ResourceResponse(), m_resource->options().initiatorInfo); |
|
hiroshige
2016/03/09 02:01:56
This CL changes the order from:
- willSendRequest(
Nate Chapin
2016/03/09 22:35:54
I've done a bit more refactoring than that. Resour
|
| + applyOptions(request); |
| RELEASE_ASSERT(m_state == ConnectionStateNew); |
| m_state = ConnectionStateStarted; |
| @@ -128,23 +118,10 @@ void ResourceLoader::start() |
| ASSERT(m_loader); |
| m_loader->setLoadingTaskRunner(m_fetcher->loadingTaskRunner()); |
| - if (m_options.synchronousPolicy == RequestSynchronously) |
| - requestSynchronously(); |
| + if (m_resource->options().synchronousPolicy == RequestSynchronously) |
| + requestSynchronously(request); |
| else |
| - m_loader->loadAsynchronously(WrappedResourceRequest(m_request), this); |
| -} |
| - |
| -void ResourceLoader::changeToSynchronous() |
| -{ |
| - ASSERT(m_options.synchronousPolicy == RequestAsynchronously); |
| - ASSERT(m_loader); |
| - m_loader->cancel(); |
| - m_loader.clear(); |
| - m_loader = adoptPtr(Platform::current()->createURLLoader()); |
| - ASSERT(m_loader); |
| - m_request.setPriority(ResourceLoadPriorityHighest); |
| - m_state = ConnectionStateStarted; |
| - requestSynchronously(); |
| + m_loader->loadAsynchronously(WrappedResourceRequest(request), this); |
| } |
| void ResourceLoader::setDefersLoading(bool defers) |
| @@ -204,7 +181,7 @@ void ResourceLoader::cancel(const ResourceError& error) |
| return; |
| } |
| - ResourceError nonNullError = error.isNull() ? ResourceError::cancelledError(m_request.url()) : error; |
| + ResourceError nonNullError = error.isNull() ? ResourceError::cancelledError(m_resource->lastResourceRequest().url()) : error; |
| WTF_LOG(ResourceLoading, "Cancelled load of '%s'.\n", m_resource->url().getString().latin1().data()); |
| m_state = ConnectionStateCanceled; |
| @@ -226,29 +203,23 @@ void ResourceLoader::willFollowRedirect(WebURLLoader*, WebURLRequest& passedNewR |
| ASSERT(m_state != ConnectionStateReleased); |
| ResourceRequest& newRequest(applyOptions(passedNewRequest.toMutableResourceRequest())); |
| + ResourceLoaderOptions options = m_resource->options(); |
|
Nate Chapin
2016/03/09 00:38:20
m_resource->options() is const, hence the copy. Is
|
| ASSERT(!newRequest.isNull()); |
| const ResourceResponse& redirectResponse(passedRedirectResponse.toResourceResponse()); |
| ASSERT(!redirectResponse.isNull()); |
| newRequest.setFollowedRedirect(true); |
| - if (!isManualRedirectFetchRequest(m_resource->resourceRequest()) && !m_fetcher->canAccessRedirect(m_resource.get(), newRequest, redirectResponse, m_options)) { |
| + if (!isManualRedirectFetchRequest(m_resource->resourceRequest()) && !m_fetcher->canAccessRedirect(m_resource.get(), newRequest, redirectResponse, options)) { |
| cancel(ResourceError::cancelledDueToAccessCheckError(newRequest.url())); |
| return; |
| } |
| ASSERT(m_state != ConnectionStateReleased); |
| - applyOptions(newRequest); // canAccessRedirect() can modify m_options so we should re-apply it. |
| + m_resource->setOptions(options); |
| + applyOptions(newRequest); // canAccessRedirect() can modify options so we should re-apply it. |
| m_fetcher->redirectReceived(m_resource.get(), redirectResponse); |
| - ASSERT(m_state != ConnectionStateReleased); |
| + m_fetcher->willSendRequest(m_resource->identifier(), newRequest, redirectResponse, options.initiatorInfo); |
| m_resource->willFollowRedirect(newRequest, redirectResponse); |
|
Nate Chapin
2016/03/09 00:38:20
By doing m_resource->willFollowRedirect() last, cl
|
| - if (newRequest.isNull() || m_state == ConnectionStateReleased) |
| - return; |
| - |
| - m_fetcher->willSendRequest(m_resource->identifier(), newRequest, redirectResponse, m_options.initiatorInfo); |
| - ASSERT(m_state != ConnectionStateReleased); |
| - ASSERT(!newRequest.isNull()); |
| - m_resource->updateRequest(newRequest); |
| - m_request = newRequest; |
| } |
| void ResourceLoader::didReceiveCachedMetadata(WebURLLoader*, const char* data, int length) |
| @@ -265,7 +236,7 @@ void ResourceLoader::didSendData(WebURLLoader*, unsigned long long bytesSent, un |
| bool ResourceLoader::responseNeedsAccessControlCheck() const |
| { |
| // If the fetch was (potentially) CORS enabled, an access control check of the response is required. |
| - return m_options.corsEnabled == IsCORSEnabled; |
| + return m_resource->options().corsEnabled == IsCORSEnabled; |
| } |
| void ResourceLoader::didReceiveResponse(WebURLLoader*, const WebURLResponse& response, WebDataConsumerHandle* rawHandle) |
| @@ -290,16 +261,16 @@ void ResourceLoader::didReceiveResponse(WebURLLoader*, const WebURLResponse& res |
| m_state = ConnectionStateStarted; |
| m_loader = adoptPtr(Platform::current()->createURLLoader()); |
| ASSERT(m_loader); |
| - ASSERT(!m_request.skipServiceWorker()); |
| - m_request.setSkipServiceWorker(true); |
| - WrappedResourceRequest wrappedRequest(m_request); |
| - m_loader->loadAsynchronously(wrappedRequest, this); |
| + ResourceRequest request = m_resource->lastResourceRequest(); |
| + ASSERT(!request.skipServiceWorker()); |
| + request.setSkipServiceWorker(true); |
| + m_loader->loadAsynchronously(WrappedResourceRequest(request), this); |
| return; |
| } |
| } else { |
| if (!m_resource->isCacheValidator() || resourceResponse.httpStatusCode() != 304) |
| m_resource->setResponse(resourceResponse); |
| - if (!m_fetcher->canAccessResource(m_resource.get(), m_options.securityOrigin.get(), response.url(), ResourceFetcher::ShouldLogAccessControlErrors)) { |
| + if (!m_fetcher->canAccessResource(m_resource.get(), m_resource->options().securityOrigin.get(), response.url(), ResourceFetcher::ShouldLogAccessControlErrors)) { |
| m_fetcher->didReceiveResponse(m_resource.get(), resourceResponse); |
| cancel(ResourceError::cancelledDueToAccessCheckError(KURL(response.url()))); |
| return; |
| @@ -319,7 +290,7 @@ void ResourceLoader::didReceiveResponse(WebURLLoader*, const WebURLResponse& res |
| // We only support multipart for images, though the image may be loaded |
| // as a main resource that we end up displaying through an ImageDocument. |
| if (!m_resource->isImage() && m_resource->getType() != Resource::MainResource) { |
| - cancel(); |
| + cancel(ResourceError::cancelledError(resourceResponse.url())); |
| return; |
| } |
| m_loadingMultipartContent = true; |
| @@ -337,12 +308,12 @@ void ResourceLoader::didReceiveResponse(WebURLLoader*, const WebURLResponse& res |
| if (!m_notifiedLoadComplete) { |
| m_notifiedLoadComplete = true; |
| - m_fetcher->didFailLoading(m_resource.get(), ResourceError::cancelledError(m_request.url())); |
| + m_fetcher->didFailLoading(m_resource.get(), ResourceError::cancelledError(resourceResponse.url())); |
| } |
| ASSERT(m_state != ConnectionStateReleased); |
| m_resource->error(Resource::LoadError); |
| - cancel(); |
| + cancel(ResourceError::cancelledError(resourceResponse.url())); |
| } |
| void ResourceLoader::didReceiveResponse(WebURLLoader* loader, const WebURLResponse& response) |
| @@ -416,19 +387,22 @@ void ResourceLoader::didFail(WebURLLoader*, const WebURLError& error) |
| releaseResources(); |
| } |
| -void ResourceLoader::requestSynchronously() |
| +void ResourceLoader::requestSynchronously(ResourceRequest& request) |
| { |
| // downloadToFile is not supported for synchronous requests. |
| - ASSERT(!m_request.downloadToFile()); |
| + ASSERT(!request.downloadToFile()); |
| ASSERT(m_loader); |
| + // Synchronous requests should always be max priority, lest they hang the renderer. |
| + request.setPriority(ResourceLoadPriorityHighest); |
| + |
| if (m_fetcher->defersLoading()) { |
| cancel(); |
| return; |
| } |
| RefPtrWillBeRawPtr<Resource> protectResource(m_resource.get()); |
| - WrappedResourceRequest requestIn(m_request); |
| + WrappedResourceRequest requestIn(request); |
| WebURLResponse responseOut; |
| responseOut.initialize(); |
| WebURLError errorOut; |
| @@ -463,7 +437,7 @@ void ResourceLoader::requestSynchronously() |
| ResourceRequest& ResourceLoader::applyOptions(ResourceRequest& request) const |
| { |
| - request.setAllowStoredCredentials(m_options.allowCredentials == AllowStoredCredentials); |
| + request.setAllowStoredCredentials(m_resource->options().allowCredentials == AllowStoredCredentials); |
| return request; |
| } |