[Libreoffice-commits] core.git: winaccessibility/inc winaccessibility/source

Michael Weghorn (via logerrit) logerrit at kemper.freedesktop.org
Thu Sep 16 07:26:10 UTC 2021


 winaccessibility/inc/AccDescendantManagerEventListener.hxx            |    3 +
 winaccessibility/source/service/AccDescendantManagerEventListener.cxx |   20 ++++++++--
 2 files changed, 20 insertions(+), 3 deletions(-)

New commits:
commit 836a226205df9e76e77d26af80f402de7b876d61
Author:     Michael Weghorn <m.weghorn at posteo.de>
AuthorDate: Thu Sep 16 07:11:47 2021 +0100
Commit:     Michael Weghorn <m.weghorn at posteo.de>
CommitDate: Thu Sep 16 09:25:36 2021 +0200

    tdf#100086 wina11y: Don't delete a11y object for removed cell right away
    
    When handling a SELECTION_CHANGED_REMOVE event,
    AccDescendantManagerEventListener previously emitted a corresponding
    EVENT_OBJECT_SELECTIONREMOVE MSAA event with the removed child's ID
    as a parameter, then deleted that child's accessibility object.
    
    This resulted in the accessibility object no longer being available
    if accessibility tools queried for the object just received in
    the EVENT_OBJECT_SELECTIONREMOVE event.
    
    As a consequence, no 'event_selectionRemove' would be triggered
    for any table cell object on NVDA side, so an updated selection
    would not be announced for that case.
    
    To keep child objects available for such cases, don't delete the
    corresponding object in the handler for the SELECTION_CHANGED_REMOVE
    handler, but remember it for deletion and only do the actual deletion
    once a subsequent different event is handled.
    
    With this in place, the announcement for multiple selected cells in
    Calc generally works with the NVDA screen reader and a pending
    NVDA pull request [1] by Leonard de Ruijter in place
    (s.a. discussion in NVDA issue [2] for more background
    and further information).
    
    (There are still cases where events in response
    to selection changes are missing, as described e.g. in
    tdf#118508 and tdf#118748, but those are not winaccessibility-specific
    and it's the same when using the gtk3 VCL plugin with the Orca screen
    reader on Linux.)
    
    [1] https://github.com/nvaccess/nvda/pull/12849
    [2] https://github.com/nvaccess/nvda/issues/9310
    
    Change-Id: I7a46060c501ba9b8288e7c127121a535c60ce2bc
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122169
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <m.weghorn at posteo.de>

diff --git a/winaccessibility/inc/AccDescendantManagerEventListener.hxx b/winaccessibility/inc/AccDescendantManagerEventListener.hxx
index 57ae373ce5f7..73cda0f4eb46 100644
--- a/winaccessibility/inc/AccDescendantManagerEventListener.hxx
+++ b/winaccessibility/inc/AccDescendantManagerEventListener.hxx
@@ -20,6 +20,7 @@
 #pragma once
 
 #include <stdio.h>
+#include <vector>
 #include "AccComponentEventListener.hxx"
 #include <com/sun/star/accessibility/XAccessibleEventListener.hpp>
 #include <com/sun/star/accessibility/XAccessible.hpp>
@@ -32,6 +33,8 @@
  */
 class AccDescendantManagerEventListener: public AccComponentEventListener
 {
+private:
+    std::vector<com::sun::star::accessibility::XAccessible*> m_aUnselectedChildrenForDeletion;
 
 public:
     AccDescendantManagerEventListener(css::accessibility::XAccessible* pAcc, AccObjectManagerAgent* Agent);
diff --git a/winaccessibility/source/service/AccDescendantManagerEventListener.cxx b/winaccessibility/source/service/AccDescendantManagerEventListener.cxx
index c8fc771ae503..479f045cf6f3 100644
--- a/winaccessibility/source/service/AccDescendantManagerEventListener.cxx
+++ b/winaccessibility/source/service/AccDescendantManagerEventListener.cxx
@@ -183,10 +183,24 @@ bool AccDescendantManagerEventListener::NotifyChildEvent(short nWinEvent,const A
             XAccessible* pAcc = xChild.get();
             pAgent->NotifyAccEvent(nWinEvent, pAcc);
 
-            if (pAgent->IsStateManageDescendant(m_xAccessible.get())
-                    && (nWinEvent == UM_EVENT_SELECTION_CHANGED_REMOVE))
+            if (pAgent->IsStateManageDescendant(m_xAccessible.get()))
             {
-                pAgent->DeleteAccObj( pAcc );
+                if (nWinEvent == UM_EVENT_SELECTION_CHANGED_REMOVE)
+                {
+                    // The object has just been sent in a SELECTION_CHANGED_REMOVE event
+                    // and accessibility tools may query for the object and call methods on
+                    // it as a response to this.
+                    // Therefore, don't delete the object yet, but remember it for deletion
+                    // once the next event of a different type occurs.
+                    m_aUnselectedChildrenForDeletion.push_back(pAcc);
+                }
+                else
+                {
+                    // handle any pending deletions for objects previously removed from selection
+                    for (XAccessible* pAcc : m_aUnselectedChildrenForDeletion)
+                        pAgent->DeleteAccObj(pAcc);
+                    m_aUnselectedChildrenForDeletion.clear();
+                }
             }
             return true;
         }


More information about the Libreoffice-commits mailing list