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..868411e5420ef7ab11413c155136fc527f0fd840 100644 |
--- a/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp |
+++ b/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp |
@@ -47,27 +47,15 @@ |
namespace blink { |
-namespace { |
- |
-bool isManualRedirectFetchRequest(const ResourceRequest& request) |
-{ |
- return request.fetchRedirectMode() == WebURLRequest::FetchRedirectModeManual && request.requestContext() == WebURLRequest::RequestContextFetch; |
-} |
- |
-} // 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) |
{ |
@@ -105,21 +93,11 @@ 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); |
- 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(), this, request); |
RELEASE_ASSERT(m_state == ConnectionStateNew); |
m_state = ConnectionStateStarted; |
@@ -128,23 +106,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 +169,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; |
@@ -224,31 +189,17 @@ void ResourceLoader::cancel(const ResourceError& error) |
void ResourceLoader::willFollowRedirect(WebURLLoader*, WebURLRequest& passedNewRequest, const WebURLResponse& passedRedirectResponse) |
{ |
ASSERT(m_state != ConnectionStateReleased); |
+ ASSERT(!passedNewRequest.isNull()); |
+ ASSERT(!passedRedirectResponse.isNull()); |
- ResourceRequest& newRequest(applyOptions(passedNewRequest.toMutableResourceRequest())); |
- |
- ASSERT(!newRequest.isNull()); |
+ ResourceRequest& newRequest(passedNewRequest.toMutableResourceRequest()); |
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)) { |
- cancel(ResourceError::cancelledDueToAccessCheckError(newRequest.url())); |
- return; |
- } |
- ASSERT(m_state != ConnectionStateReleased); |
- applyOptions(newRequest); // canAccessRedirect() can modify m_options so we should re-apply it. |
- m_fetcher->redirectReceived(m_resource.get(), redirectResponse); |
- ASSERT(m_state != ConnectionStateReleased); |
- m_resource->willFollowRedirect(newRequest, redirectResponse); |
- 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; |
+ if (m_fetcher->willFollowRedirect(m_resource.get(), newRequest, redirectResponse)) |
+ m_resource->willFollowRedirect(newRequest, redirectResponse); |
+ else |
+ cancel(ResourceError::cancelledDueToAccessCheckError(newRequest.url())); |
} |
void ResourceLoader::didReceiveCachedMetadata(WebURLLoader*, const char* data, int length) |
@@ -265,7 +216,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 +241,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 +270,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 +288,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 +367,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; |
@@ -461,10 +415,4 @@ void ResourceLoader::requestSynchronously() |
didFinishLoading(0, monotonicallyIncreasingTime(), encodedDataLength); |
} |
-ResourceRequest& ResourceLoader::applyOptions(ResourceRequest& request) const |
-{ |
- request.setAllowStoredCredentials(m_options.allowCredentials == AllowStoredCredentials); |
- return request; |
-} |
- |
} // namespace blink |