From ab0603f2a2e59d8a671326f659d1c316c7383606 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen <allan.jensen@qt.io> Date: Thu, 7 Sep 2017 18:31:09 +0200 Subject: [PATCH] Recreate state in renderer objects after RenderViewCreated This ensures the scripts and webchannel are added before RunScriptsAtDocumentStart is called. It also means we shouldn't add them later from the changed signal. Task-number: QTBUG-62898 Change-Id: Ib4cd3a69134d0eafc7f2ac4b7927a1c79b63bfa6 Reviewed-by: Viktor Engelmann <viktor.engelmann@qt.io> --- .../user_resource_controller_host.cpp | 6 +----- .../web_channel_ipc_transport_host.cpp | 14 ++++++++++---- .../renderer_host/web_channel_ipc_transport_host.h | 1 + 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/core/renderer_host/user_resource_controller_host.cpp b/src/core/renderer_host/user_resource_controller_host.cpp index 95385ae2f..cf0cbd357 100644 --- a/src/core/renderer_host/user_resource_controller_host.cpp +++ b/src/core/renderer_host/user_resource_controller_host.cpp @@ -79,14 +79,10 @@ void UserResourceControllerHost::WebContentsObserverHelper::RenderViewCreated(co } void UserResourceControllerHost::WebContentsObserverHelper::RenderViewHostChanged(content::RenderViewHost *oldHost, - content::RenderViewHost *newHost) + content::RenderViewHost */*newHost*/) { if (oldHost) oldHost->Send(new RenderViewObserverHelper_ClearScripts(oldHost->GetRoutingID())); - - content::WebContents *contents = web_contents(); - Q_FOREACH (const UserScript &script, m_controllerHost->m_perContentsScripts.value(contents)) - newHost->Send(new RenderViewObserverHelper_AddScript(newHost->GetRoutingID(), script.data())); } void UserResourceControllerHost::WebContentsObserverHelper::WebContentsDestroyed() diff --git a/src/core/renderer_host/web_channel_ipc_transport_host.cpp b/src/core/renderer_host/web_channel_ipc_transport_host.cpp index aef16f0a0..a093632bc 100644 --- a/src/core/renderer_host/web_channel_ipc_transport_host.cpp +++ b/src/core/renderer_host/web_channel_ipc_transport_host.cpp @@ -40,6 +40,7 @@ #include "web_channel_ipc_transport_host.h" #include "base/strings/string16.h" +#include "content/public/browser/render_view_host.h" #include "common/qt_messages.h" #include "type_conversion.h" @@ -61,11 +62,16 @@ WebChannelIPCTransportHost::~WebChannelIPCTransportHost() { } -void WebChannelIPCTransportHost::RenderViewHostChanged(content::RenderViewHost *, content::RenderViewHost *) +void WebChannelIPCTransportHost::RenderViewHostChanged(content::RenderViewHost *oldHost, content::RenderViewHost *) { - // This means that we were moved into a different RenderView, possibly in a different - // render process and that we lost our WebChannelIPCTransport object and its state. - Send(new WebChannelIPCTransport_Install(routing_id(), m_worldId)); + if (oldHost) + oldHost->Send(new WebChannelIPCTransport_Uninstall(oldHost->GetRoutingID(), m_worldId)); +} + +void WebChannelIPCTransportHost::RenderViewCreated(content::RenderViewHost *view_host) +{ + // Make sure the new view knows a webchannel is installed and in which world. + view_host->Send(new WebChannelIPCTransport_Install(view_host->GetRoutingID(), m_worldId)); } void WebChannelIPCTransportHost::setWorldId(uint worldId) diff --git a/src/core/renderer_host/web_channel_ipc_transport_host.h b/src/core/renderer_host/web_channel_ipc_transport_host.h index aa406471c..a1e697a91 100644 --- a/src/core/renderer_host/web_channel_ipc_transport_host.h +++ b/src/core/renderer_host/web_channel_ipc_transport_host.h @@ -60,6 +60,7 @@ public: // WebContentsObserver void RenderViewHostChanged(content::RenderViewHost* old_host, content::RenderViewHost* new_host) override; + void RenderViewCreated(content::RenderViewHost* render_view_host) override; // QWebChannelAbstractTransport void sendMessage(const QJsonObject &message) override; -- GitLab