From 5960c6f4ca9dd6ab4b4081d3be7253468cd212c4 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Mon, 13 Jan 2020 20:08:54 +0100 Subject: tdf#129516 DOCX import: fix incorrect z-order with textboxes Commit 3272c1eb5563f3bda2caa24f32b1018372622109 (related tdf#100074: prepare group shapes text input via writerfilter, 2018-10-01) tweaked the oox code, so that later it'll be able to call back to writerfilter to parse group shape text. That makes sense, but it also removed the reset of the group shape context, which means that two subsequent group shapes are now imported as a single group shape with a merged child list. Reset the group shape context again when writerfilter asks for the XShape from oox. If this causes a problem for the above scenario later, then it could be considered to handle this in ShapeContextHandler::endFastElement(). Change-Id: I14f7f0bab2c66c8430313d5b2daffe3160a58c27 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86712 Tested-by: Jenkins Reviewed-by: Miklos Vajna --- oox/CppunitTest_oox_shape.mk | 45 +++++++++++++++ oox/Module_oox.mk | 1 + oox/qa/unit/data/multiple-group-shapes.docx | Bin 0 -> 29653 bytes oox/qa/unit/shape.cxx | 84 ++++++++++++++++++++++++++++ oox/source/shape/ShapeContextHandler.cxx | 1 + 5 files changed, 131 insertions(+) create mode 100644 oox/CppunitTest_oox_shape.mk create mode 100644 oox/qa/unit/data/multiple-group-shapes.docx create mode 100644 oox/qa/unit/shape.cxx diff --git a/oox/CppunitTest_oox_shape.mk b/oox/CppunitTest_oox_shape.mk new file mode 100644 index 000000000000..9ae7bbd634cd --- /dev/null +++ b/oox/CppunitTest_oox_shape.mk @@ -0,0 +1,45 @@ +# -*- 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,oox_shape)) + +$(eval $(call gb_CppunitTest_use_externals,oox_shape,\ + boost_headers \ +)) + +$(eval $(call gb_CppunitTest_add_exception_objects,oox_shape, \ + oox/qa/unit/shape \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,oox_shape, \ + comphelper \ + cppu \ + oox \ + sal \ + test \ + unotest \ + utl \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,oox_shape)) + +$(eval $(call gb_CppunitTest_use_ure,oox_shape)) +$(eval $(call gb_CppunitTest_use_vcl,oox_shape)) + +$(eval $(call gb_CppunitTest_use_rdb,oox_shape,services)) + +$(eval $(call gb_CppunitTest_use_custom_headers,oox_shape,\ + officecfg/registry \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,oox_shape)) + +# vim: set noet sw=4 ts=4: diff --git a/oox/Module_oox.mk b/oox/Module_oox.mk index a40c46aaebbc..ed85ee68da2d 100644 --- a/oox/Module_oox.mk +++ b/oox/Module_oox.mk @@ -28,6 +28,7 @@ $(eval $(call gb_Module_add_check_targets,oox,\ CppunitTest_oox_mathml \ CppunitTest_oox_drawingml \ CppunitTest_oox_vml \ + CppunitTest_oox_shape \ )) # vim: set noet sw=4 ts=4: diff --git a/oox/qa/unit/data/multiple-group-shapes.docx b/oox/qa/unit/data/multiple-group-shapes.docx new file mode 100644 index 000000000000..c751bcdf650b Binary files /dev/null and b/oox/qa/unit/data/multiple-group-shapes.docx differ diff --git a/oox/qa/unit/shape.cxx b/oox/qa/unit/shape.cxx new file mode 100644 index 000000000000..27d26aa91b57 --- /dev/null +++ b/oox/qa/unit/shape.cxx @@ -0,0 +1,84 @@ +/* -*- 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 +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +char const DATA_DIRECTORY[] = "/oox/qa/unit/data/"; + +/// oox shape tests. +class OoxShapeTest : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference mxComponentContext; + uno::Reference mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference& getComponent() { return mxComponent; } + void load(const OUString& rURL); +}; + +void OoxShapeTest::setUp() +{ + test::BootstrapFixture::setUp(); + + mxComponentContext.set(comphelper::getComponentContext(getMultiServiceFactory())); + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void OoxShapeTest::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +void OoxShapeTest::load(const OUString& rFileName) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + rFileName; + mxComponent = loadFromDesktop(aURL); +} + +CPPUNIT_TEST_FIXTURE(OoxShapeTest, testMultipleGroupShapes) +{ + load("multiple-group-shapes.docx"); + + uno::Reference xDrawPagesSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2 + // - Actual : 1 + // i.e. the 2 group shapes from the document were imported as a single one. + CPPUNIT_ASSERT_EQUAL(static_cast(2), xDrawPage->getCount()); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/shape/ShapeContextHandler.cxx b/oox/source/shape/ShapeContextHandler.cxx index 9db23f51b325..f0dfae3366ab 100644 --- a/oox/source/shape/ShapeContextHandler.cxx +++ b/oox/source/shape/ShapeContextHandler.cxx @@ -498,6 +498,7 @@ ShapeContextHandler::getShape() pShape->addShape(*mxFilterBase, mpThemePtr.get(), xShapes, aMatrix, pShape->getFillProperties()); xResult = pShape->getXShape(); mxSavedShape = xResult; + mxWpgContext.clear(); } } else if (mpShape.get() != nullptr) -- cgit v1.2.1