Diff
Modified: trunk/Source/WebKit2/ChangeLog (193786 => 193787)
--- trunk/Source/WebKit2/ChangeLog 2015-12-08 23:02:58 UTC (rev 193786)
+++ trunk/Source/WebKit2/ChangeLog 2015-12-08 23:05:52 UTC (rev 193787)
@@ -1,3 +1,47 @@
+2015-12-08 Alex Christensen <achristen...@webkit.org>
+
+ Progress towards implementing downloads with NetworkSession
+ https://bugs.webkit.org/show_bug.cgi?id=151883
+
+ Reviewed by Brady Eidson.
+
+ * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+ (WebKit::NetworkConnectionToWebProcess::convertMainResourceLoadToDownload):
+ * NetworkProcess/NetworkLoad.cpp:
+ (WebKit::NetworkLoad::~NetworkLoad):
+ (WebKit::NetworkLoad::continueDidReceiveResponse):
+ (WebKit::NetworkLoad::convertTaskToDownload):
+ (WebKit::NetworkLoad::willPerformHTTPRedirection):
+ (WebKit::NetworkLoad::didReceiveChallenge):
+ (WebKit::NetworkLoad::didReceiveResponse):
+ (WebKit::NetworkLoad::didReceiveData):
+ (WebKit::NetworkLoad::didCompleteWithError):
+ (WebKit::NetworkLoad::didBecomeDownload):
+ (WebKit::NetworkLoad::didReceiveResponseAsync):
+ (WebKit::NetworkLoad::continueCanAuthenticateAgainstProtectionSpace):
+ * NetworkProcess/NetworkLoad.h:
+ * NetworkProcess/NetworkLoadClient.h:
+ * NetworkProcess/NetworkResourceLoader.cpp:
+ (WebKit::NetworkResourceLoader::cleanup):
+ (WebKit::NetworkResourceLoader::didConvertToDownload):
+ (WebKit::NetworkResourceLoader::abort):
+ (WebKit::NetworkResourceLoader::didConvertHandleToDownload): Deleted.
+ * NetworkProcess/NetworkResourceLoader.h:
+ * NetworkProcess/NetworkSession.h:
+ (WebKit::NetworkSessionTaskClient::~NetworkSessionTaskClient):
+ (WebKit::NetworkSession::~NetworkSession): Deleted.
+ * NetworkProcess/cache/NetworkCacheSpeculativeLoad.h:
+ * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
+ (-[NetworkSessionDelegate URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:]):
+ (-[NetworkSessionDelegate URLSession:dataTask:didBecomeDownloadTask:]):
+ (WebKit::NetworkSession::NetworkSession):
+ (WebKit::NetworkSession::~NetworkSession):
+ (WebKit::NetworkSession::createDataTaskWithRequest):
+ * Shared/Downloads/Download.h:
+ * Shared/Downloads/DownloadManager.h:
+ (WebKit::DownloadManager::isDownloading):
+ (WebKit::DownloadManager::activeDownloadCount):
+
2015-12-08 Joseph Pecoraro <pecor...@apple.com>
Create a Sandbox SPI header
Modified: trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp (193786 => 193787)
--- trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp 2015-12-08 23:02:58 UTC (rev 193786)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp 2015-12-08 23:05:52 UTC (rev 193787)
@@ -197,15 +197,14 @@
}
#if USE(NETWORK_SESSION)
- // FIXME: Do something here.
- notImplemented();
+ loader->networkLoad()->convertTaskToDownload();
#else
networkProcess.downloadManager().convertHandleToDownload(downloadID, loader->networkLoad()->handle(), request, response);
// Unblock the URL connection operation queue.
loader->networkLoad()->handle()->continueDidReceiveResponse();
- loader->didConvertHandleToDownload();
+ loader->didConvertToDownload();
#endif
}
Modified: trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp (193786 => 193787)
--- trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp 2015-12-08 23:02:58 UTC (rev 193786)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp 2015-12-08 23:05:52 UTC (rev 193787)
@@ -63,6 +63,8 @@
{
ASSERT(RunLoop::isMain());
#if USE(NETWORK_SESSION)
+ if (m_responseCompletionHandler)
+ m_responseCompletionHandler(PolicyIgnore);
m_task->clearClient();
#else
if (m_handle)
@@ -122,8 +124,9 @@
void NetworkLoad::continueDidReceiveResponse()
{
#if USE(NETWORK_SESSION)
- // FIXME: Do something here.
- notImplemented();
+ ASSERT(m_responseCompletionHandler);
+ m_responseCompletionHandler(PolicyUse);
+ m_responseCompletionHandler = nullptr;
#else
m_handle->continueDidReceiveResponse();
#endif
@@ -151,6 +154,13 @@
#if USE(NETWORK_SESSION)
+void NetworkLoad::convertTaskToDownload()
+{
+ ASSERT(m_responseCompletionHandler);
+ m_responseCompletionHandler(PolicyDownload);
+ m_responseCompletionHandler = nullptr;
+}
+
void NetworkLoad::willPerformHTTPRedirection(const ResourceResponse& response, const ResourceRequest& request, std::function<void(const ResourceRequest&)> completionHandler)
{
sharedWillSendRedirectedRequest(request, response);
@@ -177,16 +187,18 @@
return;
}
- m_completionHandler = completionHandler;
+ m_challengeCompletionHandler = completionHandler;
m_challenge = challenge;
m_client.canAuthenticateAgainstProtectionSpaceAsync(challenge.protectionSpace());
}
-void NetworkLoad::didReceiveResponse(const ResourceResponse& response, std::function<void(WebCore::PolicyAction)> completionHandler)
+void NetworkLoad::didReceiveResponse(const ResourceResponse& response, ResponseCompletionHandler completionHandler)
{
ASSERT(isMainThread());
- sharedDidReceiveResponse(response);
- completionHandler(PolicyUse);
+ if (sharedDidReceiveResponse(response) == NetworkLoadClient::ShouldContinueDidReceiveResponse::Yes)
+ completionHandler(PolicyUse);
+ else
+ m_responseCompletionHandler = completionHandler;
}
void NetworkLoad::didReceiveData(RefPtr<SharedBuffer>&& buffer)
@@ -204,6 +216,11 @@
m_client.didFailLoading(error);
}
+void NetworkLoad::didBecomeDownload()
+{
+ m_client.didConvertToDownload();
+}
+
#else
void NetworkLoad::didReceiveResponseAsync(ResourceHandle* handle, const ResourceResponse& receivedResponse)
@@ -277,8 +294,8 @@
void NetworkLoad::continueCanAuthenticateAgainstProtectionSpace(bool result)
{
#if USE(NETWORK_SESSION)
- ASSERT(m_completionHandler);
- auto completionHandler = WTF::move(m_completionHandler);
+ ASSERT(m_challengeCompletionHandler);
+ auto completionHandler = WTF::move(m_challengeCompletionHandler);
if (!result) {
completionHandler(AuthenticationChallengeDisposition::PerformDefaultHandling, Credential());
return;
Modified: trunk/Source/WebKit2/NetworkProcess/NetworkLoad.h (193786 => 193787)
--- trunk/Source/WebKit2/NetworkProcess/NetworkLoad.h 2015-12-08 23:02:58 UTC (rev 193786)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkLoad.h 2015-12-08 23:05:52 UTC (rev 193787)
@@ -59,12 +59,15 @@
void continueDidReceiveResponse();
#if USE(NETWORK_SESSION)
+ void convertTaskToDownload();
+
// NetworkSessionTaskClient.
virtual void willPerformHTTPRedirection(const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, std::function<void(const WebCore::ResourceRequest&)>) final override;
virtual void didReceiveChallenge(const WebCore::AuthenticationChallenge&, std::function<void(AuthenticationChallengeDisposition, const WebCore::Credential&)>) final override;
virtual void didReceiveResponse(const WebCore::ResourceResponse&, std::function<void(WebCore::PolicyAction)>) final override;
virtual void didReceiveData(RefPtr<WebCore::SharedBuffer>&&) final override;
virtual void didCompleteWithError(const WebCore::ResourceError&) final override;
+ virtual void didBecomeDownload() final override;
#else
// ResourceHandleClient
virtual void willSendRequestAsync(WebCore::ResourceHandle*, const WebCore::ResourceRequest&, const WebCore::ResourceResponse& redirectResponse) override;
@@ -117,7 +120,8 @@
#if USE(NETWORK_SESSION)
Ref<NetworkDataTask> m_task;
WebCore::AuthenticationChallenge m_challenge;
- ChallengeCompletionHandler m_completionHandler;
+ ChallengeCompletionHandler m_challengeCompletionHandler;
+ ResponseCompletionHandler m_responseCompletionHandler;
#else
RefPtr<WebCore::ResourceHandle> m_handle;
#endif
Modified: trunk/Source/WebKit2/NetworkProcess/NetworkLoadClient.h (193786 => 193787)
--- trunk/Source/WebKit2/NetworkProcess/NetworkLoadClient.h 2015-12-08 23:02:58 UTC (rev 193786)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkLoadClient.h 2015-12-08 23:05:52 UTC (rev 193787)
@@ -56,6 +56,7 @@
virtual void didReceiveBuffer(RefPtr<WebCore::SharedBuffer>&&, int reportedEncodedDataLength) = 0;
virtual void didFinishLoading(double finishTime) = 0;
virtual void didFailLoading(const WebCore::ResourceError&) = 0;
+ virtual void didConvertToDownload() = 0;
#if PLATFORM(COCOA)
virtual void willCacheResponseAsync(CFCachedURLResponseRef) = 0;
Modified: trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp (193786 => 193787)
--- trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp 2015-12-08 23:02:58 UTC (rev 193786)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp 2015-12-08 23:05:52 UTC (rev 193787)
@@ -198,23 +198,20 @@
m_connection->didCleanupResourceLoader(*this);
}
-#if !USE(NETWORK_SESSION)
-void NetworkResourceLoader::didConvertHandleToDownload()
+void NetworkResourceLoader::didConvertToDownload()
{
ASSERT(m_networkLoad);
- m_didConvertHandleToDownload = true;
-}
+ m_didConvertToDownload = true;
+#if USE(NETWORK_SESSION)
+ m_networkLoad = nullptr;
#endif
+}
void NetworkResourceLoader::abort()
{
ASSERT(RunLoop::isMain());
- if (m_networkLoad
-#if !USE(NETWORK_SESSION)
- && !m_didConvertHandleToDownload
-#endif
- ) {
+ if (m_networkLoad && !m_didConvertToDownload) {
m_networkLoad->cancel();
#if ENABLE(NETWORK_CACHE)
Modified: trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h (193786 => 193787)
--- trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h 2015-12-08 23:02:58 UTC (rev 193786)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h 2015-12-08 23:05:52 UTC (rev 193787)
@@ -61,10 +61,6 @@
NetworkLoad* networkLoad() const { return m_networkLoad.get(); }
-#if !USE(NETWORK_SESSION)
- void didConvertHandleToDownload();
-#endif
-
void start();
void abort();
@@ -106,6 +102,7 @@
virtual void didReceiveBuffer(RefPtr<WebCore::SharedBuffer>&&, int reportedEncodedDataLength) override;
virtual void didFinishLoading(double finishTime) override;
virtual void didFailLoading(const WebCore::ResourceError&) override;
+ virtual void didConvertToDownload() override;
private:
NetworkResourceLoader(const NetworkResourceLoadParameters&, NetworkConnectionToWebProcess&, RefPtr<Messages::NetworkConnectionToWebProcess::PerformSynchronousLoad::DelayedReply>&&);
@@ -150,9 +147,7 @@
std::unique_ptr<SynchronousLoadData> m_synchronousLoadData;
Vector<RefPtr<WebCore::BlobDataFileReference>> m_fileReferences;
-#if !USE(NETWORK_SESSION)
- bool m_didConvertHandleToDownload { false };
-#endif
+ bool m_didConvertToDownload { false };
bool m_didConsumeSandboxExtensions { false };
bool m_defersLoading { false };
Modified: trunk/Source/WebKit2/NetworkProcess/NetworkSession.h (193786 => 193787)
--- trunk/Source/WebKit2/NetworkProcess/NetworkSession.h 2015-12-08 23:02:58 UTC (rev 193786)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkSession.h 2015-12-08 23:05:52 UTC (rev 193787)
@@ -64,9 +64,11 @@
virtual void willPerformHTTPRedirection(const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, std::function<void(const WebCore::ResourceRequest&)>) = 0;
typedef std::function<void(AuthenticationChallengeDisposition, const WebCore::Credential&)> ChallengeCompletionHandler;
virtual void didReceiveChallenge(const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler) = 0;
- virtual void didReceiveResponse(const WebCore::ResourceResponse&, std::function<void(WebCore::PolicyAction)>) = 0;
+ typedef std::function<void(WebCore::PolicyAction)> ResponseCompletionHandler;
+ virtual void didReceiveResponse(const WebCore::ResourceResponse&, ResponseCompletionHandler) = 0;
virtual void didReceiveData(RefPtr<WebCore::SharedBuffer>&&) = 0;
virtual void didCompleteWithError(const WebCore::ResourceError&) = 0;
+ virtual void didBecomeDownload() = 0;
virtual ~NetworkSessionTaskClient() { }
};
@@ -103,7 +105,7 @@
Ephemeral
};
NetworkSession(Type, WebCore::SessionID);
- ~NetworkSession() { ASSERT(m_dataTaskMap.isEmpty()); }
+ ~NetworkSession();
static NetworkSession& defaultSession();
Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoad.h (193786 => 193787)
--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoad.h 2015-12-08 23:02:58 UTC (rev 193786)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoad.h 2015-12-08 23:05:52 UTC (rev 193787)
@@ -59,6 +59,7 @@
virtual void didReceiveBuffer(RefPtr<WebCore::SharedBuffer>&&, int reportedEncodedDataLength) override;
virtual void didFinishLoading(double finishTime) override;
virtual void didFailLoading(const WebCore::ResourceError&) override;
+ virtual void didConvertToDownload() override { ASSERT_NOT_REACHED(); }
#if PLATFORM(COCOA)
virtual void willCacheResponseAsync(CFCachedURLResponseRef) override { }
#endif
Modified: trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm (193786 => 193787)
--- trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm 2015-12-08 23:02:58 UTC (rev 193786)
+++ trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm 2015-12-08 23:05:52 UTC (rev 193787)
@@ -170,6 +170,7 @@
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
+ ASSERT_WITH_MESSAGE(!_session->dataTaskForIdentifier([downloadTask taskIdentifier]), "The NetworkDataTask should be destroyed immediately after didBecomeDownloadTask returns");
notImplemented();
}
@@ -180,7 +181,10 @@
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask
{
- notImplemented();
+ auto* networkDataTask = _session->dataTaskForIdentifier([dataTask taskIdentifier]);
+ ASSERT(networkDataTask);
+ if (auto* client = networkDataTask->client())
+ client->didBecomeDownload();
}
@end
@@ -217,6 +221,11 @@
m_session = [NSURLSession sessionWithConfiguration:configuration delegate:static_cast<id>(m_sessionDelegate.get()) delegateQueue:[NSOperationQueue mainQueue]];
}
+NetworkSession::~NetworkSession()
+{
+ [m_session invalidateAndCancel];
+}
+
Ref<NetworkDataTask> NetworkSession::createDataTaskWithRequest(const WebCore::ResourceRequest& request, NetworkSessionTaskClient& client)
{
return adoptRef(*new NetworkDataTask(*this, client, [m_session dataTaskWithRequest:request.nsURLRequest(WebCore::UpdateHTTPBody)]));
Modified: trunk/Source/WebKit2/Shared/Downloads/Download.h (193786 => 193787)
--- trunk/Source/WebKit2/Shared/Downloads/Download.h 2015-12-08 23:02:58 UTC (rev 193786)
+++ trunk/Source/WebKit2/Shared/Downloads/Download.h 2015-12-08 23:05:52 UTC (rev 193787)
@@ -34,9 +34,13 @@
#if PLATFORM(COCOA)
#include <wtf/RetainPtr.h>
+#if USE(NETWORK_SESSION)
+OBJC_CLASS NSURLSessionDownloadTask;
+#else
OBJC_CLASS NSURLDownload;
OBJC_CLASS WKDownloadAsDelegate;
#endif
+#endif
#if PLATFORM(GTK) || PLATFORM(EFL)
#include <WebCore/ResourceHandle.h>
@@ -124,7 +128,7 @@
#if PLATFORM(COCOA)
#if USE(NETWORK_SESSION)
- // FIXME: This needs member variables.
+ RetainPtr<NSURLSessionDownloadTask> m_download;
#else
RetainPtr<NSURLDownload> m_nsURLDownload;
RetainPtr<WKDownloadAsDelegate> m_delegate;
Modified: trunk/Source/WebKit2/Shared/Downloads/DownloadManager.h (193786 => 193787)
--- trunk/Source/WebKit2/Shared/Downloads/DownloadManager.h 2015-12-08 23:02:58 UTC (rev 193786)
+++ trunk/Source/WebKit2/Shared/Downloads/DownloadManager.h 2015-12-08 23:05:52 UTC (rev 193787)
@@ -33,7 +33,9 @@
#include <wtf/Noncopyable.h>
namespace WebCore {
+#if !USE(NETWORK_SESSION)
class ResourceHandle;
+#endif
class ResourceRequest;
class ResourceResponse;
class SessionID;
@@ -77,13 +79,8 @@
void cancelDownload(uint64_t downloadID);
void downloadFinished(Download*);
-#if USE(NETWORK_SESSION)
- bool isDownloading() const { notImplemented(); return false; }
- uint64_t activeDownloadCount() const { notImplemented(); return 0; }
-#else
bool isDownloading() const { return !m_downloads.isEmpty(); }
uint64_t activeDownloadCount() const { return m_downloads.size(); }
-#endif
void didCreateDownload();
void didDestroyDownload();
@@ -93,9 +90,7 @@
private:
Client* m_client;
-#if !USE(NETWORK_SESSION)
HashMap<uint64_t, std::unique_ptr<Download>> m_downloads;
-#endif
};
} // namespace WebKit