summaryrefslogtreecommitdiffstats
path: root/src/gui/accessible
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@qt.io>2018-07-05 11:28:32 +0200
committerFrederik Gladhorn <frederik.gladhorn@qt.io>2018-07-08 06:37:48 +0000
commit4fa12d8553b7d060a771a249bb13025541d354fc (patch)
tree53ba90bdd22d846ea5acd71494908a472c8be300 /src/gui/accessible
parent2a00a5d70b1b9ff2033463b740b5f1bc07d6118c (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>
Diffstat (limited to 'src/gui/accessible')
-rw-r--r--src/gui/accessible/qaccessiblecache.cpp6
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();