<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[196984] trunk/Source/WebKit2</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/196984">196984</a></dd>
<dt>Author</dt> <dd>achristensen@apple.com</dd>
<dt>Date</dt> <dd>2016-02-23 11:13:18 -0800 (Tue, 23 Feb 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>Implement downloads with NetworkSession
https://bugs.webkit.org/show_bug.cgi?id=154473
Reviewed by Brady Eidson.
* NetworkProcess/Downloads/Download.cpp:
(WebKit::Download::~Download):
(WebKit::Download::didStart):
(WebKit::Download::shouldDecodeSourceDataOfMIMEType):
(WebKit::Download::decideDestinationWithSuggestedFilename):
(WebKit::Download::didCreateDestination):
* NetworkProcess/Downloads/Download.h:
(WebKit::Download::downloadID):
(WebKit::Download::setSandboxExtension):
* NetworkProcess/Downloads/DownloadManager.cpp:
(WebKit::DownloadManager::startDownload):
(WebKit::DownloadManager::dataTaskBecameDownloadTask):
(WebKit::DownloadManager::continueCanAuthenticateAgainstProtectionSpace):
(WebKit::DownloadManager::continueWillSendRequest):
(WebKit::DownloadManager::willDecidePendingDownloadDestination):
(WebKit::DownloadManager::continueDecidePendingDownloadDestination):
(WebKit::DownloadManager::convertHandleToDownload):
* NetworkProcess/Downloads/DownloadManager.h:
* NetworkProcess/NetworkDataTask.h:
(WebKit::NetworkDataTask::clearClient):
NetworkDataTasks can now outlive their client, so we need to make client a pointer
with the ability to be nulled from the client's destructor.
(WebKit::NetworkDataTask::pendingDownloadID):
(WebKit::NetworkDataTask::pendingDownload):
(WebKit::NetworkDataTask::setPendingDownload):
(WebKit::NetworkDataTask::pendingDownloadLocation):
(WebKit::NetworkDataTask::client): Deleted.
* NetworkProcess/NetworkLoad.cpp:
(WebKit::NetworkLoad::~NetworkLoad):
(WebKit::NetworkLoad::convertTaskToDownload):
(WebKit::NetworkLoad::setPendingDownloadID):
(WebKit::NetworkLoad::didReceiveResponseNetworkSession):
Don't call the didReceiveResponse completion handler immediately when we know we are
going to turn the load into a download. Instead, save the completion handler until
after we have determined the download destination and set it in the NetworkDataTask.
* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::continueWillSendRequest):
(WebKit::NetworkProcess::findPendingDownloadLocation):
(WebKit::NetworkProcess::continueDecidePendingDownloadDestination):
(WebKit::NetworkProcess::setCacheModel):
* NetworkProcess/NetworkProcess.h:
* NetworkProcess/NetworkProcess.messages.in:
* NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:
(WebKit::NetworkDataTask::NetworkDataTask):
(WebKit::NetworkDataTask::~NetworkDataTask):
(WebKit::NetworkDataTask::didSendData):
(WebKit::NetworkDataTask::didReceiveChallenge):
(WebKit::NetworkDataTask::didCompleteWithError):
(WebKit::NetworkDataTask::didReceiveResponse):
(WebKit::NetworkDataTask::didReceiveData):
(WebKit::NetworkDataTask::didBecomeDownload):
(WebKit::NetworkDataTask::willPerformHTTPRedirection):
(WebKit::NetworkDataTask::scheduleFailure):
(WebKit::NetworkDataTask::failureTimerFired):
(WebKit::NetworkDataTask::findPendingDownloadLocation):
(WebKit::NetworkDataTask::setPendingDownloadLocation):
(WebKit::NetworkDataTask::tryPasswordBasedAuthentication):
(WebKit::NetworkDataTask::transferSandboxExtensionToDownload):
(WebKit::NetworkDataTask::currentRequest):
(WebKit::NetworkDataTask::cancel):
* NetworkProcess/cocoa/NetworkSessionCocoa.mm:
(-[WKNetworkSessionDelegate URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:]):
(-[WKNetworkSessionDelegate URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:]):
(-[WKNetworkSessionDelegate URLSession:task:didReceiveChallenge:completionHandler:]):
(-[WKNetworkSessionDelegate URLSession:task:didCompleteWithError:]):
This delegate callback is used for downloads, too.
(-[WKNetworkSessionDelegate URLSession:dataTask:didReceiveResponse:completionHandler:]):
(-[WKNetworkSessionDelegate URLSession:dataTask:didReceiveData:]):
(-[WKNetworkSessionDelegate URLSession:downloadTask:didFinishDownloadingToURL:]):
(-[WKNetworkSessionDelegate URLSession:dataTask:didBecomeDownloadTask:]):
Call didCreateDestination now, which is after the file has been opened on the disk.
A DownloadProxy::DidStart message is now sent from NetworkProcess::findPendingDownloadLocation before
we ask the UIProcess where the download should end up on disk.
Null check the NetworkDataTask's client before using it because it is now a pointer that could be null.
* UIProcess/Downloads/DownloadProxy.cpp:
(WebKit::DownloadProxy::shouldDecodeSourceDataOfMIMEType):
(WebKit::DownloadProxy::decideDestinationWithSuggestedFilenameAsync):
(WebKit::DownloadProxy::decideDestinationWithSuggestedFilename):
(WebKit::DownloadProxy::didCreateDestination):
* UIProcess/Downloads/DownloadProxy.h:
* UIProcess/Downloads/DownloadProxy.messages.in:</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessDownloadsDownloadcpp">trunk/Source/WebKit2/NetworkProcess/Downloads/Download.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessDownloadsDownloadh">trunk/Source/WebKit2/NetworkProcess/Downloads/Download.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessDownloadsDownloadManagercpp">trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessDownloadsDownloadManagerh">trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkDataTaskh">trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkLoadcpp">trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkProcesscpp">trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkProcessh">trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkProcessmessagesin">trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscocoaNetworkDataTaskCocoamm">trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscocoaNetworkSessionCocoamm">trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessDownloadsDownloadProxycpp">trunk/Source/WebKit2/UIProcess/Downloads/DownloadProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessDownloadsDownloadProxyh">trunk/Source/WebKit2/UIProcess/Downloads/DownloadProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessDownloadsDownloadProxymessagesin">trunk/Source/WebKit2/UIProcess/Downloads/DownloadProxy.messages.in</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (196983 => 196984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-02-23 18:17:17 UTC (rev 196983)
+++ trunk/Source/WebKit2/ChangeLog        2016-02-23 19:13:18 UTC (rev 196984)
</span><span class="lines">@@ -1,3 +1,100 @@
</span><ins>+2016-02-23 Alex Christensen <achristensen@webkit.org>
+
+ Implement downloads with NetworkSession
+ https://bugs.webkit.org/show_bug.cgi?id=154473
+
+ Reviewed by Brady Eidson.
+
+ * NetworkProcess/Downloads/Download.cpp:
+ (WebKit::Download::~Download):
+ (WebKit::Download::didStart):
+ (WebKit::Download::shouldDecodeSourceDataOfMIMEType):
+ (WebKit::Download::decideDestinationWithSuggestedFilename):
+ (WebKit::Download::didCreateDestination):
+ * NetworkProcess/Downloads/Download.h:
+ (WebKit::Download::downloadID):
+ (WebKit::Download::setSandboxExtension):
+ * NetworkProcess/Downloads/DownloadManager.cpp:
+ (WebKit::DownloadManager::startDownload):
+ (WebKit::DownloadManager::dataTaskBecameDownloadTask):
+ (WebKit::DownloadManager::continueCanAuthenticateAgainstProtectionSpace):
+ (WebKit::DownloadManager::continueWillSendRequest):
+ (WebKit::DownloadManager::willDecidePendingDownloadDestination):
+ (WebKit::DownloadManager::continueDecidePendingDownloadDestination):
+ (WebKit::DownloadManager::convertHandleToDownload):
+ * NetworkProcess/Downloads/DownloadManager.h:
+ * NetworkProcess/NetworkDataTask.h:
+ (WebKit::NetworkDataTask::clearClient):
+
+ NetworkDataTasks can now outlive their client, so we need to make client a pointer
+ with the ability to be nulled from the client's destructor.
+
+ (WebKit::NetworkDataTask::pendingDownloadID):
+ (WebKit::NetworkDataTask::pendingDownload):
+ (WebKit::NetworkDataTask::setPendingDownload):
+ (WebKit::NetworkDataTask::pendingDownloadLocation):
+ (WebKit::NetworkDataTask::client): Deleted.
+ * NetworkProcess/NetworkLoad.cpp:
+ (WebKit::NetworkLoad::~NetworkLoad):
+ (WebKit::NetworkLoad::convertTaskToDownload):
+ (WebKit::NetworkLoad::setPendingDownloadID):
+ (WebKit::NetworkLoad::didReceiveResponseNetworkSession):
+
+ Don't call the didReceiveResponse completion handler immediately when we know we are
+ going to turn the load into a download. Instead, save the completion handler until
+ after we have determined the download destination and set it in the NetworkDataTask.
+
+ * NetworkProcess/NetworkProcess.cpp:
+ (WebKit::NetworkProcess::continueWillSendRequest):
+ (WebKit::NetworkProcess::findPendingDownloadLocation):
+ (WebKit::NetworkProcess::continueDecidePendingDownloadDestination):
+ (WebKit::NetworkProcess::setCacheModel):
+ * NetworkProcess/NetworkProcess.h:
+ * NetworkProcess/NetworkProcess.messages.in:
+ * NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:
+ (WebKit::NetworkDataTask::NetworkDataTask):
+ (WebKit::NetworkDataTask::~NetworkDataTask):
+ (WebKit::NetworkDataTask::didSendData):
+ (WebKit::NetworkDataTask::didReceiveChallenge):
+ (WebKit::NetworkDataTask::didCompleteWithError):
+ (WebKit::NetworkDataTask::didReceiveResponse):
+ (WebKit::NetworkDataTask::didReceiveData):
+ (WebKit::NetworkDataTask::didBecomeDownload):
+ (WebKit::NetworkDataTask::willPerformHTTPRedirection):
+ (WebKit::NetworkDataTask::scheduleFailure):
+ (WebKit::NetworkDataTask::failureTimerFired):
+ (WebKit::NetworkDataTask::findPendingDownloadLocation):
+ (WebKit::NetworkDataTask::setPendingDownloadLocation):
+ (WebKit::NetworkDataTask::tryPasswordBasedAuthentication):
+ (WebKit::NetworkDataTask::transferSandboxExtensionToDownload):
+ (WebKit::NetworkDataTask::currentRequest):
+ (WebKit::NetworkDataTask::cancel):
+ * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
+ (-[WKNetworkSessionDelegate URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:]):
+ (-[WKNetworkSessionDelegate URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:]):
+ (-[WKNetworkSessionDelegate URLSession:task:didReceiveChallenge:completionHandler:]):
+ (-[WKNetworkSessionDelegate URLSession:task:didCompleteWithError:]):
+
+ This delegate callback is used for downloads, too.
+
+ (-[WKNetworkSessionDelegate URLSession:dataTask:didReceiveResponse:completionHandler:]):
+ (-[WKNetworkSessionDelegate URLSession:dataTask:didReceiveData:]):
+ (-[WKNetworkSessionDelegate URLSession:downloadTask:didFinishDownloadingToURL:]):
+ (-[WKNetworkSessionDelegate URLSession:dataTask:didBecomeDownloadTask:]):
+
+ Call didCreateDestination now, which is after the file has been opened on the disk.
+ A DownloadProxy::DidStart message is now sent from NetworkProcess::findPendingDownloadLocation before
+ we ask the UIProcess where the download should end up on disk.
+ Null check the NetworkDataTask's client before using it because it is now a pointer that could be null.
+
+ * UIProcess/Downloads/DownloadProxy.cpp:
+ (WebKit::DownloadProxy::shouldDecodeSourceDataOfMIMEType):
+ (WebKit::DownloadProxy::decideDestinationWithSuggestedFilenameAsync):
+ (WebKit::DownloadProxy::decideDestinationWithSuggestedFilename):
+ (WebKit::DownloadProxy::didCreateDestination):
+ * UIProcess/Downloads/DownloadProxy.h:
+ * UIProcess/Downloads/DownloadProxy.messages.in:
+
</ins><span class="cx"> 2016-02-23 Brian Burg <bburg@apple.com>
</span><span class="cx">
</span><span class="cx"> Connect WebAutomationSession to its backend dispatcher as if it were an agent and add stub implementations
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessDownloadsDownloadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/Downloads/Download.cpp (196983 => 196984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/Downloads/Download.cpp        2016-02-23 18:17:17 UTC (rev 196983)
+++ trunk/Source/WebKit2/NetworkProcess/Downloads/Download.cpp        2016-02-23 19:13:18 UTC (rev 196984)
</span><span class="lines">@@ -66,12 +66,7 @@
</span><span class="cx"> m_downloadManager.didDestroyDownload();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-#if USE(NETWORK_SESSION)
-void Download::didStart(const ResourceRequest& request)
-{
- send(Messages::DownloadProxy::DidStart(request));
-}
-#else
</del><ins>+#if !USE(NETWORK_SESSION)
</ins><span class="cx"> void Download::didStart()
</span><span class="cx"> {
</span><span class="cx"> send(Messages::DownloadProxy::DidStart(m_request));
</span><span class="lines">@@ -104,6 +99,7 @@
</span><span class="cx"> return result;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+#if !USE(NETWORK_SESSION)
</ins><span class="cx"> String Download::decideDestinationWithSuggestedFilename(const String& filename, bool& allowOverwrite)
</span><span class="cx"> {
</span><span class="cx"> String destination;
</span><span class="lines">@@ -117,6 +113,7 @@
</span><span class="cx">
</span><span class="cx"> return destination;
</span><span class="cx"> }
</span><ins>+#endif
</ins><span class="cx">
</span><span class="cx"> void Download::didCreateDestination(const String& path)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessDownloadsDownloadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/Downloads/Download.h (196983 => 196984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/Downloads/Download.h        2016-02-23 18:17:17 UTC (rev 196983)
+++ trunk/Source/WebKit2/NetworkProcess/Downloads/Download.h        2016-02-23 19:13:18 UTC (rev 196984)
</span><span class="lines">@@ -82,9 +82,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> ~Download();
</span><span class="cx">
</span><del>-#if USE(NETWORK_SESSION) && PLATFORM(COCOA)
- void dataTaskDidBecomeDownloadTask(const NetworkSession&, RetainPtr<NSURLSessionDownloadTask>&&);
-#else
</del><ins>+#if !USE(NETWORK_SESSION)
</ins><span class="cx"> void start();
</span><span class="cx"> void startWithHandle(WebCore::ResourceHandle*, const WebCore::ResourceResponse&);
</span><span class="cx"> #endif
</span><span class="lines">@@ -94,7 +92,7 @@
</span><span class="cx"> DownloadID downloadID() const { return m_downloadID; }
</span><span class="cx">
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><del>- void didStart(const WebCore::ResourceRequest&);
</del><ins>+ void setSandboxExtension(RefPtr<SandboxExtension>&& sandboxExtension) { m_sandboxExtension = WTFMove(sandboxExtension); }
</ins><span class="cx"> #else
</span><span class="cx"> void didStart();
</span><span class="cx"> void didReceiveAuthenticationChallenge(const WebCore::AuthenticationChallenge&);
</span><span class="lines">@@ -102,7 +100,9 @@
</span><span class="cx"> void didReceiveResponse(const WebCore::ResourceResponse&);
</span><span class="cx"> void didReceiveData(uint64_t length);
</span><span class="cx"> bool shouldDecodeSourceDataOfMIMEType(const String& mimeType);
</span><ins>+#if !USE(NETWORK_SESSION)
</ins><span class="cx"> String decideDestinationWithSuggestedFilename(const String& filename, bool& allowOverwrite);
</span><ins>+#endif
</ins><span class="cx"> void didCreateDestination(const String& path);
</span><span class="cx"> void didFinish();
</span><span class="cx"> void platformDidFinish();
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessDownloadsDownloadManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.cpp (196983 => 196984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.cpp        2016-02-23 18:17:17 UTC (rev 196983)
+++ trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.cpp        2016-02-23 19:13:18 UTC (rev 196984)
</span><span class="lines">@@ -65,13 +65,18 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><del>-std::unique_ptr<PendingDownload> DownloadManager::dataTaskBecameDownloadTask(DownloadID downloadID, std::unique_ptr<Download>&& download)
</del><ins>+std::pair<RefPtr<NetworkDataTask>, std::unique_ptr<PendingDownload>> DownloadManager::dataTaskBecameDownloadTask(DownloadID downloadID, std::unique_ptr<Download>&& download)
</ins><span class="cx"> {
</span><span class="cx"> // This is needed for downloads started with startDownload, otherwise it will return nullptr.
</span><span class="cx"> auto pendingDownload = m_pendingDownloads.take(downloadID);
</span><span class="cx">
</span><ins>+ // This is needed for downloads started with convertTaskToDownload, otherwise it will return nullptr.
+ auto downloadAfterLocationDecided = m_downloadsAfterDestinationDecided.take(downloadID);
+
+ ASSERT(!!pendingDownload != !!downloadAfterLocationDecided);
+
</ins><span class="cx"> m_downloads.add(downloadID, WTFMove(download));
</span><del>- return pendingDownload;
</del><ins>+ return std::make_pair(WTFMove(downloadAfterLocationDecided), WTFMove(pendingDownload));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void DownloadManager::continueCanAuthenticateAgainstProtectionSpace(DownloadID downloadID, bool canAuthenticate)
</span><span class="lines">@@ -89,6 +94,28 @@
</span><span class="cx"> if (pendingDownload)
</span><span class="cx"> pendingDownload->continueWillSendRequest(request);
</span><span class="cx"> }
</span><ins>+
+void DownloadManager::willDecidePendingDownloadDestination(NetworkDataTask& networkDataTask, ResponseCompletionHandler completionHandler)
+{
+ auto addResult = m_downloadsWaitingForDestination.set(networkDataTask.pendingDownloadID(), std::make_pair<RefPtr<NetworkDataTask>, ResponseCompletionHandler>(&networkDataTask, WTFMove(completionHandler)));
+ ASSERT_UNUSED(addResult, addResult.isNewEntry);
+}
+
+void DownloadManager::continueDecidePendingDownloadDestination(DownloadID downloadID, String destination, const SandboxExtension::Handle& sandboxExtensionHandle)
+{
+ auto pair = m_downloadsWaitingForDestination.take(downloadID);
+ auto networkDataTask = pair.first;
+ auto completionHandler = pair.second;
+ if (!networkDataTask || !completionHandler) {
+ ASSERT_NOT_REACHED();
+ return;
+ }
+ networkDataTask->setPendingDownloadLocation(destination, sandboxExtensionHandle);
+ completionHandler(PolicyDownload);
+
+ ASSERT(!m_downloadsAfterDestinationDecided.contains(downloadID));
+ m_downloadsAfterDestinationDecided.set(downloadID, networkDataTask);
+}
</ins><span class="cx"> #else
</span><span class="cx"> void DownloadManager::convertHandleToDownload(DownloadID downloadID, ResourceHandle* handle, const ResourceRequest& request, const ResourceResponse& response)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessDownloadsDownloadManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.h (196983 => 196984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.h        2016-02-23 18:17:17 UTC (rev 196983)
+++ trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.h        2016-02-23 19:13:18 UTC (rev 196984)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #define DownloadManager_h
</span><span class="cx">
</span><span class="cx"> #include "DownloadID.h"
</span><ins>+#include "NetworkDataTask.h"
</ins><span class="cx"> #include "PendingDownload.h"
</span><span class="cx"> #include "SandboxExtension.h"
</span><span class="cx"> #include <WebCore/NotImplemented.h>
</span><span class="lines">@@ -72,9 +73,11 @@
</span><span class="cx">
</span><span class="cx"> void startDownload(WebCore::SessionID, DownloadID, const WebCore::ResourceRequest&);
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><del>- std::unique_ptr<PendingDownload> dataTaskBecameDownloadTask(DownloadID, std::unique_ptr<Download>&&);
</del><ins>+ std::pair<RefPtr<NetworkDataTask>, std::unique_ptr<PendingDownload>> dataTaskBecameDownloadTask(DownloadID, std::unique_ptr<Download>&&);
</ins><span class="cx"> void continueCanAuthenticateAgainstProtectionSpace(DownloadID, bool canAuthenticate);
</span><span class="cx"> void continueWillSendRequest(DownloadID, const WebCore::ResourceRequest&);
</span><ins>+ void willDecidePendingDownloadDestination(NetworkDataTask&, ResponseCompletionHandler);
+ void continueDecidePendingDownloadDestination(DownloadID, String destination, const SandboxExtension::Handle&);
</ins><span class="cx"> #else
</span><span class="cx"> void convertHandleToDownload(DownloadID, WebCore::ResourceHandle*, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&);
</span><span class="cx"> #endif
</span><span class="lines">@@ -99,6 +102,8 @@
</span><span class="cx"> Client& m_client;
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><span class="cx"> HashMap<DownloadID, std::unique_ptr<PendingDownload>> m_pendingDownloads;
</span><ins>+ HashMap<DownloadID, std::pair<RefPtr<NetworkDataTask>, ResponseCompletionHandler>> m_downloadsWaitingForDestination;
+ HashMap<DownloadID, RefPtr<NetworkDataTask>> m_downloadsAfterDestinationDecided;
</ins><span class="cx"> #endif
</span><span class="cx"> HashMap<DownloadID, std::unique_ptr<Download>> m_downloads;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkDataTaskh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.h (196983 => 196984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.h        2016-02-23 18:17:17 UTC (rev 196983)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.h        2016-02-23 19:13:18 UTC (rev 196984)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #ifndef NetworkDataTask_h
</span><span class="cx"> #define NetworkDataTask_h
</span><span class="cx">
</span><ins>+#include "SandboxExtension.h"
</ins><span class="cx"> #include <WebCore/FrameLoaderTypes.h>
</span><span class="cx"> #include <WebCore/ResourceHandleTypes.h>
</span><span class="cx"> #include <WebCore/ResourceLoaderOptions.h>
</span><span class="lines">@@ -49,6 +50,7 @@
</span><span class="cx">
</span><span class="cx"> namespace WebKit {
</span><span class="cx">
</span><ins>+class Download;
</ins><span class="cx"> class NetworkSession;
</span><span class="cx"> class PendingDownload;
</span><span class="cx">
</span><span class="lines">@@ -95,8 +97,15 @@
</span><span class="cx">
</span><span class="cx"> ~NetworkDataTask();
</span><span class="cx">
</span><del>- NetworkDataTaskClient& client() { return m_client; }
</del><ins>+ void didSendData(uint64_t totalBytesSent, uint64_t totalBytesExpectedToSend);
+ void didReceiveChallenge(const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler);
+ void didCompleteWithError(const WebCore::ResourceError&);
+ void didReceiveResponse(const WebCore::ResourceResponse&, ResponseCompletionHandler);
+ void didReceiveData(RefPtr<WebCore::SharedBuffer>&&);
+ void didBecomeDownload();
</ins><span class="cx">
</span><ins>+ void clearClient() { m_client = nullptr; }
+
</ins><span class="cx"> DownloadID pendingDownloadID() { return m_pendingDownloadID; }
</span><span class="cx"> PendingDownload* pendingDownload() { return m_pendingDownload; }
</span><span class="cx"> void setPendingDownloadID(DownloadID downloadID)
</span><span class="lines">@@ -110,8 +119,13 @@
</span><span class="cx"> ASSERT(!m_pendingDownload);
</span><span class="cx"> m_pendingDownload = &pendingDownload;
</span><span class="cx"> }
</span><ins>+ void findPendingDownloadLocation(ResponseCompletionHandler);
+ void setPendingDownloadLocation(const String& filename, const SandboxExtension::Handle&);
+ const String& pendingDownloadLocation() { return m_pendingDownloadLocation; }
+ WebCore::ResourceRequest currentRequest();
</ins><span class="cx"> bool tryPasswordBasedAuthentication(const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler);
</span><span class="cx"> void willPerformHTTPRedirection(const WebCore::ResourceResponse&, WebCore::ResourceRequest&&, RedirectCompletionHandler);
</span><ins>+ void transferSandboxExtensionToDownload(Download&);
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> NetworkDataTask(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, WebCore::StoredCredentials, WebCore::ContentSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect);
</span><span class="lines">@@ -127,14 +141,16 @@
</span><span class="cx"> void scheduleFailure(FailureType);
</span><span class="cx">
</span><span class="cx"> NetworkSession& m_session;
</span><del>- NetworkDataTaskClient& m_client;
</del><ins>+ NetworkDataTaskClient* m_client;
</ins><span class="cx"> PendingDownload* m_pendingDownload { nullptr };
</span><span class="cx"> DownloadID m_pendingDownloadID;
</span><span class="cx"> String m_user;
</span><span class="cx"> String m_password;
</span><span class="cx"> String m_lastHTTPMethod;
</span><ins>+ String m_pendingDownloadLocation;
</ins><span class="cx"> WebCore::ResourceRequest m_firstRequest;
</span><span class="cx"> bool m_shouldClearReferrerOnHTTPSToHTTPRedirect;
</span><ins>+ RefPtr<SandboxExtension> m_sandboxExtension;
</ins><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx"> RetainPtr<NSURLSessionDataTask> m_task;
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkLoadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp (196983 => 196984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp        2016-02-23 18:17:17 UTC (rev 196983)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp        2016-02-23 19:13:18 UTC (rev 196984)
</span><span class="lines">@@ -71,6 +71,8 @@
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><span class="cx"> if (m_responseCompletionHandler)
</span><span class="cx"> m_responseCompletionHandler(PolicyIgnore);
</span><ins>+ if (m_task)
+ m_task->clearClient();
</ins><span class="cx"> #endif
</span><span class="cx"> if (m_handle)
</span><span class="cx"> m_handle->clearClient();
</span><span class="lines">@@ -163,13 +165,14 @@
</span><span class="cx">
</span><span class="cx"> void NetworkLoad::convertTaskToDownload(DownloadID downloadID)
</span><span class="cx"> {
</span><ins>+ if (!m_task)
+ return;
+
</ins><span class="cx"> m_task->setPendingDownloadID(downloadID);
</span><span class="cx">
</span><span class="cx"> ASSERT(m_responseCompletionHandler);
</span><del>- if (m_responseCompletionHandler) {
- m_responseCompletionHandler(PolicyDownload);
- m_responseCompletionHandler = nullptr;
- }
</del><ins>+ if (m_responseCompletionHandler)
+ m_task->findPendingDownloadLocation(WTFMove(m_responseCompletionHandler));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void NetworkLoad::setPendingDownloadID(DownloadID downloadID)
</span><span class="lines">@@ -218,7 +221,7 @@
</span><span class="cx"> {
</span><span class="cx"> ASSERT(isMainThread());
</span><span class="cx"> if (m_task && m_task->pendingDownloadID().downloadID())
</span><del>- completionHandler(PolicyDownload);
</del><ins>+ m_task->findPendingDownloadLocation(completionHandler);
</ins><span class="cx"> else if (sharedDidReceiveResponse(response) == NetworkLoadClient::ShouldContinueDidReceiveResponse::Yes)
</span><span class="cx"> completionHandler(PolicyUse);
</span><span class="cx"> else
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkProcesscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp (196983 => 196984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp        2016-02-23 18:17:17 UTC (rev 196983)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp        2016-02-23 19:13:18 UTC (rev 196984)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include "AuthenticationManager.h"
</span><span class="cx"> #include "ChildProcessMessages.h"
</span><span class="cx"> #include "CustomProtocolManager.h"
</span><ins>+#include "DownloadProxyMessages.h"
</ins><span class="cx"> #include "Logging.h"
</span><span class="cx"> #include "NetworkConnectionToWebProcess.h"
</span><span class="cx"> #include "NetworkProcessCreationParameters.h"
</span><span class="lines">@@ -41,6 +42,7 @@
</span><span class="cx"> #include "SessionTracker.h"
</span><span class="cx"> #include "StatisticsData.h"
</span><span class="cx"> #include "WebCookieManager.h"
</span><ins>+#include "WebCoreArgumentCoders.h"
</ins><span class="cx"> #include "WebProcessPoolMessages.h"
</span><span class="cx"> #include "WebsiteData.h"
</span><span class="cx"> #include <WebCore/DNS.h>
</span><span class="lines">@@ -468,6 +470,20 @@
</span><span class="cx"> {
</span><span class="cx"> downloadManager().continueWillSendRequest(downloadID, request);
</span><span class="cx"> }
</span><ins>+
+void NetworkProcess::findPendingDownloadLocation(NetworkDataTask& networkDataTask, String suggestedFilename, ResponseCompletionHandler completionHandler)
+{
+ uint64_t destinationID = networkDataTask.pendingDownloadID().downloadID();
+ downloadProxyConnection()->send(Messages::DownloadProxy::DidStart(networkDataTask.currentRequest()), destinationID);
+
+ downloadManager().willDecidePendingDownloadDestination(networkDataTask, completionHandler);
+ downloadProxyConnection()->send(Messages::DownloadProxy::DecideDestinationWithSuggestedFilenameAsync(networkDataTask.pendingDownloadID(), suggestedFilename), destinationID);
+}
+
+void NetworkProcess::continueDecidePendingDownloadDestination(DownloadID downloadID, String destination, const SandboxExtension::Handle& sandboxExtensionHandle)
+{
+ downloadManager().continueDecidePendingDownloadDestination(downloadID, destination, sandboxExtensionHandle);
+}
</ins><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> void NetworkProcess::setCacheModel(uint32_t cm)
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkProcessh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h (196983 => 196984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h        2016-02-23 18:17:17 UTC (rev 196983)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h        2016-02-23 19:13:18 UTC (rev 196984)
</span><span class="lines">@@ -42,6 +42,7 @@
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><ins>+class DownloadID;
</ins><span class="cx"> class CertificateInfo;
</span><span class="cx"> class NetworkStorageSession;
</span><span class="cx"> class SecurityOrigin;
</span><span class="lines">@@ -99,6 +100,10 @@
</span><span class="cx"> void clearHSTSCache(WebCore::NetworkStorageSession&, std::chrono::system_clock::time_point modifiedSince);
</span><span class="cx"> #endif
</span><span class="cx">
</span><ins>+#if USE(NETWORK_SESSION)
+ void findPendingDownloadLocation(NetworkDataTask&, String suggestedFilename, ResponseCompletionHandler);
+#endif
+
</ins><span class="cx"> void prefetchDNS(const String&);
</span><span class="cx">
</span><span class="cx"> private:
</span><span class="lines">@@ -157,6 +162,7 @@
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><span class="cx"> void continueCanAuthenticateAgainstProtectionSpace(DownloadID, bool canAuthenticate);
</span><span class="cx"> void continueWillSendRequest(DownloadID, const WebCore::ResourceRequest&);
</span><ins>+ void continueDecidePendingDownloadDestination(DownloadID, String destination, const SandboxExtension::Handle& sandboxExtensionHandle);
</ins><span class="cx"> #endif
</span><span class="cx"> void setCacheModel(uint32_t);
</span><span class="cx"> void allowSpecificHTTPSCertificateForHost(const WebCore::CertificateInfo&, const String& host);
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkProcessmessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in (196983 => 196984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in        2016-02-23 18:17:17 UTC (rev 196983)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in        2016-02-23 19:13:18 UTC (rev 196984)
</span><span class="lines">@@ -47,6 +47,7 @@
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><span class="cx"> ContinueCanAuthenticateAgainstProtectionSpace(WebKit::DownloadID downloadID, bool canAuthenticate)
</span><span class="cx"> ContinueWillSendRequest(WebKit::DownloadID downloadID, WebCore::ResourceRequest request)
</span><ins>+ ContinueDecidePendingDownloadDestination(WebKit::DownloadID downloadID, String destination, WebKit::SandboxExtension::Handle sandboxExtensionHandle)
</ins><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> SetProcessSuppressionEnabled(bool flag)
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscocoaNetworkDataTaskCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm (196983 => 196984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm        2016-02-23 18:17:17 UTC (rev 196983)
+++ trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm        2016-02-23 19:13:18 UTC (rev 196984)
</span><span class="lines">@@ -28,17 +28,25 @@
</span><span class="cx">
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><span class="cx">
</span><ins>+#import "Download.h"
+#import "DownloadProxyMessages.h"
+#import "NetworkProcess.h"
+#import "WebCoreArgumentCoders.h"
</ins><span class="cx"> #import <WebCore/AuthenticationChallenge.h>
</span><span class="cx"> #import <WebCore/CFNetworkSPI.h>
</span><span class="cx"> #import <WebCore/ResourceRequest.h>
</span><span class="cx"> #import <wtf/MainThread.h>
</span><span class="cx">
</span><ins>+@interface NSURLSessionTask ()
+@property (readwrite, copy) NSString *_pathToDownloadTaskFile;
+@end
+
</ins><span class="cx"> namespace WebKit {
</span><span class="cx">
</span><span class="cx"> NetworkDataTask::NetworkDataTask(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& requestWithCredentials, WebCore::StoredCredentials storedCredentials, WebCore::ContentSniffingPolicy shouldContentSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect)
</span><span class="cx"> : m_failureTimer(*this, &NetworkDataTask::failureTimerFired)
</span><span class="cx"> , m_session(session)
</span><del>- , m_client(client)
</del><ins>+ , m_client(&client)
</ins><span class="cx"> , m_lastHTTPMethod(requestWithCredentials.httpMethod())
</span><span class="cx"> , m_firstRequest(requestWithCredentials)
</span><span class="cx"> , m_shouldClearReferrerOnHTTPSToHTTPRedirect(shouldClearReferrerOnHTTPSToHTTPRedirect)
</span><span class="lines">@@ -86,6 +94,42 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void NetworkDataTask::didSendData(uint64_t totalBytesSent, uint64_t totalBytesExpectedToSend)
+{
+ if (m_client)
+ m_client->didSendData(totalBytesSent, totalBytesExpectedToSend);
+}
+
+void NetworkDataTask::didReceiveChallenge(const WebCore::AuthenticationChallenge& challenge, ChallengeCompletionHandler completionHandler)
+{
+ if (m_client)
+ m_client->didReceiveChallenge(challenge, completionHandler);
+}
+
+void NetworkDataTask::didCompleteWithError(const WebCore::ResourceError& error)
+{
+ if (m_client)
+ m_client->didCompleteWithError(error);
+}
+
+void NetworkDataTask::didReceiveResponse(const WebCore::ResourceResponse& response, ResponseCompletionHandler completionHandler)
+{
+ if (m_client)
+ m_client->didReceiveResponseNetworkSession(response, completionHandler);
+}
+
+void NetworkDataTask::didReceiveData(RefPtr<WebCore::SharedBuffer>&& data)
+{
+ if (m_client)
+ m_client->didReceiveData(WTFMove(data));
+}
+
+void NetworkDataTask::didBecomeDownload()
+{
+ if (m_client)
+ m_client->didBecomeDownload();
+}
+
</ins><span class="cx"> void NetworkDataTask::willPerformHTTPRedirection(const WebCore::ResourceResponse& redirectResponse, WebCore::ResourceRequest&& request, RedirectCompletionHandler completionHandler)
</span><span class="cx"> {
</span><span class="cx"> if (redirectResponse.httpStatusCode() == 307 || redirectResponse.httpStatusCode() == 308) {
</span><span class="lines">@@ -116,7 +160,8 @@
</span><span class="cx"> request.clearHTTPOrigin();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- client().willPerformHTTPRedirection(redirectResponse, request, completionHandler);
</del><ins>+ if (m_client)
+ m_client->willPerformHTTPRedirection(redirectResponse, request, completionHandler);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void NetworkDataTask::scheduleFailure(FailureType type)
</span><span class="lines">@@ -133,11 +178,13 @@
</span><span class="cx"> switch (m_scheduledFailureType) {
</span><span class="cx"> case BlockedFailure:
</span><span class="cx"> m_scheduledFailureType = NoFailure;
</span><del>- client().wasBlocked();
</del><ins>+ if (m_client)
+ m_client->wasBlocked();
</ins><span class="cx"> return;
</span><span class="cx"> case InvalidURLFailure:
</span><span class="cx"> m_scheduledFailureType = NoFailure;
</span><del>- client().cannotShowURL();
</del><ins>+ if (m_client)
+ m_client->cannotShowURL();
</ins><span class="cx"> return;
</span><span class="cx"> case NoFailure:
</span><span class="cx"> ASSERT_NOT_REACHED();
</span><span class="lines">@@ -146,6 +193,22 @@
</span><span class="cx"> ASSERT_NOT_REACHED();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void NetworkDataTask::findPendingDownloadLocation(ResponseCompletionHandler completionHandler)
+{
+ NetworkProcess::singleton().findPendingDownloadLocation(*this, m_task.get().response.suggestedFilename, completionHandler);
+}
+
+void NetworkDataTask::setPendingDownloadLocation(const WTF::String& filename, const SandboxExtension::Handle& sandboxExtensionHandle)
+{
+ ASSERT(!m_sandboxExtension);
+ m_sandboxExtension = SandboxExtension::create(sandboxExtensionHandle);
+ if (m_sandboxExtension)
+ m_sandboxExtension->consume();
+
+ m_pendingDownloadLocation = filename;
+ m_task.get()._pathToDownloadTaskFile = filename;
+}
+
</ins><span class="cx"> bool NetworkDataTask::tryPasswordBasedAuthentication(const WebCore::AuthenticationChallenge& challenge, ChallengeCompletionHandler completionHandler)
</span><span class="cx"> {
</span><span class="cx"> if (!challenge.protectionSpace().isPasswordBased())
</span><span class="lines">@@ -166,6 +229,16 @@
</span><span class="cx"> return false;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void NetworkDataTask::transferSandboxExtensionToDownload(Download& download)
+{
+ download.setSandboxExtension(WTFMove(m_sandboxExtension));
+}
+
+WebCore::ResourceRequest NetworkDataTask::currentRequest()
+{
+ return [m_task currentRequest];
+}
+
</ins><span class="cx"> void NetworkDataTask::cancel()
</span><span class="cx"> {
</span><span class="cx"> [m_task cancel];
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscocoaNetworkSessionCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm (196983 => 196984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm        2016-02-23 18:17:17 UTC (rev 196983)
+++ trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm        2016-02-23 19:13:18 UTC (rev 196984)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><span class="cx">
</span><span class="cx"> #import "CustomProtocolManager.h"
</span><ins>+#import "DataReference.h"
</ins><span class="cx"> #import "Download.h"
</span><span class="cx"> #import "NetworkLoad.h"
</span><span class="cx"> #import "NetworkProcess.h"
</span><span class="lines">@@ -98,7 +99,7 @@
</span><span class="cx"> - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
</span><span class="cx"> {
</span><span class="cx"> if (auto* networkDataTask = _session->dataTaskForIdentifier(task.taskIdentifier))
</span><del>- networkDataTask->client().didSendData(totalBytesSent, totalBytesExpectedToSend);
</del><ins>+ networkDataTask->didSendData(totalBytesSent, totalBytesExpectedToSend);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLRequest *))completionHandler
</span><span class="lines">@@ -125,14 +126,18 @@
</span><span class="cx"> if (networkDataTask->tryPasswordBasedAuthentication(challenge, challengeCompletionHandler))
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- networkDataTask->client().didReceiveChallenge(challenge, challengeCompletionHandler);
</del><ins>+ networkDataTask->didReceiveChallenge(challenge, challengeCompletionHandler);
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
</span><span class="cx"> {
</span><span class="cx"> if (auto* networkDataTask = _session->dataTaskForIdentifier(task.taskIdentifier))
</span><del>- networkDataTask->client().didCompleteWithError(error);
</del><ins>+ networkDataTask->didCompleteWithError(error);
+ else if (auto* download = WebKit::NetworkProcess::singleton().downloadManager().download(_session->downloadID(task.taskIdentifier))) {
+ if (error)
+ download->didFail(error, { }); // FIXME: Give some actual data here for resuming.
+ }
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
</span><span class="lines">@@ -142,7 +147,7 @@
</span><span class="cx"> WebCore::ResourceResponse resourceResponse(response);
</span><span class="cx"> copyTimingData([dataTask _timingData], resourceResponse.resourceLoadTiming());
</span><span class="cx"> auto completionHandlerCopy = Block_copy(completionHandler);
</span><del>- networkDataTask->client().didReceiveResponseNetworkSession(resourceResponse, [completionHandlerCopy](WebCore::PolicyAction policyAction) {
</del><ins>+ networkDataTask->didReceiveResponse(resourceResponse, [completionHandlerCopy, resourceResponse](WebCore::PolicyAction policyAction) {
</ins><span class="cx"> completionHandlerCopy(toNSURLSessionResponseDisposition(policyAction));
</span><span class="cx"> Block_release(completionHandlerCopy);
</span><span class="cx"> });
</span><span class="lines">@@ -152,13 +157,12 @@
</span><span class="cx"> - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
</span><span class="cx"> {
</span><span class="cx"> if (auto* networkDataTask = _session->dataTaskForIdentifier(dataTask.taskIdentifier))
</span><del>- networkDataTask->client().didReceiveData(WebCore::SharedBuffer::wrapNSData(data));
</del><ins>+ networkDataTask->didReceiveData(WebCore::SharedBuffer::wrapNSData(data));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
</span><span class="cx"> {
</span><span class="cx"> auto downloadID = _session->takeDownloadID([downloadTask taskIdentifier]);
</span><del>- notImplemented();
</del><span class="cx"> if (auto* download = WebKit::NetworkProcess::singleton().downloadManager().download(downloadID))
</span><span class="cx"> download->didFinish();
</span><span class="cx"> }
</span><span class="lines">@@ -183,11 +187,13 @@
</span><span class="cx"> auto downloadID = networkDataTask->pendingDownloadID();
</span><span class="cx"> auto& downloadManager = WebKit::NetworkProcess::singleton().downloadManager();
</span><span class="cx"> auto download = std::make_unique<WebKit::Download>(downloadManager, downloadID);
</span><del>- download->didStart([downloadTask currentRequest]);
</del><ins>+ networkDataTask->transferSandboxExtensionToDownload(*download);
+ ASSERT(WebCore::fileExists(networkDataTask->pendingDownloadLocation()));
+ download->didCreateDestination(networkDataTask->pendingDownloadLocation());
</ins><span class="cx"> download->didReceiveResponse([downloadTask response]);
</span><span class="cx"> auto pendingDownload = downloadManager.dataTaskBecameDownloadTask(downloadID, WTFMove(download));
</span><span class="cx">
</span><del>- networkDataTask->client().didBecomeDownload();
</del><ins>+ networkDataTask->didBecomeDownload();
</ins><span class="cx">
</span><span class="cx"> _session->addDownloadID([downloadTask taskIdentifier], downloadID);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessDownloadsDownloadProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Downloads/DownloadProxy.cpp (196983 => 196984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Downloads/DownloadProxy.cpp        2016-02-23 18:17:17 UTC (rev 196983)
+++ trunk/Source/WebKit2/UIProcess/Downloads/DownloadProxy.cpp        2016-02-23 19:13:18 UTC (rev 196984)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> #include "WebProcessMessages.h"
</span><span class="cx"> #include "WebProcessPool.h"
</span><span class="cx"> #include "WebProtectionSpace.h"
</span><ins>+#include <WebCore/FileSystem.h>
</ins><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx"> #include <wtf/text/WTFString.h>
</span><span class="cx">
</span><span class="lines">@@ -170,6 +171,24 @@
</span><span class="cx"> result = m_processPool->downloadClient().shouldDecodeSourceDataOfMIMEType(m_processPool.get(), this, mimeType);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+#if USE(NETWORK_SESSION)
+void DownloadProxy::decideDestinationWithSuggestedFilenameAsync(DownloadID downloadID, const String& suggestedFilename)
+{
+ bool allowOverwrite = false;
+
+ if (!m_processPool)
+ return;
+
+ String destination = m_processPool->downloadClient().decideDestinationWithSuggestedFilename(m_processPool.get(), this, suggestedFilename, allowOverwrite);
+
+ SandboxExtension::Handle sandboxExtensionHandle;
+ if (!destination.isNull())
+ SandboxExtension::createHandle(destination, SandboxExtension::ReadWrite, sandboxExtensionHandle);
+
+ if (NetworkProcessProxy* networkProcess = m_processPool->networkProcess())
+ networkProcess->connection()->send(Messages::NetworkProcess::ContinueDecidePendingDownloadDestination(downloadID, destination, sandboxExtensionHandle), 0);
+}
+#else
</ins><span class="cx"> void DownloadProxy::decideDestinationWithSuggestedFilename(const String& filename, String& destination, bool& allowOverwrite, SandboxExtension::Handle& sandboxExtensionHandle)
</span><span class="cx"> {
</span><span class="cx"> allowOverwrite = false;
</span><span class="lines">@@ -182,6 +201,7 @@
</span><span class="cx"> if (!destination.isNull())
</span><span class="cx"> SandboxExtension::createHandle(destination, SandboxExtension::ReadWrite, sandboxExtensionHandle);
</span><span class="cx"> }
</span><ins>+#endif
</ins><span class="cx">
</span><span class="cx"> void DownloadProxy::didCreateDestination(const String& path)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessDownloadsDownloadProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Downloads/DownloadProxy.h (196983 => 196984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Downloads/DownloadProxy.h        2016-02-23 18:17:17 UTC (rev 196983)
+++ trunk/Source/WebKit2/UIProcess/Downloads/DownloadProxy.h        2016-02-23 19:13:18 UTC (rev 196984)
</span><span class="lines">@@ -47,6 +47,7 @@
</span><span class="cx">
</span><span class="cx"> namespace WebKit {
</span><span class="cx">
</span><ins>+class DownloadID;
</ins><span class="cx"> class DownloadProxyMap;
</span><span class="cx"> class WebPageProxy;
</span><span class="cx"> class WebProcessPool;
</span><span class="lines">@@ -81,7 +82,9 @@
</span><span class="cx"> void didReceiveResponse(const WebCore::ResourceResponse&);
</span><span class="cx"> void didReceiveData(uint64_t length);
</span><span class="cx"> void shouldDecodeSourceDataOfMIMEType(const String& mimeType, bool& result);
</span><ins>+#if !USE(NETWORK_SESSION)
</ins><span class="cx"> void decideDestinationWithSuggestedFilename(const String& filename, String& destination, bool& allowOverwrite, SandboxExtension::Handle& sandboxExtensionHandle);
</span><ins>+#endif
</ins><span class="cx"> void didCreateDestination(const String& path);
</span><span class="cx"> void didFinish();
</span><span class="cx"> void didFail(const WebCore::ResourceError&, const IPC::DataReference& resumeData);
</span><span class="lines">@@ -89,6 +92,7 @@
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><span class="cx"> void canAuthenticateAgainstProtectionSpace(const WebCore::ProtectionSpace&);
</span><span class="cx"> void willSendRequest(const WebCore::ResourceRequest& redirectRequest, const WebCore::ResourceResponse& redirectResponse);
</span><ins>+ void decideDestinationWithSuggestedFilenameAsync(DownloadID, const String& suggestedFilename);
</ins><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> DownloadProxyMap& m_downloadProxyMap;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessDownloadsDownloadProxymessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Downloads/DownloadProxy.messages.in (196983 => 196984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Downloads/DownloadProxy.messages.in        2016-02-23 18:17:17 UTC (rev 196983)
+++ trunk/Source/WebKit2/UIProcess/Downloads/DownloadProxy.messages.in        2016-02-23 19:13:18 UTC (rev 196984)
</span><span class="lines">@@ -26,12 +26,15 @@
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><span class="cx"> WillSendRequest(WebCore::ResourceRequest redirectRequest, WebCore::ResourceResponse redirectResponse));
</span><span class="cx"> CanAuthenticateAgainstProtectionSpace(WebCore::ProtectionSpace protectionSpace)
</span><ins>+ DecideDestinationWithSuggestedFilenameAsync(WebKit::DownloadID downloadID, String suggestedFilename)
</ins><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> DidReceiveResponse(WebCore::ResourceResponse response)
</span><span class="cx"> DidReceiveData(uint64_t length)
</span><span class="cx"> ShouldDecodeSourceDataOfMIMEType(String mimeType) -> (bool result)
</span><ins>+#if !USE(NETWORK_SESSION)
</ins><span class="cx"> DecideDestinationWithSuggestedFilename(String filename) -> (String destination, bool allowOverwrite, WebKit::SandboxExtension::Handle sandboxExtensionHandle)
</span><ins>+#endif
</ins><span class="cx"> DidCreateDestination(String path)
</span><span class="cx"> DidFinish()
</span><span class="cx"> DidFail(WebCore::ResourceError error, IPC::DataReference resumeData)
</span></span></pre>
</div>
</div>
</body>
</html>