Title: [193787] trunk/Source/WebKit2
Revision
193787
Author
commit-qu...@webkit.org
Date
2015-12-08 15:05:52 -0800 (Tue, 08 Dec 2015)

Log Message

Progress towards implementing downloads with NetworkSession
https://bugs.webkit.org/show_bug.cgi?id=151883

Patch by Alex Christensen <achristen...@webkit.org> on 2015-12-08
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):

Modified Paths

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
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to