Handle downloads in the network process
https://bugs.webkit.org/show_bug.cgi?id=105117
Reviewed by Sam Weinig.
Start using the download manager in the network process.
* NetworkProcess/NetworkConnectionToWebProcess.cpp:
(WebKit::NetworkConnectionToWebProcess::startDownload):
Call through to the download manager.
* NetworkProcess/NetworkConnectionToWebProcess.messages.in:
Add StartDownload message.
* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::downloadManager):
Add "singleton" download manager.
(WebKit::NetworkProcess::didCreateDownload):
(WebKit::NetworkProcess::didDestroyDownload):
(WebKit::NetworkProcess::downloadProxyConnection):
Implement DownloadManager::Client.
* UIProcess/Network/NetworkProcessProxy.cpp:
(WebKit::NetworkProcessProxy::didReceiveMessage):
(WebKit::NetworkProcessProxy::didReceiveSyncMessage):
Call through to the message receiver map.
* WebProcess/Downloads/Download.cpp:
* WebProcess/Downloads/DownloadManager.cpp:
(WebKit::DownloadManager::downloadProxyConnection):
* WebProcess/Downloads/DownloadManager.h:
Rename connection to downloadProxyConnection.
* WebProcess/WebPage/WebFrame.cpp:
(WebKit::WebFrame::startDownload):
When using the network process, send a message to it with the request that needs to be downloaded.
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::downloadProxyConnection):
Return the connection to the UI process.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@137824 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebKit2/ChangeLog b/Source/WebKit2/ChangeLog
index 1709617..8e1bd38 100644
--- a/Source/WebKit2/ChangeLog
+++ b/Source/WebKit2/ChangeLog
@@ -1,3 +1,47 @@
+2012-12-15 Anders Carlsson <andersca@apple.com>
+
+ Handle downloads in the network process
+ https://bugs.webkit.org/show_bug.cgi?id=105117
+
+ Reviewed by Sam Weinig.
+
+ Start using the download manager in the network process.
+
+ * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+ (WebKit::NetworkConnectionToWebProcess::startDownload):
+ Call through to the download manager.
+
+ * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
+ Add StartDownload message.
+
+ * NetworkProcess/NetworkProcess.cpp:
+ (WebKit::NetworkProcess::downloadManager):
+ Add "singleton" download manager.
+
+ (WebKit::NetworkProcess::didCreateDownload):
+ (WebKit::NetworkProcess::didDestroyDownload):
+ (WebKit::NetworkProcess::downloadProxyConnection):
+ Implement DownloadManager::Client.
+
+ * UIProcess/Network/NetworkProcessProxy.cpp:
+ (WebKit::NetworkProcessProxy::didReceiveMessage):
+ (WebKit::NetworkProcessProxy::didReceiveSyncMessage):
+ Call through to the message receiver map.
+
+ * WebProcess/Downloads/Download.cpp:
+ * WebProcess/Downloads/DownloadManager.cpp:
+ (WebKit::DownloadManager::downloadProxyConnection):
+ * WebProcess/Downloads/DownloadManager.h:
+ Rename connection to downloadProxyConnection.
+
+ * WebProcess/WebPage/WebFrame.cpp:
+ (WebKit::WebFrame::startDownload):
+ When using the network process, send a message to it with the request that needs to be downloaded.
+
+ * WebProcess/WebProcess.cpp:
+ (WebKit::WebProcess::downloadProxyConnection):
+ Return the connection to the UI process.
+
2012-12-15 Sam Weinig <sam@webkit.org>
NSURLCache should be disabled in the WebProcess when using the NetworkProcess
diff --git a/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp b/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp
index 38100a8..c222ffc 100644
--- a/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp
+++ b/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp
@@ -166,6 +166,12 @@
}
}
+void NetworkConnectionToWebProcess::startDownload(bool privateBrowsingEnabled, uint64_t downloadID, const ResourceRequest& request)
+{
+ // FIXME: Do something with the private browsing flag.
+ NetworkProcess::shared().downloadManager().startDownload(downloadID, request);
+}
+
void NetworkConnectionToWebProcess::cookiesForDOM(bool privateBrowsingEnabled, const KURL& firstParty, const KURL& url, String& result)
{
result = WebCore::cookiesForDOM(networkingContext(privateBrowsingEnabled), firstParty, url);
diff --git a/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.h b/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.h
index 09a6e34..fdcea36 100644
--- a/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.h
+++ b/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.h
@@ -86,6 +86,7 @@
void suspendPendingRequests();
void resumePendingRequests();
void setSerialLoadingEnabled(bool);
+ void startDownload(bool privateBrowsingEnabled, uint64_t downloadID, const WebCore::ResourceRequest&);
void cookiesForDOM(bool privateBrowsingEnabled, const WebCore::KURL& firstParty, const WebCore::KURL&, String& result);
void setCookiesFromDOM(bool privateBrowsingEnabled, const WebCore::KURL& firstParty, const WebCore::KURL&, const String&);
void cookiesEnabled(bool privateBrowsingEnabled, const WebCore::KURL& firstParty, const WebCore::KURL&, bool& result);
diff --git a/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.messages.in b/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.messages.in
index 781a57b..a755faf 100644
--- a/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.messages.in
+++ b/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.messages.in
@@ -39,6 +39,8 @@
SetSerialLoadingEnabled(bool enabled) -> ()
+ StartDownload(bool privateBrowsingEnabled, uint64_t downloadID, WebCore::ResourceRequest request)
+
CookiesForDOM(bool privateBrowsingEnabled, WebCore::KURL firstParty, WebCore::KURL url) -> (WTF::String result)
SetCookiesFromDOM(bool privateBrowsingEnabled, WebCore::KURL firstParty, WebCore::KURL url, WTF::String cookieString)
CookiesEnabled(bool privateBrowsingEnabled, WebCore::KURL firstParty, WebCore::KURL url) -> (bool enabled)
diff --git a/Source/WebKit2/NetworkProcess/NetworkProcess.cpp b/Source/WebKit2/NetworkProcess/NetworkProcess.cpp
index 89a1a46..1a532bc 100644
--- a/Source/WebKit2/NetworkProcess/NetworkProcess.cpp
+++ b/Source/WebKit2/NetworkProcess/NetworkProcess.cpp
@@ -61,6 +61,12 @@
{
}
+DownloadManager& NetworkProcess::downloadManager()
+{
+ DEFINE_STATIC_LOCAL(DownloadManager, downloadManager, (this));
+ return downloadManager;
+}
+
void NetworkProcess::initialize(CoreIPC::Connection::Identifier serverIdentifier, WebCore::RunLoop* runLoop)
{
ASSERT(!m_uiConnection);
@@ -99,6 +105,21 @@
RunLoop::current()->stop();
}
+void NetworkProcess::didCreateDownload()
+{
+ disableTermination();
+}
+
+void NetworkProcess::didDestroyDownload()
+{
+ enableTermination();
+}
+
+CoreIPC::Connection* NetworkProcess::downloadProxyConnection()
+{
+ return m_uiConnection.get();
+}
+
void NetworkProcess::initializeNetworkProcess(const NetworkProcessCreationParameters& parameters)
{
#if !LOG_DISABLED
diff --git a/Source/WebKit2/NetworkProcess/NetworkProcess.h b/Source/WebKit2/NetworkProcess/NetworkProcess.h
index b3526eb..ab62d1b 100644
--- a/Source/WebKit2/NetworkProcess/NetworkProcess.h
+++ b/Source/WebKit2/NetworkProcess/NetworkProcess.h
@@ -30,6 +30,7 @@
#include "CacheModel.h"
#include "ChildProcess.h"
+#include "DownloadManager.h"
#include "NetworkResourceLoadScheduler.h"
#include <wtf/Forward.h>
@@ -42,7 +43,7 @@
class NetworkConnectionToWebProcess;
struct NetworkProcessCreationParameters;
-class NetworkProcess : ChildProcess {
+class NetworkProcess : ChildProcess, DownloadManager::Client {
WTF_MAKE_NONCOPYABLE(NetworkProcess);
public:
static NetworkProcess& shared();
@@ -53,6 +54,8 @@
NetworkResourceLoadScheduler& networkResourceLoadScheduler() { return m_networkResourceLoadScheduler; }
+ DownloadManager& downloadManager();
+
private:
NetworkProcess();
~NetworkProcess();
@@ -67,6 +70,11 @@
virtual void didClose(CoreIPC::Connection*) OVERRIDE;
virtual void didReceiveInvalidMessage(CoreIPC::Connection*, CoreIPC::StringReference messageReceiverName, CoreIPC::StringReference messageName) OVERRIDE;
+ // DownloadManager::Client
+ virtual void didCreateDownload() OVERRIDE;
+ virtual void didDestroyDownload() OVERRIDE;
+ virtual CoreIPC::Connection* downloadProxyConnection() OVERRIDE;
+
// Message Handlers
void didReceiveNetworkProcessMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder&);
void initializeNetworkProcess(const NetworkProcessCreationParameters&);
diff --git a/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.cpp b/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.cpp
index bcf0a9e..cf3fa50 100644
--- a/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.cpp
+++ b/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.cpp
@@ -26,6 +26,7 @@
#include "config.h"
#include "NetworkProcessProxy.h"
+#include "DownloadProxyMessages.h"
#include "NetworkProcessCreationParameters.h"
#include "NetworkProcessMessages.h"
#include "WebContext.h"
@@ -106,9 +107,20 @@
void NetworkProcessProxy::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::MessageDecoder& decoder)
{
+ if (m_messageReceiverMap.dispatchMessage(connection, messageID, decoder))
+ return;
+
didReceiveNetworkProcessProxyMessage(connection, messageID, decoder);
}
+void NetworkProcessProxy::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::MessageDecoder& decoder, OwnPtr<CoreIPC::MessageEncoder>& replyEncoder)
+{
+ if (m_messageReceiverMap.dispatchSyncMessage(connection, messageID, decoder, replyEncoder))
+ return;
+
+ ASSERT_NOT_REACHED();
+}
+
void NetworkProcessProxy::didClose(CoreIPC::Connection*)
{
if (m_downloadProxyMap)
diff --git a/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.h b/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.h
index c3402f9..8736c93 100644
--- a/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.h
+++ b/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.h
@@ -64,6 +64,7 @@
// CoreIPC::Connection::Client
virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder&) OVERRIDE;
+ virtual void didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder&, OwnPtr<CoreIPC::MessageEncoder>&) OVERRIDE;
virtual void didClose(CoreIPC::Connection*) OVERRIDE;
virtual void didReceiveInvalidMessage(CoreIPC::Connection*, CoreIPC::StringReference messageReceiverName, CoreIPC::StringReference messageName) OVERRIDE;
diff --git a/Source/WebKit2/WebProcess/Downloads/Download.cpp b/Source/WebKit2/WebProcess/Downloads/Download.cpp
index 638f67c..b3b6ef2 100644
--- a/Source/WebKit2/WebProcess/Downloads/Download.cpp
+++ b/Source/WebKit2/WebProcess/Downloads/Download.cpp
@@ -69,7 +69,7 @@
CoreIPC::Connection* Download::connection() const
{
- return m_downloadManager.connection();
+ return m_downloadManager.downloadProxyConnection();
}
void Download::didStart()
diff --git a/Source/WebKit2/WebProcess/Downloads/DownloadManager.cpp b/Source/WebKit2/WebProcess/Downloads/DownloadManager.cpp
index 28f63db..448bab4 100644
--- a/Source/WebKit2/WebProcess/Downloads/DownloadManager.cpp
+++ b/Source/WebKit2/WebProcess/Downloads/DownloadManager.cpp
@@ -83,9 +83,9 @@
m_client->didDestroyDownload();
}
-CoreIPC::Connection* DownloadManager::connection()
+CoreIPC::Connection* DownloadManager::downloadProxyConnection()
{
- return m_client->connection();
+ return m_client->downloadProxyConnection();
}
#if PLATFORM(QT)
diff --git a/Source/WebKit2/WebProcess/Downloads/DownloadManager.h b/Source/WebKit2/WebProcess/Downloads/DownloadManager.h
index 9eb96cd..ba36f83 100644
--- a/Source/WebKit2/WebProcess/Downloads/DownloadManager.h
+++ b/Source/WebKit2/WebProcess/Downloads/DownloadManager.h
@@ -56,7 +56,8 @@
virtual void didCreateDownload() = 0;
virtual void didDestroyDownload() = 0;
- virtual CoreIPC::Connection* connection() const = 0;
+ // This is the connection where DownloadProxy messages should be sent.
+ virtual CoreIPC::Connection* downloadProxyConnection() = 0;
};
explicit DownloadManager(Client*);
@@ -72,7 +73,7 @@
void didCreateDownload();
void didDestroyDownload();
- CoreIPC::Connection* connection();
+ CoreIPC::Connection* downloadProxyConnection();
#if PLATFORM(QT)
void startTransfer(uint64_t downloadID, const String& destination);
diff --git a/Source/WebKit2/WebProcess/WebPage/WebFrame.cpp b/Source/WebKit2/WebProcess/WebPage/WebFrame.cpp
index b374ab3..5de5c1b 100644
--- a/Source/WebKit2/WebProcess/WebPage/WebFrame.cpp
+++ b/Source/WebKit2/WebProcess/WebPage/WebFrame.cpp
@@ -76,6 +76,12 @@
#include <WebCore/LegacyWebArchive.h>
#endif
+#if ENABLE(NETWORK_PROCESS)
+#include "NetworkConnectionToWebProcessMessages.h"
+#include "NetworkProcessConnection.h"
+#include "WebCoreArgumentCoders.h"
+#endif
+
#ifndef NDEBUG
#include <wtf/RefCountedLeakCounter.h>
#endif
@@ -236,9 +242,18 @@
{
ASSERT(m_policyDownloadID);
- WebProcess::shared().downloadManager().startDownload(m_policyDownloadID, request);
-
+ uint64_t policyDownloadID = m_policyDownloadID;
m_policyDownloadID = 0;
+
+#if ENABLE(NETWORK_PROCESS)
+ if (WebProcess::shared().usesNetworkProcess()) {
+ bool privateBrowsingEnabled = m_coreFrame->loader()->networkingContext()->inPrivateBrowsingMode();
+ WebProcess::shared().networkConnection()->connection()->send(Messages::NetworkConnectionToWebProcess::StartDownload(privateBrowsingEnabled, policyDownloadID, request), 0);
+ return;
+ }
+#endif
+
+ WebProcess::shared().downloadManager().startDownload(policyDownloadID, request);
}
void WebFrame::convertHandleToDownload(ResourceHandle* handle, const ResourceRequest& request, const ResourceResponse& response)
diff --git a/Source/WebKit2/WebProcess/WebProcess.cpp b/Source/WebKit2/WebProcess/WebProcess.cpp
index 852c15e..436662d 100644
--- a/Source/WebKit2/WebProcess/WebProcess.cpp
+++ b/Source/WebKit2/WebProcess/WebProcess.cpp
@@ -229,6 +229,11 @@
enableTermination();
}
+CoreIPC::Connection* WebProcess::downloadProxyConnection()
+{
+ return m_connection.get();
+}
+
void WebProcess::initializeWebProcess(const WebProcessCreationParameters& parameters, CoreIPC::MessageDecoder& decoder)
{
ASSERT(m_pageMap.isEmpty());
@@ -1011,7 +1016,6 @@
m_networkProcessConnection = 0;
}
-
#endif
#if ENABLE(PLUGIN_PROCESS)
diff --git a/Source/WebKit2/WebProcess/WebProcess.h b/Source/WebKit2/WebProcess/WebProcess.h
index 454df1c..5372667 100644
--- a/Source/WebKit2/WebProcess/WebProcess.h
+++ b/Source/WebKit2/WebProcess/WebProcess.h
@@ -224,6 +224,7 @@
// DownloadManager::Client.
virtual void didCreateDownload() OVERRIDE;
virtual void didDestroyDownload() OVERRIDE;
+ virtual CoreIPC::Connection* downloadProxyConnection() OVERRIDE;
void initializeWebProcess(const WebProcessCreationParameters&, CoreIPC::MessageDecoder&);
void platformInitializeWebProcess(const WebProcessCreationParameters&, CoreIPC::MessageDecoder&);