tdf#99609 tdf#156473 a11y: Check whether row header exists
Don't allow using `BBINDEX_ROWHEADERBAR` as the
child index unconditionally, but only if the
browse box actually has a row header.
An `AccessibleTabListBox` doesn't have a header
and instead returns the table when requesting the
child at index 1 (`BBINDEX_ROWHEADERBAR`).
Now that row headers are propagated to the Windows
platform accessibility layer with
commit 2b30d37bd555188733a006e1a5796461ab11d326
Date: Thu Aug 3 15:48:48 2023 +0100
tdf#156473 wina11y: Fix invalid write due to row/col mismatch
in place, NVDA confusingly started announcing all cells
in the currently selected row as row headers for
the currently selected cell in the Expert Configuration
dialog, because of the table being returned without
this change in place (while the cells in that table don't
actually have any row headers).
Related backtrace of how the table was returned
for the row headers:
1 accessibility::AccessibleTabListBox::getAccessibleChild accessibletablistbox.cxx 90 0x7fffb8ab64bb
2 accessibility::AccessibleBrowseBoxTable::implGetHeaderBar AccessibleBrowseBoxTable.cxx 214 0x7fffb8a7e241
3 accessibility::AccessibleBrowseBoxTable::getAccessibleRowHeaders AccessibleBrowseBoxTable.cxx 116 0x7fffb8a7da02
4 QtAccessibleWidget::rowHeaderCells QtAccessibleWidget.cxx 1808 0x7fffe3e51e97
5 AtSpiAdaptor::tableCellInterface atspiadaptor.cpp 2801 0x7fffe2cee526
6 AtSpiAdaptor::handleMessage atspiadaptor.cpp 1450 0x7fffe2cde6ee
7 QDBusConnectionPrivate::activateObject qdbusintegrator.cpp 1416 0x7fffe14cc216
8 QDBusActivateObjectEvent::placeMetaCall qdbusintegrator.cpp 1572 0x7fffe14cceba
9 QObject::event qobject.cpp 1438 0x7fffe3621280
10 QApplicationPrivate::notify_helper qapplication.cpp 3287 0x7fffe1ba2414
11 QApplication::notify qapplication.cpp 3238 0x7fffe1ba2224
12 QCoreApplication::notifyInternal2 qcoreapplication.cpp 1123 0x7fffe35a3c34
13 QCoreApplication::sendEvent qcoreapplication.cpp 1557 0x7fffe35a46f5
14 QCoreApplicationPrivate::sendPostedEvents qcoreapplication.cpp 1924 0x7fffe35a55b2
15 QCoreApplication::sendPostedEvents qcoreapplication.cpp 1781 0x7fffe35a4eba
16 postEventSourceDispatch qeventdispatcher_glib.cpp 240 0x7fffe39b26d3
17 ?? 0x7fffe97135b4
18 ?? 0x7fffe9716607
19 g_main_context_iteration 0x7fffe9716bfc
20 QEventDispatcherGlib::processEvents qeventdispatcher_glib.cpp 390 0x7fffe39b2f67
... <More>
Also add an assert that
`AccessibleBrowseBoxTable::implGetHeaderBar` only
gets called with indices for row/col header, not
arbitrary integers.
Change-Id: Id7ebab9bfa8a7f05cb43da1bf5756e5980f4ed20
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/156012
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <[email protected]>
diff --git a/accessibility/source/extended/AccessibleBrowseBoxTable.cxx b/accessibility/source/extended/AccessibleBrowseBoxTable.cxx
index cdf9183..09c7448 100644
--- a/accessibility/source/extended/AccessibleBrowseBoxTable.cxx
+++ b/accessibility/source/extended/AccessibleBrowseBoxTable.cxx
@@ -205,19 +205,24 @@ AbsoluteScreenPixelRectangle AccessibleBrowseBoxTable::implGetBoundingBoxOnScree
Reference< XAccessibleTable > AccessibleBrowseBoxTable::implGetHeaderBar(
sal_Int32 nChildIndex )
{
assert(nChildIndex == vcl::BBINDEX_ROWHEADERBAR || nChildIndex == vcl::BBINDEX_COLUMNHEADERBAR);
Reference< XAccessible > xRet;
Reference< XAccessibleContext > xContext( mxParent, uno::UNO_QUERY );
if( xContext.is() )
{
try
if (nChildIndex == vcl::BBINDEX_COLUMNHEADERBAR || mpBrowseBox->HasRowHeader())
{
xRet = xContext->getAccessibleChild( nChildIndex );
try
{
xRet = xContext->getAccessibleChild( nChildIndex );
}
catch (const lang::IndexOutOfBoundsException&)
{
OSL_FAIL( "implGetHeaderBar - wrong child index" );
}
// RuntimeException goes to caller
}
catch (const lang::IndexOutOfBoundsException&)
{
OSL_FAIL( "implGetHeaderBar - wrong child index" );
}
// RuntimeException goes to caller
}
return Reference< XAccessibleTable >( xRet, uno::UNO_QUERY );
}