WebAssembly: Improve browser selection combobox of run configuation

This adds a "Default Browser" entry to the browser selection combobox in
WebAssembly' run configuration. Choosing that omits the "--browser"
parameter and let's emrun determine which browser to launch (should by
the system default browser).

In order to implement that, the combobox items now got user data in
addition to have display data. The parsing of emrun's output was
extended to retrieve the long form of a browser name as display data:
"Mozilla Firefox 96.0.0.8041" instead of just "firefox".
The parsing of emrun's outout received a dedicated plugin test.

Turning the result in parseEmrunOutput() non-static fixed
QTCREATORBUG-26562

Fixes: QTCREATORBUG-25028
Fixes: QTCREATORBUG-26559
Change-Id: I18891b88b063903d1a9eeb88a6c906e596e561c1
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Alessandro Portale
2022-01-12 22:55:10 +01:00
parent 4d9245b001
commit 0bbc465f61
4 changed files with 118 additions and 41 deletions

View File

@@ -34,6 +34,11 @@
#include <QComboBox>
#ifdef WITH_TESTS
# include <QTest>
# include "webassemblyplugin.h"
#endif // WITH_TESTS
using namespace Utils;
namespace WebAssembly {
@@ -41,40 +46,46 @@ namespace Internal {
static const char BROWSER_KEY[] = "WASM.WebBrowserSelectionAspect.Browser";
static QStringList detectedBrowsers(ProjectExplorer::Target *target)
static WebBrowserEntries parseEmrunOutput(const QByteArray &output)
{
static QStringList result;
if (result.isEmpty()) {
if (auto bc = target->activeBuildConfiguration()) {
const Utils::Environment environment = bc->environment();
const Utils::FilePath emrunPath = environment.searchInPath("emrun");
WebBrowserEntries result;
QTextStream ts(output);
QString line;
const QRegularExpression regExp(" - (.*):(.*)");
while (ts.readLineInto(&line)) {
const QRegularExpressionMatch match = regExp.match(line);
if (match.hasMatch())
result << qMakePair(match.captured(1), match.captured(2).trimmed());
}
return result;
}
QtcProcess browserLister;
browserLister.setEnvironment(environment);
browserLister.setCommand({emrunPath, {"--list_browsers"}});
browserLister.start();
static WebBrowserEntries emrunBrowsers(ProjectExplorer::Target *target)
{
WebBrowserEntries result;
result.append(qMakePair(QString(), WebBrowserSelectionAspect::tr("Default Browser")));
if (auto bc = target->activeBuildConfiguration()) {
const Utils::Environment environment = bc->environment();
const Utils::FilePath emrunPath = environment.searchInPath("emrun");
if (browserLister.waitForFinished()) {
const QByteArray output = browserLister.readAllStandardOutput();
QTextStream ts(output);
QString line;
const QRegularExpression regExp(" - (.*):.*");
while (ts.readLineInto(&line)) {
const QRegularExpressionMatch match = regExp.match(line);
if (match.hasMatch())
result << match.captured(1);
}
}
}
QtcProcess browserLister;
browserLister.setEnvironment(environment);
browserLister.setCommand({emrunPath, {"--list_browsers"}});
browserLister.start();
if (browserLister.waitForFinished())
result.append(parseEmrunOutput(browserLister.readAllStandardOutput()));
}
return result;
}
WebBrowserSelectionAspect::WebBrowserSelectionAspect(ProjectExplorer::Target *target)
: m_availableBrowsers(detectedBrowsers(target))
: m_availableBrowsers(emrunBrowsers(target))
{
if (!m_availableBrowsers.isEmpty())
m_currentBrowser = m_availableBrowsers.first();
if (!m_availableBrowsers.isEmpty()) {
const int defaultIndex = qBound(0, m_availableBrowsers.count() - 1, 1);
m_currentBrowser = m_availableBrowsers.at(defaultIndex).first;
}
setDisplayName(tr("Web Browser"));
setId("WebBrowserAspect");
setSettingsKey("RunConfiguration.WebBrowser");
@@ -84,11 +95,12 @@ void WebBrowserSelectionAspect::addToLayout(LayoutBuilder &builder)
{
QTC_CHECK(!m_webBrowserComboBox);
m_webBrowserComboBox = new QComboBox;
m_webBrowserComboBox->addItems(m_availableBrowsers);
m_webBrowserComboBox->setCurrentText(m_currentBrowser);
connect(m_webBrowserComboBox, &QComboBox::currentTextChanged,
[this](const QString &selectedBrowser){
m_currentBrowser = selectedBrowser;
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]() {
m_currentBrowser = m_webBrowserComboBox->currentData().toString();
emit changed();
});
builder.addItems({tr("Web browser:"), m_webBrowserComboBox});
@@ -97,7 +109,7 @@ void WebBrowserSelectionAspect::addToLayout(LayoutBuilder &builder)
void WebBrowserSelectionAspect::fromMap(const QVariantMap &map)
{
if (!m_availableBrowsers.isEmpty())
m_currentBrowser = map.value(BROWSER_KEY, m_availableBrowsers.first()).toString();
m_currentBrowser = map.value(BROWSER_KEY, m_availableBrowsers.first().first).toString();
}
void WebBrowserSelectionAspect::toMap(QVariantMap &map) const
@@ -110,5 +122,58 @@ QString WebBrowserSelectionAspect::currentBrowser() const
return m_currentBrowser;
}
// Unit tests:
#ifdef WITH_TESTS
void testEmrunBrowserListParsing();
void testEmrunBrowserListParsing_data();
void WebAssemblyPlugin::testEmrunBrowserListParsing()
{
QFETCH(QByteArray, emrunOutput);
QFETCH(WebBrowserEntries, expectedBrowsers);
QCOMPARE(parseEmrunOutput(emrunOutput), expectedBrowsers);
}
void WebAssemblyPlugin::testEmrunBrowserListParsing_data()
{
QTest::addColumn<QByteArray>("emrunOutput");
QTest::addColumn<WebBrowserEntries>("expectedBrowsers");
QTest::newRow("emsdk 1.39.8")
// Output of "emrun --list_browsers"
<< QByteArray(
R"(emrun has automatically found the following browsers in the default install locations on the system:
- firefox: Mozilla Firefox
- chrome: Google Chrome
You can pass the --browser <id> option to launch with the given browser above.
Even if your browser was not detected, you can use --browser /path/to/browser/executable to launch with that browser.
)")
<< WebBrowserEntries({
qMakePair(QLatin1String("firefox"), QLatin1String("Mozilla Firefox")),
qMakePair(QLatin1String("chrome"), QLatin1String("Google Chrome"))});
QTest::newRow("emsdk 2.0.14")
<< QByteArray(
R"(emrun has automatically found the following browsers in the default install locations on the system:
- firefox: Mozilla Firefox 96.0.0.8041
- chrome: Google Chrome 97.0.4692.71
You can pass the --browser <id> option to launch with the given browser above.
Even if your browser was not detected, you can use --browser /path/to/browser/executable to launch with that browser.
)")
<< WebBrowserEntries({
qMakePair(QLatin1String("firefox"), QLatin1String("Mozilla Firefox 96.0.0.8041")),
qMakePair(QLatin1String("chrome"), QLatin1String("Google Chrome 97.0.4692.71"))});
}
#endif // WITH_TESTS
} // namespace Internal
} // namespace Webassembly