Use CompletionHandlers for redirects
https://bugs.webkit.org/show_bug.cgi?id=179163

Reviewed by Tim Horton.

Source/WebCore:

Having functions sometimes have to remember to call client->continueWillSendRequest is fragile.
CompletionHandler asserts if it's not called once before destruction, and that's what we need here.
This will prevent future bugs, and make ResourceHandle look more like NetworkDataTask.

No change in behavior.

* loader/NetscapePlugInStreamLoader.cpp:
(WebCore::NetscapePlugInStreamLoader::willSendRequest):
* loader/NetscapePlugInStreamLoader.h:
* loader/ResourceLoader.cpp:
(WebCore::ResourceLoader::willSendRequest):
(WebCore::ResourceLoader::willSendRequestAsync):
* loader/ResourceLoader.h:
* loader/appcache/ApplicationCacheGroup.cpp:
(WebCore::ApplicationCacheGroup::willSendRequestAsync):
* loader/appcache/ApplicationCacheGroup.h:
* platform/network/BlobResourceHandle.cpp:
* platform/network/PingHandle.h:
* platform/network/ResourceHandle.h:
* platform/network/ResourceHandleClient.h:
* platform/network/SynchronousLoaderClient.cpp:
(WebCore::SynchronousLoaderClient::willSendRequestAsync):
* platform/network/SynchronousLoaderClient.h:
* platform/network/cf/ResourceHandleCFNet.cpp:
(WebCore::ResourceHandle::willSendRequest):
(WebCore::ResourceHandle::continueWillSendRequest): Deleted.
* platform/network/cf/ResourceHandleCFURLConnectionDelegate.h:
* platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.cpp:
(WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::willSendRequest):
(WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::continueWillSendRequest): Deleted.
* platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.h:
* platform/network/curl/ResourceHandleCurlDelegate.cpp:
(WebCore::ResourceHandleCurlDelegate::willSendRequest):
* platform/network/mac/ResourceHandleMac.mm:
(WebCore::ResourceHandle::willSendRequest):
(WebCore::ResourceHandle::continueWillSendRequest): Deleted.
* platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.h:
* platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm:
(-[WebCoreResourceHandleAsOperationQueueDelegate connection:willSendRequest:redirectResponse:]):
(-[WebCoreResourceHandleAsOperationQueueDelegate continueWillSendRequest:]): Deleted.
* platform/network/soup/ResourceHandleSoup.cpp:
(WebCore::doRedirect):
(WebCore::ResourceHandle::continueWillSendRequest): Deleted.

Source/WebKit:

* NetworkProcess/Downloads/BlobDownloadClient.cpp:
(WebKit::BlobDownloadClient::willSendRequestAsync):
* NetworkProcess/Downloads/BlobDownloadClient.h:
* NetworkProcess/NetworkDataTask.h:
* NetworkProcess/NetworkLoad.cpp:
(WebKit::NetworkLoad::~NetworkLoad):
(WebKit::NetworkLoad::continueWillSendRequest):
(WebKit::NetworkLoad::willSendRequestAsync):
* NetworkProcess/NetworkLoad.h:
* NetworkProcess/NetworkLoadClient.h:
* NetworkProcess/cocoa/NetworkSessionCocoa.mm:
(-[WKNetworkSessionDelegate URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:]):
(-[WKNetworkSessionDelegate URLSession:task:_schemeUpgraded:completionHandler:]):
* UIProcess/API/APIDownloadClient.h:
(API::DownloadClient::willSendRequest):
* UIProcess/API/C/WKContext.cpp:
(WKContextSetDownloadClient):
* UIProcess/Cocoa/DownloadClient.h:
* UIProcess/Cocoa/DownloadClient.mm:
(WebKit::DownloadClient::willSendRequest):
* WebProcess/Network/WebResourceLoader.cpp:
(WebKit::WebResourceLoader::willSendRequest):
* WebProcess/Plugins/PluginView.cpp:
(WebKit::PluginView::Stream::~Stream):
(WebKit::PluginView::Stream::continueLoad):
(WebKit::PluginView::Stream::willSendRequest):
* WebProcess/WebPage/WebURLSchemeTaskProxy.cpp:

Source/WebKitLegacy/mac:

* Plugins/Hosted/HostedNetscapePluginStream.h:
* Plugins/Hosted/HostedNetscapePluginStream.mm:
(WebKit::HostedNetscapePluginStream::willSendRequest):
* Plugins/WebNetscapePluginStream.h:
* Plugins/WebNetscapePluginStream.mm:
(WebNetscapePluginStream::willSendRequest):

Source/WebKitLegacy/win:

* Plugins/PluginStream.cpp:
(WebCore::PluginStream::willSendRequest):
* Plugins/PluginStream.h:
(WebCore::PluginStreamClient::~PluginStreamClient):
(WebCore::PluginStreamClient::streamDidFinishLoading):
(WebCore::PluginStream::create):
(WebCore::PluginStream::setLoadManually):



git-svn-id: http://svn.webkit.org/repository/webkit/trunk@224373 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 9d6ce9f..eac0626 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,54 @@
+2017-11-02  Alex Christensen  <achristensen@webkit.org>
+
+        Use CompletionHandlers for redirects
+        https://bugs.webkit.org/show_bug.cgi?id=179163
+
+        Reviewed by Tim Horton.
+
+        Having functions sometimes have to remember to call client->continueWillSendRequest is fragile.
+        CompletionHandler asserts if it's not called once before destruction, and that's what we need here.
+        This will prevent future bugs, and make ResourceHandle look more like NetworkDataTask.
+
+        No change in behavior.
+
+        * loader/NetscapePlugInStreamLoader.cpp:
+        (WebCore::NetscapePlugInStreamLoader::willSendRequest):
+        * loader/NetscapePlugInStreamLoader.h:
+        * loader/ResourceLoader.cpp:
+        (WebCore::ResourceLoader::willSendRequest):
+        (WebCore::ResourceLoader::willSendRequestAsync):
+        * loader/ResourceLoader.h:
+        * loader/appcache/ApplicationCacheGroup.cpp:
+        (WebCore::ApplicationCacheGroup::willSendRequestAsync):
+        * loader/appcache/ApplicationCacheGroup.h:
+        * platform/network/BlobResourceHandle.cpp:
+        * platform/network/PingHandle.h:
+        * platform/network/ResourceHandle.h:
+        * platform/network/ResourceHandleClient.h:
+        * platform/network/SynchronousLoaderClient.cpp:
+        (WebCore::SynchronousLoaderClient::willSendRequestAsync):
+        * platform/network/SynchronousLoaderClient.h:
+        * platform/network/cf/ResourceHandleCFNet.cpp:
+        (WebCore::ResourceHandle::willSendRequest):
+        (WebCore::ResourceHandle::continueWillSendRequest): Deleted.
+        * platform/network/cf/ResourceHandleCFURLConnectionDelegate.h:
+        * platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.cpp:
+        (WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::willSendRequest):
+        (WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::continueWillSendRequest): Deleted.
+        * platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.h:
+        * platform/network/curl/ResourceHandleCurlDelegate.cpp:
+        (WebCore::ResourceHandleCurlDelegate::willSendRequest):
+        * platform/network/mac/ResourceHandleMac.mm:
+        (WebCore::ResourceHandle::willSendRequest):
+        (WebCore::ResourceHandle::continueWillSendRequest): Deleted.
+        * platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.h:
+        * platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm:
+        (-[WebCoreResourceHandleAsOperationQueueDelegate connection:willSendRequest:redirectResponse:]):
+        (-[WebCoreResourceHandleAsOperationQueueDelegate continueWillSendRequest:]): Deleted.
+        * platform/network/soup/ResourceHandleSoup.cpp:
+        (WebCore::doRedirect):
+        (WebCore::ResourceHandle::continueWillSendRequest): Deleted.
+
 2017-11-02  Christopher Reid  <chris.reid@sony.com>
 
         Add a FileSystem namespace to FileSystem.cpp
diff --git a/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp b/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp
index eb76f60..a006b4f 100644
--- a/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp
+++ b/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp
@@ -32,6 +32,7 @@
 #include "DocumentLoader.h"
 #include "FrameLoader.h"
 #include "FrameLoaderClient.h"
+#include <wtf/CompletionHandler.h>
 #include <wtf/Ref.h>
 
 #if ENABLE(CONTENT_EXTENSIONS)
@@ -86,11 +87,9 @@
     return true;
 }
 
