forked from qt-creator/qt-creator
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: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
@@ -10,7 +10,6 @@ add_qtc_plugin(WebAssembly
|
|||||||
webassemblyplugin.cpp webassemblyplugin.h
|
webassemblyplugin.cpp webassemblyplugin.h
|
||||||
webassemblyqtversion.cpp webassemblyqtversion.h
|
webassemblyqtversion.cpp webassemblyqtversion.h
|
||||||
webassemblyrunconfiguration.cpp webassemblyrunconfiguration.h
|
webassemblyrunconfiguration.cpp webassemblyrunconfiguration.h
|
||||||
webassemblyrunconfigurationaspects.cpp webassemblyrunconfigurationaspects.h
|
|
||||||
webassemblysettings.cpp webassemblysettings.h
|
webassemblysettings.cpp webassemblysettings.h
|
||||||
webassemblytoolchain.cpp webassemblytoolchain.h
|
webassemblytoolchain.cpp webassemblytoolchain.h
|
||||||
webassemblytr.h
|
webassemblytr.h
|
||||||
|
@@ -25,8 +25,6 @@ QtcPlugin {
|
|||||||
"webassemblyqtversion.h",
|
"webassemblyqtversion.h",
|
||||||
"webassemblyrunconfiguration.cpp",
|
"webassemblyrunconfiguration.cpp",
|
||||||
"webassemblyrunconfiguration.h",
|
"webassemblyrunconfiguration.h",
|
||||||
"webassemblyrunconfigurationaspects.cpp",
|
|
||||||
"webassemblyrunconfigurationaspects.h",
|
|
||||||
"webassemblysettings.cpp",
|
"webassemblysettings.cpp",
|
||||||
"webassemblysettings.h",
|
"webassemblysettings.h",
|
||||||
"webassemblytoolchain.cpp",
|
"webassemblytoolchain.cpp",
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
#include "webassembly_test.h"
|
#include "webassembly_test.h"
|
||||||
|
|
||||||
#include "webassemblyemsdk.h"
|
#include "webassemblyemsdk.h"
|
||||||
#include "webassemblyrunconfigurationaspects.h"
|
#include "webassemblyrunconfiguration.h"
|
||||||
|
|
||||||
#include <utils/environment.h>
|
#include <utils/environment.h>
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ void WebAssemblyTest::testEmrunBrowserListParsing()
|
|||||||
QFETCH(QByteArray, emrunOutput);
|
QFETCH(QByteArray, emrunOutput);
|
||||||
QFETCH(WebBrowserEntries, expectedBrowsers);
|
QFETCH(WebBrowserEntries, expectedBrowsers);
|
||||||
|
|
||||||
QCOMPARE(WebBrowserSelectionAspect::parseEmrunOutput(emrunOutput), expectedBrowsers);
|
QCOMPARE(parseEmrunOutput(emrunOutput), expectedBrowsers);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebAssemblyTest::testEmrunBrowserListParsing_data()
|
void WebAssemblyTest::testEmrunBrowserListParsing_data()
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
// Copyright (C) 2020 The Qt Company Ltd.
|
// Copyright (C) 2020 The Qt Company Ltd.
|
||||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
#include "webassemblyconstants.h"
|
|
||||||
#include "webassemblyrunconfiguration.h"
|
#include "webassemblyrunconfiguration.h"
|
||||||
#include "webassemblyrunconfigurationaspects.h"
|
|
||||||
|
#include "webassemblyconstants.h"
|
||||||
#include "webassemblytr.h"
|
#include "webassemblytr.h"
|
||||||
|
|
||||||
#include <projectexplorer/buildconfiguration.h>
|
#include <projectexplorer/buildconfiguration.h>
|
||||||
@@ -12,14 +12,37 @@
|
|||||||
#include <projectexplorer/devicesupport/deviceusedportsgatherer.h>
|
#include <projectexplorer/devicesupport/deviceusedportsgatherer.h>
|
||||||
#include <projectexplorer/project.h>
|
#include <projectexplorer/project.h>
|
||||||
#include <projectexplorer/projectexplorerconstants.h>
|
#include <projectexplorer/projectexplorerconstants.h>
|
||||||
|
#include <projectexplorer/runconfigurationaspects.h>
|
||||||
#include <projectexplorer/runcontrol.h>
|
#include <projectexplorer/runcontrol.h>
|
||||||
#include <projectexplorer/target.h>
|
#include <projectexplorer/target.h>
|
||||||
|
|
||||||
|
#include <utils/layoutbuilder.h>
|
||||||
|
#include <utils/process.h>
|
||||||
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
|
#include <QComboBox>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
using namespace ProjectExplorer;
|
using namespace ProjectExplorer;
|
||||||
using namespace Utils;
|
using namespace Utils;
|
||||||
|
|
||||||
namespace WebAssembly::Internal {
|
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)
|
static FilePath pythonInterpreter(const Environment &env)
|
||||||
{
|
{
|
||||||
const QString emsdkPythonEnvVarKey("EMSDK_PYTHON");
|
const QString emsdkPythonEnvVarKey("EMSDK_PYTHON");
|
||||||
@@ -63,12 +86,94 @@ static CommandLine emrunCommand(const Target *target,
|
|||||||
return {};
|
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
|
// Runs a webassembly application via emscripten's "emrun" tool
|
||||||
// https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html
|
// https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html
|
||||||
class EmrunRunConfiguration : public ProjectExplorer::RunConfiguration
|
class EmrunRunConfiguration : public RunConfiguration
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
EmrunRunConfiguration(Target *target, Utils::Id id)
|
EmrunRunConfiguration(Target *target, Id id)
|
||||||
: RunConfiguration(target, id)
|
: RunConfiguration(target, id)
|
||||||
{
|
{
|
||||||
webBrowser.setTarget(target);
|
webBrowser.setTarget(target);
|
||||||
@@ -130,3 +235,5 @@ EmrunRunWorkerFactory::EmrunRunWorkerFactory()
|
|||||||
}
|
}
|
||||||
|
|
||||||
} // Webassembly::Internal
|
} // Webassembly::Internal
|
||||||
|
|
||||||
|
#include "webassemblyrunconfiguration.moc"
|
||||||
|
@@ -8,6 +8,12 @@
|
|||||||
|
|
||||||
namespace WebAssembly::Internal {
|
namespace WebAssembly::Internal {
|
||||||
|
|
||||||
|
using WebBrowserEntry = QPair<QString, QString>; // first: id, second: display name
|
||||||
|
using WebBrowserEntries = QList<WebBrowserEntry>;
|
||||||
|
|
||||||
|
WebBrowserEntries parseEmrunOutput(const QByteArray &output);
|
||||||
|
|
||||||
|
|
||||||
class EmrunRunConfigurationFactory final : public ProjectExplorer::RunConfigurationFactory
|
class EmrunRunConfigurationFactory final : public ProjectExplorer::RunConfigurationFactory
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@@ -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 <projectexplorer/buildconfiguration.h>
|
|
||||||
#include <projectexplorer/target.h>
|
|
||||||
|
|
||||||
#include <utils/layoutbuilder.h>
|
|
||||||
#include <utils/process.h>
|
|
||||||
#include <utils/qtcassert.h>
|
|
||||||
|
|
||||||
#include <QComboBox>
|
|
||||||
#include <QTextStream>
|
|
||||||
|
|
||||||
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
|
|
@@ -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 <projectexplorer/runconfigurationaspects.h>
|
|
||||||
|
|
||||||
QT_FORWARD_DECLARE_CLASS(QComboBox)
|
|
||||||
|
|
||||||
namespace WebAssembly {
|
|
||||||
namespace Internal {
|
|
||||||
|
|
||||||
using WebBrowserEntry = QPair<QString, QString>; // first: id, second: display name
|
|
||||||
using WebBrowserEntries = QList<WebBrowserEntry>;
|
|
||||||
|
|
||||||
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
|
|
Reference in New Issue
Block a user