summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/Databases
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebKit2/UIProcess/Databases
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebKit2/UIProcess/Databases')
-rw-r--r--Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.cpp227
-rw-r--r--Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.h100
-rw-r--r--Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.messages.in37
3 files changed, 364 insertions, 0 deletions
diff --git a/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.cpp b/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.cpp
new file mode 100644
index 000000000..262cd26d3
--- /dev/null
+++ b/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.cpp
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "DatabaseProcessProxy.h"
+
+#include "DatabaseProcessMessages.h"
+#include "DatabaseProcessProxyMessages.h"
+#include "NetworkProcessMessages.h"
+#include "WebProcessPool.h"
+#include "WebsiteData.h"
+#include <WebCore/NotImplemented.h>
+
+#if ENABLE(DATABASE_PROCESS)
+
+using namespace WebCore;
+
+namespace WebKit {
+
+static uint64_t generateCallbackID()
+{
+ static uint64_t callbackID;
+
+ return ++callbackID;
+}
+
+Ref<DatabaseProcessProxy> DatabaseProcessProxy::create(WebProcessPool* processPool)
+{
+ return adoptRef(*new DatabaseProcessProxy(processPool));
+}
+
+DatabaseProcessProxy::DatabaseProcessProxy(WebProcessPool* processPool)
+ : ChildProcessProxy(processPool->alwaysRunsAtBackgroundPriority())
+ , m_processPool(processPool)
+ , m_numPendingConnectionRequests(0)
+{
+ connect();
+}
+
+DatabaseProcessProxy::~DatabaseProcessProxy()
+{
+ ASSERT(m_pendingFetchWebsiteDataCallbacks.isEmpty());
+ ASSERT(m_pendingDeleteWebsiteDataCallbacks.isEmpty());
+ ASSERT(m_pendingDeleteWebsiteDataForOriginsCallbacks.isEmpty());
+}
+
+void DatabaseProcessProxy::getLaunchOptions(ProcessLauncher::LaunchOptions& launchOptions)
+{
+ launchOptions.processType = ProcessLauncher::ProcessType::Database;
+ ChildProcessProxy::getLaunchOptions(launchOptions);
+}
+
+void DatabaseProcessProxy::processWillShutDown(IPC::Connection& connection)
+{
+ ASSERT_UNUSED(connection, this->connection() == &connection);
+}
+
+void DatabaseProcessProxy::didReceiveMessage(IPC::Connection& connection, IPC::Decoder& decoder)
+{
+ if (decoder.messageReceiverName() == Messages::DatabaseProcessProxy::messageReceiverName()) {
+ didReceiveDatabaseProcessProxyMessage(connection, decoder);
+ return;
+ }
+}
+
+void DatabaseProcessProxy::fetchWebsiteData(SessionID sessionID, OptionSet<WebsiteDataType> dataTypes, std::function<void (WebsiteData)> completionHandler)
+{
+ ASSERT(canSendMessage());
+
+ uint64_t callbackID = generateCallbackID();
+ m_pendingFetchWebsiteDataCallbacks.add(callbackID, WTFMove(completionHandler));
+
+ send(Messages::DatabaseProcess::FetchWebsiteData(sessionID, dataTypes, callbackID), 0);
+}
+
+void DatabaseProcessProxy::deleteWebsiteData(WebCore::SessionID sessionID, OptionSet<WebsiteDataType> dataTypes, std::chrono::system_clock::time_point modifiedSince, std::function<void ()> completionHandler)
+{
+ auto callbackID = generateCallbackID();
+
+ m_pendingDeleteWebsiteDataCallbacks.add(callbackID, WTFMove(completionHandler));
+ send(Messages::DatabaseProcess::DeleteWebsiteData(sessionID, dataTypes, modifiedSince, callbackID), 0);
+}
+
+void DatabaseProcessProxy::deleteWebsiteDataForOrigins(SessionID sessionID, OptionSet<WebsiteDataType> dataTypes, const Vector<WebCore::SecurityOriginData>& origins, std::function<void()> completionHandler)
+{
+ ASSERT(canSendMessage());
+
+ uint64_t callbackID = generateCallbackID();
+ m_pendingDeleteWebsiteDataForOriginsCallbacks.add(callbackID, WTFMove(completionHandler));
+
+ send(Messages::DatabaseProcess::DeleteWebsiteDataForOrigins(sessionID, dataTypes, origins, callbackID), 0);
+}
+
+void DatabaseProcessProxy::getDatabaseProcessConnection(Ref<Messages::WebProcessProxy::GetDatabaseProcessConnection::DelayedReply>&& reply)
+{
+ m_pendingConnectionReplies.append(WTFMove(reply));
+
+ if (state() == State::Launching) {
+ m_numPendingConnectionRequests++;
+ return;
+ }
+
+ connection()->send(Messages::DatabaseProcess::CreateDatabaseToWebProcessConnection(), 0, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
+}
+
+void DatabaseProcessProxy::didClose(IPC::Connection&)
+{
+ // The database process must have crashed or exited, so send any pending sync replies we might have.
+ while (!m_pendingConnectionReplies.isEmpty()) {
+ auto reply = m_pendingConnectionReplies.takeFirst();
+
+#if USE(UNIX_DOMAIN_SOCKETS)
+ reply->send(IPC::Attachment());
+#elif OS(DARWIN)
+ reply->send(IPC::Attachment(0, MACH_MSG_TYPE_MOVE_SEND));
+#else
+ notImplemented();
+#endif
+ }
+
+ for (const auto& callback : m_pendingFetchWebsiteDataCallbacks.values())
+ callback(WebsiteData());
+ m_pendingFetchWebsiteDataCallbacks.clear();
+
+ for (const auto& callback : m_pendingDeleteWebsiteDataCallbacks.values())
+ callback();
+ m_pendingDeleteWebsiteDataCallbacks.clear();
+
+ for (const auto& callback : m_pendingDeleteWebsiteDataForOriginsCallbacks.values())
+ callback();
+ m_pendingDeleteWebsiteDataForOriginsCallbacks.clear();
+
+ // Tell ProcessPool to forget about this database process. This may cause us to be deleted.
+ m_processPool->databaseProcessCrashed(this);
+}
+
+void DatabaseProcessProxy::didReceiveInvalidMessage(IPC::Connection&, IPC::StringReference messageReceiverName, IPC::StringReference messageName)
+{
+}
+
+void DatabaseProcessProxy::didCreateDatabaseToWebProcessConnection(const IPC::Attachment& connectionIdentifier)
+{
+ ASSERT(!m_pendingConnectionReplies.isEmpty());
+
+ RefPtr<Messages::WebProcessProxy::GetDatabaseProcessConnection::DelayedReply> reply = m_pendingConnectionReplies.takeFirst();
+
+#if USE(UNIX_DOMAIN_SOCKETS)
+ reply->send(connectionIdentifier);
+#elif OS(DARWIN)
+ reply->send(IPC::Attachment(connectionIdentifier.port(), MACH_MSG_TYPE_MOVE_SEND));
+#else
+ notImplemented();
+#endif
+}
+
+void DatabaseProcessProxy::didFetchWebsiteData(uint64_t callbackID, const WebsiteData& websiteData)
+{
+ auto callback = m_pendingFetchWebsiteDataCallbacks.take(callbackID);
+ callback(websiteData);
+}
+
+void DatabaseProcessProxy::didDeleteWebsiteData(uint64_t callbackID)
+{
+ auto callback = m_pendingDeleteWebsiteDataCallbacks.take(callbackID);
+ callback();
+}
+
+void DatabaseProcessProxy::didDeleteWebsiteDataForOrigins(uint64_t callbackID)
+{
+ auto callback = m_pendingDeleteWebsiteDataForOriginsCallbacks.take(callbackID);
+ callback();
+}
+
+#if ENABLE(SANDBOX_EXTENSIONS)
+void DatabaseProcessProxy::getSandboxExtensionsForBlobFiles(uint64_t requestID, const Vector<String>& paths)
+{
+ SandboxExtension::HandleArray extensions;
+ extensions.allocate(paths.size());
+ for (size_t i = 0; i < paths.size(); ++i) {
+ // ReadWrite is required for creating hard links, which is something that might be done with these extensions.
+ SandboxExtension::createHandle(paths[i], SandboxExtension::ReadWrite, extensions[i]);
+ }
+
+ send(Messages::DatabaseProcess::DidGetSandboxExtensionsForBlobFiles(requestID, extensions), 0);
+}
+#endif
+
+void DatabaseProcessProxy::didFinishLaunching(ProcessLauncher* launcher, IPC::Connection::Identifier connectionIdentifier)
+{
+ ChildProcessProxy::didFinishLaunching(launcher, connectionIdentifier);
+
+ if (IPC::Connection::identifierIsNull(connectionIdentifier)) {
+ // FIXME: Do better cleanup here.
+ return;
+ }
+
+ for (unsigned i = 0; i < m_numPendingConnectionRequests; ++i)
+ connection()->send(Messages::DatabaseProcess::CreateDatabaseToWebProcessConnection(), 0);
+
+ m_numPendingConnectionRequests = 0;
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(DATABASE_PROCESS)
diff --git a/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.h b/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.h
new file mode 100644
index 000000000..a80d69182
--- /dev/null
+++ b/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.h
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef DatabaseProcessProxy_h
+#define DatabaseProcessProxy_h
+
+#if ENABLE(DATABASE_PROCESS)
+
+#include "ChildProcessProxy.h"
+#include "ProcessLauncher.h"
+#include "WebProcessProxyMessages.h"
+#include <wtf/Deque.h>
+#include <wtf/Forward.h>
+
+namespace WebCore {
+class SecurityOrigin;
+class SessionID;
+struct SecurityOriginData;
+}
+
+namespace WebKit {
+
+class WebProcessPool;
+enum class WebsiteDataType;
+struct WebsiteData;
+
+class DatabaseProcessProxy : public ChildProcessProxy {
+public:
+ static Ref<DatabaseProcessProxy> create(WebProcessPool*);
+ ~DatabaseProcessProxy();
+
+ void fetchWebsiteData(WebCore::SessionID, OptionSet<WebsiteDataType>, std::function<void(WebsiteData)> completionHandler);
+ void deleteWebsiteData(WebCore::SessionID, OptionSet<WebsiteDataType>, std::chrono::system_clock::time_point modifiedSince, std::function<void()> completionHandler);
+ void deleteWebsiteDataForOrigins(WebCore::SessionID, OptionSet<WebsiteDataType>, const Vector<WebCore::SecurityOriginData>&, std::function<void()> completionHandler);
+
+ void getDatabaseProcessConnection(Ref<Messages::WebProcessProxy::GetDatabaseProcessConnection::DelayedReply>&&);
+
+private:
+ DatabaseProcessProxy(WebProcessPool*);
+
+ // ChildProcessProxy
+ void getLaunchOptions(ProcessLauncher::LaunchOptions&) override;
+ void processWillShutDown(IPC::Connection&) override;
+
+ // IPC::Connection::Client
+ void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
+ void didClose(IPC::Connection&) override;
+ void didReceiveInvalidMessage(IPC::Connection&, IPC::StringReference messageReceiverName, IPC::StringReference messageName) override;
+
+ void didReceiveDatabaseProcessProxyMessage(IPC::Connection&, IPC::Decoder&);
+
+ // Message handlers
+ void didCreateDatabaseToWebProcessConnection(const IPC::Attachment&);
+ void didFetchWebsiteData(uint64_t callbackID, const WebsiteData&);
+ void didDeleteWebsiteData(uint64_t callbackID);
+ void didDeleteWebsiteDataForOrigins(uint64_t callbackID);
+#if ENABLE(SANDBOX_EXTENSIONS)
+ void getSandboxExtensionsForBlobFiles(uint64_t requestID, const Vector<String>& paths);
+#endif
+
+ // ProcessLauncher::Client
+ void didFinishLaunching(ProcessLauncher*, IPC::Connection::Identifier) override;
+
+ WebProcessPool* m_processPool;
+
+ unsigned m_numPendingConnectionRequests;
+ Deque<Ref<Messages::WebProcessProxy::GetDatabaseProcessConnection::DelayedReply>> m_pendingConnectionReplies;
+
+ HashMap<uint64_t, std::function<void (WebsiteData)>> m_pendingFetchWebsiteDataCallbacks;
+ HashMap<uint64_t, std::function<void ()>> m_pendingDeleteWebsiteDataCallbacks;
+ HashMap<uint64_t, std::function<void ()>> m_pendingDeleteWebsiteDataForOriginsCallbacks;
+};
+
+} // namespace WebKit
+
+#endif // ENABLE(DATABASE_PROCESS)
+
+#endif // DatabaseProcessProxy_h
diff --git a/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.messages.in b/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.messages.in
new file mode 100644
index 000000000..55f73f73b
--- /dev/null
+++ b/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.messages.in
@@ -0,0 +1,37 @@
+# Copyright (C) 2013 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#if ENABLE(DATABASE_PROCESS)
+
+messages -> DatabaseProcessProxy LegacyReceiver {
+ DidCreateDatabaseToWebProcessConnection(IPC::Attachment connectionIdentifier)
+
+ DidFetchWebsiteData(uint64_t callbackID, struct WebKit::WebsiteData websiteData)
+ DidDeleteWebsiteData(uint64_t callbackID)
+ DidDeleteWebsiteDataForOrigins(uint64_t callbackID)
+
+#if ENABLE(SANDBOX_EXTENSIONS)
+ GetSandboxExtensionsForBlobFiles(uint64_t requestID, Vector<String> paths)
+#endif
+}
+
+#endif // ENABLE(DATABASE_PROCESS)