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
KItemListViewAccessible::~KItemListViewAccessible()
{
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);
}
Q_ASSERT(index < m_cells.size());
}
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 QAccessible::accessibleInterface(idWrapper.id);
}
QAccessibleInterface* KItemListViewAccessible::cellAt(int row, int column) const
}
QAccessibleInterface* KItemListViewAccessible::cellAt(int row, int column) const
+KItemListViewAccessible::AccessibleIdWrapper::AccessibleIdWrapper() :
+ isValid(false),
+ id(0)
+{
+}
+
// Table Cell
KItemListAccessibleCell::KItemListAccessibleCell(KItemListView* view, int index) :
// Table Cell
KItemListAccessibleCell::KItemListAccessibleCell(KItemListView* view, int index) :
inline QAccessibleInterface* cell(int index) const;
private:
inline QAccessibleInterface* cell(int index) const;
private:
- mutable QVector<QAccessibleInterface*> m_cells;
+ class AccessibleIdWrapper {
+ public:
+ AccessibleIdWrapper();
+ bool isValid;
+ QAccessible::Id id;
+ };
+ mutable QVector<AccessibleIdWrapper> m_cells;
};
class DOLPHIN_EXPORT KItemListAccessibleCell: public QAccessibleInterface, public QAccessibleTableCellInterface
};
class DOLPHIN_EXPORT KItemListAccessibleCell: public QAccessibleInterface, public QAccessibleTableCellInterface