[Libreoffice-commits] core.git: sd/qa xmloff/source

Michael Stahl mstahl at redhat.com
Wed Feb 8 17:54:56 UTC 2017


 sd/qa/unit/data/odp/tdf103567.odp          |binary
 sd/qa/unit/import-tests.cxx                |   47 +++++++++++++++++++++++++++++
 xmloff/source/core/xmlmultiimagehelper.cxx |    3 +
 xmloff/source/draw/ximpshap.cxx            |   10 ++++++
 4 files changed, 60 insertions(+)

New commits:
commit 791431d7e2485652c96fac7c15f47aa125271ee0
Author: Michael Stahl <mstahl at redhat.com>
Date:   Wed Feb 8 18:30:42 2017 +0100

    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

diff --git a/sd/qa/unit/data/odp/tdf103567.odp b/sd/qa/unit/data/odp/tdf103567.odp
new file mode 100644
index 0000000..a6f72c4
Binary files /dev/null and b/sd/qa/unit/data/odp/tdf103567.odp differ
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index f0f523c..2f5faa8 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 <vcl/dibtools.hxx>
@@ -129,6 +132,7 @@ public:
     void testTdf99030();
     void testTdf49561();
     void testTdf103473();
+    void testTdf103567();
     void testTdf103792();
     void testTdf103876();
     void testTdf104015();
@@ -192,6 +196,7 @@ public:
     CPPUNIT_TEST(testTdf99030);
     CPPUNIT_TEST(testTdf49561);
     CPPUNIT_TEST(testTdf103473);
+    CPPUNIT_TEST(testTdf103567);
     CPPUNIT_TEST(testTdf103792);
     CPPUNIT_TEST(testTdf103876);
     CPPUNIT_TEST(testTdf104015);
@@ -1526,6 +1531,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 690603a..723cc5d 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 4015489..9abdacf 100644
--- a/xmloff/source/draw/ximpshap.cxx
+++ b/xmloff/source/draw/ximpshap.cxx
@@ -3558,12 +3558,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 )
         {


More information about the Libreoffice-commits mailing list