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
