Commit c72fdaa7 authored by David Hallas's avatar David Hallas

Fix crash during shutdown

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:
parent 6e88d7ce
......@@ -44,10 +44,9 @@ KItemListViewAccessible::KItemListViewAccessible(KItemListView* view_) :
foreach (QAccessibleInterface* child, m_cells) {
if (child) {
QAccessible::Id childId = QAccessible::uniqueId(child);
foreach (AccessibleIdWrapper idWrapper, m_cells) {
if (idWrapper.isValid) {
......@@ -75,13 +74,13 @@ QAccessibleInterface* KItemListViewAccessible::cell(int index) const
Q_ASSERT(index < m_cells.size());
QAccessibleInterface* child =;
if (!child) {
child = new KItemListAccessibleCell(view(), index);
m_cells.insert(index, child);
AccessibleIdWrapper idWrapper =;
if (!idWrapper.isValid) { = QAccessible::registerAccessibleInterface(new KItemListAccessibleCell(view(), index));
idWrapper.isValid = true;
m_cells.insert(index, idWrapper);
return child;
return QAccessible::accessibleInterface(;
QAccessibleInterface* KItemListViewAccessible::cellAt(int row, int column) const
......@@ -266,6 +265,12 @@ QAccessibleInterface* KItemListViewAccessible::child(int index) const
return nullptr;
KItemListViewAccessible::AccessibleIdWrapper::AccessibleIdWrapper() :
// Table Cell
KItemListAccessibleCell::KItemListAccessibleCell(KItemListView* view, int index) :
......@@ -86,7 +86,13 @@ protected:
inline QAccessibleInterface* cell(int index) const;
mutable QVector<QAccessibleInterface*> m_cells;
class AccessibleIdWrapper {
bool isValid;
QAccessible::Id id;
mutable QVector<AccessibleIdWrapper> m_cells;
class DOLPHIN_EXPORT KItemListAccessibleCell: public QAccessibleInterface, public QAccessibleTableCellInterface
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment