diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebKit2/NetworkProcess/FileAPI | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebKit2/NetworkProcess/FileAPI')
-rw-r--r-- | Source/WebKit2/NetworkProcess/FileAPI/NetworkBlobRegistry.cpp | 125 | ||||
-rw-r--r-- | Source/WebKit2/NetworkProcess/FileAPI/NetworkBlobRegistry.h | 29 |
2 files changed, 102 insertions, 52 deletions
diff --git a/Source/WebKit2/NetworkProcess/FileAPI/NetworkBlobRegistry.cpp b/Source/WebKit2/NetworkProcess/FileAPI/NetworkBlobRegistry.cpp index a2ac7d124..172558d92 100644 --- a/Source/WebKit2/NetworkProcess/FileAPI/NetworkBlobRegistry.cpp +++ b/Source/WebKit2/NetworkProcess/FileAPI/NetworkBlobRegistry.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 Apple Inc. All rights reserved. + * Copyright (C) 2013-2016 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,20 +26,21 @@ #include "config.h" #include "NetworkBlobRegistry.h" -#if ENABLE(BLOB) && ENABLE(NETWORK_PROCESS) - +#include "BlobDataFileReferenceWithSandboxExtension.h" +#include "NetworkConnectionToWebProcess.h" #include "SandboxExtension.h" +#include <WebCore/BlobPart.h> #include <WebCore/BlobRegistryImpl.h> -#include <wtf/MainThread.h> #include <wtf/NeverDestroyed.h> +#include <wtf/RunLoop.h> using namespace WebCore; namespace WebKit { -NetworkBlobRegistry& NetworkBlobRegistry::shared() +NetworkBlobRegistry& NetworkBlobRegistry::singleton() { - ASSERT(isMainThread()); + ASSERT(RunLoop::isMain()); static NeverDestroyed<NetworkBlobRegistry> registry; return registry; } @@ -48,22 +49,20 @@ NetworkBlobRegistry::NetworkBlobRegistry() { } -void NetworkBlobRegistry::registerBlobURL(NetworkConnectionToWebProcess* connection, const URL& url, std::unique_ptr<BlobData> data, const Vector<RefPtr<SandboxExtension>>& newSandboxExtensions) +void NetworkBlobRegistry::registerFileBlobURL(NetworkConnectionToWebProcess* connection, const URL& url, const String& path, RefPtr<SandboxExtension>&& sandboxExtension, const String& contentType) { - ASSERT(!m_sandboxExtensions.contains(url.string())); - - // Combine new extensions for File items and existing extensions for inner Blob items. - Vector<RefPtr<SandboxExtension>> sandboxExtensions = newSandboxExtensions; - const BlobDataItemList& items = data->items(); - for (size_t i = 0, count = items.size(); i < count; ++i) { - if (items[i].type == BlobDataItem::Blob) - sandboxExtensions.appendVector(m_sandboxExtensions.get(items[i].url.string())); - } + blobRegistry().registerFileBlobURL(url, BlobDataFileReferenceWithSandboxExtension::create(path, sandboxExtension), contentType); - blobRegistry().registerBlobURL(url, std::move(data)); + ASSERT(!m_blobsForConnection.get(connection).contains(url)); + BlobForConnectionMap::iterator mapIterator = m_blobsForConnection.find(connection); + if (mapIterator == m_blobsForConnection.end()) + mapIterator = m_blobsForConnection.add(connection, HashSet<URL>()).iterator; + mapIterator->value.add(url); +} - if (!sandboxExtensions.isEmpty()) - m_sandboxExtensions.add(url.string(), sandboxExtensions); +void NetworkBlobRegistry::registerBlobURL(NetworkConnectionToWebProcess* connection, const URL& url, Vector<WebCore::BlobPart>&& blobParts, const String& contentType) +{ + blobRegistry().registerBlobURL(url, WTFMove(blobParts), contentType); ASSERT(!m_blobsForConnection.get(connection).contains(url)); BlobForConnectionMap::iterator mapIterator = m_blobsForConnection.find(connection); @@ -74,24 +73,68 @@ void NetworkBlobRegistry::registerBlobURL(NetworkConnectionToWebProcess* connect void NetworkBlobRegistry::registerBlobURL(NetworkConnectionToWebProcess* connection, const WebCore::URL& url, const WebCore::URL& srcURL) { + // The connection may not be registered if NetworkProcess prevously crashed for any reason. + BlobForConnectionMap::iterator mapIterator = m_blobsForConnection.find(connection); + if (mapIterator == m_blobsForConnection.end()) + return; + blobRegistry().registerBlobURL(url, srcURL); - SandboxExtensionMap::iterator iter = m_sandboxExtensions.find(srcURL.string()); - if (iter != m_sandboxExtensions.end()) - m_sandboxExtensions.add(url.string(), iter->value); - ASSERT(m_blobsForConnection.contains(connection)); - ASSERT(m_blobsForConnection.find(connection)->value.contains(srcURL)); - m_blobsForConnection.find(connection)->value.add(url); + ASSERT(mapIterator->value.contains(srcURL)); + mapIterator->value.add(url); +} + +void NetworkBlobRegistry::registerBlobURLOptionallyFileBacked(NetworkConnectionToWebProcess* connection, const URL& url, const URL& srcURL, const String& fileBackedPath, const String& contentType) +{ + auto fileReference = connection->getBlobDataFileReferenceForPath(fileBackedPath); + ASSERT(fileReference); + + blobRegistry().registerBlobURLOptionallyFileBacked(url, srcURL, WTFMove(fileReference), contentType); + + ASSERT(!m_blobsForConnection.get(connection).contains(url)); + BlobForConnectionMap::iterator mapIterator = m_blobsForConnection.find(connection); + if (mapIterator == m_blobsForConnection.end()) + mapIterator = m_blobsForConnection.add(connection, HashSet<URL>()).iterator; + mapIterator->value.add(url); +} + +void NetworkBlobRegistry::registerBlobURLForSlice(NetworkConnectionToWebProcess* connection, const WebCore::URL& url, const WebCore::URL& srcURL, int64_t start, int64_t end) +{ + // The connection may not be registered if NetworkProcess prevously crashed for any reason. + BlobForConnectionMap::iterator mapIterator = m_blobsForConnection.find(connection); + if (mapIterator == m_blobsForConnection.end()) + return; + + blobRegistry().registerBlobURLForSlice(url, srcURL, start, end); + + ASSERT(mapIterator->value.contains(srcURL)); + mapIterator->value.add(url); } void NetworkBlobRegistry::unregisterBlobURL(NetworkConnectionToWebProcess* connection, const WebCore::URL& url) { + // The connection may not be registered if NetworkProcess prevously crashed for any reason. + BlobForConnectionMap::iterator mapIterator = m_blobsForConnection.find(connection); + if (mapIterator == m_blobsForConnection.end()) + return; + blobRegistry().unregisterBlobURL(url); - m_sandboxExtensions.remove(url.string()); - ASSERT(m_blobsForConnection.contains(connection)); - ASSERT(m_blobsForConnection.find(connection)->value.contains(url)); - m_blobsForConnection.find(connection)->value.remove(url); + ASSERT(mapIterator->value.contains(url)); + mapIterator->value.remove(url); +} + +uint64_t NetworkBlobRegistry::blobSize(NetworkConnectionToWebProcess* connection, const WebCore::URL& url) +{ + if (!m_blobsForConnection.contains(connection) || !m_blobsForConnection.find(connection)->value.contains(url)) + return 0; + + return blobRegistry().blobSize(url); +} + +void NetworkBlobRegistry::writeBlobsToTemporaryFiles(const Vector<String>& blobURLs, Function<void(const Vector<String>&)>&& completionHandler) +{ + blobRegistry().writeBlobsToTemporaryFiles(blobURLs, WTFMove(completionHandler)); } void NetworkBlobRegistry::connectionToWebProcessDidClose(NetworkConnectionToWebProcess* connection) @@ -100,19 +143,29 @@ void NetworkBlobRegistry::connectionToWebProcessDidClose(NetworkConnectionToWebP return; HashSet<URL>& blobsForConnection = m_blobsForConnection.find(connection)->value; - for (HashSet<URL>::iterator iter = blobsForConnection.begin(), end = blobsForConnection.end(); iter != end; ++iter) { + for (HashSet<URL>::iterator iter = blobsForConnection.begin(), end = blobsForConnection.end(); iter != end; ++iter) blobRegistry().unregisterBlobURL(*iter); - m_sandboxExtensions.remove(*iter); - } m_blobsForConnection.remove(connection); } -const Vector<RefPtr<SandboxExtension>> NetworkBlobRegistry::sandboxExtensions(const WebCore::URL& url) +Vector<RefPtr<BlobDataFileReference>> NetworkBlobRegistry::filesInBlob(NetworkConnectionToWebProcess& connection, const WebCore::URL& url) { - return m_sandboxExtensions.get(url.string()); -} + if (!m_blobsForConnection.contains(&connection) || !m_blobsForConnection.find(&connection)->value.contains(url)) + return Vector<RefPtr<BlobDataFileReference>>(); + + ASSERT(blobRegistry().isBlobRegistryImpl()); + BlobData* blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(url); + if (!blobData) + return Vector<RefPtr<BlobDataFileReference>>(); + + Vector<RefPtr<BlobDataFileReference>> result; + for (const BlobDataItem& item : blobData->items()) { + if (item.type() == BlobDataItem::Type::File) + result.append(item.file()); + } + return result; } -#endif +} diff --git a/Source/WebKit2/NetworkProcess/FileAPI/NetworkBlobRegistry.h b/Source/WebKit2/NetworkProcess/FileAPI/NetworkBlobRegistry.h index 16c6adb09..40378b0bf 100644 --- a/Source/WebKit2/NetworkProcess/FileAPI/NetworkBlobRegistry.h +++ b/Source/WebKit2/NetworkProcess/FileAPI/NetworkBlobRegistry.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 Apple Inc. All rights reserved. + * Copyright (C) 2013-2016 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -23,17 +23,16 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef NetworkBlobRegistry_h -#define NetworkBlobRegistry_h - -#if ENABLE(BLOB) && ENABLE(NETWORK_PROCESS) +#pragma once #include <WebCore/URLHash.h> +#include <wtf/Function.h> #include <wtf/HashMap.h> #include <wtf/HashSet.h> namespace WebCore { -class BlobData; +class BlobDataFileReference; +class BlobPart; } namespace WebKit { @@ -45,28 +44,26 @@ class NetworkBlobRegistry { WTF_MAKE_NONCOPYABLE(NetworkBlobRegistry); public: NetworkBlobRegistry(); - static NetworkBlobRegistry& shared(); + static NetworkBlobRegistry& singleton(); - void registerBlobURL(NetworkConnectionToWebProcess*, const WebCore::URL&, std::unique_ptr<WebCore::BlobData>, const Vector<RefPtr<SandboxExtension>>&); + void registerFileBlobURL(NetworkConnectionToWebProcess*, const WebCore::URL&, const String& path, RefPtr<SandboxExtension>&&, const String& contentType); + void registerBlobURL(NetworkConnectionToWebProcess*, const WebCore::URL&, Vector<WebCore::BlobPart>&&, const String& contentType); void registerBlobURL(NetworkConnectionToWebProcess*, const WebCore::URL&, const WebCore::URL& srcURL); + void registerBlobURLOptionallyFileBacked(NetworkConnectionToWebProcess*, const WebCore::URL&, const WebCore::URL& srcURL, const String& fileBackedPath, const String& contentType); + void registerBlobURLForSlice(NetworkConnectionToWebProcess*, const WebCore::URL&, const WebCore::URL& srcURL, int64_t start, int64_t end); void unregisterBlobURL(NetworkConnectionToWebProcess*, const WebCore::URL&); + uint64_t blobSize(NetworkConnectionToWebProcess*, const WebCore::URL&); + void writeBlobsToTemporaryFiles(const Vector<String>& blobURLs, Function<void (const Vector<String>&)>&& completionHandler); void connectionToWebProcessDidClose(NetworkConnectionToWebProcess*); - const Vector<RefPtr<SandboxExtension>> sandboxExtensions(const WebCore::URL&); + Vector<RefPtr<WebCore::BlobDataFileReference>> filesInBlob(NetworkConnectionToWebProcess&, const WebCore::URL&); private: ~NetworkBlobRegistry(); - typedef HashMap<String, Vector<RefPtr<SandboxExtension>>> SandboxExtensionMap; - SandboxExtensionMap m_sandboxExtensions; - typedef HashMap<NetworkConnectionToWebProcess*, HashSet<WebCore::URL>> BlobForConnectionMap; BlobForConnectionMap m_blobsForConnection; }; } - -#endif // ENABLE(BLOB) && ENABLE(NETWORK_PROCESS) - -#endif // NetworkBlobRegistry_h |