sw/qa/extras/ooxmlexport/data/tdf148111.docx |binary
 sw/qa/extras/ooxmlexport/ooxmlexport15.cxx   |   29 +++++++++++++++++++++++++++
 writerfilter/source/dmapper/SdtHelper.cxx    |    3 +-
 3 files changed, 31 insertions(+), 1 deletion(-)

New commits:
commit 873b52f4c46c47ebe7d70374586a00488f3a4037
Author:     Vasily Melenchuk <vasily.melenc...@cib.de>
AuthorDate: Fri Mar 25 11:14:10 2022 +0300
Commit:     Thorsten Behrens <thorsten.behr...@allotropia.de>
CommitDate: Tue Jun 21 01:18:27 2022 +0200

    tdf#148111: docx std fields: use placeholder text for empty data
    
    It is quite unexpected Word behavior: if data source for sdt field
    exists but contains empty string it is not used. Placeholder is
    inserted instead.
    
    In general behavior is more complex: logic of replacement is defined
    by <w:showingPlcHdr> property and results can vary (see testcase).
    But LO does not support this property correctly yet.
    
    Change-Id: I2ec8efe05f79a01af5d74d21bfcd05f3b19e3970
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132096
    Tested-by: Jenkins
    Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132574
    Tested-by: Thorsten Behrens <thorsten.behr...@allotropia.de>

diff --git a/sw/qa/extras/ooxmlexport/data/tdf148111.docx 
b/sw/qa/extras/ooxmlexport/data/tdf148111.docx
new file mode 100644
index 000000000000..a46fb508dc0e
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148111.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx
index 95359aebf820..f63b5aa5a5fe 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx
@@ -12,6 +12,7 @@
 #include <com/sun/star/beans/NamedValue.hpp>
 #include <com/sun/star/beans/XPropertySet.hpp>
 #include <com/sun/star/text/XBookmarksSupplier.hpp>
+#include <com/sun/star/text/XTextField.hpp>
 
 char const DATA_DIRECTORY[] = "/sw/qa/extras/ooxmlexport/data/";
 
@@ -182,6 +183,34 @@ DECLARE_OOXMLEXPORT_TEST(testTdf137466, "tdf137466.docx")
     CPPUNIT_ASSERT_EQUAL(OUString("FF0000"), sColor);
 }
 
+DECLARE_OOXMLEXPORT_TEST(testTdf148111, "tdf148111.docx")
+{
+    uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, 
uno::UNO_QUERY);
+    uno::Reference<container::XEnumerationAccess> 
xFieldsAccess(xTextFieldsSupplier->getTextFields());
+
+    uno::Reference<container::XEnumeration> 
xFields(xFieldsAccess->createEnumeration());
+    std::vector<OUString> aExpectedValues = {
+        // These field values are NOT in order in document: getTextFields did 
provide
+        // fields in a strange but fixed order
+        "Title", "Placeholder", "Placeholder", "Placeholder",
+        "Placeholder", "Placeholder", "Placeholder", "Placeholder",
+        "Placeholder", "Placeholder", "Placeholder", "Placeholder",
+        "Placeholder", "Placeholder", "Placeholder", "Placeholder",
+        "Placeholder", "Title", "Title", "Title",
+        "Title", "Title", "Title", "Title"
+    };
+
+    sal_uInt16 nIndex = 0;
+    while (xFields->hasMoreElements())
+    {
+        uno::Reference<text::XTextField> xTextField(xFields->nextElement(), 
uno::UNO_QUERY);
+        CPPUNIT_ASSERT_EQUAL(aExpectedValues[nIndex++], 
xTextField->getPresentation(false));
+    }
+
+    // No more fields
+    CPPUNIT_ASSERT(!xFields->hasMoreElements());
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/SdtHelper.cxx 
b/writerfilter/source/dmapper/SdtHelper.cxx
index 8a2356051a21..71d1ffd7fc9f 100644
--- a/writerfilter/source/dmapper/SdtHelper.cxx
+++ b/writerfilter/source/dmapper/SdtHelper.cxx
@@ -201,7 +201,8 @@ std::optional<OUString> SdtHelper::getValueFromDataBinding()
     {
         uno::Reference<XXPathObject> xResult = xXpathAPI->eval(xDocument, 
m_sDataBindingXPath);
 
-        if (xResult.is() && xResult->getNodeList() && 
xResult->getNodeList()->getLength())
+        if (xResult.is() && xResult->getNodeList() && 
xResult->getNodeList()->getLength()
+            && xResult->getString().getLength())
         {
             return xResult->getString();
         }

Reply via email to