Index: Source/core/fetch/ResourceFetcher.cpp |
diff --git a/Source/core/fetch/ResourceFetcher.cpp b/Source/core/fetch/ResourceFetcher.cpp |
index 063a3eb4c430313eef9947e2be1153d3ed6b46a8..4e8ca8b1a302563db92988e257466abdcf12180e 100644 |
--- a/Source/core/fetch/ResourceFetcher.cpp |
+++ b/Source/core/fetch/ResourceFetcher.cpp |
@@ -116,9 +116,10 @@ static ResourceLoadPriority loadPriority(Resource::Type type, const FetchRequest |
return ResourceLoadPriorityVeryHigh; |
case Resource::CSSStyleSheet: |
return ResourceLoadPriorityHigh; |
+ case Resource::Raw: |
+ return request.options().synchronousPolicy == RequestSynchronously ? ResourceLoadPriorityVeryHigh : ResourceLoadPriorityMedium; |
case Resource::Script: |
case Resource::Font: |
- case Resource::Raw: |
case Resource::ImportResource: |
return ResourceLoadPriorityMedium; |
case Resource::Image: |
@@ -211,20 +212,14 @@ FetchContext& ResourceFetcher::context() const |
return FetchContext::nullInstance(); |
} |
-unsigned long ResourceFetcher::fetchSynchronously(const ResourceRequest& passedRequest, StoredCredentials storedCredentials, ResourceError& error, ResourceResponse& response, Vector<char>& data) |
+ResourcePtr<Resource> ResourceFetcher::fetchSynchronously(FetchRequest& request) |
{ |
ASSERT(document()); |
- ResourceRequest request(passedRequest); |
- request.setTimeoutInterval(10); |
- addAdditionalRequestHeaders(request, Resource::Raw); |
- |
- unsigned long identifier = createUniqueIdentifier(); |
- context().dispatchWillSendRequest(m_documentLoader, identifier, request, ResourceResponse()); |
- documentLoader()->applicationCacheHost()->willStartLoadingSynchronously(request); |
- ResourceLoader::loadResourceSynchronously(request, storedCredentials, error, response, data); |
- int encodedDataLength = response.resourceLoadInfo() ? static_cast<int>(response.resourceLoadInfo()->encodedDataLength) : -1; |
- context().sendRemainingDelegateMessages(m_documentLoader, identifier, response, data.data(), data.size(), encodedDataLength, error); |
- return identifier; |
+ request.mutableResourceRequest().setTimeoutInterval(10); |
+ ResourceLoaderOptions options(request.options()); |
+ options.synchronousPolicy = RequestSynchronously; |
+ request.setOptions(options); |
+ return requestResource(Resource::Raw, request); |
} |
ResourcePtr<ImageResource> ResourceFetcher::fetchImage(FetchRequest& request) |
@@ -515,6 +510,8 @@ bool ResourceFetcher::shouldLoadNewResource() const |
ResourcePtr<Resource> ResourceFetcher::requestResource(Resource::Type type, FetchRequest& request) |
{ |
+ ASSERT(request.options().synchronousPolicy == RequestAsynchronously || type == Resource::Raw); |
+ |
KURL url = request.resourceRequest().url(); |
LOG(ResourceLoading, "ResourceFetcher::requestResource '%s', charset '%s', priority=%d, forPreload=%u", url.elidedString().latin1().data(), request.charset().latin1().data(), request.priority(), request.forPreload()); |
@@ -575,11 +572,16 @@ ResourcePtr<Resource> ResourceFetcher::requestResource(Resource::Type type, Fetc |
if (!m_documentLoader || !m_documentLoader->scheduleArchiveLoad(resource.get(), request.resourceRequest())) |
resource->load(this, request.options()); |
- // We don't support immediate loads, but we do support immediate failure. |
+ // For asynchronous loads that immediately fail, it's sufficient to return a |
+ // null Resource, as it indicates that something prevented the load from starting. |
+ // If there's a network error, that failure will happen asynchronously. However, if |
+ // a sync load receives a network error, it will have already happened by this point. |
+ // In that case, the requester should have access to the relevant ResourceError, so |
+ // we need to return a non-null Resource. |
if (resource->errorOccurred()) { |
if (resource->inCache()) |
memoryCache()->remove(resource.get()); |
- return 0; |
+ return request.options().synchronousPolicy == RequestSynchronously ? resource : 0; |
} |
} |