summaryrefslogtreecommitdiffstats
path: root/source/kde/kde/patch/kio/c801571f.patch
diff options
context:
space:
mode:
Diffstat (limited to 'source/kde/kde/patch/kio/c801571f.patch')
-rw-r--r--source/kde/kde/patch/kio/c801571f.patch229
1 files changed, 229 insertions, 0 deletions
diff --git a/source/kde/kde/patch/kio/c801571f.patch b/source/kde/kde/patch/kio/c801571f.patch
new file mode 100644
index 000000000..1045ac4be
--- /dev/null
+++ b/source/kde/kde/patch/kio/c801571f.patch
@@ -0,0 +1,229 @@
+From c801571f78136692873ea3d2d22e35ac7e5fa530 Mon Sep 17 00:00:00 2001
+From: Nicolas Fella <nicolas.fella@gmx.de>
+Date: Wed, 28 Dec 2022 21:32:14 +0100
+Subject: [PATCH] Restore old behavior for KFileFilterCombo::setFilter
+
+fb2a2268dbb2033bb8483d9bee63cb11f914573e refactored it to use the newly introduced KFileFilter
+class to parse the input. However, it actually allows input that is not a valid filter string expression.
+
+For example K3B uses filters like "audio/x-wav |Wave Sound Files", which are now parsed incorrectly.
+
+Also, contrary to KFileWidget's filter strings slashes were allowed unescapted, which broke Krita.
+
+K3B's usage of KFileFilterCombo for this is somewhat questionable, but we should not break it regardless.
+
+Longer-term setFilter should be replaced with API that takes a KFileFilter object to avoid such confusion
+
+Revert the implementation of setFilter to the original one. For setMimeFilter the usage of KFileFilter is fine.
+That means we now have separate codepaths for when setFilter and setMimeFilter was called. Longer-term there will
+be only one using KFileFilter
+
+BUG: 463309
+---
+ autotests/kfilefiltercombotest.cpp | 20 +++++++++
+ src/filewidgets/kfilefiltercombo.cpp | 64 +++++++++++++++++++---------
+ 2 files changed, 65 insertions(+), 19 deletions(-)
+
+diff --git a/autotests/kfilefiltercombotest.cpp b/autotests/kfilefiltercombotest.cpp
+index bb155f2de..22a042020 100644
+--- a/autotests/kfilefiltercombotest.cpp
++++ b/autotests/kfilefiltercombotest.cpp
+@@ -65,6 +65,15 @@ void KFileFilterComboTest::testSetFilter_data()
+ QTest::addRow("mutiple_extension_multiple_filter")
+ << "*.cpp *.cc *.C|C++ Source Files\n*.h *.H|Header files" << QStringList{"C++ Source Files", "Header files"};
+ QTest::addRow("pattern_only") << "*.cpp" << QStringList{"*.cpp"};
++
++ // must handle an unescaped slash https://bugs.kde.org/show_bug.cgi?id=463309
++ QTest::addRow("slash") << "*.c *.cpp|C/C++ Files" << QStringList{"C/C++ Files"};
++
++ QString k3bFilter =
++ "*|All Files\naudio/x-mp3 audio/x-wav application/x-ogg |Sound Files\naudio/x-wav |Wave Sound Files\naudio/x-mp3 |MP3 Sound Files\napplication/x-ogg "
++ "|Ogg Vorbis Sound Files\nvideo/mpeg |MPEG Video Files";
++ QTest::addRow("k3b") << k3bFilter
++ << QStringList{"All Files", "Sound Files", "Wave Sound Files", "MP3 Sound Files", "Ogg Vorbis Sound Files", "MPEG Video Files"};
+ }
+
+ void KFileFilterComboTest::testDefaultFilter()
+@@ -177,6 +186,17 @@ void KFileFilterComboTest::testFilters_data()
+ QTest::addRow("mutiple_extension_multiple_filter")
+ << "*.cpp *.cc *.C|C++ Source Files\n*.h *.H|Header files" << QStringList{"*.cpp *.cc *.C|C++ Source Files", "*.h *.H|Header files"};
+ QTest::addRow("pattern_only") << "*.cpp" << QStringList{"*.cpp"};
++
++ QString k3bFilter =
++ "*|All Files\naudio/x-mp3 audio/x-wav application/x-ogg |Sound Files\naudio/x-wav |Wave Sound Files\naudio/x-mp3 |MP3 Sound Files\napplication/x-ogg "
++ "|Ogg Vorbis Sound Files\nvideo/mpeg |MPEG Video Files";
++ QTest::addRow("k3b") << k3bFilter
++ << QStringList{"*|All Files",
++ "audio/x-mp3 audio/x-wav application/x-ogg |Sound Files",
++ "audio/x-wav |Wave Sound Files",
++ "audio/x-mp3 |MP3 Sound Files",
++ "application/x-ogg |Ogg Vorbis Sound Files",
++ "video/mpeg |MPEG Video Files"};
+ }
+
+ void KFileFilterComboTest::testFilters()
+diff --git a/src/filewidgets/kfilefiltercombo.cpp b/src/filewidgets/kfilefiltercombo.cpp
+index 3d93af643..e751f0c25 100644
+--- a/src/filewidgets/kfilefiltercombo.cpp
++++ b/src/filewidgets/kfilefiltercombo.cpp
+@@ -41,7 +41,8 @@ public:
+ QString m_lastFilter;
+ QString m_defaultFilter = i18nc("Default mime type filter that shows all file types", "*|All Files");
+
+- QVector<KFileFilter> m_filters;
++ QVector<KFileFilter> m_fileFilters;
++ QStringList m_filters;
+ bool m_allTypes;
+ };
+
+@@ -62,22 +63,31 @@ KFileFilterCombo::KFileFilterCombo(QWidget *parent)
+
+ KFileFilterCombo::~KFileFilterCombo() = default;
+
+-void KFileFilterCombo::setFilter(const QString &filterString)
++void KFileFilterCombo::setFilter(const QString &filter)
+ {
+ clear();
+ d->m_filters.clear();
++ d->m_fileFilters.clear();
+ d->m_hasAllSupportedFiles = false;
+
+- const QVector<KFileFilter> filters = KFileFilter::fromFilterString(filterString);
+-
+- if (!filters.isEmpty()) {
+- d->m_filters = filters;
++ if (!filter.isEmpty()) {
++ QString tmp = filter;
++ int index = tmp.indexOf(QLatin1Char('\n'));
++ while (index > 0) {
++ d->m_filters.append(tmp.left(index));
++ tmp.remove(0, index + 1);
++ index = tmp.indexOf(QLatin1Char('\n'));
++ }
++ d->m_filters.append(tmp);
+ } else {
+- d->m_filters = KFileFilter::fromFilterString(d->m_defaultFilter);
++ d->m_filters.append(d->m_defaultFilter);
+ }
+
+- for (const KFileFilter &filter : std::as_const(d->m_filters)) {
+- addItem(filter.label());
++ QStringList::ConstIterator it;
++ QStringList::ConstIterator end(d->m_filters.constEnd());
++ for (it = d->m_filters.constBegin(); it != end; ++it) {
++ int tab = (*it).indexOf(QLatin1Char('|'));
++ addItem((tab < 0) ? *it : (*it).mid(tab + 1));
+ }
+
+ d->m_lastFilter = currentText();
+@@ -88,7 +98,13 @@ QString KFileFilterCombo::currentFilter() const
+ {
+ QString f = currentText();
+ if (f == itemText(currentIndex())) { // user didn't edit the text
+- f = d->m_filters.value(currentIndex()).toFilterString();
++
++ if (!d->m_filters.isEmpty()) {
++ f = d->m_filters.value(currentIndex());
++ } else {
++ f = d->m_fileFilters.value(currentIndex()).toFilterString();
++ }
++
+ if (d->m_isMimeFilter || (currentIndex() == 0 && d->m_hasAllSupportedFiles)) {
+ return f; // we have a MIME type as filter
+ }
+@@ -109,9 +125,13 @@ bool KFileFilterCombo::showsAllTypes() const
+
+ QStringList KFileFilterCombo::filters() const
+ {
++ if (!d->m_filters.isEmpty()) {
++ return d->m_filters;
++ }
++
+ QStringList result;
+
+- for (const KFileFilter &filter : std::as_const(d->m_filters)) {
++ for (const KFileFilter &filter : std::as_const(d->m_fileFilters)) {
+ result << filter.toFilterString();
+ }
+
+@@ -120,18 +140,23 @@ QStringList KFileFilterCombo::filters() const
+
+ void KFileFilterCombo::setCurrentFilter(const QString &filterString)
+ {
+- auto it = std::find_if(d->m_filters.cbegin(), d->m_filters.cend(), [filterString](const KFileFilter &filter) {
++ if (!d->m_filters.isEmpty()) {
++ setCurrentIndex(d->m_filters.indexOf(filterString));
++ return;
++ }
++
++ auto it = std::find_if(d->m_fileFilters.cbegin(), d->m_fileFilters.cend(), [filterString](const KFileFilter &filter) {
+ return filterString == filter.toFilterString();
+ });
+
+- if (it == d->m_filters.cend()) {
++ if (it == d->m_fileFilters.cend()) {
+ qCWarning(KIO_KFILEWIDGETS_KFILEFILTERCOMBO) << "Could not find filter" << filterString;
+ setCurrentIndex(-1);
+ Q_EMIT filterChanged();
+ return;
+ }
+
+- setCurrentIndex(std::distance(d->m_filters.cbegin(), it));
++ setCurrentIndex(std::distance(d->m_fileFilters.cbegin(), it));
+ Q_EMIT filterChanged();
+ }
+
+@@ -139,6 +164,7 @@ void KFileFilterCombo::setMimeFilter(const QStringList &types, const QString &de
+ {
+ clear();
+ d->m_filters.clear();
++ d->m_fileFilters.clear();
+ QString delim = QStringLiteral(", ");
+ d->m_hasAllSupportedFiles = false;
+ bool hasAllFilesFilter = false;
+@@ -181,7 +207,7 @@ void KFileFilterCombo::setMimeFilter(const QStringList &types, const QString &de
+ filter = KFileFilter::fromMimeType(*it);
+ }
+
+- d->m_filters.append(filter);
++ d->m_fileFilters.append(filter);
+ addItem(filter.label());
+
+ if (type.name() == defaultType) {
+@@ -195,7 +221,7 @@ void KFileFilterCombo::setMimeFilter(const QStringList &types, const QString &de
+
+ if (d->m_allTypes) {
+ QStringList allTypes;
+- for (const KFileFilter &filter : std::as_const(d->m_filters)) {
++ for (const KFileFilter &filter : std::as_const(d->m_fileFilters)) {
+ allTypes << filter.mimePatterns().join(QLatin1Char(' '));
+ }
+
+@@ -203,7 +229,7 @@ void KFileFilterCombo::setMimeFilter(const QStringList &types, const QString &de
+
+ if (count() <= 3) { // show the MIME type comments of at max 3 types
+ QStringList allComments;
+- for (const KFileFilter &filter : std::as_const(d->m_filters)) {
++ for (const KFileFilter &filter : std::as_const(d->m_fileFilters)) {
+ allComments << filter.label();
+ }
+
+@@ -214,13 +240,13 @@ void KFileFilterCombo::setMimeFilter(const QStringList &types, const QString &de
+ }
+
+ insertItem(0, allSupportedFilesFilter.label());
+- d->m_filters.prepend(allSupportedFilesFilter);
++ d->m_fileFilters.prepend(allSupportedFilesFilter);
+ setCurrentIndex(0);
+ }
+
+ if (hasAllFilesFilter) {
+ addItem(i18n("All Files"));
+- d->m_filters.append(KFileFilter(i18n("All Files"), {}, {QStringLiteral("application/octet-stream")}));
++ d->m_fileFilters.append(KFileFilter(i18n("All Files"), {}, {QStringLiteral("application/octet-stream")}));
+ }
+
+ d->m_lastFilter = currentText();
+--
+GitLab
+