summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSarper Akdemir <sarper.akdemir@collabora.com>2022-03-30 17:02:30 +0300
committerAndras Timar <andras.timar@collabora.com>2022-04-03 17:33:46 +0200
commit87c1615c1f6525c3f0e0d16dd98269744d21d183 (patch)
tree11e9e9e305aa387747e7fdc5762595856f08c7c9
parent83852d3e002e38f607a1e97793f0c43a0cc49514 (diff)
tdf#148273 docx import: fix section break format leak to bullets
Fixes RES_PARATR_LIST_AUTOFMT leaking into the next section. Achieves this by resetting list related attributes on the cursor's text node in DomainMapper_Impl::RemoveLastParagraph() after the deletion of the paragraph. Change-Id: Ib4d09c5f190b8b8fd3bdc119ddd57d91f353de2f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132324 Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132440 Reviewed-by: Andras Timar <andras.timar@collabora.com>
-rw-r--r--sw/inc/unoprnms.hxx1
-rw-r--r--sw/qa/extras/ooxmlexport/data/tdf148273_sectionBulletFormatLeak.docxbin0 -> 15161 bytes
-rw-r--r--sw/qa/extras/ooxmlexport/ooxmlexport17.cxx17
-rw-r--r--sw/source/core/unocore/unoobj.cxx9
-rw-r--r--writerfilter/source/dmapper/DomainMapper.cxx2
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx8
6 files changed, 36 insertions, 1 deletions
diff --git a/sw/inc/unoprnms.hxx b/sw/inc/unoprnms.hxx
index 7ef5d0a58cd7..b9dbdc40e9fa 100644
--- a/sw/inc/unoprnms.hxx
+++ b/sw/inc/unoprnms.hxx
@@ -500,6 +500,7 @@
#define UNO_NAME_SEPARATOR_LINE_IS_ON "SeparatorLineIsOn"
#define UNO_NAME_IS_SKIP_HIDDEN_TEXT "IsSkipHiddenText"
#define UNO_NAME_IS_SKIP_PROTECTED_TEXT "IsSkipProtectedText"
+#define UNO_NAME_RESET_PARAGRAPH_LIST_ATTRIBUTES "ResetParagraphListAttributes"
#define UNO_NAME_DOCUMENT_INDEX_MARKS "DocumentIndexMarks"
#define UNO_NAME_FOOTNOTE_IS_COLLECT_AT_TEXT_END "FootnoteIsCollectAtTextEnd"
#define UNO_NAME_FOOTNOTE_IS_RESTART_NUMBERING "FootnoteIsRestartNumbering"
diff --git a/sw/qa/extras/ooxmlexport/data/tdf148273_sectionBulletFormatLeak.docx b/sw/qa/extras/ooxmlexport/data/tdf148273_sectionBulletFormatLeak.docx
new file mode 100644
index 000000000000..1ebb1e8b419c
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/tdf148273_sectionBulletFormatLeak.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
index f23721767fc9..370989a9d6b7 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
@@ -11,6 +11,7 @@
#include <string_view>
+#include <com/sun/star/beans/NamedValue.hpp>
#include <com/sun/star/text/XBookmarksSupplier.hpp>
#include <com/sun/star/text/XTextFieldsSupplier.hpp>
#include <com/sun/star/text/XTextField.hpp>
@@ -282,6 +283,22 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf147978enhancedPathABVW)
}
}
+DECLARE_OOXMLEXPORT_TEST(testTdf148273_sectionBulletFormatLeak, "tdf148273_sectionBulletFormatLeak.docx")
+{
+ // get a paragraph with bullet point after section break
+ uno::Reference<text::XTextRange> xParagraph = getParagraph(4);
+ uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
+
+ // Make sure that the bullet has no ListAutoFormat inherited from
+ // the empty paragraph before the section break
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 0
+ // - Actual : 1
+ // i.e. empty paragraph formats from the first section leaked to the bullet's formatting
+ uno::Any aValue = xProps->getPropertyValue("ListAutoFormat");
+ CPPUNIT_ASSERT_EQUAL(false, aValue.hasValue());
+}
+
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/unocore/unoobj.cxx b/sw/source/core/unocore/unoobj.cxx
index b26acac97282..09136cf44c8c 100644
--- a/sw/source/core/unocore/unoobj.cxx
+++ b/sw/source/core/unocore/unoobj.cxx
@@ -2087,6 +2087,15 @@ SwXTextCursor::setPropertyValue(
}
rUnoCursor.SetSkipOverProtectSections(bSet);
}
+ else if (rPropertyName == UNO_NAME_RESET_PARAGRAPH_LIST_ATTRIBUTES)
+ {
+ SwTextNode* pTextNode= GetPaM()->GetNode().GetTextNode();
+
+ if(pTextNode)
+ {
+ pTextNode->ResetAttr(RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END);
+ }
+ }
else
{
SwUnoCursorHelper::SetPropertyValue(rUnoCursor,
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index ffa829351baa..691e876d4859 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -3768,10 +3768,10 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len)
static_cast<ParagraphPropertyMap*>(xContext.get())->SetListId(-1);;
xContext->Erase(PROP_NUMBERING_LEVEL);
}
- m_pImpl->SetParaSectpr(false);
finishParagraph(bRemove, bNoNumbering);
if (bRemove)
m_pImpl->RemoveLastParagraph();
+ m_pImpl->SetParaSectpr(false);
}
else
{
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 8afcede51d13..7eb9964e36a4 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -716,6 +716,14 @@ void DomainMapper_Impl::RemoveLastParagraph( )
// delete
xCursor->setString(OUString());
+ // While removing paragraphs that contain section properties, reset list
+ // related attributes to prevent them leaking into the following section's lists
+ if (GetParaSectpr())
+ {
+ uno::Reference<beans::XPropertySet> XCursorProps(xCursor, uno::UNO_QUERY);
+ XCursorProps->setPropertyValue("ResetParagraphListAttributes", uno::Any());
+ }
+
// call to xCursor->setString possibly did remove final bookmark
// from previous paragraph. We need to restore it, if there was any.
if (sLastBookmarkName.getLength())