diff options
author | Ahmad Samir <a.samirh78@gmail.com> | 2023-04-13 03:26:13 +0200 |
---|---|---|
committer | Ahmad Samir <a.samirh78@gmail.com> | 2023-05-07 14:29:17 +0300 |
commit | 9547ef58c707a11d5affcbcfa553f3aca5334087 (patch) | |
tree | 2711f49ff2a8842b8dc636eb9a2733372a917434 /tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp | |
parent | a2551c45d496c23045eb8451e080e75b2f8b42c1 (diff) |
QMimeDatabase: handle glob-deleteall tags
According to the Freedesktop spec[1], a mimetype that has glob-deleteall
overwrites other glob-pattern definitions for a mimetype if it is in a
higher precedence dir, the default order is (from high to low)
~/.local/share/mime, /usr/local/share/mime, /usr/share/mime. Or if the
XDG_DATA_DIRS env var is set, then it takes precedence. The
QMime*ProviderS in m_providers are constructed/stored in that same
order, high to low).
For QMimeXMLProvider, we can just clear the glob patterns associated
with those mimetypes from the lists/maps. For the QMimeBinaryProvider
however, we can't change the binary (mmap'ed) cache file, instead check
mimetype names against the exclusion list before modifying a
QMimeGlobMatchResult.
[1] https://specifications.freedesktop.org/shared-mime-info-spec/latest/ar01s02.html
This test uses XDG_DATA_DIRS so only viable when USE_XDG_DATA_DIRS is
defined.
Fixes: QTBUG-101755
Pick-to: 6.5
Change-Id: Icadbdf1027155296377c5a6ab3be8e41b6668325
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: David Faure <david.faure@kdab.com>
Diffstat (limited to 'tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp')
-rw-r--r-- | tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp index 6bb3bcb1cf..53bcba1be2 100644 --- a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp +++ b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp @@ -131,7 +131,9 @@ void tst_QMimeDatabase::initTestCase() const QString globalPackageDir = m_globalXdgDir + QStringLiteral("/mime/packages"); QVERIFY(here.mkpath(globalPackageDir)); - qputenv("XDG_DATA_DIRS", QFile::encodeName(m_globalXdgDir)); + QString overrideDir = QFINDTESTDATA("mimetypes-override/"); + QByteArray env = QFile::encodeName(overrideDir) + ':' + QFile::encodeName(m_globalXdgDir); + qputenv("XDG_DATA_DIRS", env); qDebug() << "\nGlobal XDG_DATA_DIRS: " << m_globalXdgDir; const QString freeDesktopXml = QStringLiteral("freedesktop.org.xml"); @@ -301,6 +303,15 @@ void tst_QMimeDatabase::mimeTypesForFileName_data() QTest::newRow("non_ascii") << QString::fromUtf8("AİİA.pdf") << (QStringList() << "application/pdf"); } +static QStringList mimeTypeNames(const QList<QMimeType> &mimes) +{ + QStringList mimeNames; + mimeNames.reserve(mimes.size()); + for (const auto &mime : mimes) + mimeNames.append(mime.name()); + return mimeNames; +} + void tst_QMimeDatabase::mimeTypesForFileName() { QFETCH(QString, fileName); @@ -313,6 +324,24 @@ void tst_QMimeDatabase::mimeTypesForFileName() QCOMPARE(mimeNames, expectedMimeTypes); } +void tst_QMimeDatabase::mimeTypesForFileName_glob_deleteall() +{ +#if !defined(USE_XDG_DATA_DIRS) + QSKIP("This test requires XDG_DATA_DIRS"); +#endif + + QMimeDatabase mdb; + QList<QMimeType> mimes = mdb.mimeTypesForFileName(u"foo.webm"_s); + + // "*.webm" glob pattern is deleted with "glob-deleteall" + QVERIFY2(mimes.isEmpty(), qPrintable(mimeTypeNames(mimes).join(u','))); + mimes = mdb.mimeTypesForFileName(u"foo.videowebm"_s); + QCOMPARE(mimes.size(), 1); + QCOMPARE(mimes.at(0).globPatterns(), QStringList{"*.videowebm"}); + // Custom "*.videowebm" pattern is used instead + QCOMPARE(mimes.at(0).name(), u"video/webm"); +} + void tst_QMimeDatabase::inheritance() { QMimeDatabase db; |