summaryrefslogtreecommitdiff
path: root/comphelper/source/misc
diff options
context:
space:
mode:
authorMichael Weghorn <m.weghorn@posteo.de>2023-09-06 09:12:23 +0200
committerMichael Weghorn <m.weghorn@posteo.de>2023-09-06 10:57:49 +0200
commitdb0044242a897e447988169630ff74e4c8bfecf9 (patch)
treea8d0571fe710cbfc13fa79760ebd4060072f22a3 /comphelper/source/misc
parent5462924437213934c2993c1fe966803a4a9f9a52 (diff)
tdf#156683 a11y: Forward when wrapped a11y context is disposing
`OAccessibleContextWrapper` wraps an `XAccessibleContext` held in the `m_xInnerContext` member and forwards calls to its own methods to that one. The lifecycle of the wrapper should match that of the wrapped context, so handle when the wrapped context is disposing by overriding `XAccessibleContext::disposing` (that takes a `css::lang::EventObject&` parameter) instead of overriding `WeakComponentImplHelperBase::disposing` (the `disposing` method not taking a param) that's meant to be called when/right before the object itself gets disposed (but wasn't called at all e.g. for the `OToolBoxWindowItemContext` case in tdf#156683). This makes sure that the corresponding entry in the `AccessibleEventNotifier` client map is removed and event listeners for the wrapper get notified (via `AccessibleEventNotifier::revokeClientNotifyDisposing`) when the wrapped object is disposing and fixes the tdf#156683 crash on exit with gtk3 observed in the libreoffice-7-6 branch: /usr/include/c++/13/debug/vector:450: In function: std::debug::vector<_Tp, _Allocator>::const_reference std:: debug::vector<_Tp, _Allocator>::operator[](size_type) const [with _Tp = com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleEventListener>; _Allocator = std::allocator<com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleEventListener> >; const_reference = const com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleEventListener>&; size_type = long unsigned int] Error: attempt to subscript container with out-of-bounds index 0, but container only holds 0 elements. Objects involved in the operation: sequence "this" @ 0x561465d8e510 { type = std::debug::vector<com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleEventListener>, std::allocator<com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleEventListener> > >; } warn:desktop:197113:197113:desktop/source/app/crashreport.cxx:61: minidump generated: /home/michi/development/git/libreoffice-WORKTREE/instdir/program/../program/../crash//e338ad13-2338-4cd0-8d5c069d-c28f5cf5.dmp Backtrace: 1 comphelper::OInterfaceContainerHelper4<com::sun::star::accessibility::XAccessibleEventListener>::disposeAndClear interfacecontainer4.hxx 397 0x7f2c39915cdc 2 comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing accessibleeventnotifier.cxx 204 0x7f2c39913c75 3 comphelper::OAccessibleContextWrapper::disposing accessiblewrapper.cxx 610 0x7f2c3992f033 4 cppu::WeakComponentImplHelperBase::dispose implbase.cxx 104 0x7f2c3947491b 5 cppu::PartialWeakComponentImplHelper<com::sun::star::accessibility::XAccessibleEventBroadcaster, com::sun::star::accessibility::XAccessibleContext>::dispose compbase.hxx 90 0x7f2bf8b31c70 6 cppu::WeakComponentImplHelperBase::release implbase.cxx 79 0x7f2c39474664 7 cppu::PartialWeakComponentImplHelper<com::sun::star::accessibility::XAccessibleEventBroadcaster, com::sun::star::accessibility::XAccessibleContext>::release compbase.hxx 86 0x7f2c3993133c 8 comphelper::OAccessibleContextWrapper::release accessiblewrapper.cxx 475 0x7f2c3992e536 9 com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleContext>::clear Reference.hxx 231 0x7f2c26929685 10 atk_object_wrapper_dispose atkwrapper.cxx 1074 0x7f2c26928a2e 11 atk_object_wrapper_finalize atkwrapper.cxx 670 0x7f2c26927677 12 g_object_unref 0x7f2c3418c48c 13 AtkListener::~AtkListener atklistener.cxx 57 0x7f2c26900547 14 AtkListener::~AtkListener atklistener.cxx 58 0x7f2c2690057e 15 cppu::OWeakObject::release weak.cxx 230 0x7f2c39556056 16 cppu::WeakImplHelper<com::sun::star::accessibility::XAccessibleEventListener>::release implbase.hxx 115 0x7f2c2690a92e 17 com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleEventListener>::~Reference Reference.hxx 114 0x7f2c39921b9f 18 std::_Destroy<com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleEventListener>> stl_construct.h 151 0x7f2c399217af 19 std::_Destroy_aux<false>::__destroy<com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleEventListener> *> stl_construct.h 163 0x7f2c39920bd5 20 std::_Destroy<com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleEventListener> *> stl_construct.h 196 0x7f2c3991f10b ... <More> Reverse-debugging to the start of `atk_object_wrapper_dispose` (s. frame 10 above), shows that the the `mpContext` is`: uno::Reference to ((anonymous namespace)::OToolBoxWindowItemContext *) 0x5637df79f1b8 Also, call the base class implementation of the same method, i.e. `OAccessibleContextWrapperHelper::disposing` instead of directly disposing via `OAccessibleContextWrapperHelper::dispose`. The former will call `dispose` via its base class implementation if it hasn't been disposed yet, s. `OComponentProxyAggregationHelper::disposing`. Change-Id: Ief66ffbe075af40f10c5fafa62063bda55f66b2f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/156610 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
Diffstat (limited to 'comphelper/source/misc')
-rw-r--r--comphelper/source/misc/accessiblewrapper.cxx8
1 files changed, 6 insertions, 2 deletions
diff --git a/comphelper/source/misc/accessiblewrapper.cxx b/comphelper/source/misc/accessiblewrapper.cxx
index 4c8d98977cd3..bd66b7534d46 100644
--- a/comphelper/source/misc/accessiblewrapper.cxx
+++ b/comphelper/source/misc/accessiblewrapper.cxx
@@ -585,8 +585,12 @@ namespace comphelper
}
- void SAL_CALL OAccessibleContextWrapper::disposing()
+ void SAL_CALL OAccessibleContextWrapper::disposing(const css::lang::EventObject& rEvent)
{
+ assert(rEvent.Source == Reference<XInterface>(m_xInnerContext, UNO_QUERY)
+ && "OAccessibleContextWrapper::disposing called with event source that's not the "
+ "wrapped a11y context");
+
AccessibleEventNotifier::TClientId nClientId( 0 );
// --- <mutex lock> -----------------------------------------
@@ -603,7 +607,7 @@ namespace comphelper
// --- </mutex lock> -----------------------------------------
// let the base class do
- OAccessibleContextWrapperHelper::dispose();
+ OAccessibleContextWrapperHelper::disposing(rEvent);
// notify the disposal
if ( nClientId )