sw/qa/extras/uiwriter/data/tdf144748.fodt |   82 ++++++++++++++++++++++++++++++
 sw/qa/extras/uiwriter/uiwriter2.cxx       |   44 ++++++++++++++++
 sw/source/core/docnode/ndtbl1.cxx         |    4 +
 3 files changed, 129 insertions(+), 1 deletion(-)

New commits:
commit 74650680788dc076a37d2fe4d5f9237c450807d0
Author:     László Németh <nem...@numbertext.org>
AuthorDate: Tue Oct 5 10:44:36 2021 +0200
Commit:     László Németh <nem...@numbertext.org>
CommitDate: Tue Oct 5 14:58:09 2021 +0200

    tdf#144748 sw: fix crash at Undo of deletion with empty table rows
    
    When a table with empty rows is part of a bigger deletion,
    Undo of the deletion resulted a crash, because the deletion
    created extra redlines for the empty rows within the bigger
    redline.
    
    Regression from commit 9994120c8d0fe8c5a029390ad7411b99c18ff5c9
    "tdf#144347 sw: fix tracked deletion of table with tracked content".
    See also commit 99059a1ececa3621c2fe46fabdd79eed9d626c42
    "tdf#143359 sw: track deletion of empty table rows".
    
    Change-Id: I0e33e169c1ffe60022a6b66a6d70fdd9c0a9332a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123091
    Tested-by: Jenkins
    Reviewed-by: László Németh <nem...@numbertext.org>

diff --git a/sw/qa/extras/uiwriter/data/tdf144748.fodt 
b/sw/qa/extras/uiwriter/data/tdf144748.fodt
new file mode 100644
index 000000000000..4da444cf03b3
--- /dev/null
+++ b/sw/qa/extras/uiwriter/data/tdf144748.fodt
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:drawooo="http://openoffice.org/2010/draw"; 
xmlns:tableooo="http://openoffice.org/2009/table"; 
xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" 
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:xlink="http://www.w3.org/1999/xlink"; 
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" 
xmlns:dc="http://purl.org/dc/elements/1.1/"; 
xmlns:ooo="http://openoffice.org/2004/office"; 
xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart: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:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" 
xmlns:officeooo="http://openoffice.org/2009/office"; 
xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" 
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" 
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" 
office:version="1.3" office:mimetype="application/vnd.oasis.opendocume
 nt.text">
