From 3f7741000ccf058212da26c7dc4ab4c8b4c9c0f3 Mon Sep 17 00:00:00 2001 From: Fabian Kosmale Date: Fri, 21 May 2021 14:56:43 +0200 Subject: [PATCH] QTestAccessible: Clear objects in EventList when deleted The list persists events, which reference objects. Those objects might get deleted by the time we investigate the objects. We cannot change the event to store a QPointer for BIC reasons, and for normal usage of the events, that doesn't make sense either. Instead, connect the objects destroyed signal to a lambda which clears the events' object member. In order to access the private member, we befriend the test class. Change-Id: I036be7053dccde4bdf862173789564e89d729ee1 Reviewed-by: Edward Welbourne Reviewed-by: Shawn Rutledge --- src/gui/accessible/qaccessible.h | 1 + src/testlib/qtestaccessible.h | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/gui/accessible/qaccessible.h b/src/gui/accessible/qaccessible.h index 093a48e211..c47ff41207 100644 --- a/src/gui/accessible/qaccessible.h +++ b/src/gui/accessible/qaccessible.h @@ -715,6 +715,7 @@ protected: QAccessible::Id m_uniqueId; }; + friend class QTestAccessibility; }; class Q_GUI_EXPORT QAccessibleStateChangeEvent :public QAccessibleEvent diff --git a/src/testlib/qtestaccessible.h b/src/testlib/qtestaccessible.h index bd77ee77a1..8fe5fba338 100644 --- a/src/testlib/qtestaccessible.h +++ b/src/testlib/qtestaccessible.h @@ -185,7 +185,16 @@ private: static void updateHandler(QAccessibleEvent *event) { - eventList().append(copyEvent(event)); + auto ev = copyEvent(event); + if (ev->object()) { + QObject::connect(ev->object(), &QObject::destroyed, [&, ev](){ + auto index= eventList().indexOf(ev); + if (index == -1) + return; + eventList().at(index)->m_object = nullptr; + }); + } + eventList().append(ev); } static QAccessibleEvent *copyEvent(QAccessibleEvent *event) {