summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp
diff options
context:
space:
mode:
authorAhmad Samir <a.samirh78@gmail.com>2023-04-13 03:26:13 +0200
committerAhmad Samir <a.samirh78@gmail.com>2023-05-07 14:29:17 +0300
commit9547ef58c707a11d5affcbcfa553f3aca5334087 (patch)
tree2711f49ff2a8842b8dc636eb9a2733372a917434 /tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp
parenta2551c45d496c23045eb8451e080e75b2f8b42c1 (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.cpp31
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;