-void NetscapePlugInStreamLoader::willSendRequest(ResourceRequest&& request, const ResourceResponse& redirectResponse, WTF::Function<void(ResourceRequest&&)>&& callback)
+void NetscapePlugInStreamLoader::willSendRequest(ResourceRequest&& request, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&& callback)
 {
-    RefPtr<NetscapePlugInStreamLoader> protectedThis(this);
-
-    m_client->willSendRequest(this, WTFMove(request), redirectResponse, [protectedThis, redirectResponse, callback = WTFMove(callback)](ResourceRequest request) {
+    m_client->willSendRequest(this, WTFMove(request), redirectResponse, [protectedThis = makeRef(*this), redirectResponse, callback = WTFMove(callback)](ResourceRequest request) mutable {
         if (!request.isNull())
             protectedThis->willSendRequestInternal(request, redirectResponse);
 
diff --git a/Source/WebCore/loader/NetscapePlugInStreamLoader.h b/Source/WebCore/loader/NetscapePlugInStreamLoader.h
index 3e719a6..f409b10 100644
--- a/Source/WebCore/loader/NetscapePlugInStreamLoader.h
+++ b/Source/WebCore/loader/NetscapePlugInStreamLoader.h
@@ -38,7 +38,7 @@
 
 class NetscapePlugInStreamLoaderClient {
 public:
-    virtual void willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&&, const ResourceResponse& redirectResponse, WTF::Function<void (ResourceRequest&&)>&&) = 0;
+    virtual void willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&&, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&&) = 0;
     virtual void didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse&) = 0;
     virtual void didReceiveData(NetscapePlugInStreamLoader*, const char*, int) = 0;
     virtual void didFail(NetscapePlugInStreamLoader*, const ResourceError&) = 0;
@@ -59,7 +59,7 @@
 private:
     bool init(const ResourceRequest&) override;
 
-    void willSendRequest(ResourceRequest&&, const ResourceResponse& redirectResponse, WTF::Function<void(ResourceRequest&&)>&& callback) override;
+    void willSendRequest(ResourceRequest&&, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&& callback) override;
     void didReceiveResponse(const ResourceResponse&) override;
     void didReceiveData(const char*, unsigned, long long encodedDataLength, DataPayloadType) override;
     void didReceiveBuffer(Ref<SharedBuffer>&&, long long encodedDataLength, DataPayloadType) override;
diff --git a/Source/WebCore/loader/ResourceLoader.cpp b/Source/WebCore/loader/ResourceLoader.cpp
index 36949d6..b8220f5 100644
--- a/Source/WebCore/loader/ResourceLoader.cpp
+++ b/Source/WebCore/loader/ResourceLoader.cpp
@@ -50,6 +50,7 @@
 #include "ResourceHandle.h"
 #include "SecurityOrigin.h"
 #include "SharedBuffer.h"
+#include <wtf/CompletionHandler.h>
 #include <wtf/Ref.h>
 
 #if ENABLE(CONTENT_EXTENSIONS)
@@ -420,7 +421,7 @@
     }
 }
 
-void ResourceLoader::willSendRequest(ResourceRequest&& request, const ResourceResponse& redirectResponse, WTF::Function<void(ResourceRequest&&)>&& callback)
+void ResourceLoader::willSendRequest(ResourceRequest&& request, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&& callback)
 {
     willSendRequestInternal(request, redirectResponse);
     callback(WTFMove(request));
@@ -638,15 +639,15 @@
     return frameLoader()->client().cannotShowURLError(m_request);
 }
 
-void ResourceLoader::willSendRequestAsync(ResourceHandle* handle, ResourceRequest&& request, ResourceResponse&& redirectResponse)
+void ResourceLoader::willSendRequestAsync(ResourceHandle* handle, ResourceRequest&& request, ResourceResponse&& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
 {
     RefPtr<ResourceHandle> protectedHandle(handle);
     if (documentLoader()->applicationCacheHost().maybeLoadFallbackForRedirect(this, request, redirectResponse)) {
-        handle->continueWillSendRequest(WTFMove(request));
+        completionHandler(WTFMove(request));
         return;
     }
     willSendRequestInternal(request, redirectResponse);
-    handle->continueWillSendRequest(WTFMove(request));
+    completionHandler(WTFMove(request));
 }
 
 void ResourceLoader::didSendData(ResourceHandle*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
diff --git a/Source/WebCore/loader/ResourceLoader.h b/Source/WebCore/loader/ResourceLoader.h
index 9cacbb8..377e7fa 100644
--- a/Source/WebCore/loader/ResourceLoader.h
+++ b/Source/WebCore/loader/ResourceLoader.h
@@ -98,7 +98,7 @@
     
     virtual bool isSubresourceLoader();
 
-    virtual void willSendRequest(ResourceRequest&&, const ResourceResponse& redirectResponse, WTF::Function<void(ResourceRequest&&)>&& callback);
+    virtual void willSendRequest(ResourceRequest&&, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&& callback);
     virtual void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
     virtual void didReceiveResponse(const ResourceResponse&);
     virtual void didReceiveData(const char*, unsigned, long long encodedDataLength, DataPayloadType);
@@ -187,7 +187,7 @@
     // ResourceHandleClient
     void didSendData(ResourceHandle*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
     void didReceiveResponseAsync(ResourceHandle*, ResourceResponse&&) override;
-    void willSendRequestAsync(ResourceHandle*, ResourceRequest&&, ResourceResponse&&) override;
+    void willSendRequestAsync(ResourceHandle*, ResourceRequest&&, ResourceResponse&&, CompletionHandler<void(ResourceRequest&&)>&&) override;
     void didReceiveData(ResourceHandle*, const char*, unsigned, int encodedDataLength) override;
     void didReceiveBuffer(ResourceHandle*, Ref<SharedBuffer>&&, int encodedDataLength) override;
     void didFinishLoading(ResourceHandle*) override;
diff --git a/Source/WebCore/loader/appcache/ApplicationCacheGroup.cpp b/Source/WebCore/loader/appcache/ApplicationCacheGroup.cpp
index d813a8a..4c0680a 100644
--- a/Source/WebCore/loader/appcache/ApplicationCacheGroup.cpp
+++ b/Source/WebCore/loader/appcache/ApplicationCacheGroup.cpp
@@ -48,6 +48,7 @@
 #include "ResourceHandle.h"
 #include "SecurityOrigin.h"
 #include "Settings.h"
+#include <wtf/CompletionHandler.h>
 #include <wtf/HashMap.h>
 #include <wtf/MainThread.h>
 
@@ -562,9 +563,9 @@
     handle->continueDidReceiveResponse();
 }
 
-void ApplicationCacheGroup::willSendRequestAsync(ResourceHandle* handle, ResourceRequest&& request, ResourceResponse&&)
+void ApplicationCacheGroup::willSendRequestAsync(ResourceHandle*, ResourceRequest&& request, ResourceResponse&&, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
 {
-    handle->continueWillSendRequest(WTFMove(request));
+    completionHandler(WTFMove(request));
 }
 
 #if USE(PROTECTION_SPACE_AUTH_CALLBACK)
diff --git a/Source/WebCore/loader/appcache/ApplicationCacheGroup.h b/Source/WebCore/loader/appcache/ApplicationCacheGroup.h
index 34aab9f..bbd5804 100644
--- a/Source/WebCore/loader/appcache/ApplicationCacheGroup.h
+++ b/Source/WebCore/loader/appcache/ApplicationCacheGroup.h
@@ -110,7 +110,7 @@
 
     // ResourceHandleClient
     void didReceiveResponseAsync(ResourceHandle*, ResourceResponse&&) final;
-    void willSendRequestAsync(ResourceHandle*, ResourceRequest&&, ResourceResponse&&) final;
+    void willSendRequestAsync(ResourceHandle*, ResourceRequest&&, ResourceResponse&&, CompletionHandler<void(ResourceRequest&&)>&&) final;
 #if USE(PROTECTION_SPACE_AUTH_CALLBACK)
     void canAuthenticateAgainstProtectionSpaceAsync(ResourceHandle*, const ProtectionSpace&) final;
 #endif
diff --git a/Source/WebCore/platform/network/BlobResourceHandle.cpp b/Source/WebCore/platform/network/BlobResourceHandle.cpp
index 7b78937..e6cee97 100644
--- a/Source/WebCore/platform/network/BlobResourceHandle.cpp
+++ b/Source/WebCore/platform/network/BlobResourceHandle.cpp
@@ -45,6 +45,7 @@
 #include "ResourceRequest.h"
 #include "ResourceResponse.h"
 #include "SharedBuffer.h"
+#include <wtf/CompletionHandler.h>
 #include <wtf/MainThread.h>
 #include <wtf/Ref.h>
 
@@ -76,7 +77,7 @@
 
     void didReceiveResponseAsync(ResourceHandle*, ResourceResponse&&) final;
     void didFail(ResourceHandle*, const ResourceError&) final;
-    void willSendRequestAsync(ResourceHandle*, ResourceRequest&&, ResourceResponse&&) final;
+    void willSendRequestAsync(ResourceHandle*, ResourceRequest&&, ResourceResponse&&, CompletionHandler<void(ResourceRequest&&)>&&) final;
 #if USE(PROTECTION_SPACE_AUTH_CALLBACK)
     void canAuthenticateAgainstProtectionSpaceAsync(ResourceHandle*, const ProtectionSpace&) final;
 #endif
@@ -94,10 +95,10 @@
 {
 }
 
-void BlobResourceSynchronousLoader::willSendRequestAsync(ResourceHandle* handle, ResourceRequest&& request, ResourceResponse&&)
+void BlobResourceSynchronousLoader::willSendRequestAsync(ResourceHandle*, ResourceRequest&& request, ResourceResponse&&, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
 {
     ASSERT_NOT_REACHED();
-    handle->continueWillSendRequest(WTFMove(request));
+    completionHandler(WTFMove(request));
 }
 
 #if USE(PROTECTION_SPACE_AUTH_CALLBACK)
diff --git a/Source/WebCore/platform/network/PingHandle.h b/Source/WebCore/platform/network/PingHandle.h
index 5640162..462377e 100644
--- a/Source/WebCore/platform/network/PingHandle.h
+++ b/Source/WebCore/platform/network/PingHandle.h
@@ -57,14 +57,14 @@
     }
 
 private:
-    void willSendRequestAsync(ResourceHandle*, ResourceRequest&& request, ResourceResponse&&) final
+    void willSendRequestAsync(ResourceHandle*, ResourceRequest&& request, ResourceResponse&&, CompletionHandler<void(ResourceRequest&&)>&& completionHandler) final
     {
         m_currentRequest = WTFMove(request);
         if (m_shouldFollowRedirects) {
-            m_handle->continueWillSendRequest(ResourceRequest { m_currentRequest });
+            completionHandler(ResourceRequest { m_currentRequest });
             return;
         }
-        m_handle->continueWillSendRequest({ });
+        completionHandler({ });
         pingLoadComplete(ResourceError { String(), 0, m_currentRequest.url(), ASCIILiteral("Not allowed to follow redirects"), ResourceError::Type::AccessControl });
     }
     void didReceiveResponseAsync(ResourceHandle*, ResourceResponse&& response) final
diff --git a/Source/WebCore/platform/network/ResourceHandle.h b/Source/WebCore/platform/network/ResourceHandle.h
index b3f6a4f..e2dcb3d 100644
--- a/Source/WebCore/platform/network/ResourceHandle.h
+++ b/Source/WebCore/platform/network/ResourceHandle.h
@@ -104,7 +104,7 @@
     WEBCORE_EXPORT virtual ~ResourceHandle();
 
 #if PLATFORM(COCOA) || USE(CFURLCONNECTION)
-    ResourceRequest willSendRequest(ResourceRequest&&, ResourceResponse&&);
+    void willSendRequest(ResourceRequest&&, ResourceResponse&&, CompletionHandler<void(ResourceRequest&&)>&&);
 #endif
 
     void didReceiveResponse(ResourceResponse&&);
@@ -193,9 +193,6 @@
     WEBCORE_EXPORT ResourceHandleClient* client() const;
     WEBCORE_EXPORT void clearClient();
 
-    // Called in response to ResourceHandleClient::willSendRequestAsync().
-    WEBCORE_EXPORT void continueWillSendRequest(ResourceRequest&&);
-
     // Called in response to ResourceHandleClient::didReceiveResponseAsync().
     WEBCORE_EXPORT virtual void continueDidReceiveResponse();
 
diff --git a/Source/WebCore/platform/network/ResourceHandleClient.h b/Source/WebCore/platform/network/ResourceHandleClient.h
index 3912665..3ad06e4 100644
--- a/Source/WebCore/platform/network/ResourceHandleClient.h
+++ b/Source/WebCore/platform/network/ResourceHandleClient.h
@@ -26,6 +26,7 @@
 #pragma once
 
 #include "PlatformExportMacros.h"
+#include <wtf/Forward.h>
 #include <wtf/Ref.h>
 
 #if USE(CFURLCONNECTION)
@@ -75,8 +76,7 @@
 
     virtual bool loadingSynchronousXHR() { return false; }
 
-    // Client will pass an updated request using ResourceHandle::continueWillSendRequest() when ready.
-    WEBCORE_EXPORT virtual void willSendRequestAsync(ResourceHandle*, ResourceRequest&&, ResourceResponse&&) = 0;
+    WEBCORE_EXPORT virtual void willSendRequestAsync(ResourceHandle*, ResourceRequest&&, ResourceResponse&&, CompletionHandler<void(ResourceRequest&&)>&&) = 0;
 
     // Client will call ResourceHandle::continueDidReceiveResponse() when ready.
     WEBCORE_EXPORT virtual void didReceiveResponseAsync(ResourceHandle*, ResourceResponse&&) = 0;
diff --git a/Source/WebCore/platform/network/SynchronousLoaderClient.cpp b/Source/WebCore/platform/network/SynchronousLoaderClient.cpp
index f9f28d8..fdb9427 100644
--- a/Source/WebCore/platform/network/SynchronousLoaderClient.cpp
+++ b/Source/WebCore/platform/network/SynchronousLoaderClient.cpp
@@ -29,22 +29,23 @@
 #include "AuthenticationChallenge.h"
 #include "ResourceHandle.h"
 #include "ResourceRequest.h"
+#include <wtf/CompletionHandler.h>
 
 namespace WebCore {
 
 SynchronousLoaderClient::~SynchronousLoaderClient() = default;
 
-void SynchronousLoaderClient::willSendRequestAsync(ResourceHandle* handle, ResourceRequest&& request, ResourceResponse&&)
+void SynchronousLoaderClient::willSendRequestAsync(ResourceHandle* handle, ResourceRequest&& request, ResourceResponse&&, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
 {
     // FIXME: This needs to be fixed to follow the redirect correctly even for cross-domain requests.
     if (protocolHostAndPortAreEqual(handle->firstRequest().url(), request.url())) {
-        handle->continueWillSendRequest(WTFMove(request));
+        completionHandler(WTFMove(request));
         return;
     }
 
     ASSERT(m_error.isNull());
     m_error = platformBadResponseError();
-    handle->continueWillSendRequest({ });
+    completionHandler({ });
 }
 
 bool SynchronousLoaderClient::shouldUseCredentialStorage(ResourceHandle*)
diff --git a/Source/WebCore/platform/network/SynchronousLoaderClient.h b/Source/WebCore/platform/network/SynchronousLoaderClient.h
index be9e73d..9664c2c 100644
--- a/Source/WebCore/platform/network/SynchronousLoaderClient.h
+++ b/Source/WebCore/platform/network/SynchronousLoaderClient.h
@@ -46,7 +46,7 @@
     WEBCORE_EXPORT static ResourceError platformBadResponseError();
 
 private:
-    void willSendRequestAsync(ResourceHandle*, ResourceRequest&&, ResourceResponse&&) override;
+    void willSendRequestAsync(ResourceHandle*, ResourceRequest&&, ResourceResponse&&, CompletionHandler<void(ResourceRequest&&)>&&) override;
     bool shouldUseCredentialStorage(ResourceHandle*) override;
     void didReceiveAuthenticationChallenge(ResourceHandle*, const AuthenticationChallenge&) override;
     void didReceiveResponseAsync(ResourceHandle*, ResourceResponse&&) override;
diff --git a/Source/WebCore/platform/network/cf/ResourceHandleCFNet.cpp b/Source/WebCore/platform/network/cf/ResourceHandleCFNet.cpp
index e5c8f31..59f327b 100644
--- a/Source/WebCore/platform/network/cf/ResourceHandleCFNet.cpp
+++ b/Source/WebCore/platform/network/cf/ResourceHandleCFNet.cpp
@@ -48,6 +48,7 @@
 #include <pal/spi/cf/CFNetworkSPI.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#include <wtf/CompletionHandler.h>
 #include <wtf/HashMap.h>
 #include <wtf/NeverDestroyed.h>
 #include <wtf/Ref.h>
@@ -285,7 +286,7 @@
     }
 }
 
-ResourceRequest ResourceHandle::willSendRequest(ResourceRequest&& request, ResourceResponse&& redirectResponse)
+void ResourceHandle::willSendRequest(ResourceRequest&& request, ResourceResponse&& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
 {
     const URL& url = request.url();
     d->m_user = url.user();
@@ -314,9 +315,11 @@
         }
     }
 
-    Ref<ResourceHandle> protectedThis(*this);
-    client()->willSendRequestAsync(this, WTFMove(request), WTFMove(redirectResponse));
-    return { };
+    client()->willSendRequestAsync(this, WTFMove(request), WTFMove(redirectResponse), [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)] (ResourceRequest&& request) mutable {
+        if (!request.isNull())
+            request.setStorageSession(d->m_storageSession.get());
+        completionHandler(WTFMove(request));
+    });
 }
 
 bool ResourceHandle::shouldUseCredentialStorage()
@@ -663,13 +666,6 @@
     return d->m_currentRequest;
 }
 
-void ResourceHandle::continueWillSendRequest(ResourceRequest&& request)
-{
-    if (!request.isNull())
-        request.setStorageSession(d->m_storageSession.get());
-    d->m_connectionDelegate->continueWillSendRequest(request.cfURLRequest(UpdateHTTPBody));
-}
-
 void ResourceHandle::continueDidReceiveResponse()
 {
     d->m_connectionDelegate->continueDidReceiveResponse();
diff --git a/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegate.h b/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegate.h
index 4de70dc..5b16830 100644
--- a/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegate.h
+++ b/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegate.h
@@ -46,7 +46,6 @@
     virtual void setupConnectionScheduling(CFURLConnectionRef) = 0;
     virtual void releaseHandle();
 
-    virtual void continueWillSendRequest(CFURLRequestRef) = 0;
     virtual void continueDidReceiveResponse() = 0;
     virtual void continueWillCacheResponse(CFCachedURLResponseRef) = 0;
 #if USE(PROTECTION_SPACE_AUTH_CALLBACK)
diff --git a/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.cpp b/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.cpp
index 8742c8a..dae0239 100644
--- a/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.cpp
+++ b/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.cpp
@@ -40,6 +40,7 @@
 #include "WebCoreURLResponse.h"
 #endif
 #include <pal/spi/cf/CFNetworkSPI.h>
+#include <wtf/CompletionHandler.h>
 #include <wtf/MainThread.h>
 #include <wtf/Threading.h>
 #include <wtf/text/CString.h>
@@ -152,23 +153,27 @@
 
     ASSERT(!isMainThread());
     
-    auto work = [protectedThis = makeRef(*this), cfRequest = RetainPtr<CFURLRequestRef>(cfRequest), originalRedirectResponse = RetainPtr<CFURLResponseRef>(originalRedirectResponse)] () {
+    auto work = [this, protectedThis = makeRef(*this), cfRequest = RetainPtr<CFURLRequestRef>(cfRequest), originalRedirectResponse = RetainPtr<CFURLResponseRef>(originalRedirectResponse)] () mutable {
         auto& handle = protectedThis->m_handle;
-        
-        if (!protectedThis->hasHandle()) {
-            protectedThis->continueWillSendRequest(nullptr);
+        auto completionHandler = [this, protectedThis = WTFMove(protectedThis)] (ResourceRequest&& request) {
+            m_requestResult = request.cfURLRequest(UpdateHTTPBody);
+            m_semaphore.signal();
+        };
+
+        if (!hasHandle()) {
+            completionHandler({ });
             return;
         }
 
         LOG(Network, "CFNet - ResourceHandleCFURLConnectionDelegateWithOperationQueue::willSendRequest(handle=%p) (%s)", handle, handle->firstRequest().url().string().utf8().data());
 
-        RetainPtr<CFURLResponseRef> redirectResponse = protectedThis->synthesizeRedirectResponseIfNecessary(cfRequest.get(), originalRedirectResponse.get());
+        RetainPtr<CFURLResponseRef> redirectResponse = synthesizeRedirectResponseIfNecessary(cfRequest.get(), originalRedirectResponse.get());
         ASSERT(redirectResponse);
 
-        ResourceRequest request = protectedThis->createResourceRequest(cfRequest.get(), redirectResponse.get());
-        handle->willSendRequest(WTFMove(request), redirectResponse.get());
+        ResourceRequest request = createResourceRequest(cfRequest.get(), redirectResponse.get());
+        handle->willSendRequest(WTFMove(request), redirectResponse.get(), WTFMove(completionHandler));
     };
-    
+
     if (m_messageQueue)
         m_messageQueue->append(std::make_unique<Function<void()>>(WTFMove(work)));
     else
@@ -405,12 +410,6 @@
 }
 #endif // USE(PROTECTION_SPACE_AUTH_CALLBACK)
 
-void ResourceHandleCFURLConnectionDelegateWithOperationQueue::continueWillSendRequest(CFURLRequestRef request)
-{
-    m_requestResult = request;
-    m_semaphore.signal();
-}
-
 void ResourceHandleCFURLConnectionDelegateWithOperationQueue::continueDidReceiveResponse()
 {
     m_semaphore.signal();
diff --git a/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.h b/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.h
index 6ad1e4f..5a3f5a32 100644
--- a/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.h
+++ b/Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.h
@@ -58,7 +58,6 @@
     void didSendBodyData(CFIndex totalBytesWritten, CFIndex totalBytesExpectedToWrite) override;
     Boolean shouldUseCredentialStorage() override;
 
-    void continueWillSendRequest(CFURLRequestRef) override;
     void continueDidReceiveResponse() override;
     void continueWillCacheResponse(CFCachedURLResponseRef) override;
 #if USE(PROTECTION_SPACE_AUTH_CALLBACK)
diff --git a/Source/WebCore/platform/network/curl/ResourceHandleCurlDelegate.cpp b/Source/WebCore/platform/network/curl/ResourceHandleCurlDelegate.cpp
index 0d7d44c..356f9fb 100644
--- a/Source/WebCore/platform/network/curl/ResourceHandleCurlDelegate.cpp
+++ b/Source/WebCore/platform/network/curl/ResourceHandleCurlDelegate.cpp
@@ -41,6 +41,7 @@
 #include "ResourceHandleInternal.h"
 #include "SharedBuffer.h"
 #include "TextEncoding.h"
+#include <wtf/CompletionHandler.h>
 #include <wtf/text/Base64.h>
 
 namespace WebCore {
@@ -363,7 +364,9 @@
     }
 
     ResourceResponse responseCopy = response();
-    m_handle->client()->willSendRequestAsync(m_handle, WTFMove(newRequest), WTFMove(responseCopy));
+    m_handle->client()->willSendRequestAsync(m_handle, WTFMove(newRequest), WTFMove(responseCopy), [this, protectedThis = makeRef(*this)] (ResourceRequest&& request) {
+        continueWillSendRequest(WTFMove(request));
+    });
 }
 
 void ResourceHandleCurlDelegate::continueWillSendRequest(ResourceRequest&& request)
diff --git a/Source/WebCore/platform/network/mac/ResourceHandleMac.mm b/Source/WebCore/platform/network/mac/ResourceHandleMac.mm
index e9478b1..e665afe 100644
--- a/Source/WebCore/platform/network/mac/ResourceHandleMac.mm
+++ b/Source/WebCore/platform/network/mac/ResourceHandleMac.mm
@@ -49,6 +49,7 @@
 #import <pal/spi/cf/CFNetworkSPI.h>
 #import <pal/spi/cocoa/NSURLConnectionSPI.h>
 #import <wtf/BlockObjCExceptions.h>
+#import <wtf/CompletionHandler.h>
 #import <wtf/Ref.h>
 #import <wtf/SchedulePair.h>
 #import <wtf/text/Base64.h>
@@ -435,7 +436,7 @@
     data.swap(client.mutableData());
 }
 
-ResourceRequest ResourceHandle::willSendRequest(ResourceRequest&& request, ResourceResponse&& redirectResponse)
+void ResourceHandle::willSendRequest(ResourceRequest&& request, ResourceResponse&& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
 {
     ASSERT(!redirectResponse.isNull());
 
@@ -483,16 +484,12 @@
         }
     }
 
-    client()->willSendRequestAsync(this, WTFMove(request), WTFMove(redirectResponse));
-    return { };
-}
-
-void ResourceHandle::continueWillSendRequest(ResourceRequest&& newRequest)
-{
-    // Client call may not preserve the session, especially if the request is sent over IPC.
-    if (!newRequest.isNull())
-        newRequest.setStorageSession(d->m_storageSession.get());
-    [(id)delegate() continueWillSendRequest:newRequest.nsURLRequest(UpdateHTTPBody)];
+    client()->willSendRequestAsync(this, WTFMove(request), WTFMove(redirectResponse), [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)] (ResourceRequest&& request) mutable {
+        // Client call may not preserve the session, especially if the request is sent over IPC.
+        if (!request.isNull())
+            request.setStorageSession(d->m_storageSession.get());
+        completionHandler(WTFMove(request));
+    });
 }
 
 void ResourceHandle::continueDidReceiveResponse()
