summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Varga <pvarga@inf.u-szeged.hu>2023-05-25 13:55:41 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-06-01 06:19:12 +0000
commitccc2693bd31059e09915affb733bc4e089441820 (patch)
tree198f923f981250f83334a5c9bd12b02a3f83656a
parent8383d31abd62c8beccb149058c24f222db973e6e (diff)
Fix accessibility crash on <li> elements
QAccessibleTableCellInterface::table() is not expected to return nullptr. Ensure that BrowserAccessibilityInterface::interface_cast() doesn't cast an interface to QAccessibleTableCellInterface without a table parent. Fixes: QTBUG-113859 Change-Id: If7c0d863c27190f51ff023efef4ee038423fc8bf Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io> (cherry picked from commit 83dbd2e4864c3d237ddda62e41da091eac92ab07) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/core/browser_accessibility_qt.cpp32
1 files changed, 22 insertions, 10 deletions
diff --git a/src/core/browser_accessibility_qt.cpp b/src/core/browser_accessibility_qt.cpp
index 844d77492..d1cdd4b20 100644
--- a/src/core/browser_accessibility_qt.cpp
+++ b/src/core/browser_accessibility_qt.cpp
@@ -126,6 +126,8 @@ public:
void modelChange(QAccessibleTableModelChangeEvent *event) override;
private:
+ content::BrowserAccessibility *findTable() const;
+
QObject *m_object = nullptr;
QAccessible::Id m_id = 0;
BrowserAccessibilityQt *q;
@@ -212,10 +214,14 @@ void *BrowserAccessibilityInterface::interface_cast(QAccessible::InterfaceType t
}
case QAccessible::TableCellInterface: {
QAccessible::Role r = role();
- if (r == QAccessible::Cell ||
- r == QAccessible::ListItem ||
- r == QAccessible::TreeItem)
- return static_cast<QAccessibleTableCellInterface*>(this);
+ if (r == QAccessible::Cell) {
+ Q_ASSERT(findTable());
+ return static_cast<QAccessibleTableCellInterface *>(this);
+ }
+ if (r == QAccessible::ListItem || r == QAccessible::TreeItem) {
+ if (findTable())
+ return static_cast<QAccessibleTableCellInterface *>(this);
+ }
break;
}
default:
@@ -1102,14 +1108,20 @@ bool BrowserAccessibilityInterface::isSelected() const
return false;
}
+content::BrowserAccessibility *BrowserAccessibilityInterface::findTable() const
+{
+ content::BrowserAccessibility *parent = q->PlatformGetParent();
+ while (parent && parent->GetRole() != ax::mojom::Role::kTable)
+ parent = parent->PlatformGetParent();
+
+ return parent;
+}
+
QAccessibleInterface *BrowserAccessibilityInterface::table() const
{
- content::BrowserAccessibility *find_table = q->PlatformGetParent();
- while (find_table && find_table->GetRole() != ax::mojom::Role::kTable)
- find_table = find_table->PlatformGetParent();
- if (!find_table)
- return nullptr;
- return content::toQAccessibleInterface(find_table);
+ content::BrowserAccessibility *table = findTable();
+ Q_ASSERT(table);
+ return content::toQAccessibleInterface(table);
}
void BrowserAccessibilityInterface::modelChange(QAccessibleTableModelChangeEvent *)