From 62db6a3b4ac0adfd7fe33d214b79ef9327ad9524 Mon Sep 17 00:00:00 2001 From: Michal Klocek Date: Thu, 15 Oct 2020 08:06:39 +0200 Subject: Cache mojo interface bindings to UserResourceControllerRenderFrame Change-Id: If9394dbfe49adf7330558eac194a0ec643eb8ee6 Reviewed-by: Allan Sandfeld Jensen --- .../user_resource_controller_host.cpp | 63 +++++++++++----------- 1 file changed, 33 insertions(+), 30 deletions(-) (limited to 'src/core/renderer_host/user_resource_controller_host.cpp') 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 - userResourceController; - renderFrameHost->GetRemoteAssociatedInterfaces()->GetInterface( - userResourceController.BindNewEndpointAndPassReceiver()); - + auto &remote = m_controllerHost->GetUserResourceControllerRenderFrame(renderFrameHost); const QList 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 - 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 - 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::iterator it = std::find(list.begin(), list.end(), script); if (it == list.end()) return false; - mojo::AssociatedRemote - 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 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 -- cgit v1.2.3