sw/qa/uitest/data/tdf39721.fodt                         |   42 ++++++++++++++++
 sw/qa/uitest/writer_tests7/tdf145093.py                 |   34 ++++++++++++
 sw/source/core/doc/DocumentContentOperationsManager.cxx |    6 +-
 3 files changed, 80 insertions(+), 2 deletions(-)

New commits:
commit eda5ac4a63fac6bce939b6791dec52270618dc29
Author:     László Németh <nem...@numbertext.org>
AuthorDate: Wed Oct 13 08:56:02 2021 +0200
Commit:     László Németh <nem...@numbertext.org>
CommitDate: Thu Oct 14 09:13:31 2021 +0200

    tdf#145093 sw track changes: fix crash at moving list items
    
    over a tracked paragraph insertion (both in Show Changes and
    Hide Changes modes).
    
    Note: we needed a Python UI test, because uiwriter doesn't crash
    on Linux without this fix.
    
    Likely regression from commit a19dc0d9cc35ae1e200f51d86950595f6771e9c3
    "sw_redlinehide_3: update frames in MoveParagraph()".
    
    Change-Id: I3026c9136e2fa6dcc1f6b5bad1677846a6cfe614
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123551
    Tested-by: László Németh <nem...@numbertext.org>
    Reviewed-by: László Németh <nem...@numbertext.org>

diff --git a/sw/qa/uitest/data/tdf39721.fodt b/sw/qa/uitest/data/tdf39721.fodt
new file mode 100644
index 000000000000..1acf06c5e2a5
--- /dev/null
+++ b/sw/qa/uitest/data/tdf39721.fodt
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document 
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" 
xmlns:officeooo="http://openoffice.org/2009/office"; office:version="1.2" 
office:mimetype="application/vnd.oasis.opendocument.text" 
xmlns:dc="http://purl.org/dc/elements/1.1/";>
+ <office:styles>
+  <style:style style:name="Standard" style:family="paragraph" 
style:class="text"/>
+  <style:default-style style:family="paragraph">
+   <style:text-properties fo:language="en" fo:country="US"/>
+  </style:default-style>
+ </office:styles>
+ <office:body>
+  <office:text>
+   <text:tracked-changes text:track-changes="false">
+    <text:changed-region xml:id="ct94454449144064" text:id="ct94454449144064">
+     <text:deletion>
+      <office:change-info>
+       <dc:creator>Unknown Author</dc:creator>
+       <dc:date>2021-01-06T16:18:57</dc:date>
+      </office:change-info>
+     </text:deletion>
+    </text:changed-region>
+    <text:changed-region xml:id="ct94454455394000" text:id="ct94454455394000">
+     <text:deletion>
+      <office:change-info>
+       <dc:creator>Unknown Author</dc:creator>
+       <dc:date>2021-01-06T16:20:17</dc:date>
+      </office:change-info>
+     </text:deletion>
+    </text:changed-region>
+   </text:tracked-changes>
+   <text:list xml:id="list627175737" text:style-name="L3">
+    <text:list-item>
+     <text:p text:style-name="P1">Lorem<text:change-start 
text:change-id="ct94454449144064"/> ipsu<text:change-end 
text:change-id="ct94454449144064"/>m</text:p>
+    </text:list-item>
+    <text:list-item>
+     <text:p text:style-name="P1">dol<text:change-start 
text:change-id="ct94454455394000"/>or <text:change-end 
text:change-id="ct94454455394000"/>sit</text:p>
+    </text:list-item>
+    <text:list-item>
+     <text:p text:style-name="P1">amet.</text:p>
+    </text:list-item>
+   </text:list>
+  </office:text>
+ </office:body>
+</office:document>
diff --git a/sw/qa/uitest/writer_tests7/tdf145093.py 
b/sw/qa/uitest/writer_tests7/tdf145093.py
new file mode 100644
index 000000000000..c22510a619cc
--- /dev/null
+++ b/sw/qa/uitest/writer_tests7/tdf145093.py
@@ -0,0 +1,34 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+from uitest.framework import UITestCase
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import select_pos
+from uitest.uihelper.common import type_text
+from uitest.uihelper.common import get_url_for_data_file
+
+class tdf145093(UITestCase):
+    def test_tdf145093(self):
+        # load the sample file
+        with self.ui_test.load_file(get_url_for_data_file("tdf39721.fodt")) as 
document:
+
+            # redlining should be on
+            self.xUITest.executeCommand(".uno:TrackChanges")
+
+            # Move Up/Down a list item over a tracked paragraph insertion 
resulted a crash
+            # (Note: not only at the end of the document, but check the 
original
+            # bug report temporarily, where the problem is triggered by an 
other problem).
+
+            self.xUITest.executeCommand(".uno:MoveDown")
+            self.xUITest.executeCommand(".uno:MoveDown")
+            # Note: Move list item from the end of the document creates an 
extra insertion.
+            # TODO: fix this other problem, and improve the test with an extra 
paragraph insertion
+            self.xUITest.executeCommand(".uno:MoveUp")
+
+            # This was a crash (using invalid pointer) both in Show Changes 
and Hide Changes modes
+            self.xUITest.executeCommand(".uno:MoveDown")
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx 
b/sw/source/core/doc/DocumentContentOperationsManager.cxx
index 9a093450f992..e078b3aeda8e 100644
--- a/sw/source/core/doc/DocumentContentOperationsManager.cxx
+++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx
@@ -949,8 +949,10 @@ namespace
         for(SaveRedline & rSvRedLine : rArr)
         {
             rSvRedLine.SetPos( nInsPos );
-            rDoc.getIDocumentRedlineAccess().AppendRedline( rSvRedLine.pRedl, 
true );
-            if (rSvRedLine.pRedl->GetType() == RedlineType::Delete)
+            IDocumentRedlineAccess::AppendResult const result(
+                rDoc.getIDocumentRedlineAccess().AppendRedline( 
rSvRedLine.pRedl, true ));
+            if ( IDocumentRedlineAccess::AppendResult::APPENDED == result &&
+                rSvRedLine.pRedl->GetType() == RedlineType::Delete )
             {
                 UpdateFramesForAddDeleteRedline(rDoc, *rSvRedLine.pRedl);
             }

Reply via email to