Diff
Modified: trunk/Source/WebCore/ChangeLog (224698 => 224699)
--- trunk/Source/WebCore/ChangeLog 2017-11-10 19:06:50 UTC (rev 224698)
+++ trunk/Source/WebCore/ChangeLog 2017-11-10 19:23:13 UTC (rev 224699)
@@ -1,3 +1,45 @@
+2017-11-10 Alex Christensen <achristen...@webkit.org>
+
+ 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):
+
2017-11-10 John Wilander <wilan...@apple.com>
Ignore HSTS for partitioned, cross-origin subresource requests
Modified: trunk/Source/WebCore/loader/DocumentLoader.cpp (224698 => 224699)
--- trunk/Source/WebCore/loader/DocumentLoader.cpp 2017-11-10 19:06:50 UTC (rev 224698)
+++ trunk/Source/WebCore/loader/DocumentLoader.cpp 2017-11-10 19:23:13 UTC (rev 224699)
@@ -467,10 +467,11 @@
startDataLoadTimer();
}
-void DocumentLoader::redirectReceived(CachedResource& resource, ResourceRequest& request, const ResourceResponse& redirectResponse)
+void DocumentLoader::redirectReceived(CachedResource& resource, ResourceRequest&& request, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
{
ASSERT_UNUSED(resource, &resource == m_mainResource);
willSendRequest(request, redirectResponse);
+ completionHandler(WTFMove(request));
}
void DocumentLoader::willSendRequest(ResourceRequest& newRequest, const ResourceResponse& redirectResponse)
Modified: trunk/Source/WebCore/loader/DocumentLoader.h (224698 => 224699)
--- trunk/Source/WebCore/loader/DocumentLoader.h 2017-11-10 19:06:50 UTC (rev 224698)
+++ trunk/Source/WebCore/loader/DocumentLoader.h 2017-11-10 19:23:13 UTC (rev 224699)
@@ -195,7 +195,7 @@
const NavigationAction& triggeringAction() const { return m_triggeringAction; }
void setTriggeringAction(const NavigationAction&);
void setOverrideEncoding(const String& encoding) { m_overrideEncoding = encoding; }
- void setLastCheckedRequest(const ResourceRequest& request) { m_lastCheckedRequest = request; }
+ void setLastCheckedRequest(ResourceRequest&& request) { m_lastCheckedRequest = WTFMove(request); }
const ResourceRequest& lastCheckedRequest() { return m_lastCheckedRequest; }
void stopRecordingResponses();
@@ -327,7 +327,7 @@
void willSendRequest(ResourceRequest&, const ResourceResponse&);
void finishedLoading();
void mainReceivedError(const ResourceError&);
- WEBCORE_EXPORT void redirectReceived(CachedResource&, ResourceRequest&, const ResourceResponse&) override;
+ WEBCORE_EXPORT void redirectReceived(CachedResource&, ResourceRequest&&, const ResourceResponse&, CompletionHandler<void(ResourceRequest&&)>&&) override;
WEBCORE_EXPORT void responseReceived(CachedResource&, const ResourceResponse&) override;
WEBCORE_EXPORT void dataReceived(CachedResource&, const char* data, int length) override;
WEBCORE_EXPORT void notifyFinished(CachedResource&) override;
Modified: trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp (224698 => 224699)
--- trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp 2017-11-10 19:06:50 UTC (rev 224698)
+++ trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp 2017-11-10 19:23:13 UTC (rev 224699)
@@ -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)
Modified: trunk/Source/WebCore/loader/DocumentThreadableLoader.h (224698 => 224699)
--- trunk/Source/WebCore/loader/DocumentThreadableLoader.h 2017-11-10 19:06:50 UTC (rev 224698)
+++ trunk/Source/WebCore/loader/DocumentThreadableLoader.h 2017-11-10 19:23:13 UTC (rev 224699)
@@ -83,7 +83,7 @@
void dataSent(CachedResource&, unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
void responseReceived(CachedResource&, const ResourceResponse&) override;
void dataReceived(CachedResource&, const char* data, int dataLength) override;
- void redirectReceived(CachedResource&, ResourceRequest&, const ResourceResponse&) override;
+ void redirectReceived(CachedResource&, ResourceRequest&&, const ResourceResponse&, CompletionHandler<void(ResourceRequest&&)>&&) override;
void finishedTimingForWorkerLoad(CachedResource&, const ResourceTiming&) override;
void finishedTimingForWorkerLoad(const ResourceTiming&);
void notifyFinished(CachedResource&) override;
Modified: trunk/Source/WebCore/loader/MediaResourceLoader.cpp (224698 => 224699)
--- trunk/Source/WebCore/loader/MediaResourceLoader.cpp 2017-11-10 19:06:50 UTC (rev 224698)
+++ trunk/Source/WebCore/loader/MediaResourceLoader.cpp 2017-11-10 19:23:13 UTC (rev 224699)
@@ -174,13 +174,15 @@
return true;
}
-void MediaResource::redirectReceived(CachedResource& resource, ResourceRequest& request, const ResourceResponse& response)
+void MediaResource::redirectReceived(CachedResource& resource, ResourceRequest&& request, const ResourceResponse& response, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
{
ASSERT_UNUSED(resource, &resource == m_resource);
RefPtr<MediaResource> protectedThis(this);
if (m_client)
- m_client->redirectReceived(*this, request, response);
+ m_client->redirectReceived(*this, WTFMove(request), response, WTFMove(completionHandler));
+ else
+ completionHandler(WTFMove(request));
}
void MediaResource::dataSent(CachedResource& resource, unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
Modified: trunk/Source/WebCore/loader/MediaResourceLoader.h (224698 => 224699)
--- trunk/Source/WebCore/loader/MediaResourceLoader.h 2017-11-10 19:06:50 UTC (rev 224698)
+++ trunk/Source/WebCore/loader/MediaResourceLoader.h 2017-11-10 19:23:13 UTC (rev 224699)
@@ -83,7 +83,7 @@
// CachedRawResourceClient
void responseReceived(CachedResource&, const ResourceResponse&) override;
- void redirectReceived(CachedResource&, ResourceRequest&, const ResourceResponse&) override;
+ void redirectReceived(CachedResource&, ResourceRequest&&, const ResourceResponse&, CompletionHandler<void(ResourceRequest&&)>&&) override;
bool shouldCacheResponse(CachedResource&, const ResourceResponse&) override;
void dataSent(CachedResource&, unsigned long long, unsigned long long) override;
void dataReceived(CachedResource&, const char*, int) override;
Modified: trunk/Source/WebCore/loader/PolicyChecker.cpp (224698 => 224699)
--- trunk/Source/WebCore/loader/PolicyChecker.cpp 2017-11-10 19:06:50 UTC (rev 224698)
+++ trunk/Source/WebCore/loader/PolicyChecker.cpp 2017-11-10 19:23:13 UTC (rev 224699)
@@ -93,7 +93,7 @@
// This avoids confusion on the part of the client.
if (equalIgnoringHeaderFields(request, loader->lastCheckedRequest()) || (!request.isNull() && request.url().isEmpty())) {
function(request, nullptr, true);
- loader->setLastCheckedRequest(request);
+ loader->setLastCheckedRequest(ResourceRequest(request));
return;
}
@@ -121,7 +121,7 @@
return;
}
- loader->setLastCheckedRequest(request);
+ loader->setLastCheckedRequest(ResourceRequest(request));
#if USE(QUICK_LOOK)
// Always allow QuickLook-generated URLs based on the protocol scheme.
Modified: trunk/Source/WebCore/loader/SubresourceLoader.cpp (224698 => 224699)
--- trunk/Source/WebCore/loader/SubresourceLoader.cpp 2017-11-10 19:06:50 UTC (rev 224698)
+++ trunk/Source/WebCore/loader/SubresourceLoader.cpp 2017-11-10 19:23:13 UTC (rev 224699)
@@ -183,6 +183,25 @@
ResourceLoadObserver::shared().logSubresourceLoading(m_frame.get(), newRequest, redirectResponse);
}
+ auto continueWillSendRequest = [this, protectedThis = makeRef(*this), redirectResponse] (CompletionHandler<void(ResourceRequest&&)>&& completionHandler, ResourceRequest&& newRequest) mutable {
+ if (newRequest.isNull() || reachedTerminalState())
+ return completionHandler(WTFMove(newRequest));
+
+ ResourceLoader::willSendRequestInternal(WTFMove(newRequest), redirectResponse, [this, protectedThis = WTFMove(protectedThis), completionHandler = WTFMove(completionHandler), redirectResponse] (ResourceRequest&& request) mutable {
+ if (reachedTerminalState())
+ return completionHandler(WTFMove(request));
+
+ if (request.isNull()) {
+ cancel();
+ return completionHandler(WTFMove(request));
+ }
+
+ if (m_resource->type() == CachedResource::MainResource && !redirectResponse.isNull())
+ m_documentLoader->willContinueMainResourceLoadAfterRedirect(request);
+ completionHandler(WTFMove(request));
+ });
+ };
+
ASSERT(!newRequest.isNull());
if (!redirectResponse.isNull()) {
if (options().redirect != FetchOptions::Redirect::Follow) {
@@ -234,25 +253,13 @@
return completionHandler(WTFMove(newRequest));
}
m_loadTiming.addRedirect(redirectResponse.url(), newRequest.url());
- m_resource->redirectReceived(newRequest, redirectResponse);
+ m_resource->redirectReceived(WTFMove(newRequest), redirectResponse, [completionHandler = WTFMove(completionHandler), continueWillSendRequest = WTFMove(continueWillSendRequest)] (ResourceRequest&& request) mutable {
+ continueWillSendRequest(WTFMove(completionHandler), WTFMove(request));
+ });
+ return;
}
- if (newRequest.isNull() || reachedTerminalState())
- return completionHandler(WTFMove(newRequest));
-
- ResourceLoader::willSendRequestInternal(WTFMove(newRequest), redirectResponse, [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler), redirectResponse] (ResourceRequest&& request) mutable {
- if (reachedTerminalState())
- return completionHandler(WTFMove(request));
-
- if (request.isNull()) {
- cancel();
- return completionHandler(WTFMove(request));
- }
-
- if (m_resource->type() == CachedResource::MainResource && !redirectResponse.isNull())
- m_documentLoader->willContinueMainResourceLoadAfterRedirect(request);
- completionHandler(WTFMove(request));
- });
+ continueWillSendRequest(WTFMove(completionHandler), WTFMove(newRequest));
}
void SubresourceLoader::didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
Modified: trunk/Source/WebCore/loader/cache/CachedRawResource.cpp (224698 => 224699)
--- trunk/Source/WebCore/loader/cache/CachedRawResource.cpp 2017-11-10 19:06:50 UTC (rev 224698)
+++ trunk/Source/WebCore/loader/cache/CachedRawResource.cpp 2017-11-10 19:23:13 UTC (rev 224699)
@@ -32,6 +32,7 @@
#include "HTTPHeaderNames.h"
#include "SharedBuffer.h"
#include "SubresourceLoader.h"
+#include <wtf/CompletionHandler.h>
#include <wtf/text/StringView.h>
namespace WebCore {
@@ -115,42 +116,49 @@
c->dataReceived(*this, data, length);
}
+static void iterateRedirects(CachedResourceHandle<CachedRawResource>&& handle, CachedRawResourceClient& client, Vector<std::pair<ResourceRequest, ResourceResponse>>&& redirectsInReverseOrder, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
+{
+ if (!handle->hasClient(client) || redirectsInReverseOrder.isEmpty())
+ return completionHandler({ });
+ auto redirectPair = redirectsInReverseOrder.takeLast();
+ client.redirectReceived(*handle, WTFMove(redirectPair.first), WTFMove(redirectPair.second), [handle = WTFMove(handle), client, redirectsInReverseOrder = WTFMove(redirectsInReverseOrder), completionHandler = WTFMove(completionHandler)] (ResourceRequest&&) mutable {
+ // Ignore the new request because we can't do anything with it.
+ // We're just replying a redirect chain that has already happened.
+ iterateRedirects(WTFMove(handle), client, WTFMove(redirectsInReverseOrder), WTFMove(completionHandler));
+ });
+}
+
void CachedRawResource::didAddClient(CachedResourceClient& c)
{
- if (!hasClient(c))
- return;
- // The calls to the client can result in events running, potentially causing
- // this resource to be evicted from the cache and all clients to be removed,
- // so a protector is necessary.
- CachedResourceHandle<CachedRawResource> protectedThis(this);
CachedRawResourceClient& client = static_cast<CachedRawResourceClient&>(c);
size_t redirectCount = m_redirectChain.size();
- for (size_t i = 0; i < redirectCount; i++) {
- RedirectPair redirect = m_redirectChain[i];
- ResourceRequest request(redirect.m_request);
- client.redirectReceived(*this, request, redirect.m_redirectResponse);
- if (!hasClient(c))
+ Vector<std::pair<ResourceRequest, ResourceResponse>> redirectsInReverseOrder;
+ redirectsInReverseOrder.reserveInitialCapacity(redirectCount);
+ for (size_t i = 0; i < redirectCount; ++i) {
+ const auto& pair = m_redirectChain[redirectCount - i - 1];
+ redirectsInReverseOrder.uncheckedAppend(std::make_pair(pair.m_request, pair.m_redirectResponse));
+ }
+ iterateRedirects(CachedResourceHandle<CachedRawResource>(this), client, WTFMove(redirectsInReverseOrder), [this, protectedThis = CachedResourceHandle<CachedRawResource>(this), client = &client] (ResourceRequest&&) mutable {
+ if (!hasClient(*client))
return;
- }
- ASSERT(redirectCount == m_redirectChain.size());
-
- if (!m_response.isNull()) {
- ResourceResponse response(m_response);
- if (validationCompleting())
- response.setSource(ResourceResponse::Source::MemoryCacheAfterValidation);
- else {
- ASSERT(!validationInProgress());
- response.setSource(ResourceResponse::Source::MemoryCache);
+ if (!m_response.isNull()) {
+ ResourceResponse response(m_response);
+ if (validationCompleting())
+ response.setSource(ResourceResponse::Source::MemoryCacheAfterValidation);
+ else {
+ ASSERT(!validationInProgress());
+ response.setSource(ResourceResponse::Source::MemoryCache);
+ }
+ client->responseReceived(*this, response);
}
- client.responseReceived(*this, response);
- }
- if (!hasClient(c))
- return;
- if (m_data)
- client.dataReceived(*this, m_data->data(), m_data->size());
- if (!hasClient(c))
- return;
- CachedResource::didAddClient(client);
+ if (!hasClient(*client))
+ return;
+ if (m_data)
+ client->dataReceived(*this, m_data->data(), m_data->size());
+ if (!hasClient(*client))
+ return;
+ CachedResource::didAddClient(*client);
+ });
}
void CachedRawResource::allClientsRemoved()
@@ -159,16 +167,27 @@
m_loader->cancelIfNotFinishing();
}
-void CachedRawResource::redirectReceived(ResourceRequest& request, const ResourceResponse& response)
+static void iterateClients(CachedResourceClientWalker<CachedRawResourceClient>&& walker, CachedResourceHandle<CachedRawResource>&& handle, ResourceRequest&& request, std::unique_ptr<ResourceResponse>&& response, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
{
- CachedResourceHandle<CachedRawResource> protectedThis(this);
- if (!response.isNull()) {
- CachedResourceClientWalker<CachedRawResourceClient> w(m_clients);
- while (CachedRawResourceClient* c = w.next())
- c->redirectReceived(*this, request, response);
+ auto client = walker.next();
+ if (!client)
+ return completionHandler(WTFMove(request));
+ const ResourceResponse& responseReference = *response;
+ client->redirectReceived(*handle, WTFMove(request), responseReference, [walker = WTFMove(walker), handle = WTFMove(handle), response = WTFMove(response), completionHandler = WTFMove(completionHandler)] (ResourceRequest&& request) mutable {
+ iterateClients(WTFMove(walker), WTFMove(handle), WTFMove(request), WTFMove(response), WTFMove(completionHandler));
+ });
+}
+
+void CachedRawResource::redirectReceived(ResourceRequest&& request, const ResourceResponse& response, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
+{
+ if (response.isNull())
+ CachedResource::redirectReceived(WTFMove(request), response, WTFMove(completionHandler));
+ else {
m_redirectChain.append(RedirectPair(request, response));
+ iterateClients(CachedResourceClientWalker<CachedRawResourceClient>(m_clients), CachedResourceHandle<CachedRawResource>(this), WTFMove(request), std::make_unique<ResourceResponse>(response), [this, protectedThis = CachedResourceHandle<CachedRawResource>(this), completionHandler = WTFMove(completionHandler), response] (ResourceRequest&& request) mutable {
+ CachedResource::redirectReceived(WTFMove(request), response, WTFMove(completionHandler));
+ });
}
- CachedResource::redirectReceived(request, response);
}
void CachedRawResource::responseReceived(const ResourceResponse& response)
Modified: trunk/Source/WebCore/loader/cache/CachedRawResource.h (224698 => 224699)
--- trunk/Source/WebCore/loader/cache/CachedRawResource.h 2017-11-10 19:06:50 UTC (rev 224698)
+++ trunk/Source/WebCore/loader/cache/CachedRawResource.h 2017-11-10 19:23:13 UTC (rev 224699)
@@ -62,7 +62,7 @@
bool shouldIgnoreHTTPStatusCodeErrors() const override { return true; }
void allClientsRemoved() override;
- void redirectReceived(ResourceRequest&, const ResourceResponse&) override;
+ void redirectReceived(ResourceRequest&&, const ResourceResponse&, CompletionHandler<void(ResourceRequest&&)>&&) override;
void responseReceived(const ResourceResponse&) override;
bool shouldCacheResponse(const ResourceResponse&) override;
void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
Modified: trunk/Source/WebCore/loader/cache/CachedRawResourceClient.h (224698 => 224699)
--- trunk/Source/WebCore/loader/cache/CachedRawResourceClient.h 2017-11-10 19:06:50 UTC (rev 224698)
+++ trunk/Source/WebCore/loader/cache/CachedRawResourceClient.h 2017-11-10 19:23:13 UTC (rev 224699)
@@ -23,6 +23,7 @@
#pragma once
#include "CachedResourceClient.h"
+#include <wtf/CompletionHandler.h>
namespace WebCore {
@@ -41,7 +42,7 @@
virtual void responseReceived(CachedResource&, const ResourceResponse&) { }
virtual bool shouldCacheResponse(CachedResource&, const ResourceResponse&) { return true; }
virtual void dataReceived(CachedResource&, const char* /* data */, int /* length */) { }
- virtual void redirectReceived(CachedResource&, ResourceRequest&, const ResourceResponse&) { }
+ virtual void redirectReceived(CachedResource&, ResourceRequest&& request, const ResourceResponse&, CompletionHandler<void(ResourceRequest&&)>&& completionHandler) { completionHandler(WTFMove(request)); }
virtual void finishedTimingForWorkerLoad(CachedResource&, const ResourceTiming&) { }
#if USE(SOUP)
virtual char* getOrCreateReadBuffer(CachedResource&, size_t /* requestedSize */, size_t& /* actualSize */) { return nullptr; }
Modified: trunk/Source/WebCore/loader/cache/CachedResource.cpp (224698 => 224699)
--- trunk/Source/WebCore/loader/cache/CachedResource.cpp 2017-11-10 19:06:50 UTC (rev 224698)
+++ trunk/Source/WebCore/loader/cache/CachedResource.cpp 2017-11-10 19:23:13 UTC (rev 224699)
@@ -453,13 +453,14 @@
return computeFreshnessLifetimeForHTTPFamily(response, m_responseTimestamp);
}
-void CachedResource::redirectReceived(ResourceRequest&, const ResourceResponse& response)
+void CachedResource::redirectReceived(ResourceRequest&& request, const ResourceResponse& response, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
{
m_requestedFromNetworkingLayer = true;
if (response.isNull())
- return;
+ return completionHandler(WTFMove(request));
updateRedirectChainStatus(m_redirectChainCacheStatus, response);
+ completionHandler(WTFMove(request));
}
void CachedResource::setResponse(const ResourceResponse& response)
Modified: trunk/Source/WebCore/loader/cache/CachedResource.h (224698 => 224699)
--- trunk/Source/WebCore/loader/cache/CachedResource.h 2017-11-10 19:06:50 UTC (rev 224698)
+++ trunk/Source/WebCore/loader/cache/CachedResource.h 2017-11-10 19:23:13 UTC (rev 224699)
@@ -201,7 +201,7 @@
SharedBuffer* resourceBuffer() const { return m_data.get(); }
- virtual void redirectReceived(ResourceRequest&, const ResourceResponse&);
+ virtual void redirectReceived(ResourceRequest&&, const ResourceResponse&, CompletionHandler<void(ResourceRequest&&)>&&);
virtual void responseReceived(const ResourceResponse&);
virtual bool shouldCacheResponse(const ResourceResponse&) { return true; }
void setResponse(const ResourceResponse&);
Modified: trunk/Source/WebCore/platform/graphics/PlatformMediaResourceLoader.h (224698 => 224699)
--- trunk/Source/WebCore/platform/graphics/PlatformMediaResourceLoader.h 2017-11-10 19:06:50 UTC (rev 224698)
+++ trunk/Source/WebCore/platform/graphics/PlatformMediaResourceLoader.h 2017-11-10 19:23:13 UTC (rev 224699)
@@ -27,6 +27,7 @@
#if ENABLE(VIDEO)
+#include <wtf/CompletionHandler.h>
#include <wtf/Noncopyable.h>
#include <wtf/RefCounted.h>
#include <wtf/ThreadSafeRefCounted.h>
@@ -43,7 +44,7 @@
virtual ~PlatformMediaResourceClient() = default;
virtual void responseReceived(PlatformMediaResource&, const ResourceResponse&) { }
- virtual void redirectReceived(PlatformMediaResource&, ResourceRequest&, const ResourceResponse&) { }
+ virtual void redirectReceived(PlatformMediaResource&, ResourceRequest&& request, const ResourceResponse&, CompletionHandler<void(ResourceRequest&&)>&& completionHandler) { completionHandler(WTFMove(request)); }
virtual bool shouldCacheResponse(PlatformMediaResource&, const ResourceResponse&) { return true; }
virtual void dataSent(PlatformMediaResource&, unsigned long long, unsigned long long) { }
virtual void dataReceived(PlatformMediaResource&, const char*, int) { }
Modified: trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm (224698 => 224699)
--- trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm 2017-11-10 19:06:50 UTC (rev 224698)
+++ trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm 2017-11-10 19:23:13 UTC (rev 224699)
@@ -29,6 +29,7 @@
#import "CachedResourceRequest.h"
#import "PlatformMediaResourceLoader.h"
#import "SubresourceLoader.h"
+#import <wtf/CompletionHandler.h>
using namespace WebCore;
@@ -349,7 +350,7 @@
}
void responseReceived(PlatformMediaResource&, const ResourceResponse&) override;
- void redirectReceived(PlatformMediaResource&, ResourceRequest&, const ResourceResponse&) override;
+ void redirectReceived(PlatformMediaResource&, ResourceRequest&&, const ResourceResponse&, CompletionHandler<void(ResourceRequest&&)>&&) override;
bool shouldCacheResponse(PlatformMediaResource&, const ResourceResponse&) override;
void dataSent(PlatformMediaResource&, unsigned long long, unsigned long long) override;
void dataReceived(PlatformMediaResource&, const char* /* data */, int /* length */) override;
@@ -381,9 +382,10 @@
[m_task resource:resource receivedData:data length:length];
}
-void WebCoreNSURLSessionDataTaskClient::redirectReceived(PlatformMediaResource& resource, ResourceRequest& request, const ResourceResponse& response)
+void WebCoreNSURLSessionDataTaskClient::redirectReceived(PlatformMediaResource& resource, ResourceRequest&& request, const ResourceResponse& response, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
{
[m_task resource:resource receivedRedirect:response request:request];
+ completionHandler(WTFMove(request));
}
void WebCoreNSURLSessionDataTaskClient::accessControlCheckFailed(PlatformMediaResource& resource, const ResourceError& error)