From 1bf2ff6d92977b3c29fc9954a3291a80c8cde9d4 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 16 Jul 2018 16:13:25 +0200 Subject: [PATCH] MenuBarFilter: Do not access menu bar and actions from non-UI thread Nothing of this is thread-safe and needs to be done in the UI thread. Luckily this is easy for locator filters: prepareSearch is run in the UI thread, and matchesFor is guaranteed to never run while prepareSearch runs. Change-Id: I757a2488db7254b8973c21dbda221a116b4bf6e9 Reviewed-by: David Schulz --- src/plugins/coreplugin/menubarfilter.cpp | 24 ++++++++++++------------ src/plugins/coreplugin/menubarfilter.h | 1 + 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/plugins/coreplugin/menubarfilter.cpp b/src/plugins/coreplugin/menubarfilter.cpp index 6a82d8676e7..c9ba7428ced 100644 --- a/src/plugins/coreplugin/menubarfilter.cpp +++ b/src/plugins/coreplugin/menubarfilter.cpp @@ -59,17 +59,8 @@ QList MenuBarFilter::matchesFor(QFutureInterface entries; - QString normalized = entry; - normalized.replace(seperatorRegExp, separators.at(0)); - const QStringList entryPath = normalized.split(separators.at(0), QString::SkipEmptyParts); - QVector processedMenus; - for (QAction* action : menuBarActions()) - entries << matchesForAction(action, entryPath, QStringList(), processedMenus); - - return entries; + Q_UNUSED(entry); + return std::move(m_entries); } void MenuBarFilter::accept(LocatorFilterEntry selection, QString *newText, @@ -161,6 +152,15 @@ static void requestMenuUpdate(const QAction* action) void Core::Internal::MenuBarFilter::prepareSearch(const QString &entry) { Q_UNUSED(entry); - for (const QAction *action : menuBarActions()) + static const QString separators = ". >/"; + static const QRegularExpression seperatorRegExp(QString("[%1]").arg(separators)); + QString normalized = entry; + normalized.replace(seperatorRegExp, separators.at(0)); + const QStringList entryPath = normalized.split(separators.at(0), QString::SkipEmptyParts); + m_entries.clear(); + QVector processedMenus; + for (QAction* action : menuBarActions()) { requestMenuUpdate(action); + m_entries << matchesForAction(action, entryPath, QStringList(), processedMenus); + } } diff --git a/src/plugins/coreplugin/menubarfilter.h b/src/plugins/coreplugin/menubarfilter.h index c7b137e6a9f..68f98dddeac 100644 --- a/src/plugins/coreplugin/menubarfilter.h +++ b/src/plugins/coreplugin/menubarfilter.h @@ -53,6 +53,7 @@ private: const QStringList &path, QVector &processedMenus); + QList m_entries; }; } // namespace Internal