Blob Blame History Raw
From 8e147ed3be7740092de233a2a7c67ec890069649 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20Br=C3=BCning?= <michael.bruning@qt.io>
Date: Mon, 13 Mar 2017 11:13:56 +0100
Subject: Remove stale parent connection when initializing delegate as a child

When clicking on a blank link target, the constructor of the
RenderWidgetHostViewQtDelegateWidget instance for the newly created
view is called with the originating QWebEngineView as its parent
and will connect its removeParentBeforeParentDelete slot to the
originating view's destroyed signal.

This leads to the situation where the delegate's parent will be set to
null when the originating view is closed, causing the view to display
only an empty widget with the actual web contents remaining live in
the background.

This patch removes the connection to the old view when initializing
the delegate as a child of the QWebEnginePagePrivate instance. The
addition to the layout updates the parent and child relationship
between the view and the delegate internally.

Task-number: QTBUG-58381
Change-Id: I448380478c2bcfcfbddaee8a35caf46010e57972
Reviewed-by: Florian Bruhin <qt-project.org@the-compiler.org>
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
---
 src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
index e7ad5b1..14c4d72 100644
--- a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
+++ b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
@@ -163,6 +163,9 @@ void RenderWidgetHostViewQtDelegateWidget::initAsChild(WebContentsAdapterClient*
 
     QWebEnginePagePrivate *pagePrivate = static_cast<QWebEnginePagePrivate *>(container);
     if (pagePrivate->view) {
+        if (parentWidget())
+            disconnect(parentWidget(), &QObject::destroyed,
+                this, &RenderWidgetHostViewQtDelegateWidget::removeParentBeforeParentDelete);
         pagePrivate->view->layout()->addWidget(this);
         pagePrivate->view->setFocusProxy(this);
         show();
-- 
cgit v1.0-4-g1e03