From: David Hallas Date: Sat, 16 Feb 2019 15:50:42 +0000 (+0100) Subject: Fix crash during shutdown X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/c72fdaa77380ef811dfef626a4edadbb824ed252?ds=sidebyside 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 --- 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) : diff --git a/src/kitemviews/kitemlistviewaccessible.h b/src/kitemviews/kitemlistviewaccessible.h index fdc3ff1a3..3e39e2399 100644 --- a/src/kitemviews/kitemlistviewaccessible.h +++ b/src/kitemviews/kitemlistviewaccessible.h @@ -86,7 +86,13 @@ protected: inline QAccessibleInterface* cell(int index) const; private: - mutable QVector m_cells; + class AccessibleIdWrapper { + public: + AccessibleIdWrapper(); + bool isValid; + QAccessible::Id id; + }; + mutable QVector m_cells; }; class DOLPHIN_EXPORT KItemListAccessibleCell: public QAccessibleInterface, public QAccessibleTableCellInterface