[Libreoffice-commits] core.git: Branch 'libreoffice-6-1' - sw/inc sw/source

Caolán McNamara caolanm at redhat.com
Mon May 28 11:33:13 UTC 2018


 sw/inc/accmap.hxx                    |    3 +++
 sw/source/core/access/acccontext.cxx |    6 +++++-
 sw/source/core/access/accmap.cxx     |   11 ++++++++---
 3 files changed, 16 insertions(+), 4 deletions(-)

New commits:
commit 95ed8c0c76c18e773c5484b8b27c36805fcc7b9b
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Fri May 25 14:37:03 2018 +0100

    tdf#117601 a11y crash after merging cells
    
    this is similar to tdf#87199, in this case the accessibiles for the merged
    cells are not visible so not removed when their frame is deleted, but remain
    in the cache pointing to invalid frames.
    
    Change-Id: Ibc5b9f27541683b8f3604839fa3d1431380a4039
    Reviewed-on: https://gerrit.libreoffice.org/54902
    Reviewed-by: Michael Stahl <Michael.Stahl at cib.de>
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/sw/inc/accmap.hxx b/sw/inc/accmap.hxx
index fc7f665da383..c78bea3e0e51 100644
--- a/sw/inc/accmap.hxx
+++ b/sw/inc/accmap.hxx
@@ -277,6 +277,9 @@ public:
     Point PixelToCore (const Point& rPoint) const;
     tools::Rectangle CoreToPixel (const tools::Rectangle& rRect) const;
 
+    // is there a known accessibility impl cached for the frame
+    bool Contains(const SwFrame *pFrame) const;
+
 private:
     /** get mapping mode for LogicToPixel and PixelToLogic conversions
 
diff --git a/sw/source/core/access/acccontext.cxx b/sw/source/core/access/acccontext.cxx
index 628ad727dc47..efb6b415d372 100644
--- a/sw/source/core/access/acccontext.cxx
+++ b/sw/source/core/access/acccontext.cxx
@@ -402,8 +402,12 @@ void SwAccessibleContext::DisposeChildren(const SwFrame *pFrame,
         if( pLower )
         {
             ::rtl::Reference< SwAccessibleContext > xAccImpl;
-            if( rLower.IsAccessible( GetShell()->IsPreview() ) )
+            if (rLower.IsAccessible(GetShell()->IsPreview())
+                       // tdf#117601 dispose the darn thing if it ever was accessible
+                    || GetMap()->Contains(pLower))
+            {
                 xAccImpl = GetMap()->GetContextImpl( pLower, false );
+            }
             if( xAccImpl.is() )
                 xAccImpl->Dispose( bRecursive );
             else
diff --git a/sw/source/core/access/accmap.cxx b/sw/source/core/access/accmap.cxx
index 712b70873507..43cc0974625e 100644
--- a/sw/source/core/access/accmap.cxx
+++ b/sw/source/core/access/accmap.cxx
@@ -2158,6 +2158,11 @@ void SwAccessibleMap::RemoveContext( const SdrObject *pObj )
     }
 }
 
+bool SwAccessibleMap::Contains(const SwFrame *pFrame) const
+{
+    return (pFrame && mpFrameMap && mpFrameMap->find(pFrame) != mpFrameMap->end());
+}
+
 void SwAccessibleMap::A11yDispose( const SwFrame *pFrame,
                                    const SdrObject *pObj,
                                    vcl::Window* pWindow,
@@ -2173,9 +2178,9 @@ void SwAccessibleMap::A11yDispose( const SwFrame *pFrame,
     OSL_ENSURE( !aFrameOrObj.GetSwFrame() || aFrameOrObj.GetSwFrame()->IsAccessibleFrame(),
             "non accessible frame should be disposed" );
 
-    if (aFrameOrObj.IsAccessible( GetShell()->IsPreview() )
-            // fdo#87199 dispose the darn thing if it ever was accessible
-        || (pFrame && mpFrameMap && mpFrameMap->find(pFrame) != mpFrameMap->end()))
+    if (aFrameOrObj.IsAccessible(GetShell()->IsPreview())
+               // fdo#87199 dispose the darn thing if it ever was accessible
+            || Contains(pFrame))
     {
         ::rtl::Reference< SwAccessibleContext > xAccImpl;
         ::rtl::Reference< SwAccessibleContext > xParentAccImpl;


More information about the Libreoffice-commits mailing list