summaryrefslogtreecommitdiff
path: root/accessibility/source
diff options
context:
space:
mode:
authorMichael Weghorn <m.weghorn@posteo.de>2024-02-27 21:42:42 +0100
committerMichael Weghorn <m.weghorn@posteo.de>2024-02-28 09:02:46 +0100
commit8f88aff98c6089140c73437e567e6d78da5f563e (patch)
treeaa78d1bc692aba359fa739520cf07df28f3df9a5 /accessibility/source
parent0845e782eb271c6e13ad376cff7ec72724d2a89c (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.cxx10
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());