summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2022-06-10 15:21:49 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-06-11 15:35:15 +0000
commitee7ec6ec26a89255d8753e9a94d3954f2d55443d (patch)
tree2e6c76943926f4e78303e3347e5c64c8b4353928
parentd09bd0509a7b8fe374c772813dd8659e45584c61 (diff)
Avoid extra window after change of page
A widget created for an item in a viewless page, still needs to be tracked as a widget. Change-Id: I9d571916b28b1cb2b8bd184d008255b9af105c33 Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu> (cherry picked from commit d12adcd84d9246e029b9a8340da4545a1f1797ec) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/webenginewidgets/api/qwebengineview.cpp26
-rw-r--r--tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp1
2 files changed, 22 insertions, 5 deletions
diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp
index cf8af53e3..9fa5f11fc 100644
--- a/src/webenginewidgets/api/qwebengineview.cpp
+++ b/src/webenginewidgets/api/qwebengineview.cpp
@@ -139,17 +139,31 @@ public:
void Bind(WebContentsAdapterClient *client) override
{
+ BindPage(static_cast<QWebEnginePagePrivate *>(client)->q_func());
+ }
+
+ void BindPage(QWebEnginePage *page)
+ {
if (m_pageDestroyedConnection)
QObject::disconnect(m_pageDestroyedConnection);
- QWebEnginePage *page = static_cast<QWebEnginePagePrivate *>(client)->q_func();
QWebEngineViewPrivate::bindPageAndWidget(page, this);
- m_pageDestroyedConnection = QObject::connect(page, &QWebEnginePage::_q_aboutToDelete, this, &WebEngineQuickWidget::Unbind);
+ m_pageDestroyedConnection = QObject::connect(page, &QObject::destroyed, this, &WebEngineQuickWidget::UnbindPage);
+ }
+
+ void UnbindPage()
+ {
+ Unbind();
+ // In case we are not bound to a WebContentsAdapterClient that would destroy us:
+ if (!parent())
+ Destroy();
}
void Unbind() override
{
- if (m_pageDestroyedConnection)
+ if (m_pageDestroyedConnection) {
QObject::disconnect(m_pageDestroyedConnection);
+ m_pageDestroyedConnection = {};
+ }
QWebEngineViewPrivate::bindPageAndWidget(nullptr, this);
}
@@ -639,7 +653,7 @@ static QAccessibleInterface *webAccessibleFactory(const QString &, QObject *obje
#endif // QT_CONFIG(accessibility)
QWebEngineViewPrivate::QWebEngineViewPrivate()
- : page(0)
+ : page(nullptr)
, m_dragEntered(false)
, m_ownsPage(false)
, m_contextRequest(nullptr)
@@ -700,8 +714,10 @@ void QWebEngineViewPrivate::bindPageAndView(QWebEnginePage *page, QWebEngineView
view->d_func()->pageChanged(oldPage, page);
else
view->d_func()->pageChanged(nullptr, page);
- if (!widget && page && page->d_func()->item)
+ if (!widget && page && page->d_func()->item) {
widget = new QtWebEngineCore::WebEngineQuickWidget(page->d_func()->item, nullptr);
+ widget->BindPage(page);
+ }
if (oldWidget != widget)
view->d_func()->widgetChanged(oldWidget, widget);
}
diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
index 40c99c6e0..80da4664c 100644
--- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
+++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp
@@ -201,6 +201,7 @@ void tst_QWebEngineView::init()
// This will be called after every test function.
void tst_QWebEngineView::cleanup()
{
+ QTRY_COMPARE(QApplication::topLevelWidgets().size(), 0);
}
void tst_QWebEngineView::renderHints()