Make CachedResource::redirectReceived asynchronous
https://bugs.webkit.org/show_bug.cgi?id=179503
Reviewed by Antti Koivisto.
There were a few loops where we called redirectReceived many times in a row,
and these are replaced with a completion handler that recursively calls the next
redirectReceived or the code after the loop.
No change in behavior.
* loader/DocumentLoader.cpp:
(WebCore::DocumentLoader::redirectReceived):
* loader/DocumentLoader.h:
(WebCore::DocumentLoader::setLastCheckedRequest):
* loader/DocumentThreadableLoader.cpp:
(WebCore::DocumentThreadableLoader::redirectReceived):
* loader/DocumentThreadableLoader.h:
* loader/MediaResourceLoader.cpp:
(WebCore::MediaResource::redirectReceived):
* loader/MediaResourceLoader.h:
* loader/PolicyChecker.cpp:
(WebCore::PolicyChecker::checkNavigationPolicy):
* loader/SubresourceLoader.cpp:
(WebCore::SubresourceLoader::willSendRequestInternal):
* loader/cache/CachedRawResource.cpp:
(WebCore::iterate):
(WebCore::CachedRawResource::didAddClient):
(WebCore::CachedRawResource::redirectReceived):
* loader/cache/CachedRawResource.h:
* loader/cache/CachedRawResourceClient.h:
(WebCore::CachedRawResourceClient::redirectReceived):
* loader/cache/CachedResource.cpp:
(WebCore::CachedResource::redirectReceived):
* loader/cache/CachedResource.h:
* platform/graphics/PlatformMediaResourceLoader.h:
(WebCore::PlatformMediaResourceClient::redirectReceived):
* platform/network/cocoa/WebCoreNSURLSession.mm:
(WebCore::WebCoreNSURLSessionDataTaskClient::redirectReceived):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@224699 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/loader/DocumentThreadableLoader.cpp b/Source/WebCore/loader/DocumentThreadableLoader.cpp
index 65b7ae9..d50135f 100644
--- a/Source/WebCore/loader/DocumentThreadableLoader.cpp
+++ b/Source/WebCore/loader/DocumentThreadableLoader.cpp
@@ -234,7 +234,7 @@
m_preflightChecker = std::nullopt;
}
-void DocumentThreadableLoader::redirectReceived(CachedResource& resource, ResourceRequest& request, const ResourceResponse& redirectResponse)
+void DocumentThreadableLoader::redirectReceived(CachedResource& resource, ResourceRequest&& request, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
{
ASSERT(m_client);
ASSERT_UNUSED(resource, &resource == m_resource);
@@ -248,18 +248,18 @@
if (!request.url().protocolIsInHTTPFamily() && m_options.initiator == cachedResourceRequestInitiators().fetch) {
reportRedirectionWithBadScheme(request.url());
clearResource();
- return;
+ return completionHandler(WTFMove(request));
}
if (!isAllowedByContentSecurityPolicy(request.url(), redirectResponse.isNull() ? ContentSecurityPolicy::RedirectResponseReceived::No : ContentSecurityPolicy::RedirectResponseReceived::Yes)) {
reportContentSecurityPolicyError(redirectResponse.url());
clearResource();
- return;
+ return completionHandler(WTFMove(request));
}
// Allow same origin requests to continue after allowing clients to audit the redirect.
if (isAllowedRedirect(request.url()))
- return;
+ return completionHandler(WTFMove(request));
// Force any subsequent request to use these checks.
m_sameOriginRequest = false;
@@ -276,7 +276,7 @@
// Except in case where preflight is needed, loading should be able to continue on its own.
// But we also handle credentials here if it is restricted to SameOrigin.
if (m_options.credentials != FetchOptions::Credentials::SameOrigin && m_simpleRequest && isSimpleCrossOriginAccessRequest(request.httpMethod(), *m_originalHeaders))
- return;
+ return completionHandler(WTFMove(request));
m_options.storedCredentialsPolicy = StoredCredentialsPolicy::DoNotUse;
@@ -289,6 +289,7 @@
request.setHTTPHeaderFields(*m_originalHeaders);
makeCrossOriginAccessRequest(ResourceRequest(request));
+ completionHandler(WTFMove(request));
}
void DocumentThreadableLoader::dataSent(CachedResource& resource, unsigned long long bytesSent, unsigned long long totalBytesToBeSent)