tdf#159910 a11y: Dispose VCLXAccessibleList children

In `VCLXAccessibleList::HandleChangedItemList`,
don't just clear the vector of list items, but
dispose them first.

To avoid code duplication, extract a helper method
from `VCLXAccessibleList::disposing` which already
disposes the children since

    commit 51de048ae9
    Author: Michael Weghorn <m.weghorn@posteo.de>
    Date:   Mon Sep 4 17:19:03 2023 +0200

        tdf#157088 a11y: Dispose list items with list

This fixes a similar crash/assert on exit, seen after using the
Navigator in Writer (in particular the combo/listboxes in
there) with the qt6 VCL plugin and the Orca screen reader
running.

stderr showed this:

    soffice.bin: .../libreoffice/comphelper/source/misc/accessibleeventnotifier.cxx:142: bool (anonymous namespace)::implLookupClient(const AccessibleEventNotifier::TClientId, ClientMap::iterator &): Assertion `rClients.end() != rPos && "AccessibleEventNotifier::implLookupClient: invalid client id " "(did you register your client?)!"' failed.
    Aborted

Backtrace:

    1 __pthread_kill_implementation pthread_kill.c 44 0x7f0e1a4a816c
    2 __pthread_kill_internal pthread_kill.c 78 0x7f0e1a4a81cf
    3 __GI_raise raise.c 26 0x7f0e1a45a472
    4 __GI_abort abort.c 79 0x7f0e1a4444b2
    5 __assert_fail_base assert.c 92 0x7f0e1a4443d5
    6 __assert_fail assert.c 101 0x7f0e1a4533a2
    7 (anonymous namespace)::implLookupClient accessibleeventnotifier.cxx 140 0x7f0e18ce59ac
    8 comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing accessibleeventnotifier.cxx 185 0x7f0e18ce5e68
    9 VCLXAccessibleListItem::disposing vclxaccessiblelistitem.cxx 164 0x7f0ddf7d237f
    10 cppu::WeakComponentImplHelperBase::dispose implbase.cxx 104 0x7f0e1873f544
    11 cppu::PartialWeakComponentImplHelper<com::sun::accessibility::XAccessible, com::sun::accessibility::XAccessibleContext, com::sun::accessibility::XAccessibleComponent, com::sun::accessibility::XAccessibleEventBroadcaster, com::sun::accessibility::XAccessibleText, com::sun::lang::XServiceInfo>::dispose compbase.hxx 90 0x7f0ddf7cb7c5
    12 cppu::WeakComponentImplHelperBase::release implbase.cxx 79 0x7f0e1873f1fe
    13 cppu::PartialWeakComponentImplHelper<com::sun::accessibility::XAccessible, com::sun::accessibility::XAccessibleContext, com::sun::accessibility::XAccessibleComponent, com::sun::accessibility::XAccessibleEventBroadcaster, com::sun::accessibility::XAccessibleText, com::sun::lang::XServiceInfo>::release compbase.hxx 86 0x7f0ddf7cd0c5
    14 com::sun::uno::Reference<com::sun::accessibility::XAccessible>::~Reference Reference.hxx 114 0x7f0e06bbccbe
    15 QtAccessibleWidget::~QtAccessibleWidget QtAccessibleWidget.hxx 39 0x7f0e06bd618d
    16 QtAccessibleWidget::~QtAccessibleWidget QtAccessibleWidget.hxx 39 0x7f0e06bd6219
    17 QAccessibleCache::deleteInterface qaccessiblecache.cpp 173 0x7f0e05545319
    18 QAccessibleCache::~QAccessibleCache qaccessiblecache.cpp 31 0x7f0e0554492a
    19 QAccessibleCache::~QAccessibleCache qaccessiblecache.cpp 32 0x7f0e055449b0
    20 cleanupAccessibleCache qaccessiblecache.cpp 24 0x7f0e05544896
    21 qt_call_post_routines qcoreapplication.cpp 332 0x7f0e05faf826
    22 QApplication::~QApplication qapplication.cpp 665 0x7f0e0419e24a
    23 QApplication::~QApplication qapplication.cpp 722 0x7f0e0419e55c
    24 std::default_delete<QApplication>::operator() unique_ptr.h 99 0x7f0e06c5d63c
    25 std::__uniq_ptr_impl<QApplication, std::default_delete<QApplication>>::reset unique_ptr.h 211 0x7f0e06c5df7c
    26 std::unique_ptr<QApplication, std::default_delete<QApplication>>::reset unique_ptr.h 509 0x7f0e06c58bfd
    27 QtInstance::~QtInstance QtInstance.cxx 305 0x7f0e06c51184
    28 QtInstance::~QtInstance QtInstance.cxx 302 0x7f0e06c51279
    29 DestroySalInstance salplug.cxx 368 0x7f0e114c0a18
    30 DeInitVCL svmain.cxx 625 0x7f0e115c5e7d
    31 ImplSVMain svmain.cxx 254 0x7f0e115c4031
    32 SVMain svmain.cxx 261 0x7f0e115c5f79
    33 soffice_main sofficemain.cxx 94 0x7f0e1a7a4ba3
    34 sal_main main.c 51 0x559ce9c67a5d
    35 main main.c 49 0x559ce9c67a37

Change-Id: Ic5121645a6920a8ac35154dda1dcfa1974ab9d4a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164062
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
This commit is contained in:
Michael Weghorn 2024-02-27 21:42:42 +01:00
parent 0845e782eb
commit 8f88aff98c
2 changed files with 9 additions and 3 deletions

View file

@ -136,6 +136,8 @@ private:
*/
virtual void SAL_CALL disposing() override;
void disposeChildren();
/** This method adds the states
AccessibleStateType::FOCUSABLE and possibly
AccessibleStateType::MULTI_SELECTABLE to the state set

View file

@ -108,6 +108,12 @@ void SAL_CALL VCLXAccessibleList::disposing()
{
VCLXAccessibleComponent::disposing();
disposeChildren();
m_pListBoxHelper.reset();
}
void VCLXAccessibleList::disposeChildren()
{
// Dispose all items in the list.
for (rtl::Reference<VCLXAccessibleListItem>& rxChild : m_aAccessibleChildren)
{
@ -116,8 +122,6 @@ void SAL_CALL VCLXAccessibleList::disposing()
}
m_aAccessibleChildren.clear();
m_pListBoxHelper.reset();
}
@ -515,7 +519,7 @@ rtl::Reference<VCLXAccessibleListItem> VCLXAccessibleList::CreateChild(sal_Int32
void VCLXAccessibleList::HandleChangedItemList()
{
m_aAccessibleChildren.clear();
disposeChildren();
NotifyAccessibleEvent (
AccessibleEventId::INVALIDATE_ALL_CHILDREN,
Any(), Any());