sw/source/core/layout/flowfrm.cxx | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-)
New commits: commit e9fbb0a06b4318233e8cc4eec1273f7fde1beca1 Author: Michael Stahl <michael.st...@cib.de> AuthorDate: Tue Jun 18 17:51:43 2019 +0200 Commit: Michael Stahl <michael.st...@cib.de> CommitDate: Wed Jun 19 12:28:02 2019 +0200 sw: fix assert on layout of ooo63564-1.odt The problem is that some SwTextFrames (1415 in particular) inside the follow-flow-row of a table move backwards, during(!) which the follow-flow-row is deleted; i.e., the SwTextFrame was already moved backwards by the pNewUpper->Calc() in MoveBwd(), then it is Cut and Pasted at the end of pNewUpper, when it is actually already a lower, somewhere in the middle... This triggers the assert in SwFrame::PrepareMake() that was added in commit e14056e6e88d9b8d988b7b88b2776a8fc952031b Prevent this by using the IsDeleteForbidden() check that was introduced in commit 0005b330eaed0b5559042d2597fb45e0c9125d7e; this is similar to how MoveBwd() already locks section frames to prevent such problems. Ultimately a regression from 18765b9fa739337d2d891513f6e2fb7c3ce23b50. Change-Id: I893ec3e491b4cbe1569edf97fec31d3dd74548ed Reviewed-on: https://gerrit.libreoffice.org/74298 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@cib.de> (cherry picked from commit 1e6dec4b4313212a3bdc6bb06155fd65e795368b) Reviewed-on: https://gerrit.libreoffice.org/74342 diff --git a/sw/source/core/layout/flowfrm.cxx b/sw/source/core/layout/flowfrm.cxx index 6285a8b5bf81..6e1b40986f73 100644 --- a/sw/source/core/layout/flowfrm.cxx +++ b/sw/source/core/layout/flowfrm.cxx @@ -45,6 +45,7 @@ #include <txtfrm.hxx> #include <notxtfrm.hxx> #include <tabfrm.hxx> +#include <rowfrm.hxx> #include <pagedesc.hxx> #include <layact.hxx> #include <flyfrms.hxx> @@ -2518,7 +2519,28 @@ bool SwFlowFrame::MoveBwd( bool &rbReformat ) pSect->ColLock(); bFollow = pSect->HasFollow(); } - pNewUpper->Calc(m_rThis.getRootFrame()->GetCurrShell()->GetOut()); + + { + auto const pOld = m_rThis.GetUpper(); + ::boost::optional<SwFrameDeleteGuard> g; + if (m_rThis.GetUpper()->IsCellFrame()) + { + // note: IsFollowFlowRow() is never set for new-style tables + SwTabFrame const*const pTabFrame(m_rThis.FindTabFrame()); + if ( pTabFrame->IsFollow() + && static_cast<SwTabFrame const*>(pTabFrame->GetPrecede())->HasFollowFlowLine() + && pTabFrame->GetFirstNonHeadlineRow() == m_rThis.GetUpper()->GetUpper()) + { + // lock follow-flow-row (similar to sections above) + g.emplace(m_rThis.GetUpper()->GetUpper()); + assert(m_rThis.GetUpper()->GetUpper()->IsDeleteForbidden()); + } + } + pNewUpper->Calc(m_rThis.getRootFrame()->GetCurrShell()->GetOut()); + SAL_WARN_IF(pOld != m_rThis.GetUpper(), "sw.core", + "MoveBwd(): pNewUpper->Calc() moved this frame?"); + } + m_rThis.Cut(); // optimization: format section, if its size is invalidated and if it's _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits