tdf#130707 xmloff: survive <text:database-display> in editeng text
Regression from commit 28d67b7927
(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 <vmiklos@collabora.com>
This commit is contained in:
44
xmloff/CppunitTest_xmloff_text.mk
Normal file
44
xmloff/CppunitTest_xmloff_text.mk
Normal file
@@ -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:
|
@@ -30,6 +30,7 @@ $(eval $(call gb_Module_add_check_targets,xmloff,\
|
|||||||
$(if $(MERGELIBS),, \
|
$(if $(MERGELIBS),, \
|
||||||
CppunitTest_xmloff_uxmloff) \
|
CppunitTest_xmloff_uxmloff) \
|
||||||
CppunitTest_xmloff_style \
|
CppunitTest_xmloff_style \
|
||||||
|
CppunitTest_xmloff_text \
|
||||||
))
|
))
|
||||||
|
|
||||||
$(eval $(call gb_Module_add_subsequentcheck_targets,xmloff,\
|
$(eval $(call gb_Module_add_subsequentcheck_targets,xmloff,\
|
||||||
|
BIN
xmloff/qa/unit/data/mail-merge-editeng.odt
Normal file
BIN
xmloff/qa/unit/data/mail-merge-editeng.odt
Normal file
Binary file not shown.
58
xmloff/qa/unit/text.cxx
Normal file
58
xmloff/qa/unit/text.cxx
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||||
|
/*
|
||||||
|
* 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/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <test/bootstrapfixture.hxx>
|
||||||
|
#include <unotest/macros_test.hxx>
|
||||||
|
|
||||||
|
#include <com/sun/star/frame/Desktop.hpp>
|
||||||
|
#include <com/sun/star/container/XNameContainer.hpp>
|
||||||
|
|
||||||
|
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<lang::XComponent> mxComponent;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void setUp() override;
|
||||||
|
void tearDown() override;
|
||||||
|
uno::Reference<lang::XComponent>& 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
|
||||||
|
// <text:database-display> in editeng text abored the whole import process.
|
||||||
|
CPPUNIT_ASSERT(getComponent().is());
|
||||||
|
}
|
||||||
|
|
||||||
|
CPPUNIT_PLUGIN_IMPLEMENT();
|
||||||
|
|
||||||
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -46,6 +46,7 @@
|
|||||||
|
|
||||||
#include <rtl/ustring.hxx>
|
#include <rtl/ustring.hxx>
|
||||||
#include <osl/diagnose.h>
|
#include <osl/diagnose.h>
|
||||||
|
#include <sal/log.hxx>
|
||||||
|
|
||||||
#include <tools/debug.hxx>
|
#include <tools/debug.hxx>
|
||||||
|
|
||||||
@@ -1013,27 +1014,34 @@ void XMLDatabaseDisplayImportContext::EndElement()
|
|||||||
if (xTextContent.is())
|
if (xTextContent.is())
|
||||||
{
|
{
|
||||||
// insert, set field properties and exit!
|
// insert, set field properties and exit!
|
||||||
GetImportHelper().InsertTextContent(xTextContent);
|
try
|
||||||
|
|
||||||
// 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));
|
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user