aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2023-04-19 13:30:16 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-04-19 18:01:14 +0000
commit1b9953be4e7501382e17c4f8d10376d8f568abe0 (patch)
tree92ab01da8c8aec8a19154c0dcbb64ef74eda6068
parentf9efa3469f9d4e5522b4b5744216b16e913a6fcc (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.cpp10
-rw-r--r--src/quickwidgets/qaccessiblequickwidget_p.h2
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)
};