diff --git a/autotests/kerfuffle/archivetest.cpp b/autotests/kerfuffle/archivetest.cpp --- a/autotests/kerfuffle/archivetest.cpp +++ b/autotests/kerfuffle/archivetest.cpp @@ -161,6 +161,12 @@ } else { qDebug() << "lrzip executable not found in path. Skipping lrzip test."; } + + QTest::newRow("mimetype child of application/zip") + << QFINDTESTDATA("data/test.odt") + << QStringLiteral("test") + << false << true << false << Archive::Unencrypted + << QStringLiteral("test"); } void ArchiveTest::testProperties() diff --git a/autotests/kerfuffle/data/test.odt b/autotests/kerfuffle/data/test.odt new file mode 100644 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@ #include #include +#include #include #include @@ -57,8 +58,24 @@ qCDebug(ARK) << "Detected mime" << mimeType; QVector offers = KPluginLoader::findPlugins(QStringLiteral("kerfuffle"), [mimeType](const KPluginMetaData& metaData) { - return metaData.serviceTypes().contains(QStringLiteral("Kerfuffle/Plugin")) && - metaData.mimeTypes().contains(mimeType); + if (!metaData.serviceTypes().contains(QStringLiteral("Kerfuffle/Plugin"))) { + return false; + } + + if (metaData.mimeTypes().contains(mimeType)) { + return true; + } + + // The mimetype is not directly supported, but it could inherit from a supported one. + if (!supportedMimeTypes().contains(mimeType)) { + foreach (const QString &mime, metaData.mimeTypes()) { + if (QMimeDatabase().mimeTypeForName(mimeType).inherits(mime)) { + return true; + } + } + } + + return false; }); qSort(offers.begin(), offers.end(), comparePlugins);