sw/qa/extras/embedded_fonts/embedded_fonts.cxx | 77 +++++++++++++++++++++++++ sw/qa/extras/ooxmlexport/ooxmlexport25.cxx | 35 ----------- sw/qa/extras/uiwriter/uiwriter10.cxx | 50 ---------------- 3 files changed, 77 insertions(+), 85 deletions(-)
New commits: commit 63dbc286b88fde128227fb5c03fd611f14578af8 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Wed Aug 13 09:56:37 2025 +0500 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Wed Aug 13 07:57:19 2025 +0200 Add a SAL_INFO substitution output in the tests Change-Id: I638e3f1bb46d2efe230c76b80d02097ec4c62415 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189467 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/sw/qa/extras/embedded_fonts/embedded_fonts.cxx b/sw/qa/extras/embedded_fonts/embedded_fonts.cxx index bcbac3f13cca..c111b11a66fe 100644 --- a/sw/qa/extras/embedded_fonts/embedded_fonts.cxx +++ b/sw/qa/extras/embedded_fonts/embedded_fonts.cxx @@ -145,7 +145,10 @@ public: std::u16string_view rest; if (!used.startsWith(element.originalFont, &rest) || (!rest.empty() && !rest.starts_with('/'))) + { + SAL_INFO("test", element.originalFont << " substituted with " << used); return true; + } } } return false; commit c96dd50bac82fb9341e2c979cb509182b460688f Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Wed Aug 13 09:45:11 2025 +0500 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Wed Aug 13 07:57:13 2025 +0200 Move some tests to sw_embedded_fonts Change-Id: I19347e42f00d3534a33d5e8cae31fccb3e00f35e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189466 Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> Tested-by: Jenkins diff --git a/sw/qa/extras/uiwriter/data/embed-unrestricted1.odt b/sw/qa/extras/embedded_fonts/data/embed-unrestricted1.odt similarity index 100% rename from sw/qa/extras/uiwriter/data/embed-unrestricted1.odt rename to sw/qa/extras/embedded_fonts/data/embed-unrestricted1.odt diff --git a/sw/qa/extras/uiwriter/data/embed-unrestricted2.odt b/sw/qa/extras/embedded_fonts/data/embed-unrestricted2.odt similarity index 100% rename from sw/qa/extras/uiwriter/data/embed-unrestricted2.odt rename to sw/qa/extras/embedded_fonts/data/embed-unrestricted2.odt diff --git a/sw/qa/extras/ooxmlexport/data/font_used_in_header_only.fodt b/sw/qa/extras/embedded_fonts/data/font_used_in_header_only.fodt similarity index 100% rename from sw/qa/extras/ooxmlexport/data/font_used_in_header_only.fodt rename to sw/qa/extras/embedded_fonts/data/font_used_in_header_only.fodt diff --git a/sw/qa/extras/embedded_fonts/embedded_fonts.cxx b/sw/qa/extras/embedded_fonts/embedded_fonts.cxx index c0c26a44df8f..bcbac3f13cca 100644 --- a/sw/qa/extras/embedded_fonts/embedded_fonts.cxx +++ b/sw/qa/extras/embedded_fonts/embedded_fonts.cxx @@ -335,6 +335,80 @@ CPPUNIT_TEST_FIXTURE(Test, testOpenDOCXWithRestrictedEmbeddedFont) } } +#if !defined(MACOSX) +CPPUNIT_TEST_FIXTURE(Test, testTdf167849) +{ + // Given two documents with embedded fonts, that will not require substitution, if present: + + FontMappingUseListener fontMappingData; + + // Load the first document + createSwDoc("embed-unrestricted1.odt"); + // At this point, 'Manbow Solid' embedded font is loaded + std::swap(mxComponent, mxComponent2); // keep it from unloading upon the next load + + fontMappingData.checkpoint(); + CPPUNIT_ASSERT(fontMappingData.wasUsed(u"Manbow Solid")); + CPPUNIT_ASSERT(!fontMappingData.wasSubstituted(u"Manbow Solid")); + + // Load the second document + createSwDoc("embed-unrestricted2.odt"); + // At this point, 'Unsteady Oversteer' font is also loaded + + fontMappingData.checkpoint(); + CPPUNIT_ASSERT(fontMappingData.wasUsed(u"Unsteady Oversteer")); + CPPUNIT_ASSERT(!fontMappingData.wasSubstituted(u"Unsteady Oversteer")); + + // Re-layout both documents; both fonts must still be loaded + calcLayout(true); + std::swap(mxComponent, mxComponent2); + calcLayout(true); + + fontMappingData.checkpoint(); + CPPUNIT_ASSERT(fontMappingData.wasUsed(u"Manbow Solid")); + // Without the fix, it would fail, because loading the second document unregistered + // the embedded font from the first one. + CPPUNIT_ASSERT(!fontMappingData.wasSubstituted(u"Manbow Solid")); + CPPUNIT_ASSERT(fontMappingData.wasUsed(u"Unsteady Oversteer")); + CPPUNIT_ASSERT(!fontMappingData.wasSubstituted(u"Unsteady Oversteer")); +} +#endif + +CPPUNIT_TEST_FIXTURE(Test, testFontEmbeddingDOCX) +{ + createSwDoc("font_used_in_header_only.fodt"); + uno::Reference<lang::XMultiServiceFactory> xFactory(mxComponent, uno::UNO_QUERY_THROW); + uno::Reference<beans::XPropertySet> xProps( + xFactory->createInstance(u"com.sun.star.document.Settings"_ustr), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(true), xProps->getPropertyValue(u"EmbedFonts"_ustr)); + + save(u"Office Open XML Text"_ustr); + + xmlDocUniquePtr pXml = parseExport(u"word/fontTable.xml"_ustr); + + // Test that DejaVu Sans is embedded + assertXPath(pXml, "/w:fonts/w:font[@w:name='DejaVu Sans']/w:embedRegular"); + assertXPath(pXml, "/w:fonts/w:font[@w:name='DejaVu Sans']/w:embedBold"); + assertXPath(pXml, "/w:fonts/w:font[@w:name='DejaVu Sans']/w:embedItalic"); +// It is strange that DejaVu is different on Linux: see e.g. tdf166627 in odfexport2.cxx +#if defined(_WIN32) || defined(MACOSX) + assertXPath(pXml, "/w:fonts/w:font[@w:name='DejaVu Sans']/w:embedBoldItalic"); +#endif + + // Test that common fonts (here: Liberation Serif, Liberation Sans) are not embedded + assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Serif']"); + assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Serif']/w:embedRegular", 0); + assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Serif']/w:embedBold", 0); + assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Serif']/w:embedItalic", 0); + assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Serif']/w:embedBoldItalic", 0); + + assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Sans']"); + assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Sans']/w:embedRegular", 0); + assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Sans']/w:embedBold", 0); + assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Sans']/w:embedItalic", 0); + assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Sans']/w:embedBoldItalic", 0); +} + } // end of anonymous namespace CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport25.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport25.cxx index 43440ead4814..b7681ff523d3 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport25.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport25.cxx @@ -274,41 +274,6 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf150822) fnVerify(); } -CPPUNIT_TEST_FIXTURE(Test, testFontEmbeddingDOCX) -{ - createSwDoc("font_used_in_header_only.fodt"); - uno::Reference<lang::XMultiServiceFactory> xFactory(mxComponent, uno::UNO_QUERY_THROW); - uno::Reference<beans::XPropertySet> xProps( - xFactory->createInstance(u"com.sun.star.document.Settings"_ustr), uno::UNO_QUERY_THROW); - CPPUNIT_ASSERT_EQUAL(uno::Any(true), xProps->getPropertyValue(u"EmbedFonts"_ustr)); - - save(mpFilter); - - xmlDocUniquePtr pXml = parseExport(u"word/fontTable.xml"_ustr); - - // Test that DejaVu Sans is embedded - assertXPath(pXml, "/w:fonts/w:font[@w:name='DejaVu Sans']/w:embedRegular"); - assertXPath(pXml, "/w:fonts/w:font[@w:name='DejaVu Sans']/w:embedBold"); - assertXPath(pXml, "/w:fonts/w:font[@w:name='DejaVu Sans']/w:embedItalic"); -// It is strange that DejaVu is different on Linux: see e.g. tdf166627 in odfexport2.cxx -#if defined(_WIN32) || defined(MACOSX) - assertXPath(pXml, "/w:fonts/w:font[@w:name='DejaVu Sans']/w:embedBoldItalic"); -#endif - - // Test that common fonts (here: Liberation Serif, Liberation Sans) are not embedded - assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Serif']"); - assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Serif']/w:embedRegular", 0); - assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Serif']/w:embedBold", 0); - assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Serif']/w:embedItalic", 0); - assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Serif']/w:embedBoldItalic", 0); - - assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Sans']"); - assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Sans']/w:embedRegular", 0); - assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Sans']/w:embedBold", 0); - assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Sans']/w:embedItalic", 0); - assertXPath(pXml, "/w:fonts/w:font[@w:name='Liberation Sans']/w:embedBoldItalic", 0); -} - } // end of anonymous namespace CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/qa/extras/uiwriter/uiwriter10.cxx b/sw/qa/extras/uiwriter/uiwriter10.cxx index dad4bda7b3d1..1ee3144b5a62 100644 --- a/sw/qa/extras/uiwriter/uiwriter10.cxx +++ b/sw/qa/extras/uiwriter/uiwriter10.cxx @@ -2098,56 +2098,6 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest5, testTdf166012) getProperty<short>(getRun(getParagraph(1), 1), u"CharScriptHint"_ustr)); } -#if !defined(MACOSX) -CPPUNIT_TEST_FIXTURE(SwUiWriterTest5, testTdf167849) -{ - auto assertNoSubstitution = [](const uno::Reference<awt::XFontMappingUse>& xUse, int pass) { - const auto trackingData = xUse->finishTrackingFontMappingUse(); - for (const auto& element : trackingData) - { - for (const auto& used : element.usedFonts) - { - OUString message = "Pass " + OUString::number(pass) + ": " + element.originalFont - + " substituted with " + used; - CPPUNIT_ASSERT_MESSAGE(message.toUtf8().getStr(), - used.startsWith(element.originalFont)); - } - } - xUse->startTrackingFontMappingUse(); - }; - - auto xFontMappingUse = awt::Toolkit::create(comphelper::getProcessComponentContext()) - .queryThrow<awt::XFontMappingUse>(); - xFontMappingUse->startTrackingFontMappingUse(); - - // Given two documents with embedded fonts, that will not require substitution, if present: - - // Load the first document - createSwDoc("embed-unrestricted1.odt"); - // At this point, 'Manbow Solid' embedded font is loaded - std::swap(mxComponent, mxComponent2); // keep it from unloading upon the next load - - assertNoSubstitution(xFontMappingUse, 1); - - // Load the second document - createSwDoc("embed-unrestricted2.odt"); - // At this point, 'Unsteady Oversteer' font is also loaded - - assertNoSubstitution(xFontMappingUse, 2); - - // Re-layout both documents; both fonts must still be loaded - calcLayout(true); - std::swap(mxComponent, mxComponent2); - calcLayout(true); - - // Without the fix, it would fail with - // - Pass 3: Manbow Solid substituted with Liberation Serif/Regular - // because loading the second document unregistered the embedded font from the first one. - assertNoSubstitution(xFontMappingUse, 3); - xFontMappingUse->finishTrackingFontMappingUse(); -} -#endif - CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */