Index: Source/core/loader/DocumentThreadableLoader.cpp |
diff --git a/Source/core/loader/DocumentThreadableLoader.cpp b/Source/core/loader/DocumentThreadableLoader.cpp |
index 2f1314a8201119b4384ecdaee6c54e3af5e1113c..d548a758486423223ef23a082d3abad5f422e3ec 100644 |
--- a/Source/core/loader/DocumentThreadableLoader.cpp |
+++ b/Source/core/loader/DocumentThreadableLoader.cpp |
@@ -162,7 +162,7 @@ void DocumentThreadableLoader::makeCrossOriginAccessRequest(const ResourceReques |
// is no reason to send a request, preflighted or not, that's guaranteed |
// to be denied. |
if (!SchemeRegistry::shouldTreatURLSchemeAsCORSEnabled(request.url().protocol())) { |
- m_client->didFailAccessControlCheck(ResourceError(errorDomainBlinkInternal, 0, request.url().string(), "Cross origin requests are only supported for protocol schemes: " + SchemeRegistry::listOfCORSEnabledURLSchemes() + ".")); |
+ handlePreflightFailure(request.url().string(), "Cross origin requests are only supported for protocol schemes: " + SchemeRegistry::listOfCORSEnabledURLSchemes() + "."); |
return; |
} |
@@ -335,8 +335,7 @@ void DocumentThreadableLoader::redirectReceived(Resource* resource, ResourceRequ |
return; |
} |
- ResourceError error(errorDomainBlinkInternal, 0, redirectResponse.url().string(), accessControlErrorDescription); |
- m_client->didFailAccessControlCheck(error); |
+ handlePreflightFailure(redirectResponse.url().string(), accessControlErrorDescription); |
} else { |
m_client->didFailRedirectCheck(); |
} |
@@ -436,7 +435,7 @@ void DocumentThreadableLoader::handleResponse(unsigned long identifier, const Re |
String accessControlErrorDescription; |
if (!passesAccessControlCheck(&m_document, response, effectiveAllowCredentials(), securityOrigin(), accessControlErrorDescription)) { |
reportResponseReceived(identifier, response); |
- m_client->didFailAccessControlCheck(ResourceError(errorDomainBlinkInternal, 0, response.url().string(), accessControlErrorDescription)); |
+ handlePreflightFailure(response.url().string(), accessControlErrorDescription); |
return; |
} |
} |
@@ -534,9 +533,17 @@ void DocumentThreadableLoader::handlePreflightFailure(const String& url, const S |
// Prevent handleSuccessfulFinish() from bypassing access check. |
m_actualRequest = nullptr; |
+ // Do not call didFailAccessControlCheck() directly from other places in |
+ // DocumentThreadableLoader. |
+ // Call handlePreflightFailure() to prevent m_client's handlers from |
+ // being called after didFailAccessControlCheck(). |
+ |
// FIXME: Should prevent timeout from being overridden after preflight failure, without |
// resetting m_requestStartedSeconds to 0.0 |
m_client->didFailAccessControlCheck(error); |
+ |
+ // Prevent m_client's handlers from being called later. |
+ clearResource(); |
} |
void DocumentThreadableLoader::loadRequest(const ResourceRequest& request, ResourceLoaderOptions resourceLoaderOptions) |