diff --git a/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.h b/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.h
index 26a793b..334e34d 100644
--- a/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.h
+++ b/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.h
@@ -49,7 +49,6 @@
 
 - (void)detachHandle;
 - (id)initWithHandle:(WebCore::ResourceHandle*)handle messageQueue:(MessageQueue<Function<void()>>*)messageQueue;
-- (void)continueWillSendRequest:(NSURLRequest *)newRequest;
 - (void)continueDidReceiveResponse;
 - (void)continueCanAuthenticateAgainstProtectionSpace:(BOOL)canAuthenticate;
 - (void)continueWillCacheResponse:(NSCachedURLResponse *)response;
diff --git a/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm b/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm
index d543cf4..b343788 100644
--- a/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm
+++ b/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm
@@ -74,12 +74,6 @@
     [super dealloc];
 }
 
-- (void)continueWillSendRequest:(NSURLRequest *)newRequest
-{
-    m_requestResult = newRequest;
-    dispatch_semaphore_signal(m_semaphore);
-}
-
 - (void)continueDidReceiveResponse
 {
     dispatch_semaphore_signal(m_semaphore);
@@ -122,10 +116,12 @@
             return;
         }
 
-        m_handle->willSendRequest(newRequest.get(), redirectResponse.get());
+        m_handle->willSendRequest(newRequest.get(), redirectResponse.get(), [self, protectedSelf = WTFMove(protectedSelf)](ResourceRequest&& request) {
+            m_requestResult = request.nsURLRequest(UpdateHTTPBody);
+            dispatch_semaphore_signal(m_semaphore);
+        });
     };
 
