Skip to content

Commit 9648ba2

Browse files
Michal Klocekpatricia-gallardo
authored andcommitted
Cache mojo interface bindings to UserResourceControllerRenderFrame
Change-Id: If9394dbfe49adf7330558eac194a0ec643eb8ee6 Reviewed-by: Allan Sandfeld Jensen <[email protected]>
1 parent adc0cbd commit 9648ba2

File tree

2 files changed

+40
-30
lines changed

2 files changed

+40
-30
lines changed

src/core/renderer_host/user_resource_controller_host.cpp

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class UserResourceControllerHost::WebContentsObserverHelper : public content::We
6161
// WebContentsObserver overrides:
6262
void RenderFrameCreated(content::RenderFrameHost *renderFrameHost) override;
6363
void RenderFrameHostChanged(content::RenderFrameHost *oldHost, content::RenderFrameHost *newHost) override;
64+
void RenderFrameDeleted(content::RenderFrameHost *render_frame_host) override;
6465
void WebContentsDestroyed() override;
6566

6667
private:
@@ -77,28 +78,27 @@ UserResourceControllerHost::WebContentsObserverHelper::WebContentsObserverHelper
7778
void UserResourceControllerHost::WebContentsObserverHelper::RenderFrameCreated(content::RenderFrameHost *renderFrameHost)
7879
{
7980
content::WebContents *contents = web_contents();
80-
mojo::AssociatedRemote<qtwebengine::mojom::UserResourceControllerRenderFrame>
81-
userResourceController;
82-
renderFrameHost->GetRemoteAssociatedInterfaces()->GetInterface(
83-
userResourceController.BindNewEndpointAndPassReceiver());
84-
81+
auto &remote = m_controllerHost->GetUserResourceControllerRenderFrame(renderFrameHost);
8582
const QList<UserScript> scripts = m_controllerHost->m_perContentsScripts.value(contents);
8683
for (const UserScript &script : scripts)
87-
userResourceController->AddScript(script.data());
84+
remote->AddScript(script.data());
8885
}
8986

9087
void UserResourceControllerHost::WebContentsObserverHelper::RenderFrameHostChanged(content::RenderFrameHost *oldHost,
9188
content::RenderFrameHost *newHost)
9289
{
9390
if (oldHost) {
94-
mojo::AssociatedRemote<qtwebengine::mojom::UserResourceControllerRenderFrame>
95-
userResourceController;
96-
oldHost->GetRemoteAssociatedInterfaces()->GetInterface(
97-
userResourceController.BindNewEndpointAndPassReceiver());
98-
userResourceController->ClearScripts();
91+
auto &remote = m_controllerHost->GetUserResourceControllerRenderFrame(oldHost);
92+
remote->ClearScripts();
9993
}
10094
}
10195

96+
void UserResourceControllerHost::WebContentsObserverHelper::RenderFrameDeleted(
97+
content::RenderFrameHost *render_frame_host)
98+
{
99+
m_controllerHost->m_renderFrames.erase(render_frame_host);
100+
}
101+
102102
void UserResourceControllerHost::WebContentsObserverHelper::WebContentsDestroyed()
103103
{
104104
m_controllerHost->webContentsDestroyed(web_contents());
@@ -154,13 +154,8 @@ void UserResourceControllerHost::addUserScript(const UserScript &script, WebCont
154154
m_perContentsScripts.insert(contents, currentScripts);
155155
}
156156
}
157-
mojo::AssociatedRemote<qtwebengine::mojom::UserResourceControllerRenderFrame>
158-
userResourceController;
159-
contents->GetRenderViewHost()
160-
->GetMainFrame()
161-
->GetRemoteAssociatedInterfaces()
162-
->GetInterface(userResourceController.BindNewEndpointAndPassReceiver());
163-
userResourceController->AddScript(script.data());
157+
GetUserResourceControllerRenderFrame(contents->GetRenderViewHost()->GetMainFrame())
158+
->AddScript(script.data());
164159
}
165160
}
166161

@@ -184,13 +179,8 @@ bool UserResourceControllerHost::removeUserScript(const UserScript &script, WebC
184179
QList<UserScript>::iterator it = std::find(list.begin(), list.end(), script);
185180
if (it == list.end())
186181
return false;
187-
mojo::AssociatedRemote<qtwebengine::mojom::UserResourceControllerRenderFrame>
188-
userResourceController;
189-
contents->GetRenderViewHost()
190-
->GetMainFrame()
191-
->GetRemoteAssociatedInterfaces()
192-
->GetInterface(userResourceController.BindNewEndpointAndPassReceiver());
193-
userResourceController->RemoveScript((*it).data());
182+
GetUserResourceControllerRenderFrame(contents->GetRenderViewHost()->GetMainFrame())
183+
->RemoveScript((*it).data());
194184
list.erase(it);
195185
}
196186
return true;
@@ -208,11 +198,8 @@ void UserResourceControllerHost::clearAllScripts(WebContentsAdapter *adapter)
208198
m_perContentsScripts.remove(contents);
209199
mojo::AssociatedRemote<qtwebengine::mojom::UserResourceControllerRenderFrame>
210200
userResourceController;
211-
contents->GetRenderViewHost()
212-
->GetMainFrame()
213-
->GetRemoteAssociatedInterfaces()
214-
->GetInterface(userResourceController.BindNewEndpointAndPassReceiver());
215-
userResourceController->ClearScripts();
201+
GetUserResourceControllerRenderFrame(contents->GetRenderViewHost()->GetMainFrame())
202+
->ClearScripts();
216203
}
217204
}
218205

@@ -258,4 +245,20 @@ UserResourceControllerHost::~UserResourceControllerHost()
258245
}
259246
}
260247

248+
const UserResourceControllerRenderFrameRemote &
249+
UserResourceControllerHost::GetUserResourceControllerRenderFrame(content::RenderFrameHost *rfh)
250+
{
251+
auto it = m_renderFrames.find(rfh);
252+
if (it == m_renderFrames.end()) {
253+
UserResourceControllerRenderFrameRemote remote;
254+
rfh->GetRemoteAssociatedInterfaces()->GetInterface(remote.BindNewEndpointAndPassReceiver());
255+
it = m_renderFrames.insert(std::make_pair(rfh, std::move(remote))).first;
256+
} else if (it->second.is_bound() && !it->second.is_connected()) {
257+
it->second.reset();
258+
rfh->GetRemoteAssociatedInterfaces()->GetInterface(&it->second);
259+
}
260+
261+
return it->second;
262+
}
263+
261264
} // namespace

src/core/renderer_host/user_resource_controller_host.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,13 @@
5555

5656
#include <QtCore/QHash>
5757
#include <QtCore/QScopedPointer>
58+
#include <map>
5859
#include "user_script.h"
5960

6061
namespace content {
6162
class RenderProcessHost;
6263
class WebContents;
64+
class RenderFrameHost;
6365
}
6466

6567
namespace mojo {
@@ -70,12 +72,14 @@ class AssociatedRemote;
7072
namespace qtwebengine {
7173
namespace mojom {
7274
class UserResourceController;
75+
class UserResourceControllerRenderFrame;
7376
}
7477
}
7578

7679
namespace QtWebEngineCore {
7780

7881
using UserResourceControllerRemote = mojo::AssociatedRemote<qtwebengine::mojom::UserResourceController>;
82+
using UserResourceControllerRenderFrameRemote = mojo::AssociatedRemote<qtwebengine::mojom::UserResourceControllerRenderFrame>;
7983
class WebContentsAdapter;
8084

8185
class Q_WEBENGINECORE_PRIVATE_EXPORT UserResourceControllerHost
@@ -98,12 +102,15 @@ class Q_WEBENGINECORE_PRIVATE_EXPORT UserResourceControllerHost
98102
class RenderProcessObserverHelper;
99103

100104
void webContentsDestroyed(content::WebContents *);
105+
const UserResourceControllerRenderFrameRemote &
106+
GetUserResourceControllerRenderFrame(content::RenderFrameHost *rfh);
101107

102108
QList<UserScript> m_profileWideScripts;
103109
typedef QHash<content::WebContents *, QList<UserScript>> ContentsScriptsMap;
104110
ContentsScriptsMap m_perContentsScripts;
105111
QHash<content::RenderProcessHost *, UserResourceControllerRemote *> m_observedProcesses;
106112
QScopedPointer<RenderProcessObserverHelper> m_renderProcessObserver;
113+
std::map<content::RenderFrameHost *, UserResourceControllerRenderFrameRemote> m_renderFrames;
107114
};
108115

109116
} // namespace

0 commit comments

Comments
 (0)