accessibility/inc/standard/vclxaccessiblelist.hxx    |    2 ++
 accessibility/source/standard/vclxaccessiblelist.cxx |   10 +++++++---
 2 files changed, 9 insertions(+), 3 deletions(-)

New commits:
commit 5cb1fa2a98f61f161ff8b3c19919dad539b36d87
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Tue Feb 27 21:42:42 2024 +0100
Commit:     Michael Stahl <michael.st...@allotropia.de>
CommitDate: Thu Feb 29 11:12:09 2024 +0100

    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.wegh...@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.wegh...@posteo.de>
    (cherry picked from commit b5f943fabbd73aa8a0c972ca8c37d6fda56a7385)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163983
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>

diff --git a/accessibility/inc/standard/vclxaccessiblelist.hxx 
b/accessibility/inc/standard/vclxaccessiblelist.hxx
index f668e75d7cda..7bfb83c7e386 100644
--- a/accessibility/inc/standard/vclxaccessiblelist.hxx
+++ b/accessibility/inc/standard/vclxaccessiblelist.hxx
@@ -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
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());

Reply via email to