2022-08-19 15:59:36 +02:00
|
|
|
// Copyright (C) 2019 The Qt Company Ltd.
|
|
|
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
2019-07-12 13:40:00 +02:00
|
|
|
|
|
|
|
|
#include "webassemblyrunconfigurationaspects.h"
|
|
|
|
|
|
|
|
|
|
#include <projectexplorer/buildconfiguration.h>
|
|
|
|
|
#include <projectexplorer/runcontrol.h>
|
|
|
|
|
#include <projectexplorer/target.h>
|
|
|
|
|
|
2020-09-18 12:11:40 +02:00
|
|
|
#include <utils/layoutbuilder.h>
|
2021-11-03 17:54:53 +01:00
|
|
|
#include <utils/qtcprocess.h>
|
2020-09-18 12:11:40 +02:00
|
|
|
|
2019-07-12 13:40:00 +02:00
|
|
|
#include <QComboBox>
|
2022-04-22 13:55:55 +02:00
|
|
|
#include <QTextStream>
|
2020-09-18 12:11:40 +02:00
|
|
|
|
2022-01-12 22:55:10 +01:00
|
|
|
#ifdef WITH_TESTS
|
|
|
|
|
# include <QTest>
|
|
|
|
|
# include "webassemblyplugin.h"
|
|
|
|
|
#endif // WITH_TESTS
|
|
|
|
|
|
2020-09-18 12:11:40 +02:00
|
|
|
using namespace Utils;
|
2019-07-12 13:40:00 +02:00
|
|
|
|
|
|
|
|
namespace WebAssembly {
|
|
|
|
|
namespace Internal {
|
|
|
|
|
|
|
|
|
|
static const char BROWSER_KEY[] = "WASM.WebBrowserSelectionAspect.Browser";
|
|
|
|
|
|
2022-01-12 22:55:10 +01:00
|
|
|
static WebBrowserEntries parseEmrunOutput(const QByteArray &output)
|
2019-07-12 13:40:00 +02:00
|
|
|
{
|
2022-01-12 22:55:10 +01:00
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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");
|
|
|
|
|
|
|
|
|
|
QtcProcess browserLister;
|
|
|
|
|
browserLister.setEnvironment(environment);
|
|
|
|
|
browserLister.setCommand({emrunPath, {"--list_browsers"}});
|
|
|
|
|
browserLister.start();
|
|
|
|
|
|
|
|
|
|
if (browserLister.waitForFinished())
|
|
|
|
|
result.append(parseEmrunOutput(browserLister.readAllStandardOutput()));
|
2019-07-12 13:40:00 +02:00
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WebBrowserSelectionAspect::WebBrowserSelectionAspect(ProjectExplorer::Target *target)
|
2022-01-12 22:55:10 +01:00
|
|
|
: m_availableBrowsers(emrunBrowsers(target))
|
2019-07-12 13:40:00 +02:00
|
|
|
{
|
2022-01-12 22:55:10 +01:00
|
|
|
if (!m_availableBrowsers.isEmpty()) {
|
|
|
|
|
const int defaultIndex = qBound(0, m_availableBrowsers.count() - 1, 1);
|
|
|
|
|
m_currentBrowser = m_availableBrowsers.at(defaultIndex).first;
|
|
|
|
|
}
|
2021-07-02 15:02:12 +02:00
|
|
|
setDisplayName(tr("Web Browser"));
|
2019-07-12 13:40:00 +02:00
|
|
|
setId("WebBrowserAspect");
|
|
|
|
|
setSettingsKey("RunConfiguration.WebBrowser");
|
2022-04-08 11:35:54 +02:00
|
|
|
|
|
|
|
|
addDataExtractor(this, &WebBrowserSelectionAspect::currentBrowser, &Data::currentBrowser);
|
2019-07-12 13:40:00 +02:00
|
|
|
}
|
|
|
|
|
|
2020-09-18 12:11:40 +02:00
|
|
|
void WebBrowserSelectionAspect::addToLayout(LayoutBuilder &builder)
|
2019-07-12 13:40:00 +02:00
|
|
|
{
|
|
|
|
|
QTC_CHECK(!m_webBrowserComboBox);
|
2019-10-15 17:20:51 +02:00
|
|
|
m_webBrowserComboBox = new QComboBox;
|
2022-01-12 22:55:10 +01:00
|
|
|
for (const WebBrowserEntry &be : m_availableBrowsers)
|
|
|
|
|
m_webBrowserComboBox->addItem(be.second, be.first);
|
|
|
|
|
m_webBrowserComboBox->setCurrentIndex(m_webBrowserComboBox->findData(m_currentBrowser));
|
2022-07-19 22:51:32 +02:00
|
|
|
connect(m_webBrowserComboBox, &QComboBox::currentIndexChanged, this, [this] {
|
|
|
|
|
m_currentBrowser = m_webBrowserComboBox->currentData().toString();
|
|
|
|
|
emit changed();
|
|
|
|
|
});
|
2020-09-18 04:54:41 +02:00
|
|
|
builder.addItems({tr("Web browser:"), m_webBrowserComboBox});
|
2019-07-12 13:40:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WebBrowserSelectionAspect::fromMap(const QVariantMap &map)
|
|
|
|
|
{
|
2019-10-25 19:48:48 +02:00
|
|
|
if (!m_availableBrowsers.isEmpty())
|
2022-01-12 22:55:10 +01:00
|
|
|
m_currentBrowser = map.value(BROWSER_KEY, m_availableBrowsers.first().first).toString();
|
2019-07-12 13:40:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WebBrowserSelectionAspect::toMap(QVariantMap &map) const
|
|
|
|
|
{
|
|
|
|
|
map.insert(BROWSER_KEY, m_currentBrowser);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString WebBrowserSelectionAspect::currentBrowser() const
|
|
|
|
|
{
|
|
|
|
|
return m_currentBrowser;
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-12 22:55:10 +01:00
|
|
|
// 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
|
|
|
|
|
|
2019-07-12 13:40:00 +02:00
|
|
|
} // namespace Internal
|
|
|
|
|
} // namespace Webassembly
|