diff options
author | Frederik Gladhorn <frederik.gladhorn@qt.io> | 2018-07-05 11:28:32 +0200 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@qt.io> | 2018-07-08 06:37:48 +0000 |
commit | 4fa12d8553b7d060a771a249bb13025541d354fc (patch) | |
tree | 53ba90bdd22d846ea5acd71494908a472c8be300 | |
parent | 2a00a5d70b1b9ff2033463b740b5f1bc07d6118c (diff) |
Fix deletion of items in QAccessibleCache
Items in the cache may be part of the parent/child hierarchy. Make sure
not to have dangling pointers in the cache, but rather cleanly remove
all interfaces that get deleted since they may delete each other (TabBar
deletes its child interfaces for example.
Task-number: QTBUG-69283
Change-Id: Iad17cd1d3356804b3d8cbba8632ec22b836c3521
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
-rw-r--r-- | src/gui/accessible/qaccessiblecache.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/gui/accessible/qaccessiblecache.cpp b/src/gui/accessible/qaccessiblecache.cpp index f11883c370..a6b2d4cde4 100644 --- a/src/gui/accessible/qaccessiblecache.cpp +++ b/src/gui/accessible/qaccessiblecache.cpp @@ -59,8 +59,8 @@ static void cleanupAccessibleCache() QAccessibleCache::~QAccessibleCache() { - for (QAccessibleInterface *iface: idToInterface.values()) - delete iface; + for (QAccessible::Id id: idToInterface.keys()) + deleteInterface(id); } QAccessibleCache *QAccessibleCache::instance() @@ -137,6 +137,8 @@ void QAccessibleCache::objectDestroyed(QObject* obj) void QAccessibleCache::deleteInterface(QAccessible::Id id, QObject *obj) { QAccessibleInterface *iface = idToInterface.take(id); + if (!iface) // the interface may be deleted already + return; interfaceToId.take(iface); if (!obj) obj = iface->object(); |