sw/qa/extras/ooxmlexport/data/tdf148111.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport17.cxx | 28 +++++++++++++++++++++++++++ writerfilter/source/dmapper/SdtHelper.cxx | 3 +- 3 files changed, 30 insertions(+), 1 deletion(-)
New commits: commit 9d033508af5257aeebbd8c22a053db5e74a814d3 Author: Vasily Melenchuk <vasily.melenc...@cib.de> AuthorDate: Fri Mar 25 11:14:10 2022 +0300 Commit: Thorsten Behrens <thorsten.behr...@allotropia.de> CommitDate: Sat Mar 26 23:02:01 2022 +0100 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> 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/ooxmlexport17.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx index aff5fb3b336c..8162b8fbb414 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx @@ -319,6 +319,34 @@ DECLARE_OOXMLEXPORT_TEST(testTdf146851_2, "tdf146851_2.docx") CPPUNIT_ASSERT_EQUAL(OUString("Schedule"), xTextField->getPresentation(false)); } +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()); +} + DECLARE_OOXMLEXPORT_TEST(testTdf81507, "tdf81507.docx") { xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); diff --git a/writerfilter/source/dmapper/SdtHelper.cxx b/writerfilter/source/dmapper/SdtHelper.cxx index f4fa3ef69405..f05d1c68b049 100644 --- a/writerfilter/source/dmapper/SdtHelper.cxx +++ b/writerfilter/source/dmapper/SdtHelper.cxx @@ -195,7 +195,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(); }