diff options
author | Michal Klocek <michal.klocek@qt.io> | 2023-04-19 13:30:16 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-04-19 18:01:14 +0000 |
commit | 1b9953be4e7501382e17c4f8d10376d8f568abe0 (patch) | |
tree | 92ab01da8c8aec8a19154c0dcbb64ef74eda6068 | |
parent | f9efa3469f9d4e5522b4b5744216b16e913a6fcc (diff) |
Fix crashes after 645aaa25b17
WebEngine during page setup can create and delete
accessibility interface with QAccessible::deleteAccessibleInterface,
which will later on tear down end with a crash as lambda function
is called on non existing object.
In case accessibility interface is deleted do not try to call
repair window.
Task-number: QTBUG-108226
Change-Id: Ic052d1b6c9c60168fb32f81134263fc484ee654b
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
(cherry picked from commit dac453a5eb10e1cbf706134bbefdef4564e8b27f)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/quickwidgets/qaccessiblequickwidget.cpp | 10 | ||||
-rw-r--r-- | src/quickwidgets/qaccessiblequickwidget_p.h | 2 |
2 files changed, 9 insertions, 3 deletions
diff --git a/src/quickwidgets/qaccessiblequickwidget.cpp b/src/quickwidgets/qaccessiblequickwidget.cpp index 103afda054..40b8f8daf2 100644 --- a/src/quickwidgets/qaccessiblequickwidget.cpp +++ b/src/quickwidgets/qaccessiblequickwidget.cpp @@ -19,6 +19,11 @@ QAccessibleQuickWidget::QAccessibleQuickWidget(QQuickWidget* widget) repairWindow(); } +QAccessibleQuickWidget::~QAccessibleQuickWidget() +{ + QObject::disconnect(m_connection); +} + void QAccessibleQuickWidget::repairWindow() { if (!m_accessibleWindow || !m_accessibleWindow->object()) { @@ -28,9 +33,8 @@ void QAccessibleQuickWidget::repairWindow() // not the one getting destroyed right now. if (qobject_cast<QQuickWindow *>(newOffscreen)) { m_accessibleWindow.reset(new QAccessibleQuickWindow(newOffscreen)); - QObject::connect(newOffscreen, &QObject::destroyed, theWidget, [this]{ - repairWindow(); - }); + m_connection = QObject::connect(newOffscreen, &QObject::destroyed, theWidget, + [this] { repairWindow(); }); } } } diff --git a/src/quickwidgets/qaccessiblequickwidget_p.h b/src/quickwidgets/qaccessiblequickwidget_p.h index b81a57ba3f..a0c99b7d97 100644 --- a/src/quickwidgets/qaccessiblequickwidget_p.h +++ b/src/quickwidgets/qaccessiblequickwidget_p.h @@ -31,6 +31,7 @@ class QAccessibleQuickWidget: public QAccessibleWidget { public: QAccessibleQuickWidget(QQuickWidget* widget); + ~QAccessibleQuickWidget(); QAccessibleInterface *child(int index) const override; int childCount() const override; @@ -41,6 +42,7 @@ private: void repairWindow(); std::unique_ptr<QAccessibleQuickWindow> m_accessibleWindow; + QMetaObject::Connection m_connection; Q_DISABLE_COPY(QAccessibleQuickWidget) }; |