diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2018-08-05 14:23:44 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2018-08-05 16:25:08 +0200 |
commit | 576fac6f6199a87fb07e4a067abaa18c89b6d7ea (patch) | |
tree | 25b274d20bf612971a7cb80df77268bc07a0a7c6 /sw | |
parent | 74edd968e9bd760a4635aa1658b8143410e74c50 (diff) |
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.kaganski@collabora.com>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/core/doc/doc.cxx | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx index 74d3ab033b3a..97ac11dea077 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> @@ -1341,9 +1342,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() @@ -1351,10 +1351,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; } } @@ -1386,6 +1385,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; @@ -1393,21 +1393,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()); } } |