From 108c64fc7acf30fa09e1d5af0e998dbb54efdd07 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 13 Jul 2023 18:27:51 +0200 Subject: [PATCH] WebAssembly: Move special aspect closer to its only use WebBrowserSelectionAspect is not too far off from a normal SelectionAspect, and may be one later. Change-Id: I4d9d3a77244fe3f30f29746e67f5420ae9c6c3f0 Reviewed-by: Reviewed-by: Alessandro Portale --- src/plugins/webassembly/CMakeLists.txt | 1 - src/plugins/webassembly/webassembly.qbs | 2 - src/plugins/webassembly/webassembly_test.cpp | 4 +- .../webassemblyrunconfiguration.cpp | 115 +++++++++++++++++- .../webassembly/webassemblyrunconfiguration.h | 6 + .../webassemblyrunconfigurationaspects.cpp | 108 ---------------- .../webassemblyrunconfigurationaspects.h | 46 ------- 7 files changed, 119 insertions(+), 163 deletions(-) delete mode 100644 src/plugins/webassembly/webassemblyrunconfigurationaspects.cpp delete mode 100644 src/plugins/webassembly/webassemblyrunconfigurationaspects.h diff --git a/src/plugins/webassembly/CMakeLists.txt b/src/plugins/webassembly/CMakeLists.txt index 6609357f015..d9e46bcc4d4 100644 --- a/src/plugins/webassembly/CMakeLists.txt +++ b/src/plugins/webassembly/CMakeLists.txt @@ -10,7 +10,6 @@ add_qtc_plugin(WebAssembly webassemblyplugin.cpp webassemblyplugin.h webassemblyqtversion.cpp webassemblyqtversion.h webassemblyrunconfiguration.cpp webassemblyrunconfiguration.h - webassemblyrunconfigurationaspects.cpp webassemblyrunconfigurationaspects.h webassemblysettings.cpp webassemblysettings.h webassemblytoolchain.cpp webassemblytoolchain.h webassemblytr.h diff --git a/src/plugins/webassembly/webassembly.qbs b/src/plugins/webassembly/webassembly.qbs index 12b639238cb..75a019ed422 100644 --- a/src/plugins/webassembly/webassembly.qbs +++ b/src/plugins/webassembly/webassembly.qbs @@ -25,8 +25,6 @@ QtcPlugin { "webassemblyqtversion.h", "webassemblyrunconfiguration.cpp", "webassemblyrunconfiguration.h", - "webassemblyrunconfigurationaspects.cpp", - "webassemblyrunconfigurationaspects.h", "webassemblysettings.cpp", "webassemblysettings.h", "webassemblytoolchain.cpp", diff --git a/src/plugins/webassembly/webassembly_test.cpp b/src/plugins/webassembly/webassembly_test.cpp index 6292cd9942a..bc763822c06 100644 --- a/src/plugins/webassembly/webassembly_test.cpp +++ b/src/plugins/webassembly/webassembly_test.cpp @@ -4,7 +4,7 @@ #include "webassembly_test.h" #include "webassemblyemsdk.h" -#include "webassemblyrunconfigurationaspects.h" +#include "webassemblyrunconfiguration.h" #include @@ -77,7 +77,7 @@ void WebAssemblyTest::testEmrunBrowserListParsing() QFETCH(QByteArray, emrunOutput); QFETCH(WebBrowserEntries, expectedBrowsers); - QCOMPARE(WebBrowserSelectionAspect::parseEmrunOutput(emrunOutput), expectedBrowsers); + QCOMPARE(parseEmrunOutput(emrunOutput), expectedBrowsers); } void WebAssemblyTest::testEmrunBrowserListParsing_data() diff --git a/src/plugins/webassembly/webassemblyrunconfiguration.cpp b/src/plugins/webassembly/webassemblyrunconfiguration.cpp index 7459853f508..a1bb735c3c3 100644 --- a/src/plugins/webassembly/webassemblyrunconfiguration.cpp +++ b/src/plugins/webassembly/webassemblyrunconfiguration.cpp @@ -1,9 +1,9 @@ // Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "webassemblyconstants.h" #include "webassemblyrunconfiguration.h" -#include "webassemblyrunconfigurationaspects.h" + +#include "webassemblyconstants.h" #include "webassemblytr.h" #include @@ -12,14 +12,37 @@ #include #include #include +#include #include #include +#include +#include +#include + +#include +#include + using namespace ProjectExplorer; using namespace Utils; namespace WebAssembly::Internal { +WebBrowserEntries parseEmrunOutput(const QByteArray &output) +{ + WebBrowserEntries result; + QTextStream ts(output); + QString line; + static const QRegularExpression regExp(R"( - (.*):\s*(.*))"); // ' - firefox: Mozilla Firefox' + // ^__1__^ ^______2______^ + while (ts.readLineInto(&line)) { + const QRegularExpressionMatch match = regExp.match(line); + if (match.hasMatch()) + result.push_back({match.captured(1), match.captured(2)}); + } + return result; +} + static FilePath pythonInterpreter(const Environment &env) { const QString emsdkPythonEnvVarKey("EMSDK_PYTHON"); @@ -63,12 +86,94 @@ static CommandLine emrunCommand(const Target *target, return {}; } +static const char BROWSER_KEY[] = "WASM.WebBrowserSelectionAspect.Browser"; + +static WebBrowserEntries emrunBrowsers(Target *target) +{ + WebBrowserEntries result; + result.append(qMakePair(QString(), Tr::tr("Default Browser"))); + if (auto bc = target->activeBuildConfiguration()) { + const Environment environment = bc->environment(); + const FilePath emrunPath = environment.searchInPath("emrun"); + + Process browserLister; + browserLister.setEnvironment(environment); + browserLister.setCommand({emrunPath, {"--list_browsers"}}); + browserLister.start(); + + if (browserLister.waitForFinished()) + result.append(parseEmrunOutput(browserLister.readAllRawStandardOutput())); + } + return result; +} + +class WebBrowserSelectionAspect : public BaseAspect +{ + Q_OBJECT + +public: + WebBrowserSelectionAspect(AspectContainer *container) + : BaseAspect(container) + {} + + void setTarget(Target *target) + { + m_availableBrowsers = emrunBrowsers(target); + if (!m_availableBrowsers.isEmpty()) { + const int defaultIndex = qBound(0, m_availableBrowsers.count() - 1, 1); + m_currentBrowser = m_availableBrowsers.at(defaultIndex).first; + } + setDisplayName(Tr::tr("Web Browser")); + setId("WebBrowserAspect"); + setSettingsKey("RunConfiguration.WebBrowser"); + + addDataExtractor(this, &WebBrowserSelectionAspect::currentBrowser, &Data::currentBrowser); + } + + void addToLayout(Layouting::LayoutItem &parent) override + { + QTC_CHECK(!m_webBrowserComboBox); + m_webBrowserComboBox = new QComboBox; + for (const WebBrowserEntry &be : m_availableBrowsers) + m_webBrowserComboBox->addItem(be.second, be.first); + m_webBrowserComboBox->setCurrentIndex(m_webBrowserComboBox->findData(m_currentBrowser)); + connect(m_webBrowserComboBox, &QComboBox::currentIndexChanged, this, [this] { + m_currentBrowser = m_webBrowserComboBox->currentData().toString(); + emit changed(); + }); + parent.addItems({Tr::tr("Web browser:"), m_webBrowserComboBox}); + } + + void fromMap(const QVariantMap &map) override + { + if (!m_availableBrowsers.isEmpty()) + m_currentBrowser = map.value(BROWSER_KEY, m_availableBrowsers.first().first).toString(); + } + + void toMap(QVariantMap &map) const override + { + map.insert(BROWSER_KEY, m_currentBrowser); + } + + QString currentBrowser() const { return m_currentBrowser; } + + struct Data : BaseAspect::Data + { + QString currentBrowser; + }; + +private: + QComboBox *m_webBrowserComboBox = nullptr; + QString m_currentBrowser; + WebBrowserEntries m_availableBrowsers; +}; + // Runs a webassembly application via emscripten's "emrun" tool // https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html -class EmrunRunConfiguration : public ProjectExplorer::RunConfiguration +class EmrunRunConfiguration : public RunConfiguration { public: - EmrunRunConfiguration(Target *target, Utils::Id id) + EmrunRunConfiguration(Target *target, Id id) : RunConfiguration(target, id) { webBrowser.setTarget(target); @@ -130,3 +235,5 @@ EmrunRunWorkerFactory::EmrunRunWorkerFactory() } } // Webassembly::Internal + +#include "webassemblyrunconfiguration.moc" diff --git a/src/plugins/webassembly/webassemblyrunconfiguration.h b/src/plugins/webassembly/webassemblyrunconfiguration.h index b6ade22e847..9490cc77c86 100644 --- a/src/plugins/webassembly/webassemblyrunconfiguration.h +++ b/src/plugins/webassembly/webassemblyrunconfiguration.h @@ -8,6 +8,12 @@ namespace WebAssembly::Internal { +using WebBrowserEntry = QPair; // first: id, second: display name +using WebBrowserEntries = QList; + +WebBrowserEntries parseEmrunOutput(const QByteArray &output); + + class EmrunRunConfigurationFactory final : public ProjectExplorer::RunConfigurationFactory { public: diff --git a/src/plugins/webassembly/webassemblyrunconfigurationaspects.cpp b/src/plugins/webassembly/webassemblyrunconfigurationaspects.cpp deleted file mode 100644 index 74ee0ded60f..00000000000 --- a/src/plugins/webassembly/webassemblyrunconfigurationaspects.cpp +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (C) 2019 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "webassemblyrunconfigurationaspects.h" -#include "webassemblytr.h" - -#include -#include - -#include -#include -#include - -#include -#include - -using namespace Utils; - -namespace WebAssembly { -namespace Internal { - -static const char BROWSER_KEY[] = "WASM.WebBrowserSelectionAspect.Browser"; - -static WebBrowserEntries emrunBrowsers(ProjectExplorer::Target *target) -{ - WebBrowserEntries result; - result.append(qMakePair(QString(), Tr::tr("Default Browser"))); - if (auto bc = target->activeBuildConfiguration()) { - const Utils::Environment environment = bc->environment(); - const Utils::FilePath emrunPath = environment.searchInPath("emrun"); - - Process browserLister; - browserLister.setEnvironment(environment); - browserLister.setCommand({emrunPath, {"--list_browsers"}}); - browserLister.start(); - - if (browserLister.waitForFinished()) - result.append(WebBrowserSelectionAspect::parseEmrunOutput( - browserLister.readAllRawStandardOutput())); - } - return result; -} - -WebBrowserSelectionAspect::WebBrowserSelectionAspect(AspectContainer *container) - : BaseAspect(container) -{} - -void WebBrowserSelectionAspect::setTarget(ProjectExplorer::Target *target) -{ - m_availableBrowsers = emrunBrowsers(target); - if (!m_availableBrowsers.isEmpty()) { - const int defaultIndex = qBound(0, m_availableBrowsers.count() - 1, 1); - m_currentBrowser = m_availableBrowsers.at(defaultIndex).first; - } - setDisplayName(Tr::tr("Web Browser")); - setId("WebBrowserAspect"); - setSettingsKey("RunConfiguration.WebBrowser"); - - addDataExtractor(this, &WebBrowserSelectionAspect::currentBrowser, &Data::currentBrowser); -} - -void WebBrowserSelectionAspect::addToLayout(Layouting::LayoutItem &parent) -{ - QTC_CHECK(!m_webBrowserComboBox); - m_webBrowserComboBox = new QComboBox; - for (const WebBrowserEntry &be : m_availableBrowsers) - m_webBrowserComboBox->addItem(be.second, be.first); - m_webBrowserComboBox->setCurrentIndex(m_webBrowserComboBox->findData(m_currentBrowser)); - connect(m_webBrowserComboBox, &QComboBox::currentIndexChanged, this, [this] { - m_currentBrowser = m_webBrowserComboBox->currentData().toString(); - emit changed(); - }); - parent.addItems({Tr::tr("Web browser:"), m_webBrowserComboBox}); -} - -void WebBrowserSelectionAspect::fromMap(const QVariantMap &map) -{ - if (!m_availableBrowsers.isEmpty()) - m_currentBrowser = map.value(BROWSER_KEY, m_availableBrowsers.first().first).toString(); -} - -void WebBrowserSelectionAspect::toMap(QVariantMap &map) const -{ - map.insert(BROWSER_KEY, m_currentBrowser); -} - -QString WebBrowserSelectionAspect::currentBrowser() const -{ - return m_currentBrowser; -} - -WebBrowserEntries WebBrowserSelectionAspect::parseEmrunOutput(const QByteArray &output) -{ - WebBrowserEntries result; - QTextStream ts(output); - QString line; - static const QRegularExpression regExp(R"( - (.*):\s*(.*))"); // ' - firefox: Mozilla Firefox' - // ^__1__^ ^______2______^ - while (ts.readLineInto(&line)) { - const QRegularExpressionMatch match = regExp.match(line); - if (match.hasMatch()) - result.push_back({match.captured(1), match.captured(2)}); - } - return result; -} - -} // namespace Internal -} // namespace Webassembly diff --git a/src/plugins/webassembly/webassemblyrunconfigurationaspects.h b/src/plugins/webassembly/webassemblyrunconfigurationaspects.h deleted file mode 100644 index db584d33a19..00000000000 --- a/src/plugins/webassembly/webassemblyrunconfigurationaspects.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2019 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include - -QT_FORWARD_DECLARE_CLASS(QComboBox) - -namespace WebAssembly { -namespace Internal { - -using WebBrowserEntry = QPair; // first: id, second: display name -using WebBrowserEntries = QList; - -class WebBrowserSelectionAspect : public Utils::BaseAspect -{ - Q_OBJECT - -public: - WebBrowserSelectionAspect(Utils::AspectContainer *container); - - void setTarget(ProjectExplorer::Target *target); - - void addToLayout(Layouting::LayoutItem &parent) override; - - void fromMap(const QVariantMap &map) override; - void toMap(QVariantMap &map) const override; - - QString currentBrowser() const; - - static WebBrowserEntries parseEmrunOutput(const QByteArray &output); - - struct Data : BaseAspect::Data - { - QString currentBrowser; - }; - -private: - QComboBox *m_webBrowserComboBox = nullptr; - QString m_currentBrowser; - WebBrowserEntries m_availableBrowsers; -}; - -} // namespace Internal -} // namespace Webassembly