Title: [241008] trunk/Source
Revision
241008
Author
[email protected]
Date
2019-02-05 18:10:50 -0800 (Tue, 05 Feb 2019)

Log Message

Stop using blobRegistry in NetworkProcess
https://bugs.webkit.org/show_bug.cgi?id=194027

Patch by Alex Christensen <[email protected]> on 2019-02-05
Reviewed by Youenn Fablet.

Source/WebCore:

Also stop using NetworkBlobRegistry::singleton.
Instead, have the NetworkProcess own a NetworkBlobRegistry which owns a BlobRegistryImpl.
We now have to resolve all blob file references while we still have a
NetworkConnectionToWebProcess/NetworkProcess/NetworkBlobRegistry/BlobRegistryImpl instead of
using the singleton after we have passed everything to the loading code, but it works the same
as it did before.  We must consume the sandbox extension from the BlobRegistryImpl before using
the resolved files, so I pass around a Vector<RefPtr<WebCore::BlobDataFileReference>> so we know
which extensions to revoke.

* platform/network/BlobRegistryImpl.h:
* platform/network/FormData.cpp:
(WebCore::appendBlobResolved):
(WebCore::FormData::resolveBlobReferences):
* platform/network/FormData.h:
* platform/network/cf/FormDataStreamCFNet.cpp:
(WebCore::createHTTPBodyCFReadStream):
* platform/network/curl/CurlFormDataStream.cpp:
(WebCore::CurlFormDataStream::CurlFormDataStream):

Source/WebKit:

* NetworkProcess/Downloads/DownloadManager.cpp:
(WebKit::DownloadManager::startDownload):
* NetworkProcess/Downloads/PendingDownload.cpp:
(WebKit::PendingDownload::PendingDownload):
* NetworkProcess/Downloads/PendingDownload.h:
* NetworkProcess/FileAPI/NetworkBlobRegistry.cpp:
(WebKit::NetworkBlobRegistry::registerFileBlobURL):
(WebKit::NetworkBlobRegistry::registerBlobURL):
(WebKit::NetworkBlobRegistry::registerBlobURLOptionallyFileBacked):
(WebKit::NetworkBlobRegistry::registerBlobURLForSlice):
(WebKit::NetworkBlobRegistry::unregisterBlobURL):
(WebKit::NetworkBlobRegistry::blobSize):
(WebKit::NetworkBlobRegistry::writeBlobsToTemporaryFiles):
(WebKit::NetworkBlobRegistry::writeBlobToFilePath):
(WebKit::NetworkBlobRegistry::connectionToWebProcessDidClose):
(WebKit::NetworkBlobRegistry::filesInBlob):
(WebKit::NetworkBlobRegistry::singleton): Deleted.
* NetworkProcess/FileAPI/NetworkBlobRegistry.h:
(WebKit::NetworkBlobRegistry::blobRegistry):
* NetworkProcess/NetworkConnectionToWebProcess.cpp:
(WebKit::NetworkConnectionToWebProcess::didClose):
(WebKit::NetworkConnectionToWebProcess::resolveBlobReferences):
(WebKit::NetworkConnectionToWebProcess::scheduleResourceLoad):
(WebKit::NetworkConnectionToWebProcess::performSynchronousLoad):
(WebKit::NetworkConnectionToWebProcess::loadPing):
(WebKit::NetworkConnectionToWebProcess::preconnectTo):
(WebKit::NetworkConnectionToWebProcess::registerFileBlobURL):
(WebKit::NetworkConnectionToWebProcess::registerBlobURL):
(WebKit::NetworkConnectionToWebProcess::registerBlobURLFromURL):
(WebKit::NetworkConnectionToWebProcess::registerBlobURLOptionallyFileBacked):
(WebKit::NetworkConnectionToWebProcess::registerBlobURLForSlice):
(WebKit::NetworkConnectionToWebProcess::unregisterBlobURL):
(WebKit::NetworkConnectionToWebProcess::blobSize):
(WebKit::NetworkConnectionToWebProcess::writeBlobsToTemporaryFiles):
(WebKit::NetworkConnectionToWebProcess::filesInBlob):
(WebKit::NetworkConnectionToWebProcess::blobRegistry):
* NetworkProcess/NetworkConnectionToWebProcess.h:
* NetworkProcess/NetworkDataTask.cpp:
(WebKit::NetworkDataTask::create):
* NetworkProcess/NetworkDataTaskBlob.cpp:
(WebKit::NetworkDataTaskBlob::NetworkDataTaskBlob):
* NetworkProcess/NetworkDataTaskBlob.h:
* NetworkProcess/NetworkLoad.cpp:
(WebKit::NetworkLoad::NetworkLoad):
(WebKit::NetworkLoad::initialize):
* NetworkProcess/NetworkLoad.h:
* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::NetworkProcess):
(WebKit::NetworkProcess::removeNetworkConnectionToWebProcess):
* NetworkProcess/NetworkProcess.h:
(WebKit::NetworkProcess::networkBlobRegistry):
* NetworkProcess/NetworkProcessPlatformStrategies.cpp:
(WebKit::NetworkProcessPlatformStrategies::createBlobRegistry):
* NetworkProcess/NetworkResourceLoader.cpp:
(WebKit::m_shouldCaptureExtraNetworkLoadMetrics):
(WebKit::NetworkResourceLoader::startNetworkLoad):
* NetworkProcess/PreconnectTask.cpp:
* NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp:
(WebKit::NetworkCache::SpeculativeLoad::SpeculativeLoad):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (241007 => 241008)


--- trunk/Source/WebCore/ChangeLog	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebCore/ChangeLog	2019-02-06 02:10:50 UTC (rev 241008)
@@ -1,3 +1,29 @@
+2019-02-05  Alex Christensen  <[email protected]>
+
+        Stop using blobRegistry in NetworkProcess
+        https://bugs.webkit.org/show_bug.cgi?id=194027
+
+        Reviewed by Youenn Fablet.
+
+        Also stop using NetworkBlobRegistry::singleton.
+        Instead, have the NetworkProcess own a NetworkBlobRegistry which owns a BlobRegistryImpl.
+        We now have to resolve all blob file references while we still have a
+        NetworkConnectionToWebProcess/NetworkProcess/NetworkBlobRegistry/BlobRegistryImpl instead of
+        using the singleton after we have passed everything to the loading code, but it works the same
+        as it did before.  We must consume the sandbox extension from the BlobRegistryImpl before using
+        the resolved files, so I pass around a Vector<RefPtr<WebCore::BlobDataFileReference>> so we know
+        which extensions to revoke.
+
+        * platform/network/BlobRegistryImpl.h:
+        * platform/network/FormData.cpp:
+        (WebCore::appendBlobResolved):
+        (WebCore::FormData::resolveBlobReferences):
+        * platform/network/FormData.h:
+        * platform/network/cf/FormDataStreamCFNet.cpp:
+        (WebCore::createHTTPBodyCFReadStream):
+        * platform/network/curl/CurlFormDataStream.cpp:
+        (WebCore::CurlFormDataStream::CurlFormDataStream):
+
 2019-02-05  Truitt Savell  <[email protected]>
 
         Unreviewed, rolling out r240984.

Modified: trunk/Source/WebCore/platform/network/BlobRegistryImpl.h (241007 => 241008)


--- trunk/Source/WebCore/platform/network/BlobRegistryImpl.h	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebCore/platform/network/BlobRegistryImpl.h	2019-02-06 02:10:50 UTC (rev 241008)
@@ -56,7 +56,6 @@
     Ref<ResourceHandle> createResourceHandle(const ResourceRequest&, ResourceHandleClient*);
     void writeBlobToFilePath(const URL& blobURL, const String& path, Function<void(bool success)>&& completionHandler);
 
-private:
     void appendStorageItems(BlobData*, const BlobDataItemList&, long long offset, long long length);
 
     void registerFileBlobURL(const URL&, Ref<BlobDataFileReference>&&, const String& contentType) override;
@@ -78,6 +77,7 @@
 
     bool populateBlobsForFileWriting(const Vector<String>& blobURLs, Vector<BlobForFileWriting>&);
 
+private:
     HashMap<String, RefPtr<BlobData>> m_blobs;
 };
 

Modified: trunk/Source/WebCore/platform/network/FormData.cpp (241007 => 241008)


