xmloff/qa/unit/data/content-control-dropdown.docx |binary
 xmloff/qa/unit/text.cxx                           |   19 +++++++++++
 xmloff/source/text/txtparae.cxx                   |   37 +++++++++++-----------
 3 files changed, 39 insertions(+), 17 deletions(-)

New commits:
commit c5df13ad4c22e8878eec0c2d5e431515537799ad
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Tue Jul 26 08:50:03 2022 +0200
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Wed Jul 27 13:40:59 2022 +0200

    crashtest: fix crash on ODT export of forum-mso-de-84211.docx
    
    XMLTextParagraphExport::ExportContentControl() disables the export of
    the <loext:list-item> XML element in autostyle mode, then it should also
    disable the export of the matching attributes.
    
    (cherry picked from commit 6cf1f3c09c43bd3bbcda611a9476ff5e64c5164f)
    
    Change-Id: Ia65fc8bd3398df0ab1b71973695c9bc8d10deaa4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137496
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/xmloff/qa/unit/data/content-control-dropdown.docx 
b/xmloff/qa/unit/data/content-control-dropdown.docx
new file mode 100644
index 000000000000..1391c90f1a63
Binary files /dev/null and b/xmloff/qa/unit/data/content-control-dropdown.docx 
differ
diff --git a/xmloff/qa/unit/text.cxx b/xmloff/qa/unit/text.cxx
index 99bb0ce3ba91..94d7da5e30a9 100644
--- a/xmloff/qa/unit/text.cxx
+++ b/xmloff/qa/unit/text.cxx
@@ -795,6 +795,25 @@ CPPUNIT_TEST_FIXTURE(XmloffStyleTest, 
testPlainTextContentControlImport)
     CPPUNIT_ASSERT(bPlainText);
 }
 
+CPPUNIT_TEST_FIXTURE(XmloffStyleTest, 
testDropdownContentControlAutostyleExport)
+{
+    // Given a document with a dropdown content control, and formatting that 
forms an autostyle in
+    // ODT:
+    OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + 
"content-control-dropdown.docx";
+    getComponent() = loadFromDesktop(aURL);
+
+    // When saving that document to ODT, then make sure no assertion failure 
happens:
+    uno::Reference<frame::XStorable> xStorable(getComponent(), uno::UNO_QUERY);
+    uno::Sequence<beans::PropertyValue> aStoreProps = 
comphelper::InitPropertySequence({
+        { "FilterName", uno::Any(OUString("writer8")) },
+    });
+    utl::TempFile aTempFile;
+    aTempFile.EnableKillingFile();
+    // Without the accompanying fix in place, this test would have failed, we 
had duplicated XML
+    // attributes.
+    xStorable->storeToURL(aTempFile.GetURL(), aStoreProps);
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmloff/source/text/txtparae.cxx b/xmloff/source/text/txtparae.cxx
index 09dde3a8127a..9f73f02a2790 100644
--- a/xmloff/source/text/txtparae.cxx
+++ b/xmloff/source/text/txtparae.cxx
@@ -3960,27 +3960,30 @@ void XMLTextParagraphExport::ExportContentControl(
     SvXMLElementExport aElem(GetExport(), bExport, XML_NAMESPACE_LO_EXT, 
XML_CONTENT_CONTROL, false,
                              false);
 
-    // Export list items of dropdowns.
-    uno::Sequence<beans::PropertyValues> aListItems;
-    xPropertySet->getPropertyValue("ListItems") >>= aListItems;
-    for (const auto& rListItem : aListItems)
+    if (bExport)
     {
-        comphelper::SequenceAsHashMap aMap(rListItem);
-        auto it = aMap.find("DisplayText");
-        OUString aValue;
-        if (it != aMap.end() && (it->second >>= aValue) && !aValue.isEmpty())
+        // Export list items of dropdowns.
+        uno::Sequence<beans::PropertyValues> aListItems;
+        xPropertySet->getPropertyValue("ListItems") >>= aListItems;
+        for (const auto& rListItem : aListItems)
         {
-            GetExport().AddAttribute(XML_NAMESPACE_LO_EXT, XML_DISPLAY_TEXT, 
aValue);
-        }
+            comphelper::SequenceAsHashMap aMap(rListItem);
+            auto it = aMap.find("DisplayText");
+            OUString aValue;
+            if (it != aMap.end() && (it->second >>= aValue) && 
!aValue.isEmpty())
+            {
+                GetExport().AddAttribute(XML_NAMESPACE_LO_EXT, 
XML_DISPLAY_TEXT, aValue);
+            }
 
-        it = aMap.find("Value");
-        if (it != aMap.end() && (it->second >>= aValue))
-        {
-            GetExport().AddAttribute(XML_NAMESPACE_LO_EXT, XML_VALUE, aValue);
-        }
+            it = aMap.find("Value");
+            if (it != aMap.end() && (it->second >>= aValue))
+            {
+                GetExport().AddAttribute(XML_NAMESPACE_LO_EXT, XML_VALUE, 
aValue);
+            }
 
-        SvXMLElementExport aItem(GetExport(), bExport, XML_NAMESPACE_LO_EXT, 
XML_LIST_ITEM, false,
-                                 false);
+            SvXMLElementExport aItem(GetExport(), bExport, 
XML_NAMESPACE_LO_EXT, XML_LIST_ITEM, false,
+                    false);
+        }
     }
 
     // Recurse to export content.

Reply via email to