oox/source/ppt/pptshape.cxx         |   18 ++++++++++++++++++
 sd/qa/unit/data/pptx/tdf144918.pptx |binary
 sd/qa/unit/import-tests.cxx         |   28 ++++++++++++++++++++++++++++
 3 files changed, 46 insertions(+)

New commits:
commit cec1f712c87e557e1b7313e0dbef4a635f69d953
Author:     Tibor Nagy <[email protected]>
AuthorDate: Mon Oct 25 09:15:20 2021 +0200
Commit:     László Németh <[email protected]>
CommitDate: Thu Nov 4 11:50:51 2021 +0100

    tdf#144918 PPTX import: fix internal hyperlink on shapes
    
    Slide names in internal hyperlinks of shapes could be replaced
    with the placeholder name 'Slide n', resulting non-functioning
    hyperlink during the slideshow.
    
    Follow-up to commit 83d92437e05a9ec872d9303953fa408dd4dcbcde
    "tdf#144616 PPTX import: fix hyperlinks on shapes".
    
    Change-Id: I733ddcdcdf92b32c4e6272d3cf48da872a63cd47
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124135
    Tested-by: László Németh <[email protected]>
    Reviewed-by: László Németh <[email protected]>

diff --git a/oox/source/ppt/pptshape.cxx b/oox/source/ppt/pptshape.cxx
index 2a134ada4a0c..b703f615d0cf 100644
--- a/oox/source/ppt/pptshape.cxx
+++ b/oox/source/ppt/pptshape.cxx
@@ -592,7 +592,25 @@ void PPTShape::addShape(
                         if (!sURL.startsWith("#"))
                             meClickAction = ClickAction_DOCUMENT;
                         else
+                        {
                             sURL = sURL.copy(1);
+                            sal_Int32 nPageNumber = 0;
+                            static const OUStringLiteral sSlide = u"Slide ";
+                            if (sURL.match(sSlide))
+                                nPageNumber = 
sURL.copy(sSlide.getLength()).toInt32();
+                            Reference<drawing::XDrawPagesSupplier> 
xDPS(rFilterBase.getModel(),
+                                                                        
uno::UNO_QUERY_THROW);
+                            Reference<drawing::XDrawPages> 
xDrawPages(xDPS->getDrawPages(),
+                                                                      
uno::UNO_SET_THROW);
+                            sal_Int32 nMaxPages = xDrawPages->getCount();
+                            if (nPageNumber && nPageNumber <= nMaxPages)
+                            {
+                                Reference<XDrawPage> xDrawPage;
+                                xDrawPages->getByIndex(nPageNumber - 1) >>= 
xDrawPage;
+                                Reference<container::XNamed> xNamed(xDrawPage, 
UNO_QUERY);
+                                sURL = xNamed->getName();
+                            }
+                        }
                         nPropertyCount += 1;
                     }
 
diff --git a/sd/qa/unit/data/pptx/tdf144918.pptx 
b/sd/qa/unit/data/pptx/tdf144918.pptx
new file mode 100644
index 000000000000..54f862bd1b48
Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf144918.pptx differ
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index e1b71fd788cf..92b08ef32094 100644
--- a/sd/qa/unit/import-tests.cxx
+++ b/sd/qa/unit/import-tests.cxx
@@ -123,6 +123,7 @@ public:
     virtual void setUp() override;
 
     void testDocumentLayout();
+    void testTdf144918();
     void testTdf144917();
     void testHyperlinkOnImage();
     void testTdf142645();
@@ -189,6 +190,7 @@ public:
     CPPUNIT_TEST_SUITE(SdImportTest);
 
     CPPUNIT_TEST(testDocumentLayout);
+    CPPUNIT_TEST(testTdf144918);
     CPPUNIT_TEST(testTdf144917);
     CPPUNIT_TEST(testHyperlinkOnImage);
     CPPUNIT_TEST(testTdf142645);
@@ -333,6 +335,32 @@ void SdImportTest::testDocumentLayout()
     }
 }
 
+void SdImportTest::testTdf144918()
+{
+    sd::DrawDocShellRef xDocShRef
+        = 
loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf144918.pptx"), 
PPTX);
+
+    uno::Reference< beans::XPropertySet > xShape1(getShapeFromPage(0, 1, 
xDocShRef));
+    uno::Reference<document::XEventsSupplier> xEventsSupplier1(xShape1, 
uno::UNO_QUERY);
+    uno::Reference<container::XNameAccess> 
xEvents1(xEventsSupplier1->getEvents());
+    uno::Sequence<beans::PropertyValue> props1;
+    xEvents1->getByName("OnClick") >>= props1;
+    comphelper::SequenceAsHashMap map1(props1);
+    auto iter1(map1.find("Bookmark"));
+    CPPUNIT_ASSERT_EQUAL(OUString("First slide"), 
iter1->second.get<OUString>());
+
+    uno::Reference< beans::XPropertySet > xShape2(getShapeFromPage(1, 1, 
xDocShRef));
+    uno::Reference<document::XEventsSupplier> xEventsSupplier2(xShape2, 
uno::UNO_QUERY);
+    uno::Reference<container::XNameAccess> 
xEvents2(xEventsSupplier2->getEvents());
+    uno::Sequence<beans::PropertyValue> props2;
+    xEvents2->getByName("OnClick") >>= props2;
+    comphelper::SequenceAsHashMap map2(props2);
+    auto iter2(map2.find("Bookmark"));
+    CPPUNIT_ASSERT_EQUAL(OUString("Third slide"), 
iter2->second.get<OUString>());
+
+    xDocShRef->DoClose();
+}
+
 void SdImportTest::testTdf144917()
 {
     sd::DrawDocShellRef xDocShRef

Reply via email to