+ <office:automatic-styles>
+  <style:style style:name="Table1" style:family="table">
+   <style:table-properties style:width="15.984cm" fo:margin-left="0.009cm" 
fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left" 
style:writing-mode="lr-tb"/>
+  </style:style>
+  <style:style style:name="Table1.A" style:family="table-column">
+   <style:table-column-properties style:column-width="5.327cm"/>
+  </style:style>
+  <style:style style:name="Table1.B" style:family="table-column">
+   <style:table-column-properties style:column-width="5.329cm"/>
+  </style:style>
+  <style:style style:name="Table1.1" style:family="table-row">
+   <style:table-row-properties fo:keep-together="auto"/>
+  </style:style>
+  <style:style style:name="Table1.A1" style:family="table-cell">
+   <style:table-cell-properties fo:padding-left="0.191cm" 
fo:padding-right="0.191cm" fo:padding-top="0cm" fo:padding-bottom="0cm" 
fo:border="0.5pt solid #000000" style:writing-mode="lr-tb"/>
+  </style:style>
+  <style:style style:name="Table1.A2" style:family="table-cell">
+   <style:table-cell-properties fo:padding-left="0.191cm" 
fo:padding-right="0.191cm" fo:padding-top="0cm" fo:padding-bottom="0cm" 
fo:border-left="0.5pt solid #000000" fo:border-right="0.5pt solid #000000" 
fo:border-top="none" fo:border-bottom="0.5pt solid #000000" 
style:writing-mode="lr-tb"/>
+  </style:style>
+  <style:style style:name="P1" style:family="paragraph" 
style:parent-style-name="Standard">
+   <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" 
style:contextual-spacing="false" fo:line-height="100%" fo:text-align="start" 
style:justify-single-word="false" fo:orphans="2" fo:widows="2"/>
+   <style:text-properties style:font-name="Calibri" fo:font-size="11pt" 
fo:language="hu" fo:country="HU" style:letter-kerning="false" 
style:font-name-asian="Calibri1" style:font-size-asian="11pt" 
style:language-asian="en" style:country-asian="US" style:font-name-complex="F" 
style:font-size-complex="11pt" style:language-complex="ar" 
style:country-complex="SA"/>
+  </style:style>
+ </office:automatic-styles>
+ <office:body>
+  <office:text>
+   <text:p text:style-name="Text_20_body"/>
+   <table:table table:name="Table1" table:style-name="Table1">
+    <table:table-column table:style-name="Table1.A"/>
+    <table:table-column table:style-name="Table1.B" 
table:number-columns-repeated="2"/>
+    <table:table-row table:style-name="Table1.1">
+     <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+      <text:p text:style-name="P1">a</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+      <text:p text:style-name="P1">b</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+      <text:p text:style-name="P1">c</text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row table:style-name="Table1.1">
+     <table:table-cell table:style-name="Table1.A2" office:value-type="string">
+      <text:p text:style-name="P1"/>
+     </table:table-cell>
+     <table:table-cell table:style-name="Table1.A2" office:value-type="string">
+      <text:p text:style-name="P1"/>
+     </table:table-cell>
+     <table:table-cell table:style-name="Table1.A2" office:value-type="string">
+      <text:p text:style-name="P1"/>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row table:style-name="Table1.1">
+     <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+      <text:p text:style-name="P1">d</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+      <text:p text:style-name="P1">e</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+      <text:p text:style-name="P1">f</text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row table:style-name="Table1.1">
+     <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+      <text:p text:style-name="P1">g</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+      <text:p text:style-name="P1">h</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Table1.A1" office:value-type="string">
+      <text:p text:style-name="P1">i</text:p>
+     </table:table-cell>
+    </table:table-row>
+   </table:table>
+   <text:p text:style-name="Standard"/>
+   <text:p text:style-name="Standard"/>
+  </office:text>
+ </office:body>
+</office:document>
diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx 
b/sw/qa/extras/uiwriter/uiwriter2.cxx
index 4a273afa49a1..9765e83cecf4 100644
--- a/sw/qa/extras/uiwriter/uiwriter2.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter2.cxx
@@ -4551,6 +4551,50 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf143215)
     CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTable->getRows()->getCount());
 }
 
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf144748)
+{
+    // load a table with an empty row, and an empty line before the table
+    // (to allow the easy selection of the full text with the table)
+    SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf144748.fodt");
+
+    // turn on red-lining and show changes
+    pDoc->getIDocumentRedlineAccess().SetRedlineFlags(RedlineFlags::On | 
RedlineFlags::ShowDelete
+                                                      | 
RedlineFlags::ShowInsert);
+    CPPUNIT_ASSERT_MESSAGE("redlining should be on",
+                           pDoc->getIDocumentRedlineAccess().IsRedlineOn());
+    CPPUNIT_ASSERT_MESSAGE(
+        "redlines should be visible",
+        
IDocumentRedlineAccess::IsShowChanges(pDoc->getIDocumentRedlineAccess().GetRedlineFlags()));
+
+    uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, 
uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> 
xTables(xTextTablesSupplier->getTextTables(),
+                                                    uno::UNO_QUERY);
+    // there is a table in the text
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount());
+
+    // delete full text with the table and check Undo
+
+    dispatchCommand(mxComponent, ".uno:SelectAll", {});
+    dispatchCommand(mxComponent, ".uno:Delete", {});
+    // this crashed LibreOffice
+    dispatchCommand(mxComponent, ".uno:Undo", {});
+
+    // redo and check redline usage
+
+    dispatchCommand(mxComponent, ".uno:Redo", {});
+    SwEditShell* const pEditShell(pDoc->GetEditShell());
+    // This was 2 (bad extra redline for the empty row of the deleted table)
+    CPPUNIT_ASSERT_EQUAL(static_cast<SwRedlineTable::size_type>(1), 
pEditShell->GetRedlineCount());
+
+    // accept deletion of the text, including the table with the empty row
+
+    IDocumentRedlineAccess& rIDRA(pDoc->getIDocumentRedlineAccess());
+    rIDRA.AcceptAllRedline(true);
+
+    // no table left in the text
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xTables->getCount());
+}
+
 CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf128335)
 {
     // Load the bugdoc, which has 3 textboxes.
diff --git a/sw/source/core/docnode/ndtbl1.cxx 
b/sw/source/core/docnode/ndtbl1.cxx
index 7e9a437aed94..8a0455eabcfe 100644
--- a/sw/source/core/docnode/ndtbl1.cxx
+++ b/sw/source/core/docnode/ndtbl1.cxx
@@ -572,7 +572,9 @@ void SwDoc::SetRowNotTracked( const SwCursor& rCursor, 
const SvxPrintItem &rNew,
         ::lcl_ProcessRowAttr( aFormatCmp, pLn, rNew );
         // as a workaround for the rows without text content,
         // add a redline with invisible text CH_TXT_TRACKED_DUMMY_CHAR
-        if (pLn->IsEmpty())
+        // (unless the table is part of a bigger deletion, where the
+        // new redline can cause a problem)
+        if (!bAll && pLn->IsEmpty())
         {
             SwNodeIndex aInsPos( *(pLn->GetTabBoxes()[0]->GetSttNd()), 1 );
             RedlineFlags eOld = getIDocumentRedlineAccess().GetRedlineFlags();

Reply via email to