Skip to content

Commit 4d57c5e

Browse files
Michal Klocekpatricia-gallardo
authored andcommitted
Cache mojo interface bindings for WebChannelIPCTransport
Change-Id: Ica6b794e16aecc60dc2c39d31750acc6b25410df Reviewed-by: Allan Sandfeld Jensen <[email protected]>
1 parent 9648ba2 commit 4d57c5e

File tree

4 files changed

+49
-16
lines changed

4 files changed

+49
-16
lines changed

src/core/renderer/web_channel_ipc_transport.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ class WebChannelTransport : public gin::Wrappable<WebChannelTransport>
7474

7575
// gin::WrappableBase
7676
gin::ObjectTemplateBuilder GetObjectTemplateBuilder(v8::Isolate *isolate) override;
77-
77+
mojo::AssociatedRemote<qtwebchannel::mojom::WebChannelTransportHost> m_remote;
78+
content::RenderFrame *m_renderFrame = nullptr;
7879
DISALLOW_COPY_AND_ASSIGN(WebChannelTransport);
7980
};
8081

@@ -165,9 +166,14 @@ void WebChannelTransport::NativeQtSendMessage(gin::Arguments *args)
165166

166167
int size = 0;
167168
const char *rawData = doc.rawData(&size);
168-
mojo::AssociatedRemote<qtwebchannel::mojom::WebChannelTransportHost> webChannelTransport;
169-
renderFrame->GetRemoteAssociatedInterfaces()->GetInterface(&webChannelTransport);
170-
webChannelTransport->DispatchWebChannelMessage(std::vector<uint8_t>(rawData, rawData + size));
169+
170+
if (!m_remote) {
171+
renderFrame->GetRemoteAssociatedInterfaces()->GetInterface(&m_remote);
172+
m_renderFrame = renderFrame;
173+
}
174+
DCHECK(renderFrame == m_renderFrame);
175+
176+
m_remote->DispatchWebChannelMessage(std::vector<uint8_t>(rawData, rawData + size));
171177
}
172178

173179
gin::ObjectTemplateBuilder WebChannelTransport::GetObjectTemplateBuilder(v8::Isolate *isolate)
@@ -177,7 +183,10 @@ gin::ObjectTemplateBuilder WebChannelTransport::GetObjectTemplateBuilder(v8::Iso
177183
}
178184

179185
WebChannelIPCTransport::WebChannelIPCTransport(content::RenderFrame *renderFrame)
180-
: content::RenderFrameObserver(renderFrame), m_worldId(0), m_worldInitialized(false)
186+
: content::RenderFrameObserver(renderFrame)
187+
, m_worldId(0)
188+
, m_worldInitialized(false)
189+
, m_binding(this)
181190
{
182191
renderFrame->GetAssociatedInterfaceRegistry()->AddInterface(
183192
base::BindRepeating(&WebChannelIPCTransport::BindReceiver, base::Unretained(this)));
@@ -186,7 +195,7 @@ WebChannelIPCTransport::WebChannelIPCTransport(content::RenderFrame *renderFrame
186195
void WebChannelIPCTransport::BindReceiver(
187196
mojo::PendingAssociatedReceiver<qtwebchannel::mojom::WebChannelTransportRender> receiver)
188197
{
189-
m_receivers.Add(this, std::move(receiver));
198+
m_binding.Bind(std::move(receiver));
190199
}
191200

192201
void WebChannelIPCTransport::SetWorldId(uint32_t worldId)

src/core/renderer/web_channel_ipc_transport.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class WebChannelIPCTransport
7676
bool m_worldInitialized;
7777
// True means it's currently OK to manipulate the frame's script context.
7878
bool m_canUseContext = false;
79-
mojo::AssociatedReceiverSet<qtwebchannel::mojom::WebChannelTransportRender> m_receivers;
79+
mojo::AssociatedReceiver<qtwebchannel::mojom::WebChannelTransportRender> m_binding;
8080
};
8181

8282
} // namespace

src/core/renderer_host/web_channel_ipc_transport_host.cpp

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,9 @@ void WebChannelIPCTransportHost::sendMessage(const QJsonObject &message)
9696
int size = 0;
9797
const char *rawData = doc.rawData(&size);
9898
content::RenderFrameHost *frame = web_contents()->GetMainFrame();
99-
mojo::AssociatedRemote<qtwebchannel::mojom::WebChannelTransportRender> webChannelTransport;
100-
frame->GetRemoteAssociatedInterfaces()->GetInterface(&webChannelTransport);
10199
qCDebug(log).nospace() << "sending webchannel message to " << frame << ": " << doc;
102-
webChannelTransport->DispatchWebChannelMessage(std::vector<uint8_t>(rawData, rawData + size), m_worldId);
100+
GetWebChannelIPCTransportRemote(frame)->DispatchWebChannelMessage(
101+
std::vector<uint8_t>(rawData, rawData + size), m_worldId);
103102
}
104103

105104
void WebChannelIPCTransportHost::setWorldId(uint32_t worldId)
@@ -116,19 +115,15 @@ void WebChannelIPCTransportHost::setWorldId(content::RenderFrameHost *frame, uin
116115
if (!frame->IsRenderFrameLive())
117116
return;
118117
qCDebug(log).nospace() << "sending setWorldId(" << worldId << ") message to " << frame;
119-
mojo::AssociatedRemote<qtwebchannel::mojom::WebChannelTransportRender> webChannelTransport;
120-
frame->GetRemoteAssociatedInterfaces()->GetInterface(&webChannelTransport);
121-
webChannelTransport->SetWorldId(worldId);
118+
GetWebChannelIPCTransportRemote(frame)->SetWorldId(worldId);
122119
}
123120

124121
void WebChannelIPCTransportHost::resetWorldId()
125122
{
126123
for (content::RenderFrameHost *frame : web_contents()->GetAllFrames()) {
127124
if (!frame->IsRenderFrameLive())
128125
return;
129-
mojo::AssociatedRemote<qtwebchannel::mojom::WebChannelTransportRender> webChannelTransport;
130-
frame->GetRemoteAssociatedInterfaces()->GetInterface(&webChannelTransport);
131-
webChannelTransport->ResetWorldId();
126+
GetWebChannelIPCTransportRemote(frame)->ResetWorldId();
132127
}
133128
}
134129

@@ -156,4 +151,25 @@ void WebChannelIPCTransportHost::RenderFrameCreated(content::RenderFrameHost *fr
156151
setWorldId(frame, m_worldId);
157152
}
158153

154+
void WebChannelIPCTransportHost::RenderFrameDeleted(content::RenderFrameHost *rfh)
155+
{
156+
m_renderFrames.erase(rfh);
157+
}
158+
159+
const mojo::AssociatedRemote<qtwebchannel::mojom::WebChannelTransportRender> &
160+
WebChannelIPCTransportHost::GetWebChannelIPCTransportRemote(content::RenderFrameHost *rfh)
161+
{
162+
auto it = m_renderFrames.find(rfh);
163+
if (it == m_renderFrames.end()) {
164+
mojo::AssociatedRemote<qtwebchannel::mojom::WebChannelTransportRender> remote;
165+
rfh->GetRemoteAssociatedInterfaces()->GetInterface(remote.BindNewEndpointAndPassReceiver());
166+
it = m_renderFrames.insert(std::make_pair(rfh, std::move(remote))).first;
167+
} else if (it->second.is_bound() && !it->second.is_connected()) {
168+
it->second.reset();
169+
rfh->GetRemoteAssociatedInterfaces()->GetInterface(&it->second);
170+
}
171+
172+
return it->second;
173+
}
174+
159175
} // namespace QtWebEngineCore

src/core/renderer_host/web_channel_ipc_transport_host.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
#include "qtwebengine/browser/qtwebchannel.mojom.h"
4848

4949
#include <QWebChannelAbstractTransport>
50+
#include <map>
5051

5152
QT_FORWARD_DECLARE_CLASS(QString)
5253

@@ -72,8 +73,12 @@ class WebChannelIPCTransportHost
7273
void resetWorldId();
7374
void onWebChannelMessage(const std::vector<char> &message);
7475

76+
const mojo::AssociatedRemote<qtwebchannel::mojom::WebChannelTransportRender> &
77+
GetWebChannelIPCTransportRemote(content::RenderFrameHost *rfh);
78+
7579
// WebContentsObserver
7680
void RenderFrameCreated(content::RenderFrameHost *frame) override;
81+
void RenderFrameDeleted(content::RenderFrameHost *render_frame_host) override;
7782

7883
// qtwebchannel::mojom::WebChannelTransportHost
7984
void DispatchWebChannelMessage(const std::vector<uint8_t> &binaryJson) override;
@@ -82,6 +87,9 @@ class WebChannelIPCTransportHost
8287
// WebChannelIPCTransports/RenderFrames in the observed WebContents.
8388
uint32_t m_worldId;
8489
content::WebContentsFrameReceiverSet<qtwebchannel::mojom::WebChannelTransportHost> m_receiver;
90+
std::map<content::RenderFrameHost *,
91+
mojo::AssociatedRemote<qtwebchannel::mojom::WebChannelTransportRender>>
92+
m_renderFrames;
8593
};
8694

8795
} // namespace

0 commit comments

Comments
 (0)