--- trunk/Source/WebCore/platform/network/FormData.cpp	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebCore/platform/network/FormData.cpp	2019-02-06 02:10:50 UTC (rev 241008)
@@ -311,14 +311,14 @@
     return Latin1Encoding().decode(reinterpret_cast<const char*>(bytes.data()), bytes.size());
 }
 
-static void appendBlobResolved(FormData* formData, const URL& url)
+static void appendBlobResolved(BlobRegistry& blobRegistry, FormData& formData, const URL& url)
 {
-    if (!blobRegistry().isBlobRegistryImpl()) {
+    if (!blobRegistry.isBlobRegistryImpl()) {
         LOG_ERROR("Tried to resolve a blob without a usable registry");
         return;
     }
 
-    BlobData* blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(url);
+    auto* blobData = static_cast<BlobRegistryImpl&>(blobRegistry).getBlobDataFromURL(url);
     if (!blobData) {
         LOG_ERROR("Could not get blob data from a registry");
         return;
@@ -327,15 +327,15 @@
     for (const auto& blobItem : blobData->items()) {
         if (blobItem.type() == BlobDataItem::Type::Data) {
             ASSERT(blobItem.data().data());
-            formData->appendData(blobItem.data().data()->data() + static_cast<int>(blobItem.offset()), static_cast<int>(blobItem.length()));
+            formData.appendData(blobItem.data().data()->data() + static_cast<int>(blobItem.offset()), static_cast<int>(blobItem.length()));
         } else if (blobItem.type() == BlobDataItem::Type::File)
-            formData->appendFileRange(blobItem.file()->path(), blobItem.offset(), blobItem.length(), blobItem.file()->expectedModificationTime());
+            formData.appendFileRange(blobItem.file()->path(), blobItem.offset(), blobItem.length(), blobItem.file()->expectedModificationTime());
         else
             ASSERT_NOT_REACHED();
     }
 }
 
-Ref<FormData> FormData::resolveBlobReferences()
+Ref<FormData> FormData::resolveBlobReferences(BlobRegistry& blobRegistry)
 {
     // First check if any blobs needs to be resolved, or we can take the fast path.
     bool hasBlob = false;
@@ -361,7 +361,7 @@
             }, [&] (const FormDataElement::EncodedFileData& fileData) {
                 newFormData->appendFileRange(fileData.filename, fileData.fileStart, fileData.fileLength, fileData.expectedFileModificationTime, fileData.shouldGenerateFile);
             }, [&] (const FormDataElement::EncodedBlobData& blobData) {
-                appendBlobResolved(newFormData.ptr(), blobData.url);
+                appendBlobResolved(blobRegistry, newFormData.get(), blobData.url);
             }
         );
     }

Modified: trunk/Source/WebCore/platform/network/FormData.h (241007 => 241008)


--- trunk/Source/WebCore/platform/network/FormData.h	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebCore/platform/network/FormData.h	2019-02-06 02:10:50 UTC (rev 241008)
@@ -29,6 +29,7 @@
 
 namespace WebCore {
 
+class BlobRegistry;
 class DOMFormData;
 class Document;
 class File;
@@ -226,7 +227,7 @@
 
     // Resolve all blob references so we only have file and data.
     // If the FormData has no blob references to resolve, this is returned.
-    Ref<FormData> resolveBlobReferences();
+    WEBCORE_EXPORT Ref<FormData> resolveBlobReferences(BlobRegistry&);
 
     bool isEmpty() const { return m_elements.isEmpty(); }
     const Vector<FormDataElement>& elements() const { return m_elements; }

Modified: trunk/Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp (241007 => 241008)


--- trunk/Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp	2019-02-06 02:10:50 UTC (rev 241008)
@@ -30,6 +30,7 @@
 #include "FormDataStreamCFNet.h"
 
 #include "BlobData.h"
+#include "BlobRegistry.h"
 #include "FormData.h"
 #include <sys/stat.h>
 #include <sys/types.h>
@@ -372,7 +373,7 @@
 
 RetainPtr<CFReadStreamRef> createHTTPBodyCFReadStream(FormData& formData)
 {
-    auto resolvedFormData = formData.resolveBlobReferences();
+    auto resolvedFormData = formData.resolveBlobReferences(blobRegistry());
 
     // Precompute the content length so CFNetwork doesn't use chunked mode.
     unsigned long long length = 0;

Modified: trunk/Source/WebCore/platform/network/curl/CurlFormDataStream.cpp (241007 => 241008)


--- trunk/Source/WebCore/platform/network/curl/CurlFormDataStream.cpp	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebCore/platform/network/curl/CurlFormDataStream.cpp	2019-02-06 02:10:50 UTC (rev 241008)
@@ -34,6 +34,7 @@
 
 #if USE(CURL)
 
+#include "BlobRegistry.h"
 #include "CurlContext.h"
 #include "Logging.h"
 #include <wtf/MainThread.h>
@@ -50,7 +51,7 @@
     m_formData = formData->isolatedCopy();
 
     // Resolve the blob elements so the formData can correctly report it's size.
-    m_formData = m_formData->resolveBlobReferences();
+    m_formData = m_formData->resolveBlobReferences(blobRegistry());
 }
 
 CurlFormDataStream::~CurlFormDataStream()

Modified: trunk/Source/WebKit/ChangeLog (241007 => 241008)


--- trunk/Source/WebKit/ChangeLog	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/ChangeLog	2019-02-06 02:10:50 UTC (rev 241008)
@@ -1,3 +1,70 @@
+2019-02-05  Alex Christensen  <[email protected]>
+
+        Stop using blobRegistry in NetworkProcess
+        https://bugs.webkit.org/show_bug.cgi?id=194027
+
+        Reviewed by Youenn Fablet.
+
+        * NetworkProcess/Downloads/DownloadManager.cpp:
+        (WebKit::DownloadManager::startDownload):
+        * NetworkProcess/Downloads/PendingDownload.cpp:
+        (WebKit::PendingDownload::PendingDownload):
+        * NetworkProcess/Downloads/PendingDownload.h:
+        * NetworkProcess/FileAPI/NetworkBlobRegistry.cpp:
+        (WebKit::NetworkBlobRegistry::registerFileBlobURL):
+        (WebKit::NetworkBlobRegistry::registerBlobURL):
+        (WebKit::NetworkBlobRegistry::registerBlobURLOptionallyFileBacked):
+        (WebKit::NetworkBlobRegistry::registerBlobURLForSlice):
+        (WebKit::NetworkBlobRegistry::unregisterBlobURL):
+        (WebKit::NetworkBlobRegistry::blobSize):
+        (WebKit::NetworkBlobRegistry::writeBlobsToTemporaryFiles):
+        (WebKit::NetworkBlobRegistry::writeBlobToFilePath):
+        (WebKit::NetworkBlobRegistry::connectionToWebProcessDidClose):
+        (WebKit::NetworkBlobRegistry::filesInBlob):
+        (WebKit::NetworkBlobRegistry::singleton): Deleted.
+        * NetworkProcess/FileAPI/NetworkBlobRegistry.h:
+        (WebKit::NetworkBlobRegistry::blobRegistry):
+        * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+        (WebKit::NetworkConnectionToWebProcess::didClose):
+        (WebKit::NetworkConnectionToWebProcess::resolveBlobReferences):
+        (WebKit::NetworkConnectionToWebProcess::scheduleResourceLoad):
+        (WebKit::NetworkConnectionToWebProcess::performSynchronousLoad):
+        (WebKit::NetworkConnectionToWebProcess::loadPing):
+        (WebKit::NetworkConnectionToWebProcess::preconnectTo):
+        (WebKit::NetworkConnectionToWebProcess::registerFileBlobURL):
+        (WebKit::NetworkConnectionToWebProcess::registerBlobURL):
+        (WebKit::NetworkConnectionToWebProcess::registerBlobURLFromURL):
+        (WebKit::NetworkConnectionToWebProcess::registerBlobURLOptionallyFileBacked):
+        (WebKit::NetworkConnectionToWebProcess::registerBlobURLForSlice):
+        (WebKit::NetworkConnectionToWebProcess::unregisterBlobURL):
+        (WebKit::NetworkConnectionToWebProcess::blobSize):
+        (WebKit::NetworkConnectionToWebProcess::writeBlobsToTemporaryFiles):
+        (WebKit::NetworkConnectionToWebProcess::filesInBlob):
+        (WebKit::NetworkConnectionToWebProcess::blobRegistry):
+        * NetworkProcess/NetworkConnectionToWebProcess.h:
+        * NetworkProcess/NetworkDataTask.cpp:
+        (WebKit::NetworkDataTask::create):
+        * NetworkProcess/NetworkDataTaskBlob.cpp:
+        (WebKit::NetworkDataTaskBlob::NetworkDataTaskBlob):
+        * NetworkProcess/NetworkDataTaskBlob.h:
+        * NetworkProcess/NetworkLoad.cpp:
+        (WebKit::NetworkLoad::NetworkLoad):
+        (WebKit::NetworkLoad::initialize):
+        * NetworkProcess/NetworkLoad.h:
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::NetworkProcess):
+        (WebKit::NetworkProcess::removeNetworkConnectionToWebProcess):
+        * NetworkProcess/NetworkProcess.h:
+        (WebKit::NetworkProcess::networkBlobRegistry):
+        * NetworkProcess/NetworkProcessPlatformStrategies.cpp:
+        (WebKit::NetworkProcessPlatformStrategies::createBlobRegistry):
+        * NetworkProcess/NetworkResourceLoader.cpp:
+        (WebKit::m_shouldCaptureExtraNetworkLoadMetrics):
+        (WebKit::NetworkResourceLoader::startNetworkLoad):
+        * NetworkProcess/PreconnectTask.cpp:
+        * NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp:
+        (WebKit::NetworkCache::SpeculativeLoad::SpeculativeLoad):
+
 2019-02-05  Daniel Bates  <[email protected]>
 
         Fix a typo in r241006. Substitute Modifier for Modifiers.

