a11y: Don't throw exception on valid list box entry action index

`checkActionIndex_Impl` was previously throwing
an IndexOutOfBoundsException for any index other than 0.

The

    // only three actions

comment in there was only adding to the confusion...

Convert that helper function to a method of the class
and take the actual count of actions into account.

Also drop the misleading `ACCESSIBLE_ACTION_COUNT`
define altogether, and just return 1 at the only
remaining place using it.

This fixes a crash seen with the qt6 VCL plugin
and Orca running when opening the spelling options
dialog ("Tools" -> "Spelling", then press the
"Options..." button).

    1  __pthread_kill_implementation                                         pthread_kill.c             44   0x7f29908a80fc
    2  __pthread_kill_internal                                               pthread_kill.c             78   0x7f29908a815f
    3  __GI_raise                                                            raise.c                    26   0x7f299085a472
    4  __GI_abort                                                            abort.c                    79   0x7f29908444b2
    5  ??                                                                                                    0x7f29904a09db
    6  ??                                                                                                    0x7f29904affaa
    7  std::terminate()                                                                                      0x7f29904b0015
    8  __cxa_throw                                                                                           0x7f29904b0268
    9  (anonymous namespace)::checkActionIndex_Impl                          accessiblelistboxentry.cxx 49   0x7f29562aeb82
    10 accessibility::AccessibleListBoxEntry::getAccessibleActionDescription accessiblelistboxentry.cxx 770  0x7f29562b2b9b
    11 QtAccessibleWidget::actionNames                                       QtAccessibleWidget.cxx     805  0x7f297c84a8d7
    12 QAccessibleBridgeUtils::effectiveActionNames                          qaccessiblebridgeutils.cpp 25   0x7f297b6c90a5
    13 AtSpiAdaptor::actionInterface                                         atspiadaptor.cpp           1862 0x7f297b6e2cc0
    14 AtSpiAdaptor::handleMessage                                           atspiadaptor.cpp           1438 0x7f297b6de432
    15 QDBusConnectionPrivate::activateObject                                qdbusintegrator.cpp        1438 0x7f2979ec0ecb
    16 QDBusActivateObjectEvent::placeMetaCall                               qdbusintegrator.cpp        1594 0x7f2979ec1bb0
    17 QObject::event                                                        qobject.cpp                1446 0x7f297c02116e
    18 QApplicationPrivate::notify_helper                                    qapplication.cpp           3295 0x7f297a59d714
    19 QApplication::notify                                                  qapplication.cpp           3246 0x7f297a59d524
    20 QCoreApplication::notifyInternal2                                     qcoreapplication.cpp       1131 0x7f297bfa23ba
    21 QCoreApplication::sendEvent                                           qcoreapplication.cpp       1572 0x7f297bfa2ead
    22 QCoreApplicationPrivate::sendPostedEvents                             qcoreapplication.cpp       1937 0x7f297bfa3ea6
    23 QCoreApplication::sendPostedEvents                                    qcoreapplication.cpp       1794 0x7f297bfa37ae
    24 postEventSourceDispatch                                               qeventdispatcher_glib.cpp  244  0x7f297c3b9108
    25 ??                                                                                                    0x7f29835111b4
    26 ??                                                                                                    0x7f29835142d7
    27 g_main_context_iteration                                                                              0x7f29835148f0
    28 QEventDispatcherGlib::processEvents                                   qeventdispatcher_glib.cpp  394  0x7f297c3b999d
    29 QXcbGlibEventDispatcher::processEvents                                qxcbeventdispatcher.cpp    96   0x7f2979c67036
    30 QtInstance::ImplYield                                                 QtInstance.cxx             421  0x7f297c8c27c6
    31 QtInstance::DoYield                                                   QtInstance.cxx             432  0x7f297c8c28ef
    32 ImplYield                                                             svapp.cxx                  377  0x7f298732dcc8
    33 Application::Yield                                                    svapp.cxx                  461  0x7f298732ea66
    34 Application::Execute                                                  svapp.cxx                  355  0x7f298732d9bb
    35 desktop::Desktop::Main                                                app.cxx                    1601 0x7f2990a35716
    36 ImplSVMain                                                            svmain.cxx                 204  0x7f298734d600
    37 SVMain                                                                svmain.cxx                 236  0x7f298734d735
    38 soffice_main                                                          sofficemain.cxx            94   0x7f2990aa058f
    39 sal_main                                                              main.c                     51   0x5629220af9d4
    40 main                                                                  main.c                     49   0x5629220af9ba

Change-Id: Ib3ed8616fb539942d9ba0cd60d5607859deb5a7b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158344
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
This commit is contained in:
Michael Weghorn
2023-10-23 20:35:52 +02:00
parent af2457dd1f
commit f1dbbfe278
2 changed files with 12 additions and 18 deletions
@@ -94,6 +94,8 @@ namespace accessibility
/// @throws css::lang::DisposedException
/// @throws css::uno::RuntimeException
tools::Rectangle GetBoundingBoxOnScreen();
/// @throws css::lang::IndexOutOfBoundsException
void CheckActionIndex(sal_Int32 nIndex);
/// @throws css::lang::DisposedException
void EnsureIsAlive() const;
@@ -37,20 +37,6 @@
#include <helper/accresmgr.hxx>
#include <strings.hrc>
#define ACCESSIBLE_ACTION_COUNT 1
namespace
{
/// @throws css::lang::IndexOutOfBoundsException
void checkActionIndex_Impl( sal_Int32 _nIndex )
{
if ( _nIndex < 0 || _nIndex >= ACCESSIBLE_ACTION_COUNT )
// only three actions
throw css::lang::IndexOutOfBoundsException();
}
}
namespace accessibility
{
// class AccessibleListBoxEntry -----------------------------------------------------
@@ -197,6 +183,12 @@ namespace accessibility
return GetBoundingBoxOnScreen_Impl();
}
void AccessibleListBoxEntry::CheckActionIndex(sal_Int32 nIndex)
{
if (nIndex < 0 || nIndex >= getAccessibleActionCount())
throw css::lang::IndexOutOfBoundsException();
}
void AccessibleListBoxEntry::EnsureIsAlive() const
{
if ( !IsAlive_Impl() )
@@ -720,7 +712,7 @@ namespace accessibility
return 0;
}
else
return ACCESSIBLE_ACTION_COUNT;
return 1;
return 0;
}
@@ -730,7 +722,7 @@ namespace accessibility
::osl::MutexGuard aGuard( m_aMutex );
bool bRet = false;
checkActionIndex_Impl( nIndex );
CheckActionIndex(nIndex);
EnsureIsAlive();
SvTreeFlags treeFlag = m_pTreeListBox->GetTreeFlags();
@@ -767,7 +759,7 @@ namespace accessibility
SolarMutexGuard aSolarGuard;
::osl::MutexGuard aGuard( m_aMutex );
checkActionIndex_Impl( nIndex );
CheckActionIndex(nIndex);
EnsureIsAlive();
SvTreeListEntry* pEntry = m_pTreeListBox->GetEntryFromPath( m_aEntryPath );
@@ -803,7 +795,7 @@ namespace accessibility
Reference< XAccessibleKeyBinding > AccessibleListBoxEntry::getAccessibleActionKeyBinding( sal_Int32 nIndex )
{
Reference< XAccessibleKeyBinding > xRet;
checkActionIndex_Impl( nIndex );
CheckActionIndex(nIndex);
// ... which key?
return xRet;
}