From d8602ce58b6ef268be84b9aa0166b0c3fa6a96e8 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Mon, 19 Oct 2020 11:39:24 +0200 Subject: QFont: Prefer setFamilies() over setFamily() By depending on setFamilies() then we can be sure that font names with spaces, commas, quotes and so on are correctly handled without being misinterpreted. For now it will split on the comma when a string containing one is passed to setFamily. But from Qt 6.2 this will be removed to preserve the family string as a convenience function. [ChangeLog][QtGui][QFont] Indicated that setFamilies/families is preferred over setFamily/family to ensure that font family names are preserved when spaces, commas and so on are used in the name. Change-Id: Id3c1a4e827756a4c928fed461a4aafa5a0f06633 Reviewed-by: Qt CI Bot Reviewed-by: Eskil Abrahamsen Blomfeldt --- tests/auto/gui/text/qfont/tst_qfont.cpp | 19 +++++++------ tests/auto/gui/text/qfontcache/tst_qfontcache.cpp | 32 +++++++++++++--------- .../gui/text/qtextdocument/tst_qtextdocument.cpp | 4 +-- .../tst_qtextdocumentfragment.cpp | 9 ++++-- .../auto/gui/text/qtextformat/tst_qtextformat.cpp | 11 ++++++++ .../qtextscriptengine/tst_qtextscriptengine.cpp | 8 +++--- .../widgets/qfontcombobox/tst_qfontcombobox.cpp | 6 ++-- 7 files changed, 56 insertions(+), 33 deletions(-) (limited to 'tests/auto') diff --git a/tests/auto/gui/text/qfont/tst_qfont.cpp b/tests/auto/gui/text/qfont/tst_qfont.cpp index 4cc5a81329..7af48eda01 100644 --- a/tests/auto/gui/text/qfont/tst_qfont.cpp +++ b/tests/auto/gui/text/qfont/tst_qfont.cpp @@ -311,10 +311,11 @@ void tst_QFont::resolve() QCOMPARE(font6.families(), fontFamilies); QFont font7, font8; + // This will call setFamilies() directly now font7.setFamily(QLatin1String("Helvetica")); font8.setFamilies(fontFamilies); font7 = font7.resolve(font8); - QCOMPARE(font7.families(), QStringList({"Helvetica", "Arial"})); + QCOMPARE(font7.families(), QStringList({"Helvetica"})); QCOMPARE(font7.family(), "Helvetica"); } @@ -710,6 +711,7 @@ void tst_QFont::sharing() void tst_QFont::familyNameWithCommaQuote_data() { + QTest::addColumn("enteredFamilyName"); QTest::addColumn("familyName"); QTest::addColumn("chosenFamilyName"); @@ -717,15 +719,16 @@ void tst_QFont::familyNameWithCommaQuote_data() if (standardFont.isEmpty()) QSKIP("No default font available on the system"); const QString weirdFont(QLatin1String("'My, weird'' font name',")); + const QString bogusFont(QLatin1String("BogusFont")); const QString commaSeparated(standardFont + QLatin1String(",Times New Roman")); const QString commaSeparatedWeird(weirdFont + QLatin1String(",") + standardFont); - const QString commaSeparatedBogus(QLatin1String("BogusFont,") + standardFont); + const QString commaSeparatedBogus(bogusFont + QLatin1String(",") + standardFont); - QTest::newRow("standard") << standardFont << standardFont; - QTest::newRow("weird") << weirdFont << weirdFont; - QTest::newRow("commaSeparated") << commaSeparated << standardFont; - QTest::newRow("commaSeparatedWeird") << commaSeparatedWeird << weirdFont; - QTest::newRow("commaSeparatedBogus") << commaSeparatedBogus << standardFont; + QTest::newRow("standard") << standardFont << standardFont << standardFont; + QTest::newRow("weird") << weirdFont << QString("'My") << standardFont; + QTest::newRow("commaSeparated") << commaSeparated << standardFont << standardFont; + QTest::newRow("commaSeparatedWeird") << commaSeparatedWeird << QString("'My") << standardFont; + QTest::newRow("commaSeparatedBogus") << commaSeparatedBogus << bogusFont << standardFont; } void tst_QFont::familyNameWithCommaQuote() @@ -804,8 +807,8 @@ void tst_QFont::setFamiliesAndFamily() QVERIFY(weirdFontId != -1); QFont f; - f.setFamilies(families); f.setFamily(family); + f.setFamilies(families); QCOMPARE(QFontInfo(f).family(), chosenFamilyName); QFontDatabase::removeApplicationFont(weirdFontId); diff --git a/tests/auto/gui/text/qfontcache/tst_qfontcache.cpp b/tests/auto/gui/text/qfontcache/tst_qfontcache.cpp index 5c5bdf06ea..ec652997fc 100644 --- a/tests/auto/gui/text/qfontcache/tst_qfontcache.cpp +++ b/tests/auto/gui/text/qfontcache/tst_qfontcache.cpp @@ -72,23 +72,29 @@ tst_QFontCache::~tst_QFontCache() void tst_QFontCache::engineData_data() { QTest::addColumn("family"); - QTest::addColumn("cacheKey"); - - QTest::newRow("unquoted-family-name") << QString("Times New Roman") << QString("Times New Roman"); - QTest::newRow("quoted-family-name") << QString("'Times New Roman'") << QString("Times New Roman"); - QTest::newRow("invalid") << QString("invalid") << QString("invalid"); - QTest::newRow("multiple") << QString("invalid, Times New Roman") << QString("invalid,Times New Roman"); - QTest::newRow("multiple spaces") << QString("invalid, Times New Roman ") << QString("invalid,Times New Roman"); - QTest::newRow("multiple spaces quotes") << QString("'invalid', Times New Roman ") << QString("invalid,Times New Roman"); - QTest::newRow("multiple2") << QString("invalid, Times New Roman , foobar, 'baz'") << QString("invalid,Times New Roman,foobar,baz"); - QTest::newRow("invalid spaces") << QString("invalid spaces, Times New Roman ") << QString("invalid spaces,Times New Roman"); - QTest::newRow("invalid spaces quotes") << QString("'invalid spaces', 'Times New Roman' ") << QString("invalid spaces,Times New Roman"); + QTest::addColumn("cacheKey"); + + QTest::newRow("unquoted-family-name") << QString("Times New Roman") << QStringList({"Times New Roman"}); + QTest::newRow("quoted-family-name") << QString("'Times New Roman'") << QStringList({"Times New Roman"}); + QTest::newRow("invalid") << QString("invalid") << QStringList({"invalid"}); + QTest::newRow("multiple") << QString("invalid, Times New Roman") + << QStringList({"invalid", "Times New Roman"}); + QTest::newRow("multiple spaces") << QString("invalid, Times New Roman ") + << QStringList({"invalid", "Times New Roman"}); + QTest::newRow("multiple spaces quotes") << QString("'invalid', Times New Roman ") + << QStringList({"invalid", "Times New Roman"}); + QTest::newRow("multiple2") << QString("invalid, Times New Roman , foobar, 'baz'") + << QStringList({"invalid", "Times New Roman", "foobar", "baz"}); + QTest::newRow("invalid spaces") << QString("invalid spaces, Times New Roman ") + << QStringList({"invalid spaces", "Times New Roman"}); + QTest::newRow("invalid spaces quotes") << QString("'invalid spaces', 'Times New Roman' ") + << QStringList({"invalid spaces", "Times New Roman"}); } void tst_QFontCache::engineData() { QFETCH(QString, family); - QFETCH(QString, cacheKey); + QFETCH(QStringList, cacheKey); QFont f(family); f.exactMatch(); // loads engine @@ -104,7 +110,7 @@ void tst_QFontCache::engineData() if (req.pointSize < 0) req.pointSize = req.pixelSize*72.0/d->dpi; - req.family = cacheKey; + req.families = cacheKey; QFontEngineData *engineData = QFontCache::instance()->findEngineData(req); diff --git a/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp b/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp index aaa3433173..a018279098 100644 --- a/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp +++ b/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp @@ -3570,13 +3570,13 @@ void tst_QTextDocument::mergeFontFamilies() cursor.setPosition(QByteArray("Hello World").length(), QTextCursor::KeepAnchor); cursor.mergeCharFormat(newFormat); - QVERIFY(td.toHtml().contains(QLatin1String("font-family:'MS Shell Dlg 2','Jokerman';"))); + QVERIFY(td.toHtml().contains(QLatin1String("font-family:'Jokerman';"))); QTextCharFormat newFormatFamilies; newFormatFamilies.setFontFamilies({ QLatin1String("Arial"), QLatin1String("Helvetica") }); cursor.mergeCharFormat(newFormatFamilies); - QVERIFY(td.toHtml().contains(QLatin1String("font-family:'Arial','Helvetica','Jokerman'"))); + QVERIFY(td.toHtml().contains(QLatin1String("font-family:'Arial','Helvetica'"))); newFormatFamilies.setFontFamilies({ QLatin1String("Arial"), QLatin1String("Jokerman"), QLatin1String("Helvetica") }); cursor.mergeCharFormat(newFormatFamilies); diff --git a/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp b/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp index 3fdfa8ae99..da06b765e0 100644 --- a/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp +++ b/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp @@ -1661,19 +1661,22 @@ void tst_QTextDocumentFragment::html_cssShorthandFont() const char html[] = "Foo"; setHtml(html); QCOMPARE(cursor.charFormat().property(QTextFormat::FontPixelSize).toInt(), 50); - QCOMPARE(cursor.charFormat().property(QTextFormat::FontFamily).toString(), QString("sans-serif")); + QCOMPARE(cursor.charFormat().property(QTextFormat::FontFamilies).toStringList(), + QStringList{"sans-serif"}); } { const char html[] = "Foo"; setHtml(html); QCOMPARE(cursor.charFormat().property(QTextFormat::FontPointSize).toInt(), 50); - QCOMPARE(cursor.charFormat().property(QTextFormat::FontFamily).toString(), QString("sans-serif")); + QCOMPARE(cursor.charFormat().property(QTextFormat::FontFamilies).toStringList(), + QStringList{"sans-serif"}); } { const char html[] = "Foo"; setHtml(html); QCOMPARE(cursor.charFormat().property(QTextFormat::FontPointSize).toInt(), 7); - QCOMPARE(cursor.charFormat().property(QTextFormat::FontFamily).toString(), QString("Times New Roman")); + QCOMPARE(cursor.charFormat().property(QTextFormat::FontFamilies).toStringList(), + QStringList{"Times New Roman"}); } { const char html[] = "Foo"; diff --git a/tests/auto/gui/text/qtextformat/tst_qtextformat.cpp b/tests/auto/gui/text/qtextformat/tst_qtextformat.cpp index ef5e3a0e0b..3a0afcffa1 100644 --- a/tests/auto/gui/text/qtextformat/tst_qtextformat.cpp +++ b/tests/auto/gui/text/qtextformat/tst_qtextformat.cpp @@ -693,14 +693,17 @@ void tst_QTextFormat::dataStreamCompatibility() QTextCharFormat format; format.setFontStretch(42); format.setFontLetterSpacingType(QFont::AbsoluteSpacing); + format.setFontFamily(QLatin1String("Arial")); // Sanity check { QMap properties = format.properties(); QVERIFY(properties.contains(QTextFormat::FontLetterSpacingType)); QVERIFY(properties.contains(QTextFormat::FontStretch)); + QVERIFY(properties.contains(QTextFormat::FontFamilies)); QVERIFY(!properties.contains(QTextFormat::OldFontLetterSpacingType)); QVERIFY(!properties.contains(QTextFormat::OldFontStretch)); + QVERIFY(!properties.contains(QTextFormat::FontFamily)); } QByteArray memory; @@ -728,8 +731,10 @@ void tst_QTextFormat::dataStreamCompatibility() QMap properties = other.properties(); QVERIFY(properties.contains(QTextFormat::FontLetterSpacingType)); QVERIFY(properties.contains(QTextFormat::FontStretch)); + QVERIFY(properties.contains(QTextFormat::FontFamilies)); QVERIFY(!properties.contains(QTextFormat::OldFontLetterSpacingType)); QVERIFY(!properties.contains(QTextFormat::OldFontStretch)); + QVERIFY(!properties.contains(QTextFormat::FontFamily)); } } @@ -746,8 +751,10 @@ void tst_QTextFormat::dataStreamCompatibility() stream >> properties; QVERIFY(properties.contains(QTextFormat::FontLetterSpacingType)); QVERIFY(properties.contains(QTextFormat::FontStretch)); + QVERIFY(properties.contains(QTextFormat::FontFamilies)); QVERIFY(!properties.contains(QTextFormat::OldFontLetterSpacingType)); QVERIFY(!properties.contains(QTextFormat::OldFontStretch)); + QVERIFY(!properties.contains(QTextFormat::FontFamily)); } } @@ -777,8 +784,10 @@ void tst_QTextFormat::dataStreamCompatibility() QMap properties = other.properties(); QVERIFY(properties.contains(QTextFormat::FontLetterSpacingType)); QVERIFY(properties.contains(QTextFormat::FontStretch)); + QVERIFY(properties.contains(QTextFormat::FontFamilies)); QVERIFY(!properties.contains(QTextFormat::OldFontLetterSpacingType)); QVERIFY(!properties.contains(QTextFormat::OldFontStretch)); + QVERIFY(!properties.contains(QTextFormat::FontFamily)); } } @@ -797,8 +806,10 @@ void tst_QTextFormat::dataStreamCompatibility() stream >> properties; QVERIFY(!properties.contains(QTextFormat::FontLetterSpacingType)); QVERIFY(!properties.contains(QTextFormat::FontStretch)); + QVERIFY(!properties.contains(QTextFormat::FontFamilies)); QVERIFY(properties.contains(QTextFormat::OldFontLetterSpacingType)); QVERIFY(properties.contains(QTextFormat::OldFontStretch)); + QVERIFY(properties.contains(QTextFormat::FontFamily)); } } diff --git a/tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp b/tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp index c85bb737bf..e752ef8ec7 100644 --- a/tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp +++ b/tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp @@ -142,7 +142,7 @@ static void doShapingTests() if (e->fontEngine(e->layoutData->items[0])->type() == QFontEngine::Box) QSKIP("OpenType support missing for script"); - QCOMPARE(e->fontEngine(e->layoutData->items[0])->fontDef.family, font.family()); + QCOMPARE(e->fontEngine(e->layoutData->items[0])->fontDef.families.first(), font.family()); ushort nglyphs = glyphs.size(); if (!glyphs.isEmpty()) { @@ -1098,7 +1098,7 @@ void tst_QTextScriptEngine::controlInSyllable_qtbug14204() QFontEngine *fe = e->fontEngine(e->layoutData->items[0]); if (fe->type() == QFontEngine::Box) QSKIP("OpenType support missing for script"); - QCOMPARE(fe->fontDef.family, font.family()); + QCOMPARE(fe->fontDef.families.first(), font.family()); e->shape(0); QCOMPARE(e->layoutData->items[0].num_glyphs, ushort(3)); @@ -1156,7 +1156,7 @@ void tst_QTextScriptEngine::combiningMarks_qtbug15675() QFontEngine *fe = e->fontEngine(e->layoutData->items[0]); if (fe->type() == QFontEngine::Box) QSKIP("OpenType support missing for script"); - QCOMPARE(fe->fontDef.family, font.family()); + QCOMPARE(fe->fontDef.families.first(), font.family()); e->shape(0); const int diff = e->layoutData->items[0].num_glyphs - string.size(); @@ -1197,7 +1197,7 @@ void tst_QTextScriptEngine::thaiIsolatedSaraAm() QFontEngine *fe = e->fontEngine(e->layoutData->items[0]); if (fe->type() == QFontEngine::Box) QSKIP("OpenType support missing for script"); - QCOMPARE(fe->fontDef.family, font.family()); + QCOMPARE(fe->fontDef.families.first(), font.family()); e->shape(0); QVERIFY(e->layoutData->items[0].num_glyphs > 0); diff --git a/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp b/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp index 1f06c537c6..0d95102f66 100644 --- a/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp +++ b/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp @@ -91,7 +91,7 @@ void tst_QFontComboBox::currentFont_data() // Normalize the names QFont defaultFont; QFontInfo fi(defaultFont); - defaultFont = QFont(fi.family()); // make sure we have a real font name and not something like 'Sans Serif'. + defaultFont = QFont(QStringList{fi.family()}); // make sure we have a real font name and not something like 'Sans Serif'. if (!QFontDatabase::isPrivateFamily(defaultFont.family())) QTest::newRow("default") << defaultFont; defaultFont.setPointSize(defaultFont.pointSize() + 10); @@ -99,8 +99,8 @@ void tst_QFontComboBox::currentFont_data() QTest::newRow("default2") << defaultFont; QStringList list = QFontDatabase::families(); for (int i = 0; i < list.count(); ++i) { - QFont f = QFont(QFontInfo(QFont(list.at(i))).family()); - if (!QFontDatabase::isPrivateFamily(f.family())) + QFont f = QFont(QStringList{QFontInfo(QFont(list.at(i))).family()}); + if (!QFontDatabase::isPrivateFamily(f.families().first())) QTest::newRow(qPrintable(list.at(i))) << f; } } -- cgit v1.2.3