sw/source/core/doc/doc.cxx | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-)
New commits: commit 0e94d8392fa18d7e99224c17d3b0186187cdfe3c Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Sun Aug 5 14:23:44 2018 +0300 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Thu Aug 9 22:21:29 2018 +0200 tdf#118859: Avoid trying to remove already removed nodes Regression from commit db04be037b611e296ef9f2542322c52ed82d7a2b Change-Id: I530c00f6357b4822654add6e5f2eecb3252b88ae Reviewed-on: https://gerrit.libreoffice.org/58612 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> (cherry picked from commit 576fac6f6199a87fb07e4a067abaa18c89b6d7ea) Reviewed-on: https://gerrit.libreoffice.org/58630 Reviewed-by: Andras Timar <andras.ti...@collabora.com> Tested-by: Andras Timar <andras.ti...@collabora.com> diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx index d5b299373abd..8d29d7872467 100644 --- a/sw/source/core/doc/doc.cxx +++ b/sw/source/core/doc/doc.cxx @@ -124,6 +124,7 @@ #include <vector> #include <map> +#include <set> #include <osl/diagnose.h> #include <osl/interlck.h> #include <vbahelper/vbaaccesshelper.hxx> @@ -1340,9 +1341,8 @@ void RemoveOrDeleteContents(SwTextNode* pTextNd, IDocumentContentOperations& xOp xOperations.DelFullPara(aPam); } } -// Returns if the data was actually modified -bool HandleHidingField(SwFormatField& rFormatField, const SwNodes& rNodes, - IDocumentContentOperations& xOperations) +// Returns the node pointer which needs to hide, or nullptr if this field does not hide a node +SwTextNode* HandleHidingField(SwFormatField& rFormatField, const SwNodes& rNodes) { SwTextNode* pTextNd; if (rFormatField.GetTextField() @@ -1350,10 +1350,9 @@ bool HandleHidingField(SwFormatField& rFormatField, const SwNodes& rNodes, && pTextNd->GetpSwpHints() && pTextNd->IsHiddenByParaField() && &pTextNd->GetNodes() == &rNodes) { - RemoveOrDeleteContents(pTextNd, xOperations); - return true; + return pTextNd; } - return false; + return nullptr; } } @@ -1385,6 +1384,7 @@ bool SwDoc::FieldHidesPara(const SwField& rField) const } /// Remove the invisible content from the document e.g. hidden areas, hidden paragraphs +// Returns if the data was actually modified bool SwDoc::RemoveInvisibleContent() { bool bRet = false; @@ -1392,21 +1392,23 @@ bool SwDoc::RemoveInvisibleContent() { // Removing some nodes for one SwFieldIds::Database type might remove the type from - // document's field types, invalidating iterators. So, we need to create own list of - // matching types prior to processing them. - std::vector<const SwFieldType*> aHidingFieldTypes; + // document's field types, or try to remove already removed nodes, invalidating iterators. + // So, we need to create own list of nodes prior to removing them. + std::set<SwTextNode*> aHiddenNodes; for (const auto* pType : *getIDocumentFieldsAccess().GetFieldTypes()) { if (FieldCanHidePara(pType->Which())) - aHidingFieldTypes.push_back(pType); + { + SwIterator<SwFormatField, SwFieldType> aIter(*pType); + for (auto* pField = aIter.First(); pField; pField = aIter.Next()) + if (SwTextNode* pHiddenNode = HandleHidingField(*pField, GetNodes())) + aHiddenNodes.insert(pHiddenNode); + } } - for (const auto* pType : aHidingFieldTypes) + for (SwTextNode* pHiddenNode : aHiddenNodes) { - SwIterator<SwFormatField, SwFieldType> aIter(*pType); - for (SwFormatField* pFormatField = aIter.First(); pFormatField; - pFormatField = aIter.Next()) - bRet |= HandleHidingField(*pFormatField, GetNodes(), - getIDocumentContentOperations()); + bRet = true; + RemoveOrDeleteContents(pHiddenNode, getIDocumentContentOperations()); } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits