summaryrefslogtreecommitdiffstats
path: root/src/core/renderer_host
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2020-10-15 08:06:39 +0200
committerMichal Klocek <michal.klocek@qt.io>2020-12-11 20:51:27 +0100
commit62db6a3b4ac0adfd7fe33d214b79ef9327ad9524 (patch)
treefc6c1bc0cd0abce3282fc82595fdacceb90eafd0 /src/core/renderer_host
parent4db8fad68da8e14d4a41ae4e8f1b65eec107f67c (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.cpp63
-rw-r--r--src/core/renderer_host/user_resource_controller_host.h7
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