Package: qtbase-opensource-src / 5.7.1+dfsg-3+deb9u2

fix_accessibility_crash.diff Patch series | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
Description: use QPersistentModelIndex for storing a model index
 QModelIndex is not safe to be used to store an index as it is designed
 to be discarded right after use as the index information can change.
 .
 Therefore a QPersistentModelIndex should be used instead to store the
 index. Subsequently the m_index does not need to be updated whenever
 the model changes anymore as this is already done for us.
Origin: upstream, https://code.qt.io/cgit/qt/qtbase.git/commit/?id=bd591064be388216
Last-Update: 2017-01-04

--- a/src/widgets/accessible/itemviews.cpp
+++ b/src/widgets/accessible/itemviews.cpp
@@ -556,20 +556,8 @@
             QAccessible::Id id = iter.value();
             QAccessibleInterface *iface = QAccessible::accessibleInterface(id);
             Q_ASSERT(iface);
-            if (iface->role() == QAccessible::Cell || iface->role() == QAccessible::ListItem) {
-                Q_ASSERT(iface->tableCellInterface());
-                QAccessibleTableCell *cell = static_cast<QAccessibleTableCell*>(iface->tableCellInterface());
-                if (event->modelChangeType() == QAccessibleTableModelChangeEvent::RowsInserted
-                        && cell->m_index.row() >= event->firstRow()) {
-                    int newRow = cell->m_index.row() + newRows;
-                    cell->m_index = cell->m_index.sibling(newRow, cell->m_index.column());
-                } else if (event->modelChangeType() == QAccessibleTableModelChangeEvent::ColumnsInserted
-                        && cell->m_index.column() >= event->firstColumn()) {
-                    int newColumn = cell->m_index.column() + newColumns;
-                    cell->m_index = cell->m_index.sibling(cell->m_index.row(), newColumn);
-                }
-            } else if (event->modelChangeType() == QAccessibleTableModelChangeEvent::RowsInserted
-                       && iface->role() == QAccessible::RowHeader) {
+            if (event->modelChangeType() == QAccessibleTableModelChangeEvent::RowsInserted
+                && iface->role() == QAccessible::RowHeader) {
                 QAccessibleTableHeaderCell *cell = static_cast<QAccessibleTableHeaderCell*>(iface);
                 if (cell->index >= event->firstRow()) {
                     cell->index += newRows;
@@ -608,27 +596,11 @@
             if (iface->role() == QAccessible::Cell || iface->role() == QAccessible::ListItem) {
                 Q_ASSERT(iface->tableCellInterface());
                 QAccessibleTableCell *cell = static_cast<QAccessibleTableCell*>(iface->tableCellInterface());
-                if (event->modelChangeType() == QAccessibleTableModelChangeEvent::RowsRemoved) {
-                    if (cell->m_index.row() < event->firstRow()) {
-                        newCache.insert(indexOfChild(cell), id);
-                    } else if (cell->m_index.row() > event->lastRow()) {
-                        int newRow = cell->m_index.row() - deletedRows;
-                        cell->m_index = cell->m_index.sibling(newRow, cell->m_index.column());
-                        newCache.insert(indexOfChild(cell), id);
-                    } else {
-                        QAccessible::deleteAccessibleInterface(id);
-                    }
-                } else if (event->modelChangeType() == QAccessibleTableModelChangeEvent::ColumnsRemoved) {
-                    if (cell->m_index.column() < event->firstColumn()) {
-                        newCache.insert(indexOfChild(cell), id);
-                    } else if (cell->m_index.column() > event->lastColumn()) {
-                        int newColumn = cell->m_index.column() - deletedColumns;
-                        cell->m_index = cell->m_index.sibling(cell->m_index.row(), newColumn);
-                        newCache.insert(indexOfChild(cell), id);
-                    } else {
-                        QAccessible::deleteAccessibleInterface(id);
-                    }
-                }
+                // Since it is a QPersistentModelIndex, we only need to check if it is valid
+                if (cell->m_index.isValid())
+                    newCache.insert(indexOfChild(cell), id);
+                else
+                    QAccessible::deleteAccessibleInterface(id);
             } else if (event->modelChangeType() == QAccessibleTableModelChangeEvent::RowsRemoved
                        && iface->role() == QAccessible::RowHeader) {
                 QAccessibleTableHeaderCell *cell = static_cast<QAccessibleTableHeaderCell*>(iface);
--- a/src/widgets/accessible/itemviews_p.h
+++ b/src/widgets/accessible/itemviews_p.h
@@ -213,7 +213,7 @@
     QHeaderView *verticalHeader() const;
     QHeaderView *horizontalHeader() const;
     QPointer<QAbstractItemView > view;
-    QModelIndex m_index;
+    QPersistentModelIndex m_index;
     QAccessible::Role m_role;
 
     void selectCell();