summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2014-12-18 21:52:51 +0100
committerCaolán McNamara <caolanm@redhat.com>2014-12-19 13:11:44 +0000
commit56d06e78ccdd8ae8c8e50a5b647272b4166f63cb (patch)
treeca8886121b922076ea8fa9898d12224c4406f7ac
parentb8e57ee5b9f0e847992307899533bb3915efb054 (diff)
fdo#87199: sw: fix root cause of a11y crash when merging cells
Commit f9eff2a402a4cd28d7dbfb6ce27cbf96b31e576f is not quite right because it will leave the mpNext chain unreachable; that could perhaps be imporoved by calling RemoveFromLayout(), but... Actually the problem is basically that one of the deleted SwCellFrms points to a SwTableBox with getRowSpan() -1 (because it has been merged) and thus IsInCoveredCell() returns true and that causes ~SwCellFrm() to skip disposing the SwAccessible stuff, so the SwCellFrm is still contained in the SwAccessibleMap. Because it's rather hard to prevent this sort of thing in general, better change SwAccessibleMap::Dispose() to assume that if it found its way into the SwAccessibleMap it should be disposed and removed. Change-Id: Ib4cec6924cb026ae30bdac6857957adf237b4d70 (cherry picked from commit 296e8b597c141b6b54cbf943871d6a6820c1779d) Reviewed-on: https://gerrit.libreoffice.org/13533 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r--sw/source/core/access/accmap.cxx4
1 files changed, 3 insertions, 1 deletions
diff --git a/sw/source/core/access/accmap.cxx b/sw/source/core/access/accmap.cxx
index f36fb141ece3..88ee719074db 100644
--- a/sw/source/core/access/accmap.cxx
+++ b/sw/source/core/access/accmap.cxx
@@ -2216,7 +2216,9 @@ void SwAccessibleMap::Dispose( const SwFrm *pFrm,
OSL_ENSURE( !aFrmOrObj.GetSwFrm() || aFrmOrObj.GetSwFrm()->IsAccessibleFrm(),
"non accessible frame should be disposed" );
- if( aFrmOrObj.IsAccessible( GetShell()->IsPreview() ) )
+ if (aFrmOrObj.IsAccessible( GetShell()->IsPreview() )
+ // fdo#87199 dispose the darn thing if it ever was accessible
+ || (pFrm && mpFrmMap && mpFrmMap->find(pFrm) != mpFrmMap->end()))
{
::rtl::Reference< SwAccessibleContext > xAccImpl;
::rtl::Reference< SwAccessibleContext > xParentAccImpl;