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:42:31 +0000 |
commit | bee00eafcf4ade2b5d9139ac751d39429fb52311 (patch) | |
tree | 02b4ffdf80942853f812b9785f265e3471165800 | |
parent | 01a68ee89809556125077b17a9055038be3a240d (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)
(cherry picked from commit 791431d7e2485652c96fac7c15f47aa125271ee0)
Change-Id: I2be5f6f424dbfd90ca2179ce6f9057929540e762
Reviewed-on: https://gerrit.libreoffice.org/34087
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 49b7d252797b..204574fd504d 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> @@ -124,6 +127,7 @@ public: void testTdf99030(); void testTdf49561(); void testTdf103473(); + void testTdf103567(); void testTdf103792(); void testTdf103876(); void testTdf104015(); @@ -180,6 +184,7 @@ public: CPPUNIT_TEST(testTdf99030); CPPUNIT_TEST(testTdf49561); CPPUNIT_TEST(testTdf103473); + CPPUNIT_TEST(testTdf103567); CPPUNIT_TEST(testTdf103792); CPPUNIT_TEST(testTdf103876); CPPUNIT_TEST(testTdf104015); @@ -1442,6 +1447,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 e7eeb6277830..9c70c0759ba8 100644 --- a/xmloff/source/core/xmlmultiimagehelper.cxx +++ b/xmloff/source/core/xmlmultiimagehelper.cxx @@ -125,6 +125,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 cde2c15710e4..f98ca9f35626 100644 --- a/xmloff/source/draw/ximpshap.cxx +++ b/xmloff/source/draw/ximpshap.cxx @@ -3515,12 +3515,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; 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 ); if( pSContext ) { |