summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.cpp
diff options
context:
space:
mode:
authorKonstantin Tokarev <annulen@yandex.ru>2016-08-25 19:20:41 +0300
committerKonstantin Tokarev <annulen@yandex.ru>2017-02-02 12:30:55 +0000
commit6882a04fb36642862b11efe514251d32070c3d65 (patch)
treeb7959826000b061fd5ccc7512035c7478742f7b0 /Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.cpp
parentab6df191029eeeb0b0f16f127d553265659f739e (diff)
downloadqtwebkit-6882a04fb36642862b11efe514251d32070c3d65.tar.gz
Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443)
Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.cpp')
-rw-r--r--Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.cpp233
1 files changed, 233 insertions, 0 deletions
diff --git a/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.cpp b/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.cpp
new file mode 100644
index 000000000..b40662f06
--- /dev/null
+++ b/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.cpp
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2014 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 "WebUserContentControllerProxy.h"
+
+#include "APIArray.h"
+#include "APIUserScript.h"
+#include "APIUserStyleSheet.h"
+#include "DataReference.h"
+#include "WebProcessProxy.h"
+#include "WebScriptMessageHandler.h"
+#include "WebUserContentControllerMessages.h"
+#include "WebUserContentControllerProxyMessages.h"
+#include <WebCore/SerializedScriptValue.h>
+
+#if ENABLE(CONTENT_EXTENSIONS)
+#include "APIUserContentExtension.h"
+#include "WebCompiledContentExtension.h"
+#endif
+
+namespace WebKit {
+
+static uint64_t generateIdentifier()
+{
+ static uint64_t identifier;
+
+ return ++identifier;
+}
+
+WebUserContentControllerProxy::WebUserContentControllerProxy()
+ : m_identifier(generateIdentifier())
+ , m_userScripts(API::Array::create())
+ , m_userStyleSheets(API::Array::create())
+{
+}
+
+WebUserContentControllerProxy::~WebUserContentControllerProxy()
+{
+ for (WebProcessProxy* process : m_processes) {
+ process->removeMessageReceiver(Messages::WebUserContentControllerProxy::messageReceiverName(), m_identifier);
+ process->didDestroyWebUserContentControllerProxy(*this);
+ }
+}
+
+void WebUserContentControllerProxy::addProcess(WebProcessProxy& webProcessProxy)
+{
+ ASSERT(webProcessProxy.state() == WebProcessProxy::State::Running);
+
+ if (!m_processes.add(&webProcessProxy).isNewEntry)
+ return;
+
+ webProcessProxy.addMessageReceiver(Messages::WebUserContentControllerProxy::messageReceiverName(), m_identifier, *this);
+
+ Vector<WebCore::UserScript> userScripts;
+ for (const auto& userScript : m_userScripts->elementsOfType<API::UserScript>())
+ userScripts.append(userScript->userScript());
+ webProcessProxy.connection()->send(Messages::WebUserContentController::AddUserScripts(userScripts), m_identifier);
+
+ Vector<WebCore::UserStyleSheet> userStyleSheets;
+ for (const auto& userStyleSheet : m_userStyleSheets->elementsOfType<API::UserStyleSheet>())
+ userStyleSheets.append(userStyleSheet->userStyleSheet());
+ webProcessProxy.connection()->send(Messages::WebUserContentController::AddUserStyleSheets(userStyleSheets), m_identifier);
+
+ Vector<WebScriptMessageHandlerHandle> messageHandlerHandles;
+ for (auto& handler : m_scriptMessageHandlers.values())
+ messageHandlerHandles.append(handler->handle());
+ webProcessProxy.connection()->send(Messages::WebUserContentController::AddUserScriptMessageHandlers(messageHandlerHandles), m_identifier);
+
+#if ENABLE(CONTENT_EXTENSIONS)
+ Vector<std::pair<String, WebCompiledContentExtensionData>> userContentExtensions;
+ for (const auto& userContentExtension : m_userContentExtensions.values())
+ userContentExtensions.append(std::make_pair(userContentExtension->name(), userContentExtension->compiledExtension().data()));
+ webProcessProxy.connection()->send(Messages::WebUserContentController::AddUserContentExtensions(userContentExtensions), m_identifier);
+#endif
+}
+
+void WebUserContentControllerProxy::removeProcess(WebProcessProxy& webProcessProxy)
+{
+ ASSERT(m_processes.contains(&webProcessProxy));
+
+ m_processes.remove(&webProcessProxy);
+ webProcessProxy.removeMessageReceiver(Messages::WebUserContentControllerProxy::messageReceiverName(), m_identifier);
+}
+
+void WebUserContentControllerProxy::addUserScript(API::UserScript& userScript)
+{
+ m_userScripts->elements().append(&userScript);
+
+ for (WebProcessProxy* process : m_processes)
+ process->connection()->send(Messages::WebUserContentController::AddUserScripts({ userScript.userScript() }), m_identifier);
+}
+
+void WebUserContentControllerProxy::removeUserScript(const API::UserScript& userScript)
+{
+ for (WebProcessProxy* process : m_processes)
+ process->connection()->send(Messages::WebUserContentController::RemoveUserScript({ userScript.userScript().url().string() }), m_identifier);
+
+ m_userScripts->elements().removeAll(&userScript);
+}
+
+void WebUserContentControllerProxy::removeAllUserScripts()
+{
+ m_userScripts->elements().clear();
+
+ for (WebProcessProxy* process : m_processes)
+ process->connection()->send(Messages::WebUserContentController::RemoveAllUserScripts(), m_identifier);
+}
+
+void WebUserContentControllerProxy::addUserStyleSheet(API::UserStyleSheet& userStyleSheet)
+{
+ m_userStyleSheets->elements().append(&userStyleSheet);
+
+ for (WebProcessProxy* process : m_processes)
+ process->connection()->send(Messages::WebUserContentController::AddUserStyleSheets({ userStyleSheet.userStyleSheet() }), m_identifier);
+}
+
+void WebUserContentControllerProxy::removeUserStyleSheet(const API::UserStyleSheet& userStyleSheet)
+{
+ for (WebProcessProxy* process : m_processes)
+ process->connection()->send(Messages::WebUserContentController::RemoveUserStyleSheet({ userStyleSheet.userStyleSheet().url().string() }), m_identifier);
+
+ m_userStyleSheets->elements().removeAll(&userStyleSheet);
+}
+
+void WebUserContentControllerProxy::removeAllUserStyleSheets()
+{
+ m_userStyleSheets->elements().clear();
+
+ for (WebProcessProxy* process : m_processes)
+ process->connection()->send(Messages::WebUserContentController::RemoveAllUserStyleSheets(), m_identifier);
+}
+
+bool WebUserContentControllerProxy::addUserScriptMessageHandler(WebScriptMessageHandler* handler)
+{
+ for (auto& existingHandler : m_scriptMessageHandlers.values()) {
+ if (existingHandler->name() == handler->name())
+ return false;
+ }
+
+ m_scriptMessageHandlers.add(handler->identifier(), handler);
+
+ for (WebProcessProxy* process : m_processes)
+ process->connection()->send(Messages::WebUserContentController::AddUserScriptMessageHandlers({ handler->handle() }), m_identifier);
+
+ return true;
+}
+
+void WebUserContentControllerProxy::removeUserMessageHandlerForName(const String& name)
+{
+ for (auto it = m_scriptMessageHandlers.begin(), end = m_scriptMessageHandlers.end(); it != end; ++it) {
+ if (it->value->name() == name) {
+ for (WebProcessProxy* process : m_processes)
+ process->connection()->send(Messages::WebUserContentController::RemoveUserScriptMessageHandler(it->value->identifier()), m_identifier);
+ m_scriptMessageHandlers.remove(it);
+ return;
+ }
+ }
+}
+
+void WebUserContentControllerProxy::didPostMessage(IPC::Connection& connection, uint64_t pageID, uint64_t frameID, const WebCore::SecurityOriginData& securityOrigin, uint64_t messageHandlerID, const IPC::DataReference& dataReference)
+{
+ WebPageProxy* page = WebProcessProxy::webPage(pageID);
+ if (!page)
+ return;
+
+ WebProcessProxy* webProcess = WebProcessProxy::fromConnection(&connection);
+ WebFrameProxy* frame = webProcess->webFrame(frameID);
+ if (!frame)
+ return;
+
+ if (!HashMap<uint64_t, RefPtr<WebScriptMessageHandler>>::isValidKey(messageHandlerID))
+ return;
+
+ RefPtr<WebScriptMessageHandler> handler = m_scriptMessageHandlers.get(messageHandlerID);
+ if (!handler)
+ return;
+
+ handler->client().didPostMessage(*page, *frame, securityOrigin,
+ WebCore::SerializedScriptValue::adopt(dataReference.vector()));
+}
+
+#if ENABLE(CONTENT_EXTENSIONS)
+void WebUserContentControllerProxy::addUserContentExtension(API::UserContentExtension& userContentExtension)
+{
+ m_userContentExtensions.set(userContentExtension.name(), &userContentExtension);
+
+ auto pair = std::make_pair(userContentExtension.name(), userContentExtension.compiledExtension().data());
+
+ for (WebProcessProxy* process : m_processes)
+ process->connection()->send(Messages::WebUserContentController::AddUserContentExtensions({ pair }), m_identifier);
+}
+
+void WebUserContentControllerProxy::removeUserContentExtension(const String& name)
+{
+ m_userContentExtensions.remove(name);
+
+ for (WebProcessProxy* process : m_processes)
+ process->connection()->send(Messages::WebUserContentController::RemoveUserContentExtension(name), m_identifier);
+}
+
+void WebUserContentControllerProxy::removeAllUserContentExtensions()
+{
+ m_userContentExtensions.clear();
+
+ for (WebProcessProxy* process : m_processes)
+ process->connection()->send(Messages::WebUserContentController::RemoveAllUserContentExtensions(), m_identifier);
+}
+#endif
+
+} // namespace WebKit