-    
     if (m_messageQueue)
         m_messageQueue->append(std::make_unique<Function<void()>>(WTFMove(work)));
     else
diff --git a/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp b/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp
index 026ff12..732c5b1 100644
--- a/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp
+++ b/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp
@@ -56,6 +56,7 @@
 #if !COMPILER(MSVC)
 #include <unistd.h>
 #endif
+#include <wtf/CompletionHandler.h>
 #include <wtf/CurrentTime.h>
 #include <wtf/glib/GRefPtr.h>
 #include <wtf/glib/RunLoopSourcePriority.h>
@@ -353,7 +354,9 @@
     cleanupSoupRequestOperation(handle);
 
     ResourceResponse responseCopy = d->m_response;
-    d->client()->willSendRequestAsync(handle, WTFMove(newRequest), WTFMove(responseCopy));
+    d->client()->willSendRequestAsync(handle, WTFMove(newRequest), WTFMove(responseCopy), [handle = makeRef(*handle)] (ResourceRequest&& request) {
+        continueAfterWillSendRequest(handle.ptr(), WTFMove(request));
+    });
 }
 
 static void redirectSkipCallback(GObject*, GAsyncResult* asyncResult, gpointer data)
@@ -1024,11 +1027,6 @@
         d->m_cancellable.get(), readCallback, handle.get());
 }
 
