diff --git a/autotests/jsonplugin.json b/autotests/jsonplugin.json --- a/autotests/jsonplugin.json +++ b/autotests/jsonplugin.json @@ -6,6 +6,7 @@ "Description[pt_BR]": "Isto é um plugin", "Description[sv]": "Det här är ett insticksprogram", "Description[uk]": "Це додаток", - "Description[x-test]": "xxThis is a pluginxx" + "Description[x-test]": "xxThis is a pluginxx", + "MimeTypes": [ "text/plain", "image/png" ] } -} \ No newline at end of file +} diff --git a/autotests/jsonplugin2.json b/autotests/jsonplugin2.json --- a/autotests/jsonplugin2.json +++ b/autotests/jsonplugin2.json @@ -7,6 +7,7 @@ "Description[sv]": "Det här är ännu ett insticksprogram", "Description[uk]": "Це інший додаток", "Description[x-test]": "xxThis is another pluginxx", - "Id": "foobar" + "Id": "foobar", + "MimeTypes": [ "text/html" ] } -} \ No newline at end of file +} diff --git a/autotests/kpluginloadertest.cpp b/autotests/kpluginloadertest.cpp --- a/autotests/kpluginloadertest.cpp +++ b/autotests/kpluginloadertest.cpp @@ -345,6 +345,20 @@ QCOMPARE(plugins[0].description(), QStringLiteral("This is another plugin")); QCOMPARE(plugins[1].description(), QStringLiteral("This is a plugin")); + // mimetype filter. Only one match, jsonplugin2 is specific to text/html. + auto supportTextPlain = [](const KPluginMetaData &metaData) { return metaData.supportsMimeType(QLatin1String("text/plain")); }; + plugins = KPluginLoader::findPlugins(QStringLiteral("kpluginmetadatatest"), supportTextPlain); + QCOMPARE(plugins.size(), 1); + QCOMPARE(plugins[0].description(), QStringLiteral("This is a plugin")); + + // mimetype filter. Two matches, both support text/html, via inheritance. + auto supportTextHtml = [](const KPluginMetaData &metaData) { return metaData.supportsMimeType(QLatin1String("text/html")); }; + plugins = KPluginLoader::findPlugins(QStringLiteral("kpluginmetadatatest"), supportTextHtml); + std::sort(plugins.begin(), plugins.end(), sortPlugins); + QCOMPARE(plugins.size(), 2); + QCOMPARE(plugins[0].description(), QStringLiteral("This is another plugin")); + QCOMPARE(plugins[1].description(), QStringLiteral("This is a plugin")); + // invalid std::function as filter plugins = KPluginLoader::findPlugins(QStringLiteral("kpluginmetadatatest")); std::sort(plugins.begin(), plugins.end(), sortPlugins); diff --git a/src/lib/plugin/kpluginmetadata.h b/src/lib/plugin/kpluginmetadata.h --- a/src/lib/plugin/kpluginmetadata.h +++ b/src/lib/plugin/kpluginmetadata.h @@ -330,6 +330,14 @@ */ QStringList mimeTypes() const; + /** + * @return true if this plugin can handle the given mimetype + * This is more accurate than mimeTypes().contains(mimeType) because it also + * takes MIME type inheritance into account. + * @since 5.66 + */ + bool supportsMimeType(const QString &mimeType) const; + /** * @return A string list of formfactors this plugin is useful for, e.g. desktop, tablet, * handset, mediacenter, etc. diff --git a/src/lib/plugin/kpluginmetadata.cpp b/src/lib/plugin/kpluginmetadata.cpp --- a/src/lib/plugin/kpluginmetadata.cpp +++ b/src/lib/plugin/kpluginmetadata.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include "kcoreaddons_debug.h" @@ -331,6 +332,18 @@ return readStringList(rootObject(), QStringLiteral("MimeTypes")); } +bool KPluginMetaData::supportsMimeType(const QString &mimeType) const +{ + QMimeDatabase db; + const QMimeType mime = db.mimeTypeForName(mimeType); + + const QStringList mimes = mimeTypes(); + auto inherits = [&](const QString &supportedMimeName) { + return mime.inherits(supportedMimeName); + }; + return std::find_if(mimes.begin(), mimes.end(), inherits) != mimes.end(); +} + QStringList KPluginMetaData::formFactors() const { return readStringList(rootObject(), QStringLiteral("FormFactors"));