sw/source/core/docnode/node.cxx | 2 ++ sw/source/core/text/redlnitr.cxx | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-)
New commits: commit 520b0e1679d7a97aa3d91cfc95ca647339da7e84 Author: Michael Stahl <michael.st...@cib.de> AuthorDate: Thu Apr 2 18:59:40 2020 +0200 Commit: Michael Stahl <michael.st...@cib.de> CommitDate: Fri Apr 3 17:20:52 2020 +0200 (related: tdf#130685) sw_redlinehide: fix update of pLastNode/pParaPropsNode If you Select All, Cut then move the cursor around a bit then paste, then this happens: sw/source/core/text/txtfrm.cxx:3461: void SwTextFrame::CalcAdditionalFirstLineOffset(): Assertion `pTextNode->IsNumbered(getRootFrame()) == pTextNode->IsNumbered(nullptr)' failed. The reason is this borked MergedPara, which really only has 1 node it's listening on, but pLastNode and pParaPropsNode point to a node that is actually part of a different MergedPara now. $6 = { listener = { m_rToTell = @0x6c02700, m_vDepends = std::__debug::vector of length 1, capacity 256 = {{ <SwClient> = { m_pRegisteredIn = 0x6af5f20 }, }} }, extents = std::__debug::vector of length 0, capacity 0, mergedText = "", pParaPropsNode = 0x6d1c390, pFirstNode = 0x6af5f20, pLastNode = 0x6d1c390 } The reason is that SwContentNode::DelFrames() doesn't update these members properly; at the time when it's called for the previous pLastNode, the offending node has Merge::NonFirst set already in the call of CheckParaRedlineMerge() so it sets the wrong new pLastNode. Fix this by iterating DelFrames() loop backward. (regression from sw_redlinehide) Change-Id: I508fd25af385a25ba9ed78d71aa3d1f02a7ac7a3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/91597 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@cib.de> diff --git a/sw/source/core/docnode/node.cxx b/sw/source/core/docnode/node.cxx index eacf62d4c56f..5c5b648f7cb5 100644 --- a/sw/source/core/docnode/node.cxx +++ b/sw/source/core/docnode/node.cxx @@ -1386,6 +1386,7 @@ void SwContentNode::DelFrames(SwRootFrame const*const pLayout) break; } } + assert(pMerged->listener.IsListeningTo(pMerged->pParaPropsNode)); } assert(GetIndex() <= pMerged->pLastNode->GetIndex()); if (this == pMerged->pLastNode) @@ -1407,6 +1408,7 @@ void SwContentNode::DelFrames(SwRootFrame const*const pLayout) } } assert(pMerged->pFirstNode->GetIndex() <= pMerged->pLastNode->GetIndex()); + assert(pMerged->listener.IsListeningTo(pMerged->pLastNode)); } // avoid re-parenting mess (ModifyChangedHint) pMerged->listener.EndListening(this); diff --git a/sw/source/core/text/redlnitr.cxx b/sw/source/core/text/redlnitr.cxx index 53f614d84b68..d4be4a1d3d8d 100644 --- a/sw/source/core/text/redlnitr.cxx +++ b/sw/source/core/text/redlnitr.cxx @@ -276,7 +276,8 @@ CheckParaRedlineMerge(SwTextFrame & rFrame, SwTextNode & rTextNode, } // unfortunately DelFrames() must be done before StartListening too, // otherwise footnotes cannot be deleted by SwTextFootnote::DelFrames! - for (auto iter = ++nodes.begin(); iter != nodes.end(); ++iter) + auto const end(--nodes.rend()); + for (auto iter = nodes.rbegin(); iter != end; ++iter) { (**iter).DelFrames(rFrame.getRootFrame()); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits