diff options
author | Michael Stahl <Michael.Stahl@cib.de> | 2019-08-09 16:41:19 +0200 |
---|---|---|
committer | Michael Stahl <Michael.Stahl@cib.de> | 2019-08-09 19:04:42 +0200 |
commit | b86ff2c6a88aa41379e74f11e8ec8497ff85ffd0 (patch) | |
tree | 8118fd648bf0e9ca6806103760404f9be66cf297 /sw | |
parent | f6a7dee56c984f36261c75a1056cc3a5bf43b2f1 (diff) |
tdf#118699 sw_redlinehide: need some more changes to use the last node
... as property node for the merged frame.
This would assert in SwContentNode::DelFrames() during tdf#126627
and also in crashtesting, e.g. fdo66302-1.odt.
(regression from fa5eb82b398e29ae033f7b7c8c8195dfc10cf5b0)
Change-Id: Ia6d52287ed42f41d16ebf12bc61d7f4a6d7c5b03
Reviewed-on: https://gerrit.libreoffice.org/77212
Tested-by: Jenkins
Reviewed-by: Michael Stahl <Michael.Stahl@cib.de>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/core/docnode/node.cxx | 20 | ||||
-rw-r--r-- | sw/source/core/text/txtfrm.cxx | 7 |
2 files changed, 22 insertions, 5 deletions
diff --git a/sw/source/core/docnode/node.cxx b/sw/source/core/docnode/node.cxx index db564aeec12f..206fcdaf1f0a 100644 --- a/sw/source/core/docnode/node.cxx +++ b/sw/source/core/docnode/node.cxx @@ -1371,8 +1371,24 @@ void SwContentNode::DelFrames(SwRootFrame const*const pLayout) // because that would access deleted wrong-lists sw::UpdateMergedParaForDelete(*pMerged, true, *static_cast<SwTextNode*>(this), 0, Len()); - // pointer should have been updated to a different node - assert(this != pMerged->pParaPropsNode); + if (this == pMerged->pParaPropsNode) + { + // otherwise pointer should have been updated to a different node + assert(this == pMerged->pLastNode); + assert(pMerged->extents.empty()); + for (sal_uLong i = pMerged->pLastNode->GetIndex() - 1;; + --i) + { + assert(pMerged->pFirstNode->GetIndex() <= i); + SwNode *const pNode(GetNodes()[i]); + if (pNode->IsTextNode() + && pNode->GetRedlineMergeFlag() != Merge::Hidden) + { + pMerged->pParaPropsNode = pNode->GetTextNode(); + break; + } + } + } if (this == pMerged->pLastNode) { pMerged->pLastNode = GetNodes()[GetIndex()-1]->GetTextNode(); diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx index a2f62d324e3b..a6264530a96b 100644 --- a/sw/source/core/text/txtfrm.cxx +++ b/sw/source/core/text/txtfrm.cxx @@ -1014,8 +1014,9 @@ static TextFrameIndex UpdateMergedParaForInsert(MergedPara & rMerged, rMerged.extents.emplace(itInsert, const_cast<SwTextNode*>(&rNode), nIndex, nIndex + nLen); text.insert(nTFIndex, rNode.GetText().copy(nIndex, nLen)); nInserted = nLen; - if (rNode.GetIndex() < rMerged.pParaPropsNode->GetIndex()) - { // text inserted before current para-props node + if (rMerged.extents.size() == 1 // also if it was empty! + || rMerged.pParaPropsNode->GetIndex() < rNode.GetIndex()) + { // text inserted after current para-props node rMerged.pParaPropsNode->RemoveFromListRLHidden(); rMerged.pParaPropsNode = &const_cast<SwTextNode&>(rNode); rMerged.pParaPropsNode->AddToListRLHidden(); @@ -1147,7 +1148,7 @@ TextFrameIndex UpdateMergedParaForDelete(MergedPara & rMerged, { rMerged.pParaPropsNode->RemoveFromListRLHidden(); rMerged.pParaPropsNode = rMerged.extents.empty() - ? rMerged.pFirstNode + ? const_cast<SwTextNode*>(rMerged.pLastNode) : rMerged.extents.front().pNode; rMerged.pParaPropsNode->AddToListRLHidden(); } |