From c72fdaa77380ef811dfef626a4edadbb824ed252 Mon Sep 17 00:00:00 2001 From: David Hallas Date: Sat, 16 Feb 2019 16:50:42 +0100 Subject: Fix crash during shutdown Summary: Fix crash during shutdown. The root cause is that when Dolphin in stopped as part of an activity, the KItemListViewAccessible destructor is called after QApplication::exec has returned causing Qt to already having cleaned up the QAccessibleInterface instances kept in KItemListViewAccessible. Instead of storing the pointers to QAccessibleInterface we store the QAccessible::Id so that we can use the QAccessible::deleteAccessibleInterface function for deleting the instances. BUG: 402784 Test Plan: I wasn't able to reproduce the crash in the first place, but I have just opened and closed Dolphin a few times and verified the the QAccessibleInterface instances are correctly cleaned up. Reviewers: #dolphin, elvisangelaccio, ngraham Reviewed By: #dolphin, elvisangelaccio Subscribers: kfm-devel Tags: #dolphin Differential Revision: https://phabricator.kde.org/D19083 --- src/kitemviews/kitemlistviewaccessible.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) (limited to 'src/kitemviews/kitemlistviewaccessible.cpp') diff --git a/src/kitemviews/kitemlistviewaccessible.cpp b/src/kitemviews/kitemlistviewaccessible.cpp index 4d1b28b9f..8fe8a6ef8 100644 --- a/src/kitemviews/kitemlistviewaccessible.cpp +++ b/src/kitemviews/kitemlistviewaccessible.cpp @@ -44,10 +44,9 @@ KItemListViewAccessible::KItemListViewAccessible(KItemListView* view_) : KItemListViewAccessible::~KItemListViewAccessible() { - foreach (QAccessibleInterface* child, m_cells) { - if (child) { - QAccessible::Id childId = QAccessible::uniqueId(child); - QAccessible::deleteAccessibleInterface(childId); + foreach (AccessibleIdWrapper idWrapper, m_cells) { + if (idWrapper.isValid) { + QAccessible::deleteAccessibleInterface(idWrapper.id); } } } @@ -75,13 +74,13 @@ QAccessibleInterface* KItemListViewAccessible::cell(int index) const } Q_ASSERT(index < m_cells.size()); - QAccessibleInterface* child = m_cells.at(index); - if (!child) { - child = new KItemListAccessibleCell(view(), index); - m_cells.insert(index, child); - QAccessible::registerAccessibleInterface(child); + AccessibleIdWrapper idWrapper = m_cells.at(index); + if (!idWrapper.isValid) { + idWrapper.id = QAccessible::registerAccessibleInterface(new KItemListAccessibleCell(view(), index)); + idWrapper.isValid = true; + m_cells.insert(index, idWrapper); } - return child; + return QAccessible::accessibleInterface(idWrapper.id); } QAccessibleInterface* KItemListViewAccessible::cellAt(int row, int column) const @@ -266,6 +265,12 @@ QAccessibleInterface* KItemListViewAccessible::child(int index) const return nullptr; } +KItemListViewAccessible::AccessibleIdWrapper::AccessibleIdWrapper() : + isValid(false), + id(0) +{ +} + // Table Cell KItemListAccessibleCell::KItemListAccessibleCell(KItemListView* view, int index) : -- cgit v1.3