Modified: trunk/Source/WebKit/NetworkProcess/Downloads/DownloadManager.cpp (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/Downloads/DownloadManager.cpp	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/Downloads/DownloadManager.cpp	2019-02-06 02:10:50 UTC (rev 241008)
@@ -27,7 +27,7 @@
 #include "DownloadManager.h"
 
 #include "Download.h"
-#include "NetworkBlobRegistry.h"
+#include "NetworkConnectionToWebProcess.h"
 #include "NetworkLoad.h"
 #include "NetworkSession.h"
 #include "PendingDownload.h"
@@ -43,7 +43,7 @@
 {
 }
 
-void DownloadManager::startDownload(NetworkConnectionToWebProcess* connection, PAL::SessionID sessionID, DownloadID downloadID, const ResourceRequest& request, const String& suggestedName)
+void DownloadManager::startDownload(PAL::SessionID sessionID, DownloadID downloadID, const ResourceRequest& request, const String& suggestedName)
 {
     auto* networkSession = client().networkSession(sessionID);
     if (!networkSession)
@@ -53,11 +53,11 @@
     parameters.sessionID = sessionID;
     parameters.request = request;
     parameters.clientCredentialPolicy = ClientCredentialPolicy::MayAskClientForCredentials;
-    if (request.url().protocolIsBlob() && connection)
-        parameters.blobFileReferences = NetworkBlobRegistry::singleton().filesInBlob(*connection, request.url());
+    if (request.url().protocolIsBlob())
+        parameters.blobFileReferences = client().networkBlobRegistry().filesInBlob(request.url());
     parameters.storedCredentialsPolicy = sessionID.isEphemeral() ? StoredCredentialsPolicy::DoNotUse : StoredCredentialsPolicy::Use;
 
-    m_pendingDownloads.add(downloadID, std::make_unique<PendingDownload>(m_client.parentProcessConnectionForDownloads(), WTFMove(parameters), downloadID, *networkSession, suggestedName));
+    m_pendingDownloads.add(downloadID, std::make_unique<PendingDownload>(m_client.parentProcessConnectionForDownloads(), WTFMove(parameters), downloadID, *networkSession, &client().networkBlobRegistry().blobRegistry(), suggestedName));
 }
 
 void DownloadManager::dataTaskBecameDownloadTask(DownloadID downloadID, std::unique_ptr<Download>&& download)

Modified: trunk/Source/WebKit/NetworkProcess/Downloads/DownloadManager.h (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/Downloads/DownloadManager.h	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/Downloads/DownloadManager.h	2019-02-06 02:10:50 UTC (rev 241008)
@@ -55,6 +55,7 @@
 
 class AuthenticationManager;
 class Download;
+class NetworkBlobRegistry;
 class NetworkConnectionToWebProcess;
 class NetworkLoad;
 class PendingDownload;
@@ -74,6 +75,7 @@
         virtual AuthenticationManager& downloadsAuthenticationManager() = 0;
         virtual void pendingDownloadCanceled(DownloadID) = 0;
         virtual NetworkSession* networkSession(const PAL::SessionID&) const = 0;
+        virtual NetworkBlobRegistry& networkBlobRegistry() = 0;
         virtual void ref() const = 0;
         virtual void deref() const = 0;
     };
@@ -80,7 +82,7 @@
 
     explicit DownloadManager(Client&);
 
-    void startDownload(NetworkConnectionToWebProcess*, PAL::SessionID, DownloadID, const WebCore::ResourceRequest&, const String& suggestedName = { });
+    void startDownload(PAL::SessionID, DownloadID, const WebCore::ResourceRequest&, const String& suggestedName = { });
     void dataTaskBecameDownloadTask(DownloadID, std::unique_ptr<Download>&&);
     void continueWillSendRequest(DownloadID, WebCore::ResourceRequest&&);
     void willDecidePendingDownloadDestination(NetworkDataTask&, ResponseCompletionHandler&&);

Modified: trunk/Source/WebKit/NetworkProcess/Downloads/PendingDownload.cpp (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/Downloads/PendingDownload.cpp	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/Downloads/PendingDownload.cpp	2019-02-06 02:10:50 UTC (rev 241008)
@@ -36,8 +36,8 @@
 namespace WebKit {
 using namespace WebCore;
 
-PendingDownload::PendingDownload(IPC::Connection* parentProcessConnection, NetworkLoadParameters&& parameters, DownloadID downloadID, NetworkSession& networkSession, const String& suggestedName)
-    : m_networkLoad(std::make_unique<NetworkLoad>(*this, WTFMove(parameters), networkSession))
+PendingDownload::PendingDownload(IPC::Connection* parentProcessConnection, NetworkLoadParameters&& parameters, DownloadID downloadID, NetworkSession& networkSession, WebCore::BlobRegistryImpl* blobRegistry, const String& suggestedName)
+    : m_networkLoad(std::make_unique<NetworkLoad>(*this, blobRegistry, WTFMove(parameters), networkSession))
     , m_parentProcessConnection(parentProcessConnection)
 {
     m_isAllowedToAskUserForCredentials = parameters.clientCredentialPolicy == ClientCredentialPolicy::MayAskClientForCredentials;

Modified: trunk/Source/WebKit/NetworkProcess/Downloads/PendingDownload.h (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/Downloads/PendingDownload.h	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/Downloads/PendingDownload.h	2019-02-06 02:10:50 UTC (rev 241008)
@@ -34,6 +34,7 @@
 }
 
 namespace WebCore {
+class BlobRegistryImpl;
 class ResourceResponse;
 }
 
@@ -48,7 +49,7 @@
 class PendingDownload : public NetworkLoadClient, public IPC::MessageSender {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    PendingDownload(IPC::Connection*, NetworkLoadParameters&&, DownloadID, NetworkSession&, const String& suggestedName);
+    PendingDownload(IPC::Connection*, NetworkLoadParameters&&, DownloadID, NetworkSession&, WebCore::BlobRegistryImpl*, const String& suggestedName);
     PendingDownload(IPC::Connection*, std::unique_ptr<NetworkLoad>&&, ResponseCompletionHandler&&, DownloadID, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&);
 
     void continueWillSendRequest(WebCore::ResourceRequest&&);

Modified: trunk/Source/WebKit/NetworkProcess/FileAPI/NetworkBlobRegistry.cpp (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/FileAPI/NetworkBlobRegistry.cpp	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/FileAPI/NetworkBlobRegistry.cpp	2019-02-06 02:10:50 UTC (rev 241008)
@@ -37,20 +37,12 @@
 namespace WebKit {
 using namespace WebCore;
 
-NetworkBlobRegistry& NetworkBlobRegistry::singleton()
-{
-    ASSERT(RunLoop::isMain());
-    static NeverDestroyed<NetworkBlobRegistry> registry;
-    return registry;
-}
+NetworkBlobRegistry::NetworkBlobRegistry() = default;
+NetworkBlobRegistry::~NetworkBlobRegistry() = default;
 
-NetworkBlobRegistry::NetworkBlobRegistry()
-{
-}
-
 void NetworkBlobRegistry::registerFileBlobURL(NetworkConnectionToWebProcess& connection, const URL& url, const String& path, RefPtr<SandboxExtension>&& sandboxExtension, const String& contentType)
 {
-    blobRegistry().registerFileBlobURL(url, BlobDataFileReferenceWithSandboxExtension::create(path, WTFMove(sandboxExtension)), contentType);
+    m_blobRegistry.registerFileBlobURL(url, BlobDataFileReferenceWithSandboxExtension::create(path, WTFMove(sandboxExtension)), contentType);
 
     ASSERT(!m_blobsForConnection.get(&connection).contains(url));
     BlobForConnectionMap::iterator mapIterator = m_blobsForConnection.find(&connection);
@@ -61,7 +53,7 @@
 
 void NetworkBlobRegistry::registerBlobURL(NetworkConnectionToWebProcess& connection, const URL& url, Vector<WebCore::BlobPart>&& blobParts, const String& contentType)
 {
-    blobRegistry().registerBlobURL(url, WTFMove(blobParts), contentType);
+    m_blobRegistry.registerBlobURL(url, WTFMove(blobParts), contentType);
 
     ASSERT(!m_blobsForConnection.get(&connection).contains(url));
     BlobForConnectionMap::iterator mapIterator = m_blobsForConnection.find(&connection);
@@ -80,7 +72,7 @@
         mapIterator = m_blobsForConnection.add(&connection, HashSet<URL>()).iterator;
     }
 
-    blobRegistry().registerBlobURL(url, srcURL);
+    m_blobRegistry.registerBlobURL(url, srcURL);
 
     ASSERT(shouldBypassConnectionCheck || mapIterator->value.contains(srcURL));
     mapIterator->value.add(url);
@@ -88,7 +80,7 @@
 
 void NetworkBlobRegistry::registerBlobURLOptionallyFileBacked(NetworkConnectionToWebProcess& connection, const URL& url, const URL& srcURL, const String& fileBackedPath, const String& contentType)
 {
-    blobRegistry().registerBlobURLOptionallyFileBacked(url, srcURL, BlobDataFileReferenceWithSandboxExtension::create(fileBackedPath, nullptr), contentType);
+    m_blobRegistry.registerBlobURLOptionallyFileBacked(url, srcURL, BlobDataFileReferenceWithSandboxExtension::create(fileBackedPath, nullptr), contentType);
 
     ASSERT(!m_blobsForConnection.get(&connection).contains(url));
     BlobForConnectionMap::iterator mapIterator = m_blobsForConnection.find(&connection);
@@ -104,7 +96,7 @@
     if (mapIterator == m_blobsForConnection.end())
         return;
 
-    blobRegistry().registerBlobURLForSlice(url, srcURL, start, end);
+    m_blobRegistry.registerBlobURLForSlice(url, srcURL, start, end);
 
     ASSERT(mapIterator->value.contains(srcURL));
     mapIterator->value.add(url);
@@ -117,7 +109,7 @@
     if (mapIterator == m_blobsForConnection.end())
         return;
 
-    blobRegistry().unregisterBlobURL(url);
+    m_blobRegistry.unregisterBlobURL(url);
 
     mapIterator->value.remove(url);
 }
@@ -127,17 +119,17 @@
     if (!m_blobsForConnection.contains(&connection) || !m_blobsForConnection.find(&connection)->value.contains(url))
         return 0;
 
-    return blobRegistry().blobSize(url);
+    return m_blobRegistry.blobSize(url);
 }
 
 void NetworkBlobRegistry::writeBlobsToTemporaryFiles(const Vector<String>& blobURLs, CompletionHandler<void(Vector<String>&&)>&& completionHandler)
 {
-    blobRegistry().writeBlobsToTemporaryFiles(blobURLs, WTFMove(completionHandler));
+    m_blobRegistry.writeBlobsToTemporaryFiles(blobURLs, WTFMove(completionHandler));
 }
 
 void NetworkBlobRegistry::writeBlobToFilePath(const URL& blobURL, const String& path, CompletionHandler<void(bool success)>&& completionHandler)
 {
-    if (!blobRegistry().isBlobRegistryImpl()) {
+    if (!m_blobRegistry.isBlobRegistryImpl()) {
         completionHandler(false);
         ASSERT_NOT_REACHED();
         return;
@@ -147,7 +139,7 @@
     for (auto& file : blobFiles)
         file->prepareForFileAccess();
 
-    static_cast<BlobRegistryImpl&>(blobRegistry()).writeBlobToFilePath(blobURL, path, [blobFiles = WTFMove(blobFiles), completionHandler = WTFMove(completionHandler)] (bool success) mutable {
+    m_blobRegistry.writeBlobToFilePath(blobURL, path, [blobFiles = WTFMove(blobFiles), completionHandler = WTFMove(completionHandler)] (bool success) mutable {
         for (auto& file : blobFiles)
             file->revokeFileAccess();
         completionHandler(success);
@@ -161,7 +153,7 @@
 
     HashSet<URL>& blobsForConnection = m_blobsForConnection.find(&connection)->value;
     for (HashSet<URL>::iterator iter = blobsForConnection.begin(), end = blobsForConnection.end(); iter != end; ++iter)
-        blobRegistry().unregisterBlobURL(*iter);
+        m_blobRegistry.unregisterBlobURL(*iter);
 
     m_blobsForConnection.remove(&connection);
 }
@@ -176,8 +168,8 @@
 
 Vector<RefPtr<BlobDataFileReference>> NetworkBlobRegistry::filesInBlob(const URL& url)
 {
-    ASSERT(blobRegistry().isBlobRegistryImpl());
-    BlobData* blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(url);
+    ASSERT(m_blobRegistry.isBlobRegistryImpl());
+    BlobData* blobData = m_blobRegistry.getBlobDataFromURL(url);
     if (!blobData)
         return { };
 

Modified: trunk/Source/WebKit/NetworkProcess/FileAPI/NetworkBlobRegistry.h (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/FileAPI/NetworkBlobRegistry.h	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/FileAPI/NetworkBlobRegistry.h	2019-02-06 02:10:50 UTC (rev 241008)
@@ -25,6 +25,7 @@
 
 #pragma once
 
+#include <WebCore/BlobRegistryImpl.h>
 #include <wtf/Function.h>
 #include <wtf/HashMap.h>
 #include <wtf/HashSet.h>
@@ -44,7 +45,7 @@
 WTF_MAKE_NONCOPYABLE(NetworkBlobRegistry);
 public:
     NetworkBlobRegistry();
-    static NetworkBlobRegistry& singleton();
+    ~NetworkBlobRegistry();
 
     void registerFileBlobURL(NetworkConnectionToWebProcess&, const URL&, const String& path, RefPtr<SandboxExtension>&&, const String& contentType);
     void registerBlobURL(NetworkConnectionToWebProcess&, const URL&, Vector<WebCore::BlobPart>&&, const String& contentType);
@@ -60,12 +61,13 @@
 
     Vector<RefPtr<WebCore::BlobDataFileReference>> filesInBlob(NetworkConnectionToWebProcess&, const URL&);
     Vector<RefPtr<WebCore::BlobDataFileReference>> filesInBlob(const URL&);
+    
+    WebCore::BlobRegistryImpl& blobRegistry() { return m_blobRegistry; }
 
 private:
-    ~NetworkBlobRegistry();
-
     typedef HashMap<NetworkConnectionToWebProcess*, HashSet<URL>> BlobForConnectionMap;
     BlobForConnectionMap m_blobsForConnection;
+    WebCore::BlobRegistryImpl m_blobRegistry;
 };
 
 }

Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp	2019-02-06 02:10:50 UTC (rev 241008)
@@ -26,9 +26,9 @@
 #include "config.h"
 #include "NetworkConnectionToWebProcess.h"
 
+#include "BlobDataFileReferenceWithSandboxExtension.h"
 #include "CacheStorageEngineConnectionMessages.h"
 #include "DataReference.h"
-#include "NetworkBlobRegistry.h"
 #include "NetworkCache.h"
 #include "NetworkMDNSRegisterMessages.h"
 #include "NetworkProcess.h"
@@ -249,7 +249,7 @@
     // root activity trackers.
     stopAllNetworkActivityTracking();
 
-    NetworkBlobRegistry::singleton().connectionToWebProcessDidClose(*this);
+    m_networkProcess->networkBlobRegistry().connectionToWebProcessDidClose(*this);
     m_networkProcess->removeNetworkConnectionToWebProcess(*this);
 
 #if USE(LIBWEBRTC)
@@ -311,6 +311,20 @@
 #endif
 }
 
+Vector<RefPtr<WebCore::BlobDataFileReference>> NetworkConnectionToWebProcess::resolveBlobReferences(const NetworkResourceLoadParameters& parameters)
+{
+    Vector<RefPtr<WebCore::BlobDataFileReference>> files;
+    if (auto* body = parameters.request.httpBody()) {
+        for (auto& element : body->elements()) {
+            if (auto* blobData = WTF::get_if<FormDataElement::EncodedBlobData>(element.data))
+                files.appendVector(m_networkProcess->networkBlobRegistry().filesInBlob(*this, blobData->url));
+        }
+        const_cast<WebCore::ResourceRequest&>(parameters.request).setHTTPBody(body->resolveBlobReferences(m_networkProcess->networkBlobRegistry().blobRegistry()));
+    }
+
+    return files;
+}
+
 void NetworkConnectionToWebProcess::scheduleResourceLoad(NetworkResourceLoadParameters&& loadParameters)
 {
     auto identifier = loadParameters.identifier;
@@ -342,7 +356,7 @@
     };
 
     // PingLoad manages its own lifetime, deleting itself when its purpose has been fulfilled.
-    new PingLoad(networkProcess(), WTFMove(loadParameters), WTFMove(completionHandler));
+    new PingLoad(*this, networkProcess(), WTFMove(loadParameters), WTFMove(completionHandler));
 }
 
 void NetworkConnectionToWebProcess::setOnLineState(bool isOnLine)
@@ -391,6 +405,8 @@
 
 void NetworkConnectionToWebProcess::preconnectTo(uint64_t preconnectionIdentifier, NetworkResourceLoadParameters&& parameters)
 {
+    ASSERT(!parameters.request.httpBody());
+    
 #if ENABLE(SERVER_PRECONNECT)
     new PreconnectTask(networkProcess(), WTFMove(parameters), [this, protectedThis = makeRef(*this), identifier = preconnectionIdentifier] (const ResourceError& error) {
         didFinishPreconnection(identifier, error);
@@ -425,7 +441,7 @@
 
 void NetworkConnectionToWebProcess::startDownload(PAL::SessionID sessionID, DownloadID downloadID, const ResourceRequest& request, const String& suggestedName)
 {
-    m_networkProcess->downloadManager().startDownload(this, sessionID, downloadID, request, suggestedName);
+    m_networkProcess->downloadManager().startDownload(sessionID, downloadID, request, suggestedName);
 }
 
 void NetworkConnectionToWebProcess::convertMainResourceLoadToDownload(PAL::SessionID sessionID, uint64_t mainResourceLoadIdentifier, DownloadID downloadID, const ResourceRequest& request, const ResourceResponse& response)
@@ -434,7 +450,7 @@
 
     // In case a response is served from service worker, we do not have yet the ability to convert the load.
     if (!mainResourceLoadIdentifier || response.source() == ResourceResponse::Source::ServiceWorker) {
-        m_networkProcess->downloadManager().startDownload(this, sessionID, downloadID, request);
+        m_networkProcess->downloadManager().startDownload(sessionID, downloadID, request);
         return;
     }
 
@@ -493,39 +509,37 @@
 
 void NetworkConnectionToWebProcess::registerFileBlobURL(const URL& url, const String& path, SandboxExtension::Handle&& extensionHandle, const String& contentType)
 {
-    RefPtr<SandboxExtension> extension = SandboxExtension::create(WTFMove(extensionHandle));
-
-    NetworkBlobRegistry::singleton().registerFileBlobURL(*this, url, path, WTFMove(extension), contentType);
+    m_networkProcess->networkBlobRegistry().registerFileBlobURL(*this, url, path, SandboxExtension::create(WTFMove(extensionHandle)), contentType);
 }
 
 void NetworkConnectionToWebProcess::registerBlobURL(const URL& url, Vector<BlobPart>&& blobParts, const String& contentType)
 {
-    NetworkBlobRegistry::singleton().registerBlobURL(*this, url, WTFMove(blobParts), contentType);
+    m_networkProcess->networkBlobRegistry().registerBlobURL(*this, url, WTFMove(blobParts), contentType);
 }
 
 void NetworkConnectionToWebProcess::registerBlobURLFromURL(const URL& url, const URL& srcURL, bool shouldBypassConnectionCheck)
 {
-    NetworkBlobRegistry::singleton().registerBlobURL(*this, url, srcURL, shouldBypassConnectionCheck);
+    m_networkProcess->networkBlobRegistry().registerBlobURL(*this, url, srcURL, shouldBypassConnectionCheck);
 }
 
 void NetworkConnectionToWebProcess::registerBlobURLOptionallyFileBacked(const URL& url, const URL& srcURL, const String& fileBackedPath, const String& contentType)
 {
-    NetworkBlobRegistry::singleton().registerBlobURLOptionallyFileBacked(*this, url, srcURL, fileBackedPath, contentType);
+    m_networkProcess->networkBlobRegistry().registerBlobURLOptionallyFileBacked(*this, url, srcURL, fileBackedPath, contentType);
 }
 
 void NetworkConnectionToWebProcess::registerBlobURLForSlice(const URL& url, const URL& srcURL, int64_t start, int64_t end)
 {
-    NetworkBlobRegistry::singleton().registerBlobURLForSlice(*this, url, srcURL, start, end);
+    m_networkProcess->networkBlobRegistry().registerBlobURLForSlice(*this, url, srcURL, start, end);
 }
 
 void NetworkConnectionToWebProcess::unregisterBlobURL(const URL& url)
 {
-    NetworkBlobRegistry::singleton().unregisterBlobURL(*this, url);
+    m_networkProcess->networkBlobRegistry().unregisterBlobURL(*this, url);
 }
 
 void NetworkConnectionToWebProcess::blobSize(const URL& url, uint64_t& resultSize)
 {
-    resultSize = NetworkBlobRegistry::singleton().blobSize(*this, url);
+    resultSize = m_networkProcess->networkBlobRegistry().blobSize(*this, url);
 }
 
 void NetworkConnectionToWebProcess::writeBlobsToTemporaryFiles(const Vector<String>& blobURLs, CompletionHandler<void(Vector<String>&&)>&& completionHandler)
@@ -532,12 +546,12 @@
 {
     Vector<RefPtr<BlobDataFileReference>> fileReferences;
     for (auto& url : blobURLs)
-        fileReferences.appendVector(NetworkBlobRegistry::singleton().filesInBlob(*this, { { }, url }));
+        fileReferences.appendVector(m_networkProcess->networkBlobRegistry().filesInBlob(*this, { { }, url }));
 
     for (auto& file : fileReferences)
         file->prepareForFileAccess();
 
-    NetworkBlobRegistry::singleton().writeBlobsToTemporaryFiles(blobURLs, [fileReferences = WTFMove(fileReferences), completionHandler = WTFMove(completionHandler)](auto&& fileNames) mutable {
+    m_networkProcess->networkBlobRegistry().writeBlobsToTemporaryFiles(blobURLs, [fileReferences = WTFMove(fileReferences), completionHandler = WTFMove(completionHandler)](auto&& fileNames) mutable {
         for (auto& file : fileReferences)
             file->revokeFileAccess();
         completionHandler(WTFMove(fileNames));
@@ -544,6 +558,16 @@
     });
 }
 
+Vector<RefPtr<WebCore::BlobDataFileReference>> NetworkConnectionToWebProcess::filesInBlob(const URL& url)
+{
+    return m_networkProcess->networkBlobRegistry().filesInBlob(*this, url);
+}
+
+WebCore::BlobRegistryImpl& NetworkConnectionToWebProcess::blobRegistry()
+{
+    return m_networkProcess->networkBlobRegistry().blobRegistry();
+}
+
 void NetworkConnectionToWebProcess::setCaptureExtraNetworkLoadMetricsEnabled(bool enabled)
 {
     m_captureExtraNetworkLoadMetricsEnabled = enabled;

Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h	2019-02-06 02:10:50 UTC (rev 241008)
@@ -41,6 +41,7 @@
 
 namespace WebCore {
 class BlobDataFileReference;
+class BlobRegistryImpl;
 class ResourceError;
 class ResourceRequest;
 struct SameSiteInfo;
@@ -121,6 +122,10 @@
     Optional<NetworkActivityTracker> startTrackingResourceLoad(uint64_t pageID, ResourceLoadIdentifier resourceID, bool isMainResource, const PAL::SessionID&);
     void stopTrackingResourceLoad(ResourceLoadIdentifier resourceID, NetworkActivityTracker::CompletionCode);
 
+    WebCore::BlobRegistryImpl& blobRegistry();
+    Vector<RefPtr<WebCore::BlobDataFileReference>> filesInBlob(const URL&);
+    Vector<RefPtr<WebCore::BlobDataFileReference>> resolveBlobReferences(const NetworkResourceLoadParameters&);
+
 private:
     NetworkConnectionToWebProcess(NetworkProcess&, IPC::Connection::Identifier);
 

Modified: trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp	2019-02-06 02:10:50 UTC (rev 241008)
@@ -47,9 +47,7 @@
 
 Ref<NetworkDataTask> NetworkDataTask::create(NetworkSession& session, NetworkDataTaskClient& client, const NetworkLoadParameters& parameters)
 {
-    if (parameters.request.url().protocolIsBlob())
-        return NetworkDataTaskBlob::create(session, client, parameters.request, parameters.contentSniffingPolicy, parameters.blobFileReferences);
-
+    ASSERT(!parameters.request.url().protocolIsBlob());
 #if PLATFORM(COCOA)
     return NetworkDataTaskCocoa::create(session, client, parameters.request, parameters.webFrameID, parameters.webPageID, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.shouldPreconnectOnly, parameters.isMainFrameNavigation, parameters.networkActivityTracker);
 #endif

Modified: trunk/Source/WebKit/NetworkProcess/NetworkDataTaskBlob.cpp (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/NetworkDataTaskBlob.cpp	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/NetworkDataTaskBlob.cpp	2019-02-06 02:10:50 UTC (rev 241008)
@@ -65,7 +65,7 @@
 
 static const char* const webKitBlobResourceDomain = "WebKitBlobResource";
 
-NetworkDataTaskBlob::NetworkDataTaskBlob(NetworkSession& session, NetworkDataTaskClient& client, const ResourceRequest& request, ContentSniffingPolicy shouldContentSniff, const Vector<RefPtr<WebCore::BlobDataFileReference>>& fileReferences)
+NetworkDataTaskBlob::NetworkDataTaskBlob(NetworkSession& session, BlobRegistryImpl& blobRegistry, NetworkDataTaskClient& client, const ResourceRequest& request, ContentSniffingPolicy shouldContentSniff, const Vector<RefPtr<WebCore::BlobDataFileReference>>& fileReferences)
     : NetworkDataTask(session, client, request, StoredCredentialsPolicy::DoNotUse, false, false)
     , m_stream(std::make_unique<AsyncFileStream>(*this))
     , m_fileReferences(fileReferences)
@@ -74,7 +74,7 @@
     for (auto& fileReference : m_fileReferences)
         fileReference->prepareForFileAccess();
 
-    m_blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(request.url());
+    m_blobData = blobRegistry.getBlobDataFromURL(request.url());
 
     m_session->registerNetworkDataTask(*this);
     LOG(NetworkSession, "%p - Created NetworkDataTaskBlob for %s", this, request.url().string().utf8().data());

Modified: trunk/Source/WebKit/NetworkProcess/NetworkDataTaskBlob.h (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/NetworkDataTaskBlob.h	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/NetworkDataTaskBlob.h	2019-02-06 02:10:50 UTC (rev 241008)
@@ -40,6 +40,7 @@
 class BlobDataFileReference;
 class BlobData;
 class BlobDataItem;
+class BlobRegistryImpl;
 }
 
 namespace WebKit {
@@ -48,15 +49,15 @@
 
 class NetworkDataTaskBlob final : public NetworkDataTask, public WebCore::FileStreamClient {
 public:
-    static Ref<NetworkDataTask> create(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& request, WebCore::ContentSniffingPolicy shouldContentSniff, const Vector<RefPtr<WebCore::BlobDataFileReference>>& fileReferences)
+    static Ref<NetworkDataTask> create(NetworkSession& session, WebCore::BlobRegistryImpl& blobRegistry, NetworkDataTaskClient& client, const WebCore::ResourceRequest& request, WebCore::ContentSniffingPolicy shouldContentSniff, const Vector<RefPtr<WebCore::BlobDataFileReference>>& fileReferences)
     {
-        return adoptRef(*new NetworkDataTaskBlob(session, client, request, shouldContentSniff, fileReferences));
+        return adoptRef(*new NetworkDataTaskBlob(session, blobRegistry, client, request, shouldContentSniff, fileReferences));
     }
 
     ~NetworkDataTaskBlob();
 
 private:
-    NetworkDataTaskBlob(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, WebCore::ContentSniffingPolicy, const Vector<RefPtr<WebCore::BlobDataFileReference>>&);
+    NetworkDataTaskBlob(NetworkSession&, WebCore::BlobRegistryImpl&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, WebCore::ContentSniffingPolicy, const Vector<RefPtr<WebCore::BlobDataFileReference>>&);
 
     void suspend() override;
     void cancel() override;

Modified: trunk/Source/WebKit/NetworkProcess/NetworkLoad.cpp (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/NetworkLoad.cpp	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/NetworkLoad.cpp	2019-02-06 02:10:50 UTC (rev 241008)
@@ -50,7 +50,7 @@
     ResponseCompletionHandler responseCompletionHandler;
 };
 
-NetworkLoad::NetworkLoad(NetworkLoadClient& client, NetworkLoadParameters&& parameters, NetworkSession& networkSession)
+NetworkLoad::NetworkLoad(NetworkLoadClient& client, BlobRegistryImpl* blobRegistry, NetworkLoadParameters&& parameters, NetworkSession& networkSession)
     : m_client(client)
     , m_networkProcess(networkSession.networkProcess())
     , m_parameters(WTFMove(parameters))
@@ -57,12 +57,16 @@
     , m_loadThrottleLatency(networkSession.loadThrottleLatency())
     , m_currentRequest(m_parameters.request)
 {
-    initialize(networkSession);
+    initialize(networkSession, blobRegistry);
 }
 
-void NetworkLoad::initialize(NetworkSession& networkSession)
+void NetworkLoad::initialize(NetworkSession& networkSession, WebCore::BlobRegistryImpl* blobRegistry)
 {
-    m_task = NetworkDataTask::create(networkSession, *this, m_parameters);
+    if (blobRegistry && m_parameters.request.url().protocolIsBlob())
+        m_task = NetworkDataTaskBlob::create(networkSession, *blobRegistry, *this, m_parameters.request, m_parameters.contentSniffingPolicy, m_parameters.blobFileReferences);
+    else
+        m_task = NetworkDataTask::create(networkSession, *this, m_parameters);
+
     if (!m_parameters.defersLoading)
         m_task->resume();
 }

Modified: trunk/Source/WebKit/NetworkProcess/NetworkLoad.h (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/NetworkLoad.h	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/NetworkLoad.h	2019-02-06 02:10:50 UTC (rev 241008)
@@ -33,6 +33,10 @@
 #include <wtf/CompletionHandler.h>
 #include <wtf/text/WTFString.h>
 
+namespace WebCore {
+class BlobRegistryImpl;
+}
+
 namespace WebKit {
 
 class NetworkProcess;
@@ -40,7 +44,7 @@
 class NetworkLoad final : private NetworkDataTaskClient {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    NetworkLoad(NetworkLoadClient&, NetworkLoadParameters&&, NetworkSession&);
+    NetworkLoad(NetworkLoadClient&, WebCore::BlobRegistryImpl*, NetworkLoadParameters&&, NetworkSession&);
     ~NetworkLoad();
 
     void setDefersLoading(bool);
@@ -65,7 +69,7 @@
     String description() const;
 
 private:
-    void initialize(NetworkSession&);
+    void initialize(NetworkSession&, WebCore::BlobRegistryImpl*);
 
     // NetworkDataTaskClient
     void willPerformHTTPRedirection(WebCore::ResourceResponse&&, WebCore::ResourceRequest&&, RedirectCompletionHandler&&) final;

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2019-02-06 02:10:50 UTC (rev 241008)
@@ -37,7 +37,6 @@
 #include "LegacyCustomProtocolManager.h"
 #endif
 #include "Logging.h"
-#include "NetworkBlobRegistry.h"
 #include "NetworkConnectionToWebProcess.h"
 #include "NetworkContentRuleListManagerMessages.h"
 #include "NetworkProcessCreationParameters.h"
@@ -150,9 +149,10 @@
     });
 #endif
 
-    NetworkStateNotifier::singleton().addListener([this](bool isOnLine) {
-        auto webProcessConnections = m_webProcessConnections;
-        for (auto& webProcessConnection : webProcessConnections)
+    NetworkStateNotifier::singleton().addListener([weakThis = makeWeakPtr(*this)](bool isOnLine) {
+        if (!weakThis)
+            return;
+        for (auto& webProcessConnection : weakThis->m_webProcessConnections)
             webProcessConnection->setOnLineState(isOnLine);
     });
 
@@ -186,10 +186,10 @@
 
 void NetworkProcess::removeNetworkConnectionToWebProcess(NetworkConnectionToWebProcess& connection)
 {
-    size_t vectorIndex = m_webProcessConnections.find(&connection);
-    ASSERT(vectorIndex != notFound);
-
-    m_webProcessConnections.remove(vectorIndex);
+    auto count = m_webProcessConnections.removeAllMatching([&] (const auto& c) {
+        return c.ptr() == &connection;
+    });
+    ASSERT_UNUSED(count, count == 1);
 }
 
 bool NetworkProcess::shouldTerminate()
@@ -1684,7 +1684,7 @@
 
 void NetworkProcess::downloadRequest(PAL::SessionID sessionID, DownloadID downloadID, const ResourceRequest& request, const String& suggestedFilename)
 {
-    downloadManager().startDownload(nullptr, sessionID, downloadID, request, suggestedFilename);
+    downloadManager().startDownload(sessionID, downloadID, request, suggestedFilename);
 }
 
 void NetworkProcess::resumeDownload(PAL::SessionID sessionID, DownloadID downloadID, const IPC::DataReference& resumeData, const String& path, WebKit::SandboxExtension::Handle&& sandboxExtensionHandle)

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.h (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2019-02-06 02:10:50 UTC (rev 241008)
@@ -28,6 +28,7 @@
 #include "AuxiliaryProcess.h"
 #include "CacheModel.h"
 #include "DownloadManager.h"
+#include "NetworkBlobRegistry.h"
 #include "NetworkContentRuleListManager.h"
 #include "NetworkHTTPSUpgradeChecker.h"
 #include "SandboxExtension.h"
@@ -291,6 +292,8 @@
     void removeCacheEngine(const PAL::SessionID&);
     void requestCacheStorageSpace(PAL::SessionID, const WebCore::ClientOrigin&, uint64_t quota, uint64_t currentSize, uint64_t spaceRequired, CompletionHandler<void(Optional<uint64_t>)>&&);
 
+    NetworkBlobRegistry& networkBlobRegistry() override { return m_networkBlobRegistry; }
+
 private:
     void platformInitializeNetworkProcess(const NetworkProcessCreationParameters&);
     std::unique_ptr<WebCore::NetworkStorageSession> platformCreateDefaultStorageSession() const;
@@ -422,7 +425,7 @@
     void ensurePathExists(const String& path);
 
     // Connections to WebProcesses.
-    Vector<RefPtr<NetworkConnectionToWebProcess>> m_webProcessConnections;
+    Vector<Ref<NetworkConnectionToWebProcess>> m_webProcessConnections;
 
     String m_diskCacheDirectory;
     bool m_hasSetCacheModel { false };
@@ -445,6 +448,7 @@
     HashMap<PAL::SessionID, Ref<NetworkSession>> m_networkSessions;
     HashMap<PAL::SessionID, std::unique_ptr<WebCore::NetworkStorageSession>> m_networkStorageSessions;
     mutable std::unique_ptr<WebCore::NetworkStorageSession> m_defaultNetworkStorageSession;
+    NetworkBlobRegistry m_networkBlobRegistry;
 
 #if PLATFORM(COCOA)
     void platformInitializeNetworkProcessCocoa(const NetworkProcessCreationParameters&);

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcessPlatformStrategies.cpp (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcessPlatformStrategies.cpp	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcessPlatformStrategies.cpp	2019-02-06 02:10:50 UTC (rev 241008)
@@ -26,7 +26,7 @@
 #include "config.h"
 #include "NetworkProcessPlatformStrategies.h"
 
-#include <WebCore/BlobRegistryImpl.h>
+#include <WebCore/BlobRegistry.h>
 #include <wtf/NeverDestroyed.h>
 
 namespace WebKit {
@@ -50,7 +50,20 @@
 
 BlobRegistry* NetworkProcessPlatformStrategies::createBlobRegistry()
 {
-    return new BlobRegistryImpl;
+    using namespace WebCore;
+    class EmptyBlobRegistry : public WebCore::BlobRegistry {
+        void registerFileBlobURL(const URL&, Ref<BlobDataFileReference>&&, const String& contentType) final { ASSERT_NOT_REACHED(); }
+        void registerBlobURL(const URL&, Vector<BlobPart>&&, const String& contentType) final { ASSERT_NOT_REACHED(); }
+        void registerBlobURL(const URL&, const URL& srcURL) final { ASSERT_NOT_REACHED(); }
+        void registerBlobURLOptionallyFileBacked(const URL&, const URL& srcURL, RefPtr<BlobDataFileReference>&&, const String& contentType) final { ASSERT_NOT_REACHED(); }
+        void registerBlobURLForSlice(const URL&, const URL& srcURL, long long start, long long end) final { ASSERT_NOT_REACHED(); }
+        void unregisterBlobURL(const URL&) final { ASSERT_NOT_REACHED(); }
+        unsigned long long blobSize(const URL&) final { ASSERT_NOT_REACHED(); return 0; }
+        void writeBlobsToTemporaryFiles(const Vector<String>& blobURLs, CompletionHandler<void(Vector<String>&& filePaths)>&&) final { ASSERT_NOT_REACHED(); }
+        bool isBlobRegistryImpl() const { return false; }
+    };
+    static NeverDestroyed<EmptyBlobRegistry> blobRegistry;
+    return &blobRegistry.get();
 }
 
 }

Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2019-02-06 02:10:50 UTC (rev 241008)
@@ -29,7 +29,6 @@
 #include "DataReference.h"
 #include "FormDataReference.h"
 #include "Logging.h"
-#include "NetworkBlobRegistry.h"
 #include "NetworkCache.h"
 #include "NetworkConnectionToWebProcess.h"
 #include "NetworkLoad.h"
@@ -92,6 +91,7 @@
 NetworkResourceLoader::NetworkResourceLoader(NetworkResourceLoadParameters&& parameters, NetworkConnectionToWebProcess& connection, Messages::NetworkConnectionToWebProcess::PerformSynchronousLoad::DelayedReply&& synchronousReply)
     : m_parameters { WTFMove(parameters) }
     , m_connection { connection }
+    , m_fileReferences(connection.resolveBlobReferences(m_parameters))
     , m_defersLoading { parameters.defersLoading }
     , m_isAllowedToAskUserForCredentials { m_parameters.clientCredentialPolicy == ClientCredentialPolicy::MayAskClientForCredentials }
     , m_bufferingTimer { *this, &NetworkResourceLoader::bufferingTimerFired }
@@ -103,13 +103,6 @@
     //        Once bug 116233 is resolved, this ASSERT can just be "m_webPageID && m_webFrameID"
     ASSERT((m_parameters.webPageID && m_parameters.webFrameID) || m_parameters.clientCredentialPolicy == ClientCredentialPolicy::CannotAskClientForCredentials);
 
-    if (originalRequest().httpBody()) {
-        for (const auto& element : originalRequest().httpBody()->elements()) {
-            if (auto* blobData = WTF::get_if<FormDataElement::EncodedBlobData>(element.data))
-                m_fileReferences.appendVector(NetworkBlobRegistry::singleton().filesInBlob(connection, blobData->url));
-        }
-    }
-
     if (synchronousReply || parameters.shouldRestrictHTTPResponseAccess) {
         NetworkLoadChecker::LoadType requestLoadType = isMainFrameLoad() ? NetworkLoadChecker::LoadType::MainFrame : NetworkLoadChecker::LoadType::Other;
         m_networkLoadChecker = std::make_unique<NetworkLoadChecker>(connection.networkProcess(), FetchOptions { m_parameters.options }, m_parameters.sessionID, m_parameters.webPageID, m_parameters.webFrameID, HTTPHeaderMap { m_parameters.originalRequestHeaders }, URL { m_parameters.request.url() }, m_parameters.sourceOrigin.copyRef(), m_parameters.preflightPolicy, originalRequest().httpReferrer(), m_parameters.isHTTPSUpgradeEnabled, shouldCaptureExtraNetworkLoadMetrics(), requestLoadType);
@@ -128,6 +121,7 @@
     ASSERT(RunLoop::isMain());
     ASSERT(!m_networkLoad);
     ASSERT(!isSynchronous() || !m_synchronousLoadData->delayedReply);
+    ASSERT(m_fileReferences.isEmpty());
     if (m_responseCompletionHandler)
         m_responseCompletionHandler(PolicyAction::Ignore);
 }
@@ -282,7 +276,7 @@
         parameters.storedCredentialsPolicy = m_networkLoadChecker->storedCredentialsPolicy();
 
     if (request.url().protocolIsBlob())
-        parameters.blobFileReferences = NetworkBlobRegistry::singleton().filesInBlob(m_connection, originalRequest().url());
+        parameters.blobFileReferences = m_connection->filesInBlob(originalRequest().url());
 
     auto* networkSession = m_connection->networkProcess().networkSession(parameters.sessionID);
     if (!networkSession && parameters.sessionID.isEphemeral()) {
@@ -298,7 +292,7 @@
     }
 
     parameters.request = WTFMove(request);
-    m_networkLoad = std::make_unique<NetworkLoad>(*this, WTFMove(parameters), *networkSession);
+    m_networkLoad = std::make_unique<NetworkLoad>(*this, &m_connection->blobRegistry(), WTFMove(parameters), *networkSession);
 
     RELEASE_LOG_IF_ALLOWED("startNetworkLoad: (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %" PRIu64 ", description = %{public}s)", m_parameters.webPageID, m_parameters.webFrameID, m_parameters.identifier, m_networkLoad->description().utf8().data());
 
@@ -353,7 +347,7 @@
 {
     // This can happen if the resource came from the disk cache.
     if (!m_networkLoad) {
-        m_connection->networkProcess().downloadManager().startDownload(m_connection.ptr(), m_parameters.sessionID, downloadID, request);
+        m_connection->networkProcess().downloadManager().startDownload(m_parameters.sessionID, downloadID, request);
         abort();
         return;
     }

Modified: trunk/Source/WebKit/NetworkProcess/PingLoad.cpp (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/PingLoad.cpp	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/PingLoad.cpp	2019-02-06 02:10:50 UTC (rev 241008)
@@ -29,6 +29,7 @@
 #include "AuthenticationChallengeDisposition.h"
 #include "AuthenticationManager.h"
 #include "Logging.h"
+#include "NetworkConnectionToWebProcess.h"
 #include "NetworkLoadChecker.h"
 #include "NetworkProcess.h"
 #include "WebErrors.h"
@@ -39,12 +40,18 @@
 
 using namespace WebCore;
 
-PingLoad::PingLoad(NetworkProcess& networkProcess, NetworkResourceLoadParameters&& parameters, CompletionHandler<void(const ResourceError&, const ResourceResponse&)>&& completionHandler)
+PingLoad::PingLoad(NetworkConnectionToWebProcess& connection, NetworkProcess& networkProcess, NetworkResourceLoadParameters&& parameters, CompletionHandler<void(const ResourceError&, const ResourceResponse&)>&& completionHandler)
     : m_parameters(WTFMove(parameters))
     , m_completionHandler(WTFMove(completionHandler))
     , m_timeoutTimer(*this, &PingLoad::timeoutTimerFired)
     , m_networkLoadChecker(makeUniqueRef<NetworkLoadChecker>(networkProcess, FetchOptions { m_parameters.options}, m_parameters.sessionID, m_parameters.webPageID, m_parameters.webFrameID, WTFMove(m_parameters.originalRequestHeaders), URL { m_parameters.request.url() }, m_parameters.sourceOrigin.copyRef(), m_parameters.preflightPolicy, m_parameters.request.httpReferrer()))
+    , m_blobFiles(connection.resolveBlobReferences(m_parameters))
 {
+    for (auto& file : m_blobFiles) {
+        if (file)
+            file->prepareForFileAccess();
+    }
+
     m_networkLoadChecker->enableContentExtensionsCheck();
     if (m_parameters.cspResponseHeaders)
         m_networkLoadChecker->setCSPResponseHeaders(WTFMove(m_parameters.cspResponseHeaders.value()));
@@ -79,6 +86,10 @@
         m_task->clearClient();
         m_task->cancel();
     }
+    for (auto& file : m_blobFiles) {
+        if (file)
+            file->revokeFileAccess();
+    }
 }
 
 void PingLoad::didFinish(const ResourceError& error, const ResourceResponse& response)

Modified: trunk/Source/WebKit/NetworkProcess/PingLoad.h (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/PingLoad.h	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/PingLoad.h	2019-02-06 02:10:50 UTC (rev 241008)
@@ -40,7 +40,7 @@
 
 class PingLoad final : public CanMakeWeakPtr<PingLoad>, private NetworkDataTaskClient {
 public:
-    PingLoad(NetworkProcess&, NetworkResourceLoadParameters&&, CompletionHandler<void(const WebCore::ResourceError&, const WebCore::ResourceResponse&)>&&);
+    PingLoad(NetworkConnectionToWebProcess&, NetworkProcess&, NetworkResourceLoadParameters&&, CompletionHandler<void(const WebCore::ResourceError&, const WebCore::ResourceResponse&)>&&);
     
 private:
     ~PingLoad();
@@ -66,6 +66,7 @@
     RefPtr<NetworkDataTask> m_task;
     WebCore::Timer m_timeoutTimer;
     UniqueRef<NetworkLoadChecker> m_networkLoadChecker;
+    Vector<RefPtr<WebCore::BlobDataFileReference>> m_blobFiles;
 };
 
 }

Modified: trunk/Source/WebKit/NetworkProcess/PreconnectTask.cpp (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/PreconnectTask.cpp	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/PreconnectTask.cpp	2019-02-06 02:10:50 UTC (rev 241008)
@@ -53,7 +53,7 @@
     }
 
     ASSERT(parameters.shouldPreconnectOnly == PreconnectOnly::Yes);
-    m_networkLoad = std::make_unique<NetworkLoad>(*this, WTFMove(parameters), *networkSession);
+    m_networkLoad = std::make_unique<NetworkLoad>(*this, nullptr, WTFMove(parameters), *networkSession);
 
     m_timeoutTimer.startOneShot(60000_s);
 }

Modified: trunk/Source/WebKit/NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp (241007 => 241008)


--- trunk/Source/WebKit/NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp	2019-02-06 01:44:21 UTC (rev 241007)
+++ trunk/Source/WebKit/NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp	2019-02-06 02:10:50 UTC (rev 241008)
@@ -60,7 +60,7 @@
     parameters.contentSniffingPolicy = ContentSniffingPolicy::DoNotSniffContent;
     parameters.contentEncodingSniffingPolicy = ContentEncodingSniffingPolicy::Sniff;
     parameters.request = m_originalRequest;
-    m_networkLoad = std::make_unique<NetworkLoad>(*this, WTFMove(parameters), *cache.networkProcess().networkSession(PAL::SessionID::defaultSessionID()));
+    m_networkLoad = std::make_unique<NetworkLoad>(*this, nullptr, WTFMove(parameters), *cache.networkProcess().networkSession(PAL::SessionID::defaultSessionID()));
 }
 
 SpeculativeLoad::~SpeculativeLoad()
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to