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

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: Make synchronousPolicy check higher priority in determineRevalidationPolicy 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..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

Powered by Google App Engine
This is Rietveld 408576698