-void ResourceHandle::continueWillSendRequest(ResourceRequest&& request)
-{
-    continueAfterWillSendRequest(this, WTFMove(request));
-}
-
 void ResourceHandle::continueDidReceiveResponse()
 {
     continueAfterDidReceiveResponse(this);
diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog
index e635f1a..bf60944 100644
--- a/Source/WebKit/ChangeLog
+++ b/Source/WebKit/ChangeLog
@@ -1,3 +1,38 @@
+2017-11-02  Alex Christensen  <achristensen@webkit.org>
+
+        Use CompletionHandlers for redirects
+        https://bugs.webkit.org/show_bug.cgi?id=179163
+
+        Reviewed by Tim Horton.
+
+        * NetworkProcess/Downloads/BlobDownloadClient.cpp:
+        (WebKit::BlobDownloadClient::willSendRequestAsync):
+        * NetworkProcess/Downloads/BlobDownloadClient.h:
+        * NetworkProcess/NetworkDataTask.h:
+        * NetworkProcess/NetworkLoad.cpp:
+        (WebKit::NetworkLoad::~NetworkLoad):
+        (WebKit::NetworkLoad::continueWillSendRequest):
+        (WebKit::NetworkLoad::willSendRequestAsync):
+        * NetworkProcess/NetworkLoad.h:
+        * NetworkProcess/NetworkLoadClient.h:
+        * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
+        (-[WKNetworkSessionDelegate URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:]):
+        (-[WKNetworkSessionDelegate URLSession:task:_schemeUpgraded:completionHandler:]):
+        * UIProcess/API/APIDownloadClient.h:
+        (API::DownloadClient::willSendRequest):
+        * UIProcess/API/C/WKContext.cpp:
+        (WKContextSetDownloadClient):
+        * UIProcess/Cocoa/DownloadClient.h:
+        * UIProcess/Cocoa/DownloadClient.mm:
+        (WebKit::DownloadClient::willSendRequest):
+        * WebProcess/Network/WebResourceLoader.cpp:
+        (WebKit::WebResourceLoader::willSendRequest):
+        * WebProcess/Plugins/PluginView.cpp:
+        (WebKit::PluginView::Stream::~Stream):
+        (WebKit::PluginView::Stream::continueLoad):
+        (WebKit::PluginView::Stream::willSendRequest):
+        * WebProcess/WebPage/WebURLSchemeTaskProxy.cpp:
+
 2017-11-02  Christopher Reid  <chris.reid@sony.com>
 
         Add a FileSystem namespace to FileSystem.cpp
diff --git a/Source/WebKit/NetworkProcess/Downloads/BlobDownloadClient.cpp b/Source/WebKit/NetworkProcess/Downloads/BlobDownloadClient.cpp
index 2104cb3..9398b73 100644
--- a/Source/WebKit/NetworkProcess/Downloads/BlobDownloadClient.cpp
+++ b/Source/WebKit/NetworkProcess/Downloads/BlobDownloadClient.cpp
@@ -35,6 +35,7 @@
 #include <WebCore/ResourceError.h>
 #include <WebCore/ResourceResponse.h>
 #include <WebCore/SharedBuffer.h>
+#include <wtf/CompletionHandler.h>
 
 namespace WebKit {
 
@@ -71,9 +72,10 @@
     m_download.continueDidReceiveResponse();
 }
 
-void BlobDownloadClient::willSendRequestAsync(ResourceHandle*, ResourceRequest&&, ResourceResponse&&)
+void BlobDownloadClient::willSendRequestAsync(ResourceHandle*, ResourceRequest&& request, ResourceResponse&&, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
 {
     ASSERT_NOT_REACHED();
+    completionHandler(WTFMove(request));
 }
 
 #if USE(PROTECTION_SPACE_AUTH_CALLBACK)
diff --git a/Source/WebKit/NetworkProcess/Downloads/BlobDownloadClient.h b/Source/WebKit/NetworkProcess/Downloads/BlobDownloadClient.h
index 64b2f3b..0729693 100644
--- a/Source/WebKit/NetworkProcess/Downloads/BlobDownloadClient.h
+++ b/Source/WebKit/NetworkProcess/Downloads/BlobDownloadClient.h
@@ -49,7 +49,7 @@
     void didReceiveBuffer(WebCore::ResourceHandle*, Ref<WebCore::SharedBuffer>&&, int reportedEncodedDataLength) final;
     void didFinishLoading(WebCore::ResourceHandle*) final;
     void didFail(WebCore::ResourceHandle*, const WebCore::ResourceError&) final;
-    void willSendRequestAsync(WebCore::ResourceHandle*, WebCore::ResourceRequest&&, WebCore::ResourceResponse&&) final;
+    void willSendRequestAsync(WebCore::ResourceHandle*, WebCore::ResourceRequest&&, WebCore::ResourceResponse&&, CompletionHandler<void(WebCore::ResourceRequest&&)>&&) final;
 #if USE(PROTECTION_SPACE_AUTH_CALLBACK)
     void canAuthenticateAgainstProtectionSpaceAsync(WebCore::ResourceHandle*, const WebCore::ProtectionSpace&) final;
 #endif
diff --git a/Source/WebKit/NetworkProcess/NetworkDataTask.h b/Source/WebKit/NetworkProcess/NetworkDataTask.h
index 3388cf8..74197e1 100644
--- a/Source/WebKit/NetworkProcess/NetworkDataTask.h
+++ b/Source/WebKit/NetworkProcess/NetworkDataTask.h
@@ -54,7 +54,7 @@
 class PendingDownload;
 enum class AuthenticationChallengeDisposition;
 
-using RedirectCompletionHandler = CompletionHandler<void(const WebCore::ResourceRequest&)>;
+using RedirectCompletionHandler = CompletionHandler<void(WebCore::ResourceRequest&&)>;
 using ChallengeCompletionHandler = CompletionHandler<void(AuthenticationChallengeDisposition, const WebCore::Credential&)>;
 using ResponseCompletionHandler = CompletionHandler<void(WebCore::PolicyAction)>;
 
diff --git a/Source/WebKit/NetworkProcess/NetworkLoad.cpp b/Source/WebKit/NetworkProcess/NetworkLoad.cpp
index 9f51d90..746b8d7 100644
--- a/Source/WebKit/NetworkProcess/NetworkLoad.cpp
+++ b/Source/WebKit/NetworkProcess/NetworkLoad.cpp
@@ -133,11 +133,11 @@
 NetworkLoad::~NetworkLoad()
 {
     ASSERT(RunLoop::isMain());
+    if (m_redirectCompletionHandler)
+        m_redirectCompletionHandler({ });
 #if USE(NETWORK_SESSION)
     if (m_responseCompletionHandler)
         m_responseCompletionHandler(PolicyAction::Ignore);
-    if (m_redirectCompletionHandler)
-        m_redirectCompletionHandler({ });
 #if USE(PROTECTION_SPACE_AUTH_CALLBACK)
     if (m_challengeCompletionHandler)
         m_challengeCompletionHandler(AuthenticationChallengeDisposition::Cancel, { });
@@ -211,7 +211,7 @@
     }
 
     if (redirectCompletionHandler)
-        redirectCompletionHandler(m_currentRequest);
+        redirectCompletionHandler(ResourceRequest(m_currentRequest));
 #else
     if (m_currentRequest.isNull()) {
         if (m_handle)
@@ -219,7 +219,9 @@
         didFail(m_handle.get(), cancelledError(m_currentRequest));
     } else if (m_handle) {
         auto currentRequestCopy = m_currentRequest;
-        m_handle->continueWillSendRequest(WTFMove(currentRequestCopy));
+        auto redirectCompletionHandler = std::exchange(m_redirectCompletionHandler, nullptr);
+        ASSERT(redirectCompletionHandler);
+        redirectCompletionHandler(WTFMove(currentRequestCopy));
     }
 #endif
 }
@@ -490,8 +492,10 @@
     m_client.get().didFailLoading(error);
 }
 
-void NetworkLoad::willSendRequestAsync(ResourceHandle* handle, ResourceRequest&& request, ResourceResponse&& redirectResponse)
+void NetworkLoad::willSendRequestAsync(ResourceHandle* handle, ResourceRequest&& request, ResourceResponse&& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
 {
+    ASSERT(!m_redirectCompletionHandler);
+    m_redirectCompletionHandler = WTFMove(completionHandler);
     ASSERT_UNUSED(handle, handle == m_handle);
     sharedWillSendRedirectedRequest(WTFMove(request), WTFMove(redirectResponse));
 }
diff --git a/Source/WebKit/NetworkProcess/NetworkLoad.h b/Source/WebKit/NetworkProcess/NetworkLoad.h
index 9d53179..267a458 100644
--- a/Source/WebKit/NetworkProcess/NetworkLoad.h
+++ b/Source/WebKit/NetworkProcess/NetworkLoad.h
@@ -23,13 +23,13 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef NetworkLoad_h
-#define NetworkLoad_h
+#pragma once
 
 #include "NetworkLoadClient.h"
 #include "NetworkLoadParameters.h"
 #include "RemoteNetworkingContext.h"
 #include <WebCore/ResourceHandleClient.h>
+#include <wtf/CompletionHandler.h>
 #include <wtf/Optional.h>
 
 #if USE(NETWORK_SESSION)
@@ -115,7 +115,7 @@
 
 #if !USE(NETWORK_SESSION)
     // ResourceHandleClient
-    void willSendRequestAsync(WebCore::ResourceHandle*, WebCore::ResourceRequest&&, WebCore::ResourceResponse&& redirectResponse) final;
+    void willSendRequestAsync(WebCore::ResourceHandle*, WebCore::ResourceRequest&&, WebCore::ResourceResponse&& redirectResponse, CompletionHandler<void(WebCore::ResourceRequest&&)>&&) final;
     void didSendData(WebCore::ResourceHandle*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent) final;
     void didReceiveResponseAsync(WebCore::ResourceHandle*, WebCore::ResourceResponse&&) final;
     void didReceiveData(WebCore::ResourceHandle*, const char*, unsigned, int encodedDataLength) final;
@@ -147,6 +147,7 @@
 
     std::reference_wrapper<NetworkLoadClient> m_client;
     const NetworkLoadParameters m_parameters;
+    CompletionHandler<void(WebCore::ResourceRequest&&)> m_redirectCompletionHandler;
 #if USE(NETWORK_SESSION)
     RefPtr<NetworkDataTask> m_task;
     std::optional<WebCore::AuthenticationChallenge> m_challenge;
@@ -154,7 +155,6 @@
     ChallengeCompletionHandler m_challengeCompletionHandler;
 #endif
     ResponseCompletionHandler m_responseCompletionHandler;
-    RedirectCompletionHandler m_redirectCompletionHandler;
     
     struct Throttle;
     std::unique_ptr<Throttle> m_throttle;
@@ -173,5 +173,3 @@
 };
 
 } // namespace WebKit
-
-#endif // NetworkLoad_h
diff --git a/Source/WebKit/NetworkProcess/NetworkLoadClient.h b/Source/WebKit/NetworkProcess/NetworkLoadClient.h
index 6438427..e0e9bc5 100644
--- a/Source/WebKit/NetworkProcess/NetworkLoadClient.h
+++ b/Source/WebKit/NetworkProcess/NetworkLoadClient.h
@@ -30,10 +30,6 @@
 #include <WebCore/ResourceResponse.h>
 #include <wtf/Forward.h>
 
-#if PLATFORM(COCOA)
-typedef const struct _CFCachedURLResponse* CFCachedURLResponseRef;
-#endif
-
 namespace WebCore {
 class NetworkLoadMetrics;
 class ProtectionSpace;
diff --git a/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm b/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm
index 5f969bb..e1da71d 100644
--- a/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm
+++ b/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm
@@ -172,7 +172,7 @@
 
     if (auto* networkDataTask = [self existingTask:task]) {
         auto completionHandlerCopy = Block_copy(completionHandler);
-        networkDataTask->willPerformHTTPRedirection(response, request, [completionHandlerCopy, taskIdentifier](auto& request) {
+        networkDataTask->willPerformHTTPRedirection(response, request, [completionHandlerCopy, taskIdentifier](auto&& request) {
 #if !LOG_DISABLED
             LOG(NetworkSession, "%llu willPerformHTTPRedirection completionHandler (%s)", taskIdentifier, request.url().string().utf8().data());
 #else
@@ -194,7 +194,7 @@
     
     if (auto* networkDataTask = [self existingTask:task]) {
         auto completionHandlerCopy = Block_copy(completionHandler);
-        networkDataTask->willPerformHTTPRedirection(WebCore::synthesizeRedirectResponseIfNecessary([task currentRequest], request, nil), request, [completionHandlerCopy, taskIdentifier](auto& request) {
+        networkDataTask->willPerformHTTPRedirection(WebCore::synthesizeRedirectResponseIfNecessary([task currentRequest], request, nil), request, [completionHandlerCopy, taskIdentifier](auto&& request) {
 #if !LOG_DISABLED
             LOG(NetworkSession, "%llu _schemeUpgraded completionHandler (%s)", taskIdentifier, request.url().string().utf8().data());
 #else
diff --git a/Source/WebKit/UIProcess/API/APIDownloadClient.h b/Source/WebKit/UIProcess/API/APIDownloadClient.h
index 368cc94..bd757fd 100644
--- a/Source/WebKit/UIProcess/API/APIDownloadClient.h
+++ b/Source/WebKit/UIProcess/API/APIDownloadClient.h
@@ -25,7 +25,7 @@
 
 #pragma once
 
-#include <wtf/Function.h>
+#include <wtf/CompletionHandler.h>
 #include <wtf/text/WTFString.h>
 
 namespace WebCore {
@@ -62,7 +62,7 @@
     virtual void didFail(WebKit::WebProcessPool&, WebKit::DownloadProxy&, const WebCore::ResourceError&) { }
     virtual void didCancel(WebKit::WebProcessPool&, WebKit::DownloadProxy&) { }
     virtual void processDidCrash(WebKit::WebProcessPool&, WebKit::DownloadProxy&) { }
-    virtual void willSendRequest(WebKit::WebProcessPool&, WebKit::DownloadProxy&, WebCore::ResourceRequest&& request, const WebCore::ResourceResponse&, Function<void(WebCore::ResourceRequest&&)>&& completionHandler) { completionHandler(WTFMove(request)); }
+    virtual void willSendRequest(WebKit::WebProcessPool&, WebKit::DownloadProxy&, WebCore::ResourceRequest&& request, const WebCore::ResourceResponse&, CompletionHandler<void(WebCore::ResourceRequest&&)>&& completionHandler) { completionHandler(WTFMove(request)); }
 };
 
 } // namespace API
diff --git a/Source/WebKit/UIProcess/API/C/WKContext.cpp b/Source/WebKit/UIProcess/API/C/WKContext.cpp
index 4209202..5f20d12 100644
--- a/Source/WebKit/UIProcess/API/C/WKContext.cpp
+++ b/Source/WebKit/UIProcess/API/C/WKContext.cpp
@@ -264,12 +264,12 @@
             m_client.processDidCrash(toAPI(&processPool), toAPI(&downloadProxy), m_client.base.clientInfo);
         }
 
-        void willSendRequest(WebProcessPool& processPool, DownloadProxy& downloadProxy, ResourceRequest&& request, const ResourceResponse&, Function<void(ResourceRequest&&)>&& callback) final
+        void willSendRequest(WebProcessPool& processPool, DownloadProxy& downloadProxy, ResourceRequest&& request, const ResourceResponse&, CompletionHandler<void(ResourceRequest&&)>&& completionHandler) final
         {
             if (m_client.didReceiveServerRedirect)
                 m_client.didReceiveServerRedirect(toAPI(&processPool), toAPI(&downloadProxy), toURLRef(request.url().string().impl()), m_client.base.clientInfo);
 
-            callback(WTFMove(request));
+            completionHandler(WTFMove(request));
         }
 
 
diff --git a/Source/WebKit/UIProcess/Cocoa/DownloadClient.h b/Source/WebKit/UIProcess/Cocoa/DownloadClient.h
index 50e23cc..7bd2868 100644
--- a/Source/WebKit/UIProcess/Cocoa/DownloadClient.h
+++ b/Source/WebKit/UIProcess/Cocoa/DownloadClient.h
@@ -54,7 +54,7 @@
     void didFinish(WebProcessPool&, DownloadProxy&) final;
     void didFail(WebProcessPool&, DownloadProxy&, const WebCore::ResourceError&) final;
     void didCancel(WebProcessPool&, DownloadProxy&) final;
-    void willSendRequest(WebProcessPool&, DownloadProxy&, WebCore::ResourceRequest&&, const WebCore::ResourceResponse&, Function<void(WebCore::ResourceRequest&&)>&&) final;
+    void willSendRequest(WebProcessPool&, DownloadProxy&, WebCore::ResourceRequest&&, const WebCore::ResourceResponse&, CompletionHandler<void(WebCore::ResourceRequest&&)>&&) final;
     void didReceiveAuthenticationChallenge(WebProcessPool&, DownloadProxy&, AuthenticationChallengeProxy&) final;
 #if !USE(NETWORK_SESSION)
     bool shouldDecodeSourceDataOfMIMEType(WebProcessPool&, DownloadProxy&, const String&) final;
diff --git a/Source/WebKit/UIProcess/Cocoa/DownloadClient.mm b/Source/WebKit/UIProcess/Cocoa/DownloadClient.mm
index 97ead6f..fd1e371 100644
--- a/Source/WebKit/UIProcess/Cocoa/DownloadClient.mm
+++ b/Source/WebKit/UIProcess/Cocoa/DownloadClient.mm
@@ -185,12 +185,12 @@
         [m_delegate _downloadDidCancel:wrapper(downloadProxy)];
 }
 
-void DownloadClient::willSendRequest(WebProcessPool&, DownloadProxy& downloadProxy, WebCore::ResourceRequest&& request, const WebCore::ResourceResponse&, Function<void(WebCore::ResourceRequest&&)>&& callback)
+void DownloadClient::willSendRequest(WebProcessPool&, DownloadProxy& downloadProxy, WebCore::ResourceRequest&& request, const WebCore::ResourceResponse&, CompletionHandler<void(WebCore::ResourceRequest&&)>&& completionHandler)
 {
     if (m_delegateMethods.downloadDidReceiveServerRedirectToURL)
         [m_delegate _download:wrapper(downloadProxy) didReceiveServerRedirectToURL:[NSURL _web_URLWithWTFString:request.url().string()]];
 
-    callback(WTFMove(request));
+    completionHandler(WTFMove(request));
 }
 
 } // namespace WebKit
diff --git a/Source/WebKit/WebProcess/Network/WebResourceLoader.cpp b/Source/WebKit/WebProcess/Network/WebResourceLoader.cpp
index 6c2596b..ba0684a 100644
--- a/Source/WebKit/WebProcess/Network/WebResourceLoader.cpp
+++ b/Source/WebKit/WebProcess/Network/WebResourceLoader.cpp
@@ -43,6 +43,7 @@
 #include <WebCore/ResourceError.h>
 #include <WebCore/ResourceLoader.h>
 #include <WebCore/SubresourceLoader.h>
+#include <wtf/CompletionHandler.h>
 
 using namespace WebCore;
 
@@ -85,12 +86,10 @@
     LOG(Network, "(WebProcess) WebResourceLoader::willSendRequest to '%s'", proposedRequest.url().string().latin1().data());
     RELEASE_LOG_IF_ALLOWED("willSendRequest: (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %" PRIu64 ")", m_trackingParameters.pageID, m_trackingParameters.frameID, m_trackingParameters.resourceID);
 
-    RefPtr<WebResourceLoader> protectedThis(this);
-
     if (m_coreLoader->documentLoader()->applicationCacheHost().maybeLoadFallbackForRedirect(m_coreLoader.get(), proposedRequest, redirectResponse))
         return;
 
-    m_coreLoader->willSendRequest(WTFMove(proposedRequest), redirectResponse, [protectedThis](ResourceRequest&& request) {
+    m_coreLoader->willSendRequest(WTFMove(proposedRequest), redirectResponse, [protectedThis = makeRef(*this)](ResourceRequest&& request) {
         if (!protectedThis->m_coreLoader)
             return;
 
diff --git a/Source/WebKit/WebProcess/Plugins/PluginView.cpp b/Source/WebKit/WebProcess/Plugins/PluginView.cpp
index f88bbcf..6a39ebb 100644
--- a/Source/WebKit/WebProcess/Plugins/PluginView.cpp
+++ b/Source/WebKit/WebProcess/Plugins/PluginView.cpp
@@ -70,6 +70,7 @@
 #include <WebCore/Settings.h>
 #include <WebCore/UserGestureIndicator.h>
 #include <bindings/ScriptValue.h>
+#include <wtf/CompletionHandler.h>
 #include <wtf/text/StringBuilder.h>
 
 #if PLATFORM(X11)
@@ -133,7 +134,7 @@
     }
 
     // NetscapePluginStreamLoaderClient
-    void willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&&, const ResourceResponse& redirectResponse, WTF::Function<void (ResourceRequest&&)>&&) override;
+    void willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&&, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&&) override;
     void didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse&) override;
     void didReceiveData(NetscapePlugInStreamLoader*, const char*, int) override;
     void didFail(NetscapePlugInStreamLoader*, const ResourceError&) override;
@@ -142,7 +143,7 @@
     PluginView* m_pluginView;
     uint64_t m_streamID;
     ResourceRequest m_request;
-    WTF::Function<void (ResourceRequest)> m_loadCallback;
+    CompletionHandler<void(ResourceRequest&&)> m_loadCallback;
 
     // True if the stream was explicitly cancelled by calling cancel().
     // (As opposed to being cancelled by the user hitting the stop button for example.
@@ -153,6 +154,8 @@
 
 PluginView::Stream::~Stream()
 {
+    if (m_loadCallback)
+        m_loadCallback({ });
     ASSERT(!m_pluginView);
 }
     
@@ -181,7 +184,7 @@
     ASSERT(m_pluginView->m_plugin);
     ASSERT(m_loadCallback);
 
-    m_loadCallback(m_request);
+    m_loadCallback(ResourceRequest(m_request));
 }
 
 static String buildHTTPHeaders(const ResourceResponse& response, long long& expectedContentLength)
@@ -221,7 +224,7 @@
     return std::chrono::duration_cast<std::chrono::milliseconds>(lastModified.value().time_since_epoch()).count();
 }
 
-void PluginView::Stream::willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&& request, const ResourceResponse& redirectResponse, WTF::Function<void (ResourceRequest&&)>&& decisionHandler)
+void PluginView::Stream::willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&& request, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&& decisionHandler)
 {
     const URL& requestURL = request.url();
     const URL& redirectResponseURL = redirectResponse.url();
diff --git a/Source/WebKit/WebProcess/WebPage/WebURLSchemeTaskProxy.cpp b/Source/WebKit/WebProcess/WebPage/WebURLSchemeTaskProxy.cpp
index 135fb1f..7de5428 100644
--- a/Source/WebKit/WebProcess/WebPage/WebURLSchemeTaskProxy.cpp
+++ b/Source/WebKit/WebProcess/WebPage/WebURLSchemeTaskProxy.cpp
@@ -33,6 +33,7 @@
 #include <WebCore/NetworkLoadMetrics.h>
 #include <WebCore/ResourceError.h>
 #include <WebCore/ResourceLoader.h>
+#include <wtf/CompletionHandler.h>
 #include <wtf/CurrentTime.h>
 
 using namespace WebCore;
diff --git a/Source/WebKitLegacy/mac/ChangeLog b/Source/WebKitLegacy/mac/ChangeLog
index 3256c17..225c8b7 100644
--- a/Source/WebKitLegacy/mac/ChangeLog
+++ b/Source/WebKitLegacy/mac/ChangeLog
@@ -1,3 +1,17 @@
+2017-11-02  Alex Christensen  <achristensen@webkit.org>
+
+        Use CompletionHandlers for redirects
+        https://bugs.webkit.org/show_bug.cgi?id=179163
+
+        Reviewed by Tim Horton.
+
+        * Plugins/Hosted/HostedNetscapePluginStream.h:
+        * Plugins/Hosted/HostedNetscapePluginStream.mm:
+        (WebKit::HostedNetscapePluginStream::willSendRequest):
+        * Plugins/WebNetscapePluginStream.h:
+        * Plugins/WebNetscapePluginStream.mm:
+        (WebNetscapePluginStream::willSendRequest):
+
 2017-11-02  Christopher Reid  <chris.reid@sony.com>
 
         Add a FileSystem namespace to FileSystem.cpp
diff --git a/Source/WebKitLegacy/mac/Plugins/Hosted/HostedNetscapePluginStream.h b/Source/WebKitLegacy/mac/Plugins/Hosted/HostedNetscapePluginStream.h
index 1567dc8..c53625a 100644
--- a/Source/WebKitLegacy/mac/Plugins/Hosted/HostedNetscapePluginStream.h
+++ b/Source/WebKitLegacy/mac/Plugins/Hosted/HostedNetscapePluginStream.h
@@ -86,7 +86,7 @@
     NSError *pluginCancelledConnectionError() const;
 
     // NetscapePlugInStreamLoaderClient methods.
-    void willSendRequest(WebCore::NetscapePlugInStreamLoader*, WebCore::ResourceRequest&&, const WebCore::ResourceResponse& redirectResponse, WTF::Function<void (WebCore::ResourceRequest&&)>&&) override;
+    void willSendRequest(WebCore::NetscapePlugInStreamLoader*, WebCore::ResourceRequest&&, const WebCore::ResourceResponse& redirectResponse, CompletionHandler<void(WebCore::ResourceRequest&&)>&&) override;
     void didReceiveResponse(WebCore::NetscapePlugInStreamLoader*, const WebCore::ResourceResponse&) override;
     bool wantsAllStreams() const override;
     
diff --git a/Source/WebKitLegacy/mac/Plugins/Hosted/HostedNetscapePluginStream.mm b/Source/WebKitLegacy/mac/Plugins/Hosted/HostedNetscapePluginStream.mm
index aff62d7..6e64bf0 100644
--- a/Source/WebKitLegacy/mac/Plugins/Hosted/HostedNetscapePluginStream.mm
+++ b/Source/WebKitLegacy/mac/Plugins/Hosted/HostedNetscapePluginStream.mm
@@ -45,6 +45,7 @@
 #import <WebCore/SecurityPolicy.h>
 #import <WebCore/WebCoreURLResponse.h>
 #import <pal/spi/cf/CFNetworkSPI.h>
+#import <wtf/CompletionHandler.h>
 #import <wtf/RefCountedLeakCounter.h>
 
 using namespace WebCore;
@@ -130,7 +131,7 @@
     m_instance->disconnectStream(this);
 }
 
-void HostedNetscapePluginStream::willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&& request, const ResourceResponse&, WTF::Function<void (WebCore::ResourceRequest&&)>&& callback)
+void HostedNetscapePluginStream::willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&& request, const ResourceResponse&, CompletionHandler<void(WebCore::ResourceRequest&&)>&& callback)
 {
     // FIXME: We should notify the plug-in with NPP_URLRedirectNotify here.
     callback(WTFMove(request));
diff --git a/Source/WebKitLegacy/mac/Plugins/WebNetscapePluginStream.h b/Source/WebKitLegacy/mac/Plugins/WebNetscapePluginStream.h
index 76ee85f..0e1898f 100644
--- a/Source/WebKitLegacy/mac/Plugins/WebNetscapePluginStream.h
+++ b/Source/WebKitLegacy/mac/Plugins/WebNetscapePluginStream.h
@@ -97,7 +97,7 @@
     NSError *pluginCancelledConnectionError() const;
 
     // NetscapePlugInStreamLoaderClient methods.
-    void willSendRequest(WebCore::NetscapePlugInStreamLoader*, WebCore::ResourceRequest&&, const WebCore::ResourceResponse& redirectResponse, WTF::Function<void (WebCore::ResourceRequest&&)>&&) override;
+    void willSendRequest(WebCore::NetscapePlugInStreamLoader*, WebCore::ResourceRequest&&, const WebCore::ResourceResponse& redirectResponse, CompletionHandler<void(WebCore::ResourceRequest&&)>&&) override;
     void didReceiveResponse(WebCore::NetscapePlugInStreamLoader*, const WebCore::ResourceResponse&) override;
     void didFail(WebCore::NetscapePlugInStreamLoader*, const WebCore::ResourceError&) override;
     bool wantsAllStreams() const override;
diff --git a/Source/WebKitLegacy/mac/Plugins/WebNetscapePluginStream.mm b/Source/WebKitLegacy/mac/Plugins/WebNetscapePluginStream.mm
index d7d67de..ab75d3c 100644
--- a/Source/WebKitLegacy/mac/Plugins/WebNetscapePluginStream.mm
+++ b/Source/WebKitLegacy/mac/Plugins/WebNetscapePluginStream.mm
@@ -53,6 +53,7 @@
 #import <WebCore/WebCoreURLResponse.h>
 #import <pal/spi/cf/CFNetworkSPI.h>
 #import <runtime/JSLock.h>
+#import <wtf/CompletionHandler.h>
 #import <wtf/HashMap.h>
 #import <wtf/NeverDestroyed.h>
 #import <wtf/StdLibExtras.h>
@@ -301,7 +302,7 @@
         cancelLoadAndDestroyStreamWithError(m_loader->cancelledError());
 }
 
-void WebNetscapePluginStream::willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&& request, const ResourceResponse&, WTF::Function<void (WebCore::ResourceRequest&&)>&& callback)
+void WebNetscapePluginStream::willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&& request, const ResourceResponse&, CompletionHandler<void(WebCore::ResourceRequest&&)>&& callback)
 {
     // FIXME: We should notify the plug-in with NPP_URLRedirectNotify here.
     callback(WTFMove(request));
diff --git a/Source/WebKitLegacy/win/ChangeLog b/Source/WebKitLegacy/win/ChangeLog
index 4715a14..731a9ce 100644
--- a/Source/WebKitLegacy/win/ChangeLog
+++ b/Source/WebKitLegacy/win/ChangeLog
@@ -1,3 +1,18 @@
+2017-11-02  Alex Christensen  <achristensen@webkit.org>
+
+        Use CompletionHandlers for redirects
+        https://bugs.webkit.org/show_bug.cgi?id=179163
+
+        Reviewed by Tim Horton.
+
+        * Plugins/PluginStream.cpp:
+        (WebCore::PluginStream::willSendRequest):
+        * Plugins/PluginStream.h:
+        (WebCore::PluginStreamClient::~PluginStreamClient):
+        (WebCore::PluginStreamClient::streamDidFinishLoading):
+        (WebCore::PluginStream::create):
+        (WebCore::PluginStream::setLoadManually):
+
 2017-11-02  Christopher Reid  <chris.reid@sony.com>
 
         Add a FileSystem namespace to FileSystem.cpp
diff --git a/Source/WebKitLegacy/win/Plugins/PluginStream.cpp b/Source/WebKitLegacy/win/Plugins/PluginStream.cpp
index c69e1e9..896bb85 100644
--- a/Source/WebKitLegacy/win/Plugins/PluginStream.cpp
+++ b/Source/WebKitLegacy/win/Plugins/PluginStream.cpp
@@ -35,6 +35,7 @@
 #include "SharedBuffer.h"
 #include "SubresourceLoader.h"
 #include "WebResourceLoadScheduler.h"
+#include <wtf/CompletionHandler.h>
 #include <wtf/StringExtras.h>
 #include <wtf/text/CString.h>
 #include <wtf/text/StringBuilder.h>
@@ -404,7 +405,7 @@
     destroyStream(resultString.isNull() ? NPRES_NETWORK_ERR : NPRES_DONE);
 }
 
-void PluginStream::willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&& request, const ResourceResponse&, WTF::Function<void (WebCore::ResourceRequest&&)>&& callback)
+void PluginStream::willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&& request, const ResourceResponse&, CompletionHandler<void(WebCore::ResourceRequest&&)>&& callback)
 {
     // FIXME: We should notify the plug-in with NPP_URLRedirectNotify here.
     callback(WTFMove(request));
diff --git a/Source/WebKitLegacy/win/Plugins/PluginStream.h b/Source/WebKitLegacy/win/Plugins/PluginStream.h
index 1e5af30..c88f06b 100644
--- a/Source/WebKitLegacy/win/Plugins/PluginStream.h
+++ b/Source/WebKitLegacy/win/Plugins/PluginStream.h
@@ -24,8 +24,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  */
 
-#ifndef PluginStream_h
-#define PluginStream_h
+#pragma once
 
 #include "FileSystem.h"
 #include "URL.h"
@@ -43,83 +42,81 @@
 #include <wtf/text/WTFString.h>
 
 namespace WebCore {
-    class Frame;
-    class PluginStream;
+class Frame;
+class PluginStream;
 
-    enum PluginStreamState { StreamBeforeStarted, StreamStarted, StreamStopped };
+enum PluginStreamState { StreamBeforeStarted, StreamStarted, StreamStopped };
 
-    class PluginStreamClient {
-    public:
-        virtual ~PluginStreamClient() {}
-        virtual void streamDidFinishLoading(PluginStream*) {}
-    };
+class PluginStreamClient {
+public:
+    virtual ~PluginStreamClient() { }
+    virtual void streamDidFinishLoading(PluginStream*) { }
+};
 
-    class PluginStream : public RefCounted<PluginStream>, private NetscapePlugInStreamLoaderClient {
-    public:
-        static Ref<PluginStream> create(PluginStreamClient* client, Frame* frame, const ResourceRequest& request, bool sendNotification, void* notifyData, const NPPluginFuncs* functions, NPP instance, const PluginQuirkSet& quirks)
-        {
-            return adoptRef(*new PluginStream(client, frame, request, sendNotification, notifyData, functions, instance, quirks));
-        }
-        virtual ~PluginStream();
-        
-        void start();
-        void stop();
+class PluginStream : public RefCounted<PluginStream>, private NetscapePlugInStreamLoaderClient {
+public:
+    static Ref<PluginStream> create(PluginStreamClient* client, Frame* frame, const ResourceRequest& request, bool sendNotification, void* notifyData, const NPPluginFuncs* functions, NPP instance, const PluginQuirkSet& quirks)
+    {
+        return adoptRef(*new PluginStream(client, frame, request, sendNotification, notifyData, functions, instance, quirks));
+    }
+    virtual ~PluginStream();
+    
+    void start();
+    void stop();
 
-        void startStream();
+    void startStream();
 
-        void setLoadManually(bool loadManually) { m_loadManually = loadManually; }
+    void setLoadManually(bool loadManually) { m_loadManually = loadManually; }
 
-        void sendJavaScriptStream(const URL& requestURL, const WTF::CString& resultString);
-        void cancelAndDestroyStream(NPReason);
+    void sendJavaScriptStream(const URL& requestURL, const WTF::CString& resultString);
+    void cancelAndDestroyStream(NPReason);
 
-        static NPP ownerForStream(NPStream*);
+    static NPP ownerForStream(NPStream*);
 
-    private:
-        PluginStream(PluginStreamClient*, Frame*, const ResourceRequest&, bool sendNotification, void* notifyData, const NPPluginFuncs*, NPP instance, const PluginQuirkSet&);
+private:
+    PluginStream(PluginStreamClient*, Frame*, const ResourceRequest&, bool sendNotification, void* notifyData, const NPPluginFuncs*, NPP instance, const PluginQuirkSet&);
 
-        void deliverData();
-        void destroyStream(NPReason);
-        void destroyStream();
+    void deliverData();
+    void destroyStream(NPReason);
+    void destroyStream();
 
-        // NetscapePlugInStreamLoaderClient
-        void willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&&, const ResourceResponse& redirectResponse, WTF::Function<void (ResourceRequest&&)>&&) override;
-        void didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse&) override;
-        void didReceiveData(NetscapePlugInStreamLoader*, const char*, int) override;
-        void didFail(NetscapePlugInStreamLoader*, const ResourceError&) override;
-        void didFinishLoading(NetscapePlugInStreamLoader*) override;
-        bool wantsAllStreams() const override;
+    // NetscapePlugInStreamLoaderClient
+    void willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&&, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&&) override;
+    void didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse&) override;
+    void didReceiveData(NetscapePlugInStreamLoader*, const char*, int) override;
+    void didFail(NetscapePlugInStreamLoader*, const ResourceError&) override;
+    void didFinishLoading(NetscapePlugInStreamLoader*) override;
+    bool wantsAllStreams() const override;
 
-        ResourceRequest m_resourceRequest;
-        ResourceResponse m_resourceResponse;
+    ResourceRequest m_resourceRequest;
+    ResourceResponse m_resourceResponse;
 
-        PluginStreamClient* m_client;
-        Frame* m_frame;
-        RefPtr<NetscapePlugInStreamLoader> m_loader;
-        void* m_notifyData;
-        bool m_sendNotification;
-        PluginStreamState m_streamState;
-        bool m_loadManually;
+    PluginStreamClient* m_client;
+    Frame* m_frame;
+    RefPtr<NetscapePlugInStreamLoader> m_loader;
+    void* m_notifyData;
+    bool m_sendNotification;
+    PluginStreamState m_streamState;
+    bool m_loadManually;
 
-        Timer m_delayDeliveryTimer;
-        void delayDeliveryTimerFired();
+    Timer m_delayDeliveryTimer;
+    void delayDeliveryTimerFired();
 
-        std::unique_ptr<Vector<char>> m_deliveryData;
+    std::unique_ptr<Vector<char>> m_deliveryData;
 
-        FileSystem::PlatformFileHandle m_tempFileHandle;
+    FileSystem::PlatformFileHandle m_tempFileHandle;
 
-        const NPPluginFuncs* m_pluginFuncs;
-        NPP m_instance;
-        uint16_t m_transferMode;
-        int32_t m_offset;
-        CString m_headers;
-        String m_path;
-        NPReason m_reason;
-        NPStream m_stream;
-        PluginQuirkSet m_quirks;
+    const NPPluginFuncs* m_pluginFuncs;
+    NPP m_instance;
+    uint16_t m_transferMode;
+    int32_t m_offset;
+    CString m_headers;
+    String m_path;
+    NPReason m_reason;
+    NPStream m_stream;
+    PluginQuirkSet m_quirks;
 
-        friend class PluginView;
-    };
+    friend class PluginView;
+};
 
 } // namespace WebCore
-
-#endif