From fd18d12efdfbe0e26d41d733edc711d0f40a7804 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Mon, 3 Aug 2020 21:03:43 +0200 Subject: [PATCH] tdf#130707 xmloff: survive in editeng text Regression from commit 28d67b792724a23015dec32fb0278b729f676736 (tdf#107776 sw ODF shape import: make is-textbox check more strict, 2019-08-26), now that we correctly identify what shape text to import as "textbox" (Writer TextFrame) and what to import as editeng text, there are documents out there that try to import mailmerge fields into editeng-based shape text. Fix missing error handling there. Note that the error is not just silently ignored, we do insert the field result into the shape text, existing code provides this already. Change-Id: Ibe631ac5d94c1c7795dd00bad05fdcca0e6741a8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100028 Tested-by: Jenkins Reviewed-by: Miklos Vajna --- xmloff/CppunitTest_xmloff_text.mk | 44 ++++++++++++++++ xmloff/Module_xmloff.mk | 1 + xmloff/qa/unit/data/mail-merge-editeng.odt | Bin 0 -> 9382 bytes xmloff/qa/unit/text.cxx | 58 +++++++++++++++++++++ xmloff/source/text/txtvfldi.cxx | 46 +++++++++------- 5 files changed, 130 insertions(+), 19 deletions(-) create mode 100644 xmloff/CppunitTest_xmloff_text.mk create mode 100644 xmloff/qa/unit/data/mail-merge-editeng.odt create mode 100644 xmloff/qa/unit/text.cxx diff --git a/xmloff/CppunitTest_xmloff_text.mk b/xmloff/CppunitTest_xmloff_text.mk new file mode 100644 index 000000000000..e3259672605b --- /dev/null +++ b/xmloff/CppunitTest_xmloff_text.mk @@ -0,0 +1,44 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,xmloff_text)) + +$(eval $(call gb_CppunitTest_use_externals,xmloff_text,\ + boost_headers \ +)) + +$(eval $(call gb_CppunitTest_add_exception_objects,xmloff_text, \ + xmloff/qa/unit/text \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,xmloff_text, \ + comphelper \ + cppu \ + embobj \ + sal \ + test \ + unotest \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,xmloff_text)) + +$(eval $(call gb_CppunitTest_use_ure,xmloff_text)) +$(eval $(call gb_CppunitTest_use_vcl,xmloff_text)) + +$(eval $(call gb_CppunitTest_use_rdb,xmloff_text,services)) + +$(eval $(call gb_CppunitTest_use_custom_headers,xmloff_text,\ + officecfg/registry \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,xmloff_text)) + +# vim: set noet sw=4 ts=4: diff --git a/xmloff/Module_xmloff.mk b/xmloff/Module_xmloff.mk index 16cf0f817889..fe69b86b09f6 100644 --- a/xmloff/Module_xmloff.mk +++ b/xmloff/Module_xmloff.mk @@ -30,6 +30,7 @@ $(eval $(call gb_Module_add_check_targets,xmloff,\ $(if $(MERGELIBS),, \ CppunitTest_xmloff_uxmloff) \ CppunitTest_xmloff_style \ + CppunitTest_xmloff_text \ )) $(eval $(call gb_Module_add_subsequentcheck_targets,xmloff,\ diff --git a/xmloff/qa/unit/data/mail-merge-editeng.odt b/xmloff/qa/unit/data/mail-merge-editeng.odt new file mode 100644 index 0000000000000000000000000000000000000000..e6466e44e01e560aeeb3651460cc9d83e1d067c1 GIT binary patch literal 9382 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 +#include + +#include +#include + +using namespace ::com::sun::star; + +char const DATA_DIRECTORY[] = "/xmloff/qa/unit/data/"; + +/// Covers xmloff/source/text/ fixes. +class XmloffStyleTest : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference& getComponent() { return mxComponent; } +}; + +void XmloffStyleTest::setUp() +{ + test::BootstrapFixture::setUp(); + + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void XmloffStyleTest::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +CPPUNIT_TEST_FIXTURE(XmloffStyleTest, testMailMergeInEditeng) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "mail-merge-editeng.odt"; + getComponent() = loadFromDesktop(aURL); + // Without the accompanying fix in place, this test would have failed, as unexpected + // in editeng text abored the whole import process. + CPPUNIT_ASSERT(getComponent().is()); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/xmloff/source/text/txtvfldi.cxx b/xmloff/source/text/txtvfldi.cxx index 9a89d8fe4da8..e348fbb6ff46 100644 --- a/xmloff/source/text/txtvfldi.cxx +++ b/xmloff/source/text/txtvfldi.cxx @@ -46,6 +46,7 @@ #include #include +#include #include @@ -1013,27 +1014,34 @@ void XMLDatabaseDisplayImportContext::EndElement() if (xTextContent.is()) { // insert, set field properties and exit! - GetImportHelper().InsertTextContent(xTextContent); - - // prepare field: format from database? - bool bTmp = !aValueHelper.IsFormatOK(); - xField->setPropertyValue("DataBaseFormat", Any(bTmp)); - - // value, value-type and format done by value helper - aValueHelper.PrepareField(xField); - - // visibility - if( bDisplayOK ) + try { - xField->setPropertyValue(sAPI_is_visible, Any(bDisplay)); + GetImportHelper().InsertTextContent(xTextContent); + + // prepare field: format from database? + bool bTmp = !aValueHelper.IsFormatOK(); + xField->setPropertyValue("DataBaseFormat", Any(bTmp)); + + // value, value-type and format done by value helper + aValueHelper.PrepareField(xField); + + // visibility + if( bDisplayOK ) + { + xField->setPropertyValue(sAPI_is_visible, Any(bDisplay)); + } + + // set presentation + aAny <<= GetContent(); + xField->setPropertyValue(sAPI_current_presentation, aAny); + + // success! + return; + } + catch (const lang::IllegalArgumentException& rException) + { + SAL_WARN("xmloff.text", "Failed to insert text content: " << rException.Message); } - - // set presentation - aAny <<= GetContent(); - xField->setPropertyValue(sAPI_current_presentation, aAny); - - // success! - return; } } }