diff options
author | Michal Klocek <michal.klocek@qt.io> | 2020-10-15 12:14:36 +0200 |
---|---|---|
committer | Michal Klocek <michal.klocek@qt.io> | 2020-12-11 20:51:38 +0100 |
commit | c175a7fbea6b707de9544ff02eb7351600a3a71b (patch) | |
tree | 3fad2a3e26794196a8f1b5bb2838c184a4a47cca /src/core/renderer | |
parent | 62db6a3b4ac0adfd7fe33d214b79ef9327ad9524 (diff) |
Cache mojo interface bindings for WebChannelIPCTransport
Change-Id: Ica6b794e16aecc60dc2c39d31750acc6b25410df
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/core/renderer')
-rw-r--r-- | src/core/renderer/web_channel_ipc_transport.cpp | 21 | ||||
-rw-r--r-- | src/core/renderer/web_channel_ipc_transport.h | 2 |
2 files changed, 16 insertions, 7 deletions
diff --git a/src/core/renderer/web_channel_ipc_transport.cpp b/src/core/renderer/web_channel_ipc_transport.cpp index 1fb3bc678..520c492ea 100644 --- a/src/core/renderer/web_channel_ipc_transport.cpp +++ b/src/core/renderer/web_channel_ipc_transport.cpp @@ -74,7 +74,8 @@ private: // gin::WrappableBase gin::ObjectTemplateBuilder GetObjectTemplateBuilder(v8::Isolate *isolate) override; - + mojo::AssociatedRemote<qtwebchannel::mojom::WebChannelTransportHost> m_remote; + content::RenderFrame *m_renderFrame = nullptr; DISALLOW_COPY_AND_ASSIGN(WebChannelTransport); }; @@ -165,9 +166,14 @@ void WebChannelTransport::NativeQtSendMessage(gin::Arguments *args) int size = 0; const char *rawData = doc.rawData(&size); - mojo::AssociatedRemote<qtwebchannel::mojom::WebChannelTransportHost> webChannelTransport; - renderFrame->GetRemoteAssociatedInterfaces()->GetInterface(&webChannelTransport); - webChannelTransport->DispatchWebChannelMessage(std::vector<uint8_t>(rawData, rawData + size)); + + if (!m_remote) { + renderFrame->GetRemoteAssociatedInterfaces()->GetInterface(&m_remote); + m_renderFrame = renderFrame; + } + DCHECK(renderFrame == m_renderFrame); + + m_remote->DispatchWebChannelMessage(std::vector<uint8_t>(rawData, rawData + size)); } gin::ObjectTemplateBuilder WebChannelTransport::GetObjectTemplateBuilder(v8::Isolate *isolate) @@ -177,7 +183,10 @@ gin::ObjectTemplateBuilder WebChannelTransport::GetObjectTemplateBuilder(v8::Iso } WebChannelIPCTransport::WebChannelIPCTransport(content::RenderFrame *renderFrame) - : content::RenderFrameObserver(renderFrame), m_worldId(0), m_worldInitialized(false) + : content::RenderFrameObserver(renderFrame) + , m_worldId(0) + , m_worldInitialized(false) + , m_binding(this) { renderFrame->GetAssociatedInterfaceRegistry()->AddInterface( base::BindRepeating(&WebChannelIPCTransport::BindReceiver, base::Unretained(this))); @@ -186,7 +195,7 @@ WebChannelIPCTransport::WebChannelIPCTransport(content::RenderFrame *renderFrame void WebChannelIPCTransport::BindReceiver( mojo::PendingAssociatedReceiver<qtwebchannel::mojom::WebChannelTransportRender> receiver) { - m_receivers.Add(this, std::move(receiver)); + m_binding.Bind(std::move(receiver)); } void WebChannelIPCTransport::SetWorldId(uint32_t worldId) diff --git a/src/core/renderer/web_channel_ipc_transport.h b/src/core/renderer/web_channel_ipc_transport.h index 15778a7bc..4bed5f26d 100644 --- a/src/core/renderer/web_channel_ipc_transport.h +++ b/src/core/renderer/web_channel_ipc_transport.h @@ -76,7 +76,7 @@ private: bool m_worldInitialized; // True means it's currently OK to manipulate the frame's script context. bool m_canUseContext = false; - mojo::AssociatedReceiverSet<qtwebchannel::mojom::WebChannelTransportRender> m_receivers; + mojo::AssociatedReceiver<qtwebchannel::mojom::WebChannelTransportRender> m_binding; }; } // namespace |