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