[Libreoffice-commits] core.git: Branch 'libreoffice-5-2' - sd/qa xmloff/source

Michael Stahl mstahl at redhat.com
Fri Feb 10 09:43:22 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 bee00eafcf4ade2b5d9139ac751d39429fb52311
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)
    
    (cherry picked from commit 791431d7e2485652c96fac7c15f47aa125271ee0)
    
    Change-Id: I2be5f6f424dbfd90ca2179ce6f9057929540e762
    Reviewed-on: https://gerrit.libreoffice.org/34087
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

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 49b7d25..204574f 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 e7eeb62..9c70c07 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 cde2c157..f98ca9f 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 )
         {


More information about the Libreoffice-commits mailing list