Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(339)

Unified Diff: third_party/WebKit/Source/core/fetch/ResourceLoader.cpp

Issue 1757633005: Don't duplicate ResourceRequests and ResourceLoaderOptions on ResourceLoader (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
}

Powered by Google App Engine
This is Rietveld 408576698