diff options
author | Michael Stahl <mstahl@redhat.com> | 2017-02-08 18:30:42 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2017-02-10 09:38:41 +0000 |
commit | ac72b37c2a23c8d92e1ec985ef6ad43833024978 (patch) | |
tree | f3490c70bfdeada1483c9a2aeac4054051dd5b27 | |
parent | 3b8fdbab0ec79608e24421241c668f2a4027d301 (diff) |
tdf#103567 xmloff: ODF import: fix loss of events on SVG multi-image
For SVG there are 2 draw:image children in the draw:frame, and the
SdXMLEventContext::EndElement() applies the content of
office:event-listeners to the shape created from the last draw:image
and then MultiImageImportHelper::solveMultipleImages() throws
it away because it's the bitmap fallback of the SVG.
Avoid that problem by calling solveMultipleImages earlier:
The ODF schema ensures that all the draw:image elements occur before
the optional property-bearing child elements of draw:frame,
so we just call solveMultipleImages on the first such optional
element, so that all subsequent properties get applied to the one
surviving shape.
(likely regression from 44cfc7cb6533d827fd2d6e586d92c61d7d7f7a70)
Change-Id: I2be5f6f424dbfd90ca2179ce6f9057929540e762
(cherry picked from commit 791431d7e2485652c96fac7c15f47aa125271ee0)
Reviewed-on: https://gerrit.libreoffice.org/34084
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | sd/qa/unit/data/odp/tdf103567.odp | bin | 0 -> 62137 bytes | |||
-rw-r--r-- | sd/qa/unit/import-tests.cxx | 47 | ||||
-rw-r--r-- | xmloff/source/core/xmlmultiimagehelper.cxx | 3 | ||||
-rw-r--r-- | xmloff/source/draw/ximpshap.cxx | 10 |
4 files changed, 60 insertions, 0 deletions
diff --git a/sd/qa/unit/data/odp/tdf103567.odp b/sd/qa/unit/data/odp/tdf103567.odp Binary files differnew file mode 100644 index 000000000000..a6f72c414f7c --- /dev/null +++ b/sd/qa/unit/data/odp/tdf103567.odp diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx index 79d6cd0163dd..4fb3f826af84 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -42,6 +42,8 @@ #include <sax/tools/converter.hxx> #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp> +#include <com/sun/star/document/XEventsSupplier.hpp> +#include <com/sun/star/presentation/ClickAction.hpp> #include <com/sun/star/drawing/GraphicExportFilter.hpp> #include <com/sun/star/drawing/XDrawPage.hpp> #include <com/sun/star/drawing/XDrawPagesSupplier.hpp> @@ -67,6 +69,7 @@ #include <stlpool.hxx> #include <comphelper/processfactory.hxx> +#include <comphelper/sequenceashashmap.hxx> #include <vcl/pngread.hxx> #include <vcl/bitmapaccess.hxx> #include <sfx2/frame.hxx> @@ -128,6 +131,7 @@ public: void testTdf99030(); void testTdf49561(); void testTdf103473(); + void testTdf103567(); void testTdf103792(); void testTdf103876(); void testTdf104015(); @@ -185,6 +189,7 @@ public: CPPUNIT_TEST(testTdf99030); CPPUNIT_TEST(testTdf49561); CPPUNIT_TEST(testTdf103473); + CPPUNIT_TEST(testTdf103567); CPPUNIT_TEST(testTdf103792); CPPUNIT_TEST(testTdf103876); CPPUNIT_TEST(testTdf104015); @@ -1515,6 +1520,48 @@ void SdImportTest::testTdf103473() xDocShRef->DoClose(); } +void SdImportTest::testTdf103567() +{ + sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("/sd/qa/unit/data/odp/tdf103567.odp"), ODP); + for (int i = 0; i < 4; ++i) + { + uno::Reference<beans::XPropertySet> const xShape(getShapeFromPage(i, 0, xDocShRef)); + uno::Reference<document::XEventsSupplier> const xEventsSupplier(xShape, uno::UNO_QUERY); + uno::Reference<container::XNameAccess> const xEvents(xEventsSupplier->getEvents()); + OString const msg("shape " + OString::number(i) + ": "); + + CPPUNIT_ASSERT(xEvents->hasByName("OnClick")); + uno::Sequence<beans::PropertyValue> props; + xEvents->getByName("OnClick") >>= props; + comphelper::SequenceAsHashMap const map(props); + { + auto iter(map.find("EventType")); + CPPUNIT_ASSERT_MESSAGE(OString(msg + "no EventType").getStr(), iter != map.end()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(msg.getStr(), OUString("Presentation"), iter->second.get<OUString>()); + } + { + auto iter(map.find("ClickAction")); + CPPUNIT_ASSERT_MESSAGE(OString(msg + "no ClickAction").getStr(), iter != map.end()); + if (i % 2 == 0) + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(msg.getStr(), css::presentation::ClickAction_DOCUMENT, iter->second.get<css::presentation::ClickAction>()); + } + else + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(msg.getStr(), css::presentation::ClickAction_NEXTPAGE, iter->second.get<css::presentation::ClickAction>()); + } + } + if (i % 2 == 0) + { + auto iter(map.find("Bookmark")); + CPPUNIT_ASSERT_MESSAGE(OString(msg + "no Bookmark").getStr(), iter != map.end()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(msg.getStr(), OUString("http://example.com/"), iter->second.get<OUString>()); + } + } + + xDocShRef->DoClose(); +} + void SdImportTest::testTdf103792() { // Title text shape on the actual slide contained no text neither a placeholder text. diff --git a/xmloff/source/core/xmlmultiimagehelper.cxx b/xmloff/source/core/xmlmultiimagehelper.cxx index 690603a6ba23..723cc5d2b396 100644 --- a/xmloff/source/core/xmlmultiimagehelper.cxx +++ b/xmloff/source/core/xmlmultiimagehelper.cxx @@ -129,6 +129,9 @@ SvXMLImportContextRef MultiImageImportHelper::solveMultipleImages() removeGraphicFromImportContext(rCandidate); } + // re-insert it so that solveMultipleImages is idempotent + maImplContextVector.clear(); + maImplContextVector.push_back(pContext); } else if (maImplContextVector.size() == 1) { diff --git a/xmloff/source/draw/ximpshap.cxx b/xmloff/source/draw/ximpshap.cxx index d8b69cd517ae..0f9b6aaeb068 100644 --- a/xmloff/source/draw/ximpshap.cxx +++ b/xmloff/source/draw/ximpshap.cxx @@ -3559,12 +3559,22 @@ SvXMLImportContext *SdXMLFrameShapeContext::CreateChildContext( sal_uInt16 nPref (nPrefix == XML_NAMESPACE_DRAW && (IsXMLToken( rLocalName, XML_GLUE_POINT ) || IsXMLToken( rLocalName, XML_THUMBNAIL ) ) ) ) { + if (getSupportsMultipleContents()) + { // tdf#103567 ensure props are set on surviving shape + // note: no more draw:image can be added once we get here + mxImplContext = solveMultipleImages(); + } SvXMLImportContext *pImplContext = mxImplContext.get(); pContext = dynamic_cast<SdXMLShapeContext&>(*pImplContext).CreateChildContext( nPrefix, rLocalName, xAttrList ); } else if ( (XML_NAMESPACE_DRAW == nPrefix) && IsXMLToken( rLocalName, XML_IMAGE_MAP ) ) { + if (getSupportsMultipleContents()) + { // tdf#103567 ensure props are set on surviving shape + // note: no more draw:image can be added once we get here + mxImplContext = solveMultipleImages(); + } SdXMLShapeContext *pSContext = dynamic_cast< SdXMLShapeContext* >( mxImplContext.get() ); if( pSContext ) { |