diff options
author | Michael Weghorn <m.weghorn@posteo.de> | 2024-02-27 21:42:42 +0100 |
---|---|---|
committer | Michael Weghorn <m.weghorn@posteo.de> | 2024-02-28 09:02:46 +0100 |
commit | 8f88aff98c6089140c73437e567e6d78da5f563e (patch) | |
tree | aa78d1bc692aba359fa739520cf07df28f3df9a5 /accessibility/source | |
parent | 0845e782eb271c6e13ad376cff7ec72724d2a89c (diff) |
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 51de048ae97cbd371457dbc07120e30db9ee4187
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::star::accessibility::XAccessible, com::sun::star::accessibility::XAccessibleContext, com::sun::star::accessibility::XAccessibleComponent, com::sun::star::accessibility::XAccessibleEventBroadcaster, com::sun::star::accessibility::XAccessibleText, com::sun::star::lang::XServiceInfo>::dispose compbase.hxx 90 0x7f0ddf7cb7c5
12 cppu::WeakComponentImplHelperBase::release implbase.cxx 79 0x7f0e1873f1fe
13 cppu::PartialWeakComponentImplHelper<com::sun::star::accessibility::XAccessible, com::sun::star::accessibility::XAccessibleContext, com::sun::star::accessibility::XAccessibleComponent, com::sun::star::accessibility::XAccessibleEventBroadcaster, com::sun::star::accessibility::XAccessibleText, com::sun::star::lang::XServiceInfo>::release compbase.hxx 86 0x7f0ddf7cd0c5
14 com::sun::star::uno::Reference<com::sun::star::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>
Diffstat (limited to 'accessibility/source')
-rw-r--r-- | accessibility/source/standard/vclxaccessiblelist.cxx | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/accessibility/source/standard/vclxaccessiblelist.cxx b/accessibility/source/standard/vclxaccessiblelist.cxx index 36573dcbb385..00a4258f602e 100644 --- a/accessibility/source/standard/vclxaccessiblelist.cxx +++ b/accessibility/source/standard/vclxaccessiblelist.cxx @@ -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()); |