diff options
-rw-r--r-- | src/core/common/qt_messages.h | 25 | ||||
-rw-r--r-- | src/core/common/user_script_data.cpp | 49 | ||||
-rw-r--r-- | src/core/common/user_script_data.h | 74 | ||||
-rw-r--r-- | src/core/core_chromium.pri | 2 | ||||
-rw-r--r-- | src/core/qtwebengine.gni | 1 | ||||
-rw-r--r-- | src/core/renderer/render_thread_observer_qt.cpp | 6 | ||||
-rw-r--r-- | src/core/renderer/user_resource_controller.cpp | 110 | ||||
-rw-r--r-- | src/core/renderer/user_resource_controller.h | 29 | ||||
-rw-r--r-- | src/core/renderer_host/user_resource_controller_host.cpp | 75 | ||||
-rw-r--r-- | src/core/renderer_host/user_resource_controller_host.h | 16 | ||||
-rw-r--r-- | src/core/user_script.cpp | 7 | ||||
-rw-r--r-- | src/core/user_script.h | 3 | ||||
-rw-r--r-- | tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp | 2 |
13 files changed, 158 insertions, 241 deletions
diff --git a/src/core/common/qt_messages.h b/src/core/common/qt_messages.h index 43f07c9a6..211c3c3de 100644 --- a/src/core/common/qt_messages.h +++ b/src/core/common/qt_messages.h @@ -9,20 +9,6 @@ #include "content/public/common/webplugininfo.h" #include "ipc/ipc_message_macros.h" #include "ppapi/buildflags/buildflags.h" -#include "user_script_data.h" - -IPC_STRUCT_TRAITS_BEGIN(UserScriptData) - IPC_STRUCT_TRAITS_MEMBER(source) - IPC_STRUCT_TRAITS_MEMBER(url) - IPC_STRUCT_TRAITS_MEMBER(injectionPoint) - IPC_STRUCT_TRAITS_MEMBER(injectForSubframes) - IPC_STRUCT_TRAITS_MEMBER(worldId) - IPC_STRUCT_TRAITS_MEMBER(scriptId) - IPC_STRUCT_TRAITS_MEMBER(globs) - IPC_STRUCT_TRAITS_MEMBER(excludeGlobs) - IPC_STRUCT_TRAITS_MEMBER(urlPatterns) -IPC_STRUCT_TRAITS_END() - #define IPC_MESSAGE_START QtMsgStart @@ -39,17 +25,6 @@ IPC_MESSAGE_ROUTED1(RenderViewObserverQt_FetchDocumentInnerText, IPC_MESSAGE_ROUTED1(RenderViewObserverQt_SetBackgroundColor, uint32_t /* color */) -// User scripts messages -IPC_MESSAGE_ROUTED1(RenderFrameObserverHelper_AddScript, - UserScriptData /* script */) -IPC_MESSAGE_ROUTED1(RenderFrameObserverHelper_RemoveScript, - UserScriptData /* script */) -IPC_MESSAGE_ROUTED0(RenderFrameObserverHelper_ClearScripts) - -IPC_MESSAGE_CONTROL1(UserResourceController_AddScript, UserScriptData /* scriptContents */) -IPC_MESSAGE_CONTROL1(UserResourceController_RemoveScript, UserScriptData /* scriptContents */) -IPC_MESSAGE_CONTROL0(UserResourceController_ClearScripts) - // Tells the renderer whether or not a file system access has been allowed. IPC_MESSAGE_ROUTED2(QtWebEngineMsg_RequestFileSystemAccessAsyncResponse, int /* request_id */, diff --git a/src/core/common/user_script_data.cpp b/src/core/common/user_script_data.cpp deleted file mode 100644 index 6f4b8cb05..000000000 --- a/src/core/common/user_script_data.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWebEngine module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "user_script_data.h" -#include "base/pickle.h" - -UserScriptData::UserScriptData() : injectionPoint(AfterLoad) - , injectForSubframes(false) - , worldId(1) -{ - static uint64_t idCount = 0; - scriptId = idCount++; -} diff --git a/src/core/common/user_script_data.h b/src/core/common/user_script_data.h deleted file mode 100644 index 8d98890e3..000000000 --- a/src/core/common/user_script_data.h +++ /dev/null @@ -1,74 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWebEngine module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef USER_SCRIPT_DATA_H -#define USER_SCRIPT_DATA_H - -#include <QtCore/QHash> -#include <string> -#include "ipc/ipc_message_utils.h" -#include "url/gurl.h" - -struct UserScriptData { - enum InjectionPoint { - AfterLoad, - DocumentLoadFinished, - DocumentElementCreation - }; - - UserScriptData(); - - std::string source; - GURL url; - /*InjectionPoint*/uint8_t injectionPoint; - bool injectForSubframes; - uint worldId; - uint64_t scriptId; - std::vector<std::string> globs; - std::vector<std::string> excludeGlobs; - std::vector<std::string> urlPatterns; -}; - -QT_BEGIN_NAMESPACE - -Q_DECLARE_TYPEINFO(UserScriptData, Q_MOVABLE_TYPE); - -QT_END_NAMESPACE - -#endif // USER_SCRIPT_DATA_H diff --git a/src/core/core_chromium.pri b/src/core/core_chromium.pri index 836d30c0e..477472897 100644 --- a/src/core/core_chromium.pri +++ b/src/core/core_chromium.pri @@ -52,7 +52,6 @@ SOURCES = \ color_chooser_controller.cpp \ common/qt_ipc_logging.cpp \ common/qt_messages.cpp \ - common/user_script_data.cpp \ compositor/content_gpu_client_qt.cpp \ compositor/display_frame_sink.cpp \ compositor/display_overrides.cpp \ @@ -155,7 +154,6 @@ HEADERS = \ color_chooser_controller_p.h \ color_chooser_controller.h \ common/qt_messages.h \ - common/user_script_data.h \ compositor/content_gpu_client_qt.h \ compositor/display_frame_sink.h \ compositor/display_software_output_surface.h \ diff --git a/src/core/qtwebengine.gni b/src/core/qtwebengine.gni index a5628bb88..9afdc0e76 100644 --- a/src/core/qtwebengine.gni +++ b/src/core/qtwebengine.gni @@ -41,6 +41,7 @@ deps = [ "//ui/accessibility", "//ui/gl", "//qtwebengine/browser:interfaces", + "//qtwebengine/userscript", "//qtwebengine/browser:service_manifests", "//qtwebengine/common:mojo_bindings", ":qtwebengine_sources", diff --git a/src/core/renderer/render_thread_observer_qt.cpp b/src/core/renderer/render_thread_observer_qt.cpp index 4912ebfc2..b2ed38f21 100644 --- a/src/core/renderer/render_thread_observer_qt.cpp +++ b/src/core/renderer/render_thread_observer_qt.cpp @@ -43,7 +43,7 @@ // found in the LICENSE file. #include "renderer/render_thread_observer_qt.h" - +#include "user_resource_controller.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" namespace QtWebEngineCore { @@ -54,11 +54,15 @@ void RenderThreadObserverQt::RegisterMojoInterfaces(blink::AssociatedInterfaceRe { associated_interfaces->AddInterface( base::Bind(&RenderThreadObserverQt::OnRendererConfigurationAssociatedRequest, base::Unretained(this))); + associated_interfaces->AddInterface( + base::Bind(&UserResourceController::BindReceiver, + base::Unretained(UserResourceController::instance()))); } void RenderThreadObserverQt::UnregisterMojoInterfaces(blink::AssociatedInterfaceRegistry *associated_interfaces) { associated_interfaces->RemoveInterface(qtwebengine::mojom::RendererConfiguration::Name_); + associated_interfaces->RemoveInterface(qtwebengine::mojom::UserResourceController::Name_); } void RenderThreadObserverQt::SetInitialConfiguration(bool is_incognito_process) diff --git a/src/core/renderer/user_resource_controller.cpp b/src/core/renderer/user_resource_controller.cpp index 5c1bd301f..5f446e3b2 100644 --- a/src/core/renderer/user_resource_controller.cpp +++ b/src/core/renderer/user_resource_controller.cpp @@ -52,9 +52,12 @@ #include "third_party/blink/public/web/web_script_source.h" #include "third_party/blink/public/web/web_view.h" #include "v8/include/v8.h" +#include "mojo/public/cpp/bindings/associated_receiver.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" #include "common/qt_messages.h" -#include "common/user_script_data.h" +#include "qtwebengine/userscript/user_script_data.h" #include "type_conversion.h" #include "user_script.h" @@ -97,7 +100,7 @@ static bool includeRuleMatchesURL(const std::string &pat, const GURL &url) return false; } -static bool scriptMatchesURL(const UserScriptData &scriptData, const GURL &url) +static bool scriptMatchesURL(const QtWebEngineCore::UserScriptData &scriptData, const GURL &url) { // Logic taken from Chromium (extensions/common/user_script.cc) bool matchFound; @@ -132,10 +135,17 @@ static bool scriptMatchesURL(const UserScriptData &scriptData, const GURL &url) return true; } -class UserResourceController::RenderFrameObserverHelper : public content::RenderFrameObserver +// using UserScriptDataPtr = mojo::StructPtr<qtwebengine::mojom::UserScriptData>; + +class UserResourceController::RenderFrameObserverHelper + : public content::RenderFrameObserver, + public qtwebengine::mojom::UserResourceControllerRenderFrame { public: RenderFrameObserverHelper(content::RenderFrame *render_frame); + void BindReceiver( + mojo::PendingAssociatedReceiver<qtwebengine::mojom::UserResourceControllerRenderFrame> + receiver); private: // RenderFrameObserver implementation. @@ -144,14 +154,13 @@ private: void DidFinishLoad() override; void FrameDetached() override; void OnDestruct() override; - bool OnMessageReceived(const IPC::Message &message) override; - - void onUserScriptAdded(const UserScriptData &); - void onUserScriptRemoved(const UserScriptData &); - void onScriptsCleared(); + void AddScript(const QtWebEngineCore::UserScriptData &data) override; + void RemoveScript(const QtWebEngineCore::UserScriptData &data) override; + void ClearScripts() override; class Runner; QScopedPointer<Runner> m_runner; + mojo::AssociatedReceiver<qtwebengine::mojom::UserResourceControllerRenderFrame> m_binding; }; // Helper class to create WeakPtrs so the AfterLoad tasks can be canceled and to @@ -161,7 +170,7 @@ class UserResourceController::RenderFrameObserverHelper::Runner : public base::S public: explicit Runner(blink::WebLocalFrame *frame) : m_frame(frame) {} - void run(UserScriptData::InjectionPoint p) + void run(QtWebEngineCore::UserScriptData::InjectionPoint p) { DCHECK_LT(p, m_ran.size()); if (!m_ran[p]) { @@ -186,7 +195,8 @@ private: void OnDestruct() override; }; -void UserResourceController::runScripts(UserScriptData::InjectionPoint p, blink::WebLocalFrame *frame) +void UserResourceController::runScripts(QtWebEngineCore::UserScriptData::InjectionPoint p, + blink::WebLocalFrame *frame) { content::RenderFrame *renderFrame = content::RenderFrame::FromWebFrame(frame); if (!renderFrame) @@ -201,7 +211,7 @@ void UserResourceController::runScripts(UserScriptData::InjectionPoint p, blink: scriptsToRun.append(m_viewUserScriptMap.value(renderView).toList()); for (uint64_t id : qAsConst(scriptsToRun)) { - const UserScriptData &script = m_scripts.value(id); + const QtWebEngineCore::UserScriptData &script = m_scripts.value(id); if (script.injectionPoint != p || (!script.injectForSubframes && !isMainFrame)) continue; if (!scriptMatchesURL(script, frame->GetDocument().Url())) @@ -216,17 +226,29 @@ void UserResourceController::runScripts(UserScriptData::InjectionPoint p, blink: void UserResourceController::RunScriptsAtDocumentEnd(content::RenderFrame *render_frame) { - runScripts(UserScriptData::DocumentLoadFinished, render_frame->GetWebFrame()); + runScripts(QtWebEngineCore::UserScriptData::DocumentLoadFinished, render_frame->GetWebFrame()); } -UserResourceController::RenderFrameObserverHelper::RenderFrameObserverHelper(content::RenderFrame *render_frame) - : content::RenderFrameObserver(render_frame) -{} +UserResourceController::RenderFrameObserverHelper::RenderFrameObserverHelper( + content::RenderFrame *render_frame) + : content::RenderFrameObserver(render_frame), m_binding(this) +{ + render_frame->GetAssociatedInterfaceRegistry()->AddInterface( + base::BindRepeating(&UserResourceController::RenderFrameObserverHelper::BindReceiver, + base::Unretained(this))); +} UserResourceController::RenderViewObserverHelper::RenderViewObserverHelper(content::RenderView *render_view) : content::RenderViewObserver(render_view) {} +void UserResourceController::RenderFrameObserverHelper::BindReceiver( + mojo::PendingAssociatedReceiver<qtwebengine::mojom::UserResourceControllerRenderFrame> + receiver) +{ + m_binding.Bind(std::move(receiver)); +} + void UserResourceController::RenderFrameObserverHelper::DidCommitProvisionalLoad(bool is_same_document_navigation, ui::PageTransition /*transitionbool*/) { @@ -240,7 +262,9 @@ void UserResourceController::RenderFrameObserverHelper::DidCommitProvisionalLoad m_runner.reset(new Runner(render_frame()->GetWebFrame())); base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(&Runner::run, m_runner->AsWeakPtr(), UserScriptData::DocumentElementCreation)); + FROM_HERE, + base::BindOnce(&Runner::run, m_runner->AsWeakPtr(), + QtWebEngineCore::UserScriptData::DocumentElementCreation)); } void UserResourceController::RenderFrameObserverHelper::DidFinishDocumentLoad() @@ -249,7 +273,9 @@ void UserResourceController::RenderFrameObserverHelper::DidFinishDocumentLoad() // called instead of DidCommitProvisionalLoad). if (m_runner) base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, base::BindOnce(&Runner::run, m_runner->AsWeakPtr(), UserScriptData::AfterLoad), + FROM_HERE, + base::BindOnce(&Runner::run, m_runner->AsWeakPtr(), + QtWebEngineCore::UserScriptData::AfterLoad), base::TimeDelta::FromMilliseconds(afterLoadTimeout)); } @@ -257,7 +283,9 @@ void UserResourceController::RenderFrameObserverHelper::DidFinishLoad() { if (m_runner) base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(&Runner::run, m_runner->AsWeakPtr(), UserScriptData::AfterLoad)); + FROM_HERE, + base::BindOnce(&Runner::run, m_runner->AsWeakPtr(), + QtWebEngineCore::UserScriptData::AfterLoad)); } void UserResourceController::RenderFrameObserverHelper::FrameDetached() @@ -278,33 +306,23 @@ void UserResourceController::RenderViewObserverHelper::OnDestruct() delete this; } -bool UserResourceController::RenderFrameObserverHelper::OnMessageReceived(const IPC::Message &message) -{ - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(UserResourceController::RenderFrameObserverHelper, message) - IPC_MESSAGE_HANDLER(RenderFrameObserverHelper_AddScript, onUserScriptAdded) - IPC_MESSAGE_HANDLER(RenderFrameObserverHelper_RemoveScript, onUserScriptRemoved) - IPC_MESSAGE_HANDLER(RenderFrameObserverHelper_ClearScripts, onScriptsCleared) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; -} - -void UserResourceController::RenderFrameObserverHelper::onUserScriptAdded(const UserScriptData &script) +void UserResourceController::RenderFrameObserverHelper::AddScript( + const QtWebEngineCore::UserScriptData &script) { if (content::RenderFrame *frame = render_frame()) if (content::RenderView *view = frame->GetRenderView()) UserResourceController::instance()->addScriptForView(script, view); } -void UserResourceController::RenderFrameObserverHelper::onUserScriptRemoved(const UserScriptData &script) +void UserResourceController::RenderFrameObserverHelper::RemoveScript( + const QtWebEngineCore::UserScriptData &script) { if (content::RenderFrame *frame = render_frame()) if (content::RenderView *view = frame->GetRenderView()) UserResourceController::instance()->removeScriptForView(script, view); } -void UserResourceController::RenderFrameObserverHelper::onScriptsCleared() +void UserResourceController::RenderFrameObserverHelper::ClearScripts() { if (content::RenderFrame *frame = render_frame()) if (content::RenderView *view = frame->GetRenderView()) @@ -316,19 +334,13 @@ UserResourceController *UserResourceController::instance() return qt_webengine_userResourceController(); } -bool UserResourceController::OnControlMessageReceived(const IPC::Message &message) +void UserResourceController::BindReceiver( + mojo::PendingAssociatedReceiver<qtwebengine::mojom::UserResourceController> receiver) { - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(UserResourceController, message) - IPC_MESSAGE_HANDLER(UserResourceController_AddScript, onAddScript) - IPC_MESSAGE_HANDLER(UserResourceController_RemoveScript, onRemoveScript) - IPC_MESSAGE_HANDLER(UserResourceController_ClearScripts, onClearScripts) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; + m_binding.Bind(std::move(receiver)); } -UserResourceController::UserResourceController() +UserResourceController::UserResourceController() : m_binding(this) { #if !defined(QT_NO_DEBUG) || defined(QT_FORCE_ASSERTS) static bool onlyCalledOnce = true; @@ -360,7 +372,8 @@ void UserResourceController::renderViewDestroyed(content::RenderView *renderView m_viewUserScriptMap.remove(renderView); } -void UserResourceController::addScriptForView(const UserScriptData &script, content::RenderView *view) +void UserResourceController::addScriptForView(const QtWebEngineCore::UserScriptData &script, + content::RenderView *view) { ViewUserScriptMap::iterator it = m_viewUserScriptMap.find(view); if (it == m_viewUserScriptMap.end()) @@ -370,7 +383,8 @@ void UserResourceController::addScriptForView(const UserScriptData &script, cont m_scripts.insert(script.scriptId, script); } -void UserResourceController::removeScriptForView(const UserScriptData &script, content::RenderView *view) +void UserResourceController::removeScriptForView(const QtWebEngineCore::UserScriptData &script, + content::RenderView *view) { ViewUserScriptMap::iterator it = m_viewUserScriptMap.find(view); if (it == m_viewUserScriptMap.end()) @@ -391,17 +405,17 @@ void UserResourceController::clearScriptsForView(content::RenderView *view) m_viewUserScriptMap.remove(view); } -void UserResourceController::onAddScript(const UserScriptData &script) +void UserResourceController::AddScript(const QtWebEngineCore::UserScriptData &script) { addScriptForView(script, globalScriptsIndex); } -void UserResourceController::onRemoveScript(const UserScriptData &script) +void UserResourceController::RemoveScript(const QtWebEngineCore::UserScriptData &script) { removeScriptForView(script, globalScriptsIndex); } -void UserResourceController::onClearScripts() +void UserResourceController::ClearScripts() { clearScriptsForView(globalScriptsIndex); } diff --git a/src/core/renderer/user_resource_controller.h b/src/core/renderer/user_resource_controller.h index 3a493b9b7..9350c9591 100644 --- a/src/core/renderer/user_resource_controller.h +++ b/src/core/renderer/user_resource_controller.h @@ -41,8 +41,9 @@ #define USER_RESOURCE_CONTROLLER_H #include "content/public/renderer/render_thread_observer.h" - -#include "common/user_script_data.h" +#include "qtwebengine/userscript/userscript.mojom.h" +#include "qtwebengine/userscript/user_script_data.h" +#include "mojo/public/cpp/bindings/associated_receiver.h" #include <QtCore/QHash> #include <QtCore/QSet> @@ -56,7 +57,8 @@ class RenderFrame; class RenderView; } -class UserResourceController : public content::RenderThreadObserver +class UserResourceController : public content::RenderThreadObserver, + qtwebengine::mojom::UserResourceController { public: @@ -65,11 +67,13 @@ public: void renderFrameCreated(content::RenderFrame *); void renderViewCreated(content::RenderView *); void renderViewDestroyed(content::RenderView *renderView); - void addScriptForView(const UserScriptData &, content::RenderView *); - void removeScriptForView(const UserScriptData &, content::RenderView *); + void addScriptForView(const QtWebEngineCore::UserScriptData &, content::RenderView *); + void removeScriptForView(const QtWebEngineCore::UserScriptData &, content::RenderView *); void clearScriptsForView(content::RenderView *); void RunScriptsAtDocumentEnd(content::RenderFrame *render_frame); + void BindReceiver( + mojo::PendingAssociatedReceiver<qtwebengine::mojom::UserResourceController> receiver); private: Q_DISABLE_COPY(UserResourceController) @@ -77,20 +81,17 @@ private: class RenderFrameObserverHelper; class RenderViewObserverHelper; - // RenderProcessObserver implementation. - bool OnControlMessageReceived(const IPC::Message &message) override; - - void onAddScript(const UserScriptData &); - void onRemoveScript(const UserScriptData &); - void onClearScripts(); + void AddScript(const QtWebEngineCore::UserScriptData &data) override; + void RemoveScript(const QtWebEngineCore::UserScriptData &data) override; + void ClearScripts() override; - void runScripts(UserScriptData::InjectionPoint, blink::WebLocalFrame *); + void runScripts(QtWebEngineCore::UserScriptData::InjectionPoint, blink::WebLocalFrame *); typedef QSet<uint64_t> UserScriptSet; typedef QHash<const content::RenderView *, UserScriptSet> ViewUserScriptMap; ViewUserScriptMap m_viewUserScriptMap; - QHash<uint64_t, UserScriptData> m_scripts; - + QHash<uint64_t, QtWebEngineCore::UserScriptData> m_scripts; + mojo::AssociatedReceiver<qtwebengine::mojom::UserResourceController> m_binding; friend class RenderFrameObserverHelper; }; diff --git a/src/core/renderer_host/user_resource_controller_host.cpp b/src/core/renderer_host/user_resource_controller_host.cpp index 6b9bb63fe..613c2917d 100644 --- a/src/core/renderer_host/user_resource_controller_host.cpp +++ b/src/core/renderer_host/user_resource_controller_host.cpp @@ -48,6 +48,8 @@ #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_observer.h" +#include "qtwebengine/userscript/userscript.mojom.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" namespace QtWebEngineCore { @@ -75,16 +77,26 @@ UserResourceControllerHost::WebContentsObserverHelper::WebContentsObserverHelper void UserResourceControllerHost::WebContentsObserverHelper::RenderFrameCreated(content::RenderFrameHost *renderFrameHost) { content::WebContents *contents = web_contents(); + mojo::AssociatedRemote<qtwebengine::mojom::UserResourceControllerRenderFrame> + userResourceController; + renderFrameHost->GetRemoteAssociatedInterfaces()->GetInterface( + userResourceController.BindNewEndpointAndPassReceiver()); + const QList<UserScript> scripts = m_controllerHost->m_perContentsScripts.value(contents); for (const UserScript &script : scripts) - renderFrameHost->Send(new RenderFrameObserverHelper_AddScript(renderFrameHost->GetRoutingID(), script.data())); + userResourceController->AddScript(script.data()); } void UserResourceControllerHost::WebContentsObserverHelper::RenderFrameHostChanged(content::RenderFrameHost *oldHost, content::RenderFrameHost *newHost) { - if (oldHost) - oldHost->Send(new RenderFrameObserverHelper_ClearScripts(oldHost->GetRoutingID())); + if (oldHost) { + mojo::AssociatedRemote<qtwebengine::mojom::UserResourceControllerRenderFrame> + userResourceController; + oldHost->GetRemoteAssociatedInterfaces()->GetInterface( + userResourceController.BindNewEndpointAndPassReceiver()); + userResourceController->ClearScripts(); + } } void UserResourceControllerHost::WebContentsObserverHelper::WebContentsDestroyed() @@ -111,6 +123,7 @@ UserResourceControllerHost::RenderProcessObserverHelper::RenderProcessObserverHe void UserResourceControllerHost::RenderProcessObserverHelper::RenderProcessHostDestroyed(content::RenderProcessHost *renderer) { Q_ASSERT(m_controllerHost); + delete m_controllerHost->m_observedProcesses[renderer]; m_controllerHost->m_observedProcesses.remove(renderer); } @@ -123,8 +136,8 @@ void UserResourceControllerHost::addUserScript(const UserScript &script, WebCont if (isProfileWideScript) { if (!m_profileWideScripts.contains(script)) { m_profileWideScripts.append(script); - for (content::RenderProcessHost *renderer : qAsConst(m_observedProcesses)) - renderer->Send(new UserResourceController_AddScript(script.data())); + for (auto controller : m_observedProcesses.values()) + (*controller)->AddScript(script.data()); } } else { content::WebContents *contents = adapter->webContents(); @@ -141,10 +154,13 @@ void UserResourceControllerHost::addUserScript(const UserScript &script, WebCont m_perContentsScripts.insert(contents, currentScripts); } } - contents->GetRenderViewHost()->Send( - new RenderFrameObserverHelper_AddScript( - contents->GetRenderViewHost()->GetMainFrame()->GetRoutingID(), - script.data())); + mojo::AssociatedRemote<qtwebengine::mojom::UserResourceControllerRenderFrame> + userResourceController; + contents->GetRenderViewHost() + ->GetMainFrame() + ->GetRemoteAssociatedInterfaces() + ->GetInterface(userResourceController.BindNewEndpointAndPassReceiver()); + userResourceController->AddScript(script.data()); } } @@ -157,8 +173,8 @@ bool UserResourceControllerHost::removeUserScript(const UserScript &script, WebC QList<UserScript>::iterator it = std::find(m_profileWideScripts.begin(), m_profileWideScripts.end(), script); if (it == m_profileWideScripts.end()) return false; - for (content::RenderProcessHost *renderer : qAsConst(m_observedProcesses)) - renderer->Send(new UserResourceController_RemoveScript((*it).data())); + for (auto controller : m_observedProcesses.values()) + (*controller)->RemoveScript((*it).data()); m_profileWideScripts.erase(it); } else { content::WebContents *contents = adapter->webContents(); @@ -168,8 +184,13 @@ bool UserResourceControllerHost::removeUserScript(const UserScript &script, WebC QList<UserScript>::iterator it = std::find(list.begin(), list.end(), script); if (it == list.end()) return false; - contents->GetRenderViewHost()->Send( - new RenderFrameObserverHelper_RemoveScript(contents->GetMainFrame()->GetRoutingID(), (*it).data())); + mojo::AssociatedRemote<qtwebengine::mojom::UserResourceControllerRenderFrame> + userResourceController; + contents->GetRenderViewHost() + ->GetMainFrame() + ->GetRemoteAssociatedInterfaces() + ->GetInterface(userResourceController.BindNewEndpointAndPassReceiver()); + userResourceController->RemoveScript((*it).data()); list.erase(it); } return true; @@ -180,13 +201,18 @@ void UserResourceControllerHost::clearAllScripts(WebContentsAdapter *adapter) const bool isProfileWideScript = !adapter; if (isProfileWideScript) { m_profileWideScripts.clear(); - for (content::RenderProcessHost *renderer : qAsConst(m_observedProcesses)) - renderer->Send(new UserResourceController_ClearScripts); + for (auto controller : m_observedProcesses.values()) + (*controller)->ClearScripts(); } else { content::WebContents *contents = adapter->webContents(); m_perContentsScripts.remove(contents); - contents->GetRenderViewHost()->Send( - new RenderFrameObserverHelper_ClearScripts(contents->GetMainFrame()->GetRoutingID())); + mojo::AssociatedRemote<qtwebengine::mojom::UserResourceControllerRenderFrame> + userResourceController; + contents->GetRenderViewHost() + ->GetMainFrame() + ->GetRemoteAssociatedInterfaces() + ->GetInterface(userResourceController.BindNewEndpointAndPassReceiver()); + userResourceController->ClearScripts(); } } @@ -201,15 +227,18 @@ void UserResourceControllerHost::reserve(WebContentsAdapter *adapter, int count) void UserResourceControllerHost::renderProcessStartedWithHost(content::RenderProcessHost *renderer) { - if (m_observedProcesses.contains(renderer)) + if (m_observedProcesses.keys().contains(renderer)) return; if (m_renderProcessObserver.isNull()) m_renderProcessObserver.reset(new RenderProcessObserverHelper(this)); renderer->AddObserver(m_renderProcessObserver.data()); - m_observedProcesses.insert(renderer); - for (const UserScript &script : qAsConst(m_profileWideScripts)) - renderer->Send(new UserResourceController_AddScript(script.data())); + auto userResourceController = new UserResourceControllerRemote; + renderer->GetChannel()->GetRemoteAssociatedInterface(userResourceController); + m_observedProcesses.insert(renderer, userResourceController); + for (const UserScript &script : qAsConst(m_profileWideScripts)) { + (*userResourceController)->AddScript(script.data()); + } } void UserResourceControllerHost::webContentsDestroyed(content::WebContents *contents) @@ -223,8 +252,10 @@ UserResourceControllerHost::UserResourceControllerHost() UserResourceControllerHost::~UserResourceControllerHost() { - for (content::RenderProcessHost *renderer : qAsConst(m_observedProcesses)) + for (content::RenderProcessHost *renderer : m_observedProcesses.keys()) { renderer->RemoveObserver(m_renderProcessObserver.data()); + delete m_observedProcesses[renderer]; + } } } // namespace diff --git a/src/core/renderer_host/user_resource_controller_host.h b/src/core/renderer_host/user_resource_controller_host.h index 7b89cb893..bc0887afd 100644 --- a/src/core/renderer_host/user_resource_controller_host.h +++ b/src/core/renderer_host/user_resource_controller_host.h @@ -53,7 +53,7 @@ #include "qtwebenginecoreglobal_p.h" -#include <QtCore/QSet> +#include <QtCore/QHash> #include <QtCore/QScopedPointer> #include "user_script.h" @@ -62,8 +62,20 @@ class RenderProcessHost; class WebContents; } +namespace mojo { +template <typename Type> +class AssociatedRemote; +} + +namespace qtwebengine { +namespace mojom { +class UserResourceController; +} +} + namespace QtWebEngineCore { +using UserResourceControllerRemote = mojo::AssociatedRemote<qtwebengine::mojom::UserResourceController>; class WebContentsAdapter; class Q_WEBENGINECORE_PRIVATE_EXPORT UserResourceControllerHost @@ -90,7 +102,7 @@ private: QList<UserScript> m_profileWideScripts; typedef QHash<content::WebContents *, QList<UserScript>> ContentsScriptsMap; ContentsScriptsMap m_perContentsScripts; - QSet<content::RenderProcessHost *> m_observedProcesses; + QHash<content::RenderProcessHost *, UserResourceControllerRemote *> m_observedProcesses; QScopedPointer<RenderProcessObserverHelper> m_renderProcessObserver; }; diff --git a/src/core/user_script.cpp b/src/core/user_script.cpp index 912b204b7..3f6721eca 100644 --- a/src/core/user_script.cpp +++ b/src/core/user_script.cpp @@ -37,7 +37,7 @@ ** ****************************************************************************/ -#include "common/user_script_data.h" +#include "qtwebengine/userscript/user_script_data.h" #include "user_script.h" #include "type_conversion.h" @@ -178,8 +178,11 @@ bool UserScript::operator==(const UserScript &other) const void UserScript::initData() { - if (scriptData.isNull()) + static uint64_t idCount = 0; + if (scriptData.isNull()) { scriptData.reset(new UserScriptData); + scriptData->scriptId = idCount++; + } } bool UserScript::isNull() const diff --git a/src/core/user_script.h b/src/core/user_script.h index 8f65f4b74..e06141259 100644 --- a/src/core/user_script.h +++ b/src/core/user_script.h @@ -57,10 +57,9 @@ #include <QtCore/QSharedData> #include <QtCore/QString> -struct UserScriptData; namespace QtWebEngineCore { - +struct UserScriptData; class UserResourceControllerHost; class Q_WEBENGINECORE_PRIVATE_EXPORT UserScript : public QSharedData { diff --git a/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp b/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp index 32384aec2..a690d516e 100644 --- a/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp +++ b/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp @@ -40,6 +40,8 @@ static bool verifyOrder(QStringList orderList) "Deferred" }; + if (orderList.size() != 5) + return false; if (orderList.at(4) == "load (timeout)") { if (orderList.at(3) != "Deferred") return false; |