diff options
author | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2017-05-30 12:48:17 +0200 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2017-05-30 12:48:17 +0200 |
commit | 881da28418d380042aa95a97f0cbd42560a64f7c (patch) | |
tree | a794dff3274695e99c651902dde93d934ea7a5af /Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp | |
parent | 7e104c57a70fdf551bb3d22a5d637cdcbc69dbea (diff) | |
parent | 0fcedcd17cc00d3dd44c718b3cb36c1033319671 (diff) | |
download | qtwebkit-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.cpp | 192 |
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 |