[Libreoffice-commits] core.git: sw/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Sun Aug 5 14:25:31 UTC 2018


 sw/source/core/doc/doc.cxx |   34 ++++++++++++++++++----------------
 1 file changed, 18 insertions(+), 16 deletions(-)

New commits:
commit 576fac6f6199a87fb07e4a067abaa18c89b6d7ea
Author:     Mike Kaganski <mike.kaganski at collabora.com>
AuthorDate: Sun Aug 5 14:23:44 2018 +0300
Commit:     Mike Kaganski <mike.kaganski at collabora.com>
CommitDate: Sun Aug 5 16:25:08 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.kaganski at collabora.com>

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());
         }
     }
 


More information about the Libreoffice-commits mailing list