diff options
author | Michal Klocek <michal.klocek@qt.io> | 2020-10-15 08:06:39 +0200 |
---|---|---|
committer | Michal Klocek <michal.klocek@qt.io> | 2020-12-11 20:51:27 +0100 |
commit | 62db6a3b4ac0adfd7fe33d214b79ef9327ad9524 (patch) | |
tree | fc6c1bc0cd0abce3282fc82595fdacceb90eafd0 /src/core/renderer_host | |
parent | 4db8fad68da8e14d4a41ae4e8f1b65eec107f67c (diff) |
Cache mojo interface bindings to UserResourceControllerRenderFrame
Change-Id: If9394dbfe49adf7330558eac194a0ec643eb8ee6
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/core/renderer_host')
-rw-r--r-- | src/core/renderer_host/user_resource_controller_host.cpp | 63 | ||||
-rw-r--r-- | src/core/renderer_host/user_resource_controller_host.h | 7 |
2 files changed, 40 insertions, 30 deletions
diff --git a/src/core/renderer_host/user_resource_controller_host.cpp b/src/core/renderer_host/user_resource_controller_host.cpp index 613c2917d..cea246c37 100644 --- a/src/core/renderer_host/user_resource_controller_host.cpp +++ b/src/core/renderer_host/user_resource_controller_host.cpp @@ -61,6 +61,7 @@ public: // WebContentsObserver overrides: void RenderFrameCreated(content::RenderFrameHost *renderFrameHost) override; void RenderFrameHostChanged(content::RenderFrameHost *oldHost, content::RenderFrameHost *newHost) override; + void RenderFrameDeleted(content::RenderFrameHost *render_frame_host) override; void WebContentsDestroyed() override; private: @@ -77,28 +78,27 @@ 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()); - + auto &remote = m_controllerHost->GetUserResourceControllerRenderFrame(renderFrameHost); const QList<UserScript> scripts = m_controllerHost->m_perContentsScripts.value(contents); for (const UserScript &script : scripts) - userResourceController->AddScript(script.data()); + remote->AddScript(script.data()); } void UserResourceControllerHost::WebContentsObserverHelper::RenderFrameHostChanged(content::RenderFrameHost *oldHost, content::RenderFrameHost *newHost) { if (oldHost) { - mojo::AssociatedRemote<qtwebengine::mojom::UserResourceControllerRenderFrame> - userResourceController; - oldHost->GetRemoteAssociatedInterfaces()->GetInterface( - userResourceController.BindNewEndpointAndPassReceiver()); - userResourceController->ClearScripts(); + auto &remote = m_controllerHost->GetUserResourceControllerRenderFrame(oldHost); + remote->ClearScripts(); } } +void UserResourceControllerHost::WebContentsObserverHelper::RenderFrameDeleted( + content::RenderFrameHost *render_frame_host) +{ + m_controllerHost->m_renderFrames.erase(render_frame_host); +} + void UserResourceControllerHost::WebContentsObserverHelper::WebContentsDestroyed() { m_controllerHost->webContentsDestroyed(web_contents()); @@ -154,13 +154,8 @@ void UserResourceControllerHost::addUserScript(const UserScript &script, WebCont m_perContentsScripts.insert(contents, currentScripts); } } - mojo::AssociatedRemote<qtwebengine::mojom::UserResourceControllerRenderFrame> - userResourceController; - contents->GetRenderViewHost() - ->GetMainFrame() - ->GetRemoteAssociatedInterfaces() - ->GetInterface(userResourceController.BindNewEndpointAndPassReceiver()); - userResourceController->AddScript(script.data()); + GetUserResourceControllerRenderFrame(contents->GetRenderViewHost()->GetMainFrame()) + ->AddScript(script.data()); } } @@ -184,13 +179,8 @@ bool UserResourceControllerHost::removeUserScript(const UserScript &script, WebC QList<UserScript>::iterator it = std::find(list.begin(), list.end(), script); if (it == list.end()) return false; - mojo::AssociatedRemote<qtwebengine::mojom::UserResourceControllerRenderFrame> - userResourceController; - contents->GetRenderViewHost() - ->GetMainFrame() - ->GetRemoteAssociatedInterfaces() - ->GetInterface(userResourceController.BindNewEndpointAndPassReceiver()); - userResourceController->RemoveScript((*it).data()); + GetUserResourceControllerRenderFrame(contents->GetRenderViewHost()->GetMainFrame()) + ->RemoveScript((*it).data()); list.erase(it); } return true; @@ -208,11 +198,8 @@ void UserResourceControllerHost::clearAllScripts(WebContentsAdapter *adapter) m_perContentsScripts.remove(contents); mojo::AssociatedRemote<qtwebengine::mojom::UserResourceControllerRenderFrame> userResourceController; - contents->GetRenderViewHost() - ->GetMainFrame() - ->GetRemoteAssociatedInterfaces() - ->GetInterface(userResourceController.BindNewEndpointAndPassReceiver()); - userResourceController->ClearScripts(); + GetUserResourceControllerRenderFrame(contents->GetRenderViewHost()->GetMainFrame()) + ->ClearScripts(); } } @@ -258,4 +245,20 @@ UserResourceControllerHost::~UserResourceControllerHost() } } +const UserResourceControllerRenderFrameRemote & +UserResourceControllerHost::GetUserResourceControllerRenderFrame(content::RenderFrameHost *rfh) +{ + auto it = m_renderFrames.find(rfh); + if (it == m_renderFrames.end()) { + UserResourceControllerRenderFrameRemote remote; + rfh->GetRemoteAssociatedInterfaces()->GetInterface(remote.BindNewEndpointAndPassReceiver()); + it = m_renderFrames.insert(std::make_pair(rfh, std::move(remote))).first; + } else if (it->second.is_bound() && !it->second.is_connected()) { + it->second.reset(); + rfh->GetRemoteAssociatedInterfaces()->GetInterface(&it->second); + } + + return it->second; +} + } // namespace diff --git a/src/core/renderer_host/user_resource_controller_host.h b/src/core/renderer_host/user_resource_controller_host.h index bc0887afd..8b6099dcf 100644 --- a/src/core/renderer_host/user_resource_controller_host.h +++ b/src/core/renderer_host/user_resource_controller_host.h @@ -55,11 +55,13 @@ #include <QtCore/QHash> #include <QtCore/QScopedPointer> +#include <map> #include "user_script.h" namespace content { class RenderProcessHost; class WebContents; +class RenderFrameHost; } namespace mojo { @@ -70,12 +72,14 @@ class AssociatedRemote; namespace qtwebengine { namespace mojom { class UserResourceController; +class UserResourceControllerRenderFrame; } } namespace QtWebEngineCore { using UserResourceControllerRemote = mojo::AssociatedRemote<qtwebengine::mojom::UserResourceController>; +using UserResourceControllerRenderFrameRemote = mojo::AssociatedRemote<qtwebengine::mojom::UserResourceControllerRenderFrame>; class WebContentsAdapter; class Q_WEBENGINECORE_PRIVATE_EXPORT UserResourceControllerHost @@ -98,12 +102,15 @@ private: class RenderProcessObserverHelper; void webContentsDestroyed(content::WebContents *); + const UserResourceControllerRenderFrameRemote & + GetUserResourceControllerRenderFrame(content::RenderFrameHost *rfh); QList<UserScript> m_profileWideScripts; typedef QHash<content::WebContents *, QList<UserScript>> ContentsScriptsMap; ContentsScriptsMap m_perContentsScripts; QHash<content::RenderProcessHost *, UserResourceControllerRemote *> m_observedProcesses; QScopedPointer<RenderProcessObserverHelper> m_renderProcessObserver; + std::map<content::RenderFrameHost *, UserResourceControllerRenderFrameRemote> m_renderFrames; }; } // namespace |