summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2018-05-25 14:37:03 +0100
committerCaolán McNamara <caolanm@redhat.com>2018-05-28 13:52:59 +0200
commitbab7384c005921768a9499550c1525d211aeddf9 (patch)
treed6bf69e7dbb88016d25a369bb59ba7b3f730751d
parent6e37f748096a7fd7d7a3a07b2393c5f8960cfeb5 (diff)
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/54903 Reviewed-by: Michael Stahl <Michael.Stahl@cib.de> Tested-by: Jenkins <ci@libreoffice.org>
-rw-r--r--sw/inc/accmap.hxx3
-rw-r--r--sw/source/core/access/acccontext.cxx6
-rw-r--r--sw/source/core/access/accmap.cxx11
3 files changed, 16 insertions, 4 deletions
diff --git a/sw/inc/accmap.hxx b/sw/inc/accmap.hxx
index 2739b1a78a01..8582e2354347 100644
--- a/sw/inc/accmap.hxx
+++ b/sw/inc/accmap.hxx
@@ -292,6 +292,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 46e0be9ce220..176358fd4907 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 98a50e784b5b..7047b4ddce47 100644
--- a/sw/source/core/access/accmap.cxx
+++ b/sw/source/core/access/accmap.cxx
@@ -2162,6 +2162,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,
@@ -2177,9 +2182,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;