summaryrefslogtreecommitdiff
path: root/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@qt.io>2017-05-30 12:48:17 +0200
committerOswald Buddenhagen <oswald.buddenhagen@qt.io>2017-05-30 12:48:17 +0200
commit881da28418d380042aa95a97f0cbd42560a64f7c (patch)
treea794dff3274695e99c651902dde93d934ea7a5af /Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp
parent7e104c57a70fdf551bb3d22a5d637cdcbc69dbea (diff)
parent0fcedcd17cc00d3dd44c718b3cb36c1033319671 (diff)
downloadqtwebkit-881da28418d380042aa95a97f0cbd42560a64f7c.tar.gz
Merge 'wip/next' into dev
Change-Id: Iff9ee5e23bb326c4371ec8ed81d56f2f05d680e9
Diffstat (limited to 'Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp')
-rw-r--r--Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp192
1 files changed, 110 insertions, 82 deletions
diff --git a/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp b/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp
index b21815418..812919890 100644
--- a/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp
+++ b/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp
@@ -26,46 +26,50 @@
#include "config.h"
#include "NetworkConnectionToWebProcess.h"
-#include "BlobRegistrationData.h"
-#include "ConnectionStack.h"
#include "NetworkBlobRegistry.h"
#include "NetworkConnectionToWebProcessMessages.h"
+#include "NetworkLoad.h"
#include "NetworkProcess.h"
#include "NetworkResourceLoadParameters.h"
#include "NetworkResourceLoader.h"
#include "NetworkResourceLoaderMessages.h"
#include "RemoteNetworkingContext.h"
-#include "SyncNetworkResourceLoader.h"
-#include <WebCore/BlobData.h>
+#include "SessionTracker.h"
+#include <WebCore/NotImplemented.h>
+#include <WebCore/PingHandle.h>
#include <WebCore/PlatformCookieJar.h>
#include <WebCore/ResourceLoaderOptions.h>
#include <WebCore/ResourceRequest.h>
-#include <WebCore/RunLoop.h>
-
-#if ENABLE(NETWORK_PROCESS)
+#include <WebCore/SessionID.h>
+#include <wtf/RunLoop.h>
using namespace WebCore;
namespace WebKit {
-PassRefPtr<NetworkConnectionToWebProcess> NetworkConnectionToWebProcess::create(CoreIPC::Connection::Identifier connectionIdentifier)
+Ref<NetworkConnectionToWebProcess> NetworkConnectionToWebProcess::create(IPC::Connection::Identifier connectionIdentifier)
{
- return adoptRef(new NetworkConnectionToWebProcess(connectionIdentifier));
+ return adoptRef(*new NetworkConnectionToWebProcess(connectionIdentifier));
}
-NetworkConnectionToWebProcess::NetworkConnectionToWebProcess(CoreIPC::Connection::Identifier connectionIdentifier)
- : m_serialLoadingEnabled(false)
+NetworkConnectionToWebProcess::NetworkConnectionToWebProcess(IPC::Connection::Identifier connectionIdentifier)
{
- m_connection = CoreIPC::Connection::createServerConnection(connectionIdentifier, this, RunLoop::main());
- m_connection->setOnlySendMessagesAsDispatchWhenWaitingForSyncReplyWhenProcessingSuchAMessage(true);
+ m_connection = IPC::Connection::createServerConnection(connectionIdentifier, *this);
m_connection->open();
}
NetworkConnectionToWebProcess::~NetworkConnectionToWebProcess()
{
}
+
+void NetworkConnectionToWebProcess::didCleanupResourceLoader(NetworkResourceLoader& loader)
+{
+ ASSERT(m_networkResourceLoaders.get(loader.identifier()) == &loader);
+
+ m_networkResourceLoaders.remove(loader.identifier());
+}
-void NetworkConnectionToWebProcess::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageDecoder& decoder)
+void NetworkConnectionToWebProcess::didReceiveMessage(IPC::Connection& connection, IPC::MessageDecoder& decoder)
{
if (decoder.messageReceiverName() == Messages::NetworkConnectionToWebProcess::messageReceiverName()) {
didReceiveNetworkConnectionToWebProcessMessage(connection, decoder);
@@ -82,7 +86,7 @@ void NetworkConnectionToWebProcess::didReceiveMessage(CoreIPC::Connection* conne
ASSERT_NOT_REACHED();
}
-void NetworkConnectionToWebProcess::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageDecoder& decoder, OwnPtr<CoreIPC::MessageEncoder>& reply)
+void NetworkConnectionToWebProcess::didReceiveSyncMessage(IPC::Connection& connection, IPC::MessageDecoder& decoder, std::unique_ptr<IPC::MessageEncoder>& reply)
{
if (decoder.messageReceiverName() == Messages::NetworkConnectionToWebProcess::messageReceiverName()) {
didReceiveSyncNetworkConnectionToWebProcessMessage(connection, decoder, reply);
@@ -91,49 +95,50 @@ void NetworkConnectionToWebProcess::didReceiveSyncMessage(CoreIPC::Connection* c
ASSERT_NOT_REACHED();
}
-void NetworkConnectionToWebProcess::didClose(CoreIPC::Connection*)
+void NetworkConnectionToWebProcess::didClose(IPC::Connection&)
{
// Protect ourself as we might be otherwise be deleted during this function.
- RefPtr<NetworkConnectionToWebProcess> protector(this);
-
- HashMap<ResourceLoadIdentifier, RefPtr<NetworkResourceLoader>>::iterator end = m_networkResourceLoaders.end();
- for (HashMap<ResourceLoadIdentifier, RefPtr<NetworkResourceLoader>>::iterator i = m_networkResourceLoaders.begin(); i != end; ++i)
- i->value->abort();
+ Ref<NetworkConnectionToWebProcess> protector(*this);
- HashMap<ResourceLoadIdentifier, RefPtr<SyncNetworkResourceLoader>>::iterator syncEnd = m_syncNetworkResourceLoaders.end();
- for (HashMap<ResourceLoadIdentifier, RefPtr<SyncNetworkResourceLoader>>::iterator i = m_syncNetworkResourceLoaders.begin(); i != syncEnd; ++i)
- i->value->abort();
+ Vector<RefPtr<NetworkResourceLoader>> loaders;
+ copyValuesToVector(m_networkResourceLoaders, loaders);
+ for (auto& loader : loaders)
+ loader->abort();
+ ASSERT(m_networkResourceLoaders.isEmpty());
- NetworkBlobRegistry::shared().connectionToWebProcessDidClose(this);
-
- m_networkResourceLoaders.clear();
-
- NetworkProcess::shared().removeNetworkConnectionToWebProcess(this);
+ NetworkBlobRegistry::singleton().connectionToWebProcessDidClose(this);
+ NetworkProcess::singleton().removeNetworkConnectionToWebProcess(this);
}
-void NetworkConnectionToWebProcess::didReceiveInvalidMessage(CoreIPC::Connection*, CoreIPC::StringReference, CoreIPC::StringReference)
+void NetworkConnectionToWebProcess::didReceiveInvalidMessage(IPC::Connection&, IPC::StringReference, IPC::StringReference)
{
}
void NetworkConnectionToWebProcess::scheduleResourceLoad(const NetworkResourceLoadParameters& loadParameters)
{
- RefPtr<NetworkResourceLoader> loader = NetworkResourceLoader::create(loadParameters, this);
- m_networkResourceLoaders.add(loadParameters.identifier, loader);
- NetworkProcess::shared().networkResourceLoadScheduler().scheduleLoader(loader.get());
+ auto loader = NetworkResourceLoader::create(loadParameters, *this);
+ m_networkResourceLoaders.add(loadParameters.identifier, loader.ptr());
+ loader->start();
}
-void NetworkConnectionToWebProcess::performSynchronousLoad(const NetworkResourceLoadParameters& loadParameters, PassRefPtr<Messages::NetworkConnectionToWebProcess::PerformSynchronousLoad::DelayedReply> reply)
+void NetworkConnectionToWebProcess::performSynchronousLoad(const NetworkResourceLoadParameters& loadParameters, RefPtr<Messages::NetworkConnectionToWebProcess::PerformSynchronousLoad::DelayedReply>&& reply)
{
- RefPtr<SyncNetworkResourceLoader> loader = SyncNetworkResourceLoader::create(loadParameters, this, reply);
- m_syncNetworkResourceLoaders.add(loadParameters.identifier, loader);
- NetworkProcess::shared().networkResourceLoadScheduler().scheduleLoader(loader.get());
+ auto loader = NetworkResourceLoader::create(loadParameters, *this, WTFMove(reply));
+ m_networkResourceLoaders.add(loadParameters.identifier, loader.ptr());
+ loader->start();
+}
+
+void NetworkConnectionToWebProcess::loadPing(const NetworkResourceLoadParameters& loadParameters)
+{
+ RefPtr<NetworkingContext> context = RemoteNetworkingContext::create(loadParameters.sessionID, loadParameters.shouldClearReferrerOnHTTPSToHTTPRedirect);
+
+ // PingHandle manages its own lifetime, deleting itself when its purpose has been fulfilled.
+ new PingHandle(context.get(), loadParameters.request, loadParameters.allowStoredCredentials == AllowStoredCredentials, PingHandle::UsesAsyncCallbacks::Yes);
}
void NetworkConnectionToWebProcess::removeLoadIdentifier(ResourceLoadIdentifier identifier)
{
- RefPtr<SchedulableLoader> loader = m_networkResourceLoaders.take(identifier);
- if (!loader)
- loader = m_syncNetworkResourceLoaders.take(identifier);
+ RefPtr<NetworkResourceLoader> loader = m_networkResourceLoaders.get(identifier);
// It's possible we have no loader for this identifier if the NetworkProcess crashed and this was a respawned NetworkProcess.
if (!loader)
@@ -142,24 +147,29 @@ void NetworkConnectionToWebProcess::removeLoadIdentifier(ResourceLoadIdentifier
// Abort the load now, as the WebProcess won't be able to respond to messages any more which might lead
// to leaked loader resources (connections, threads, etc).
loader->abort();
+ ASSERT(!m_networkResourceLoaders.contains(identifier));
}
-void NetworkConnectionToWebProcess::servePendingRequests(uint32_t resourceLoadPriority)
+void NetworkConnectionToWebProcess::setDefersLoading(ResourceLoadIdentifier identifier, bool defers)
{
- NetworkProcess::shared().networkResourceLoadScheduler().servePendingRequests(static_cast<ResourceLoadPriority>(resourceLoadPriority));
+ RefPtr<NetworkResourceLoader> loader = m_networkResourceLoaders.get(identifier);
+ if (!loader)
+ return;
+
+ loader->setDefersLoading(defers);
}
-void NetworkConnectionToWebProcess::setSerialLoadingEnabled(bool enabled)
+void NetworkConnectionToWebProcess::prefetchDNS(const String& hostname)
{
- m_serialLoadingEnabled = enabled;
+ NetworkProcess::singleton().prefetchDNS(hostname);
}
-static NetworkStorageSession& storageSession(bool privateBrowsingEnabled)
+static NetworkStorageSession& storageSession(SessionID sessionID)
{
- if (privateBrowsingEnabled) {
- NetworkStorageSession* privateSession = RemoteNetworkingContext::privateBrowsingSession();
- if (privateSession)
- return *privateSession;
+ if (sessionID.isEphemeral()) {
+ NetworkStorageSession* privateStorageSession = SessionTracker::storageSession(sessionID);
+ if (privateStorageSession)
+ return *privateStorageSession;
// Some requests with private browsing mode requested may still be coming shortly after NetworkProcess was told to destroy its session.
// FIXME: Find a way to track private browsing sessions more rigorously.
LOG_ERROR("Private browsing was requested, but there was no session for it. Please file a bug unless you just disabled private browsing, in which case it's an expected race.");
@@ -167,79 +177,97 @@ static NetworkStorageSession& storageSession(bool privateBrowsingEnabled)
return NetworkStorageSession::defaultStorageSession();
}
-void NetworkConnectionToWebProcess::startDownload(bool privateBrowsingEnabled, uint64_t downloadID, const ResourceRequest& request)
+void NetworkConnectionToWebProcess::startDownload(SessionID sessionID, DownloadID downloadID, const ResourceRequest& request)
{
- // FIXME: Do something with the private browsing flag.
- NetworkProcess::shared().downloadManager().startDownload(downloadID, request);
+ NetworkProcess::singleton().downloadManager().startDownload(sessionID, downloadID, request);
}
-void NetworkConnectionToWebProcess::convertMainResourceLoadToDownload(uint64_t mainResourceLoadIdentifier, uint64_t downloadID, const ResourceRequest& request, const ResourceResponse& response)
+void NetworkConnectionToWebProcess::convertMainResourceLoadToDownload(SessionID sessionID, uint64_t mainResourceLoadIdentifier, DownloadID downloadID, const ResourceRequest& request, const ResourceResponse& response)
{
+ auto& networkProcess = NetworkProcess::singleton();
if (!mainResourceLoadIdentifier) {
- NetworkProcess::shared().downloadManager().startDownload(downloadID, request);
+ networkProcess.downloadManager().startDownload(sessionID, downloadID, request);
return;
}
NetworkResourceLoader* loader = m_networkResourceLoaders.get(mainResourceLoadIdentifier);
- NetworkProcess::shared().downloadManager().convertHandleToDownload(downloadID, loader->handle(), request, response);
+ if (!loader) {
+ // If we're trying to download a blob here loader can be null.
+ return;
+ }
+
+#if USE(NETWORK_SESSION)
+ loader->networkLoad()->convertTaskToDownload(downloadID);
+#else
+ networkProcess.downloadManager().convertHandleToDownload(downloadID, loader->networkLoad()->handle(), request, response);
// Unblock the URL connection operation queue.
- loader->handle()->continueDidReceiveResponse();
+ loader->networkLoad()->handle()->continueDidReceiveResponse();
- loader->didConvertHandleToDownload();
+ loader->didConvertToDownload();
+#endif
}
-void NetworkConnectionToWebProcess::cookiesForDOM(bool privateBrowsingEnabled, const KURL& firstParty, const KURL& url, String& result)
+void NetworkConnectionToWebProcess::cookiesForDOM(SessionID sessionID, const URL& firstParty, const URL& url, String& result)
{
- result = WebCore::cookiesForDOM(storageSession(privateBrowsingEnabled), firstParty, url);
+ result = WebCore::cookiesForDOM(storageSession(sessionID), firstParty, url);
}
-void NetworkConnectionToWebProcess::setCookiesFromDOM(bool privateBrowsingEnabled, const KURL& firstParty, const KURL& url, const String& cookieString)
+void NetworkConnectionToWebProcess::setCookiesFromDOM(SessionID sessionID, const URL& firstParty, const URL& url, const String& cookieString)
{
- WebCore::setCookiesFromDOM(storageSession(privateBrowsingEnabled), firstParty, url, cookieString);
+ WebCore::setCookiesFromDOM(storageSession(sessionID), firstParty, url, cookieString);
}
-void NetworkConnectionToWebProcess::cookiesEnabled(bool privateBrowsingEnabled, const KURL& firstParty, const KURL& url, bool& result)
+void NetworkConnectionToWebProcess::cookiesEnabled(SessionID sessionID, const URL& firstParty, const URL& url, bool& result)
{
- result = WebCore::cookiesEnabled(storageSession(privateBrowsingEnabled), firstParty, url);
+ result = WebCore::cookiesEnabled(storageSession(sessionID), firstParty, url);
}
-void NetworkConnectionToWebProcess::cookieRequestHeaderFieldValue(bool privateBrowsingEnabled, const KURL& firstParty, const KURL& url, String& result)
+void NetworkConnectionToWebProcess::cookieRequestHeaderFieldValue(SessionID sessionID, const URL& firstParty, const URL& url, String& result)
{
- result = WebCore::cookieRequestHeaderFieldValue(storageSession(privateBrowsingEnabled), firstParty, url);
+ result = WebCore::cookieRequestHeaderFieldValue(storageSession(sessionID), firstParty, url);
}
-void NetworkConnectionToWebProcess::getRawCookies(bool privateBrowsingEnabled, const KURL& firstParty, const KURL& url, Vector<Cookie>& result)
+void NetworkConnectionToWebProcess::getRawCookies(SessionID sessionID, const URL& firstParty, const URL& url, Vector<Cookie>& result)
{
- WebCore::getRawCookies(storageSession(privateBrowsingEnabled), firstParty, url, result);
+ WebCore::getRawCookies(storageSession(sessionID), firstParty, url, result);
}
-void NetworkConnectionToWebProcess::deleteCookie(bool privateBrowsingEnabled, const KURL& url, const String& cookieName)
+void NetworkConnectionToWebProcess::deleteCookie(SessionID sessionID, const URL& url, const String& cookieName)
{
- WebCore::deleteCookie(storageSession(privateBrowsingEnabled), url, cookieName);
+ WebCore::deleteCookie(storageSession(sessionID), url, cookieName);
}
-void NetworkConnectionToWebProcess::registerBlobURL(const KURL& url, const BlobRegistrationData& data)
+void NetworkConnectionToWebProcess::registerFileBlobURL(const URL& url, const String& path, const SandboxExtension::Handle& extensionHandle, const String& contentType)
{
- Vector<RefPtr<SandboxExtension>> extensions;
- for (size_t i = 0, count = data.sandboxExtensions().size(); i < count; ++i) {
- if (RefPtr<SandboxExtension> extension = SandboxExtension::create(data.sandboxExtensions()[i]))
- extensions.append(extension);
- }
+ RefPtr<SandboxExtension> extension = SandboxExtension::create(extensionHandle);
- NetworkBlobRegistry::shared().registerBlobURL(this, url, data.releaseData(), extensions);
+ NetworkBlobRegistry::singleton().registerFileBlobURL(this, url, path, WTFMove(extension), contentType);
}
-void NetworkConnectionToWebProcess::registerBlobURLFromURL(const KURL& url, const KURL& srcURL)
+void NetworkConnectionToWebProcess::registerBlobURL(const URL& url, Vector<BlobPart> blobParts, const String& contentType)
{
- NetworkBlobRegistry::shared().registerBlobURL(this, url, srcURL);
+ NetworkBlobRegistry::singleton().registerBlobURL(this, url, WTFMove(blobParts), contentType);
}
-void NetworkConnectionToWebProcess::unregisterBlobURL(const KURL& url)
+void NetworkConnectionToWebProcess::registerBlobURLFromURL(const URL& url, const URL& srcURL)
{
- NetworkBlobRegistry::shared().unregisterBlobURL(this, url);
+ NetworkBlobRegistry::singleton().registerBlobURL(this, url, srcURL);
}
-} // namespace WebKit
+void NetworkConnectionToWebProcess::registerBlobURLForSlice(const URL& url, const URL& srcURL, int64_t start, int64_t end)
+{
+ NetworkBlobRegistry::singleton().registerBlobURLForSlice(this, url, srcURL, start, end);
+}
-#endif // ENABLE(NETWORK_PROCESS)
+void NetworkConnectionToWebProcess::unregisterBlobURL(const URL& url)
+{
+ NetworkBlobRegistry::singleton().unregisterBlobURL(this, url);
+}
+
+void NetworkConnectionToWebProcess::blobSize(const URL& url, uint64_t& resultSize)
+{
+ resultSize = NetworkBlobRegistry::singleton().blobSize(this, url);
+}
+
+} // namespace WebKit