multiple fixes related to all nodejs features

This commit is contained in:
Martin Rotter 2024-04-25 13:24:52 +02:00
parent 32e8f1f2a0
commit d1b9039bba
12 changed files with 103 additions and 93 deletions

View File

@ -107,7 +107,7 @@ void WebBrowser::createConnections() {
connect(qApp->web()->readability(), &Readability::errorOnHtmlReadabiliting, this, &WebBrowser::readabilityFailed);
connect(qApp->web()->articleParse(), &ArticleParse::articleParsed, this, &WebBrowser::setFullArticleHtml);
connect(qApp->web()->articleParse(), &ArticleParse::errorOnArticlePArsing, this, &WebBrowser::fullArticleFailed);
connect(qApp->web()->articleParse(), &ArticleParse::errorOnArticleParsing, this, &WebBrowser::fullArticleFailed);
}
void WebBrowser::updateUrl(const QUrl& url) {
@ -306,13 +306,13 @@ void WebBrowser::newWindowRequested(WebViewer* viewer) {
qApp->mainForm()->tabWidget()->addBrowser(false, false, browser);
}
void WebBrowser::setReadabledHtml(QObject* sndr, const QString& better_html) {
void WebBrowser::setReadabledHtml(const QObject* sndr, const QString& better_html) {
if (sndr == this && !better_html.isEmpty()) {
m_webView->setReadabledHtml(better_html, m_webView->url());
}
}
void WebBrowser::readabilityFailed(QObject* sndr, const QString& error) {
void WebBrowser::readabilityFailed(const QObject* sndr, const QString& error) {
if (sndr == this && !error.isEmpty()) {
m_webView->setReadabledHtml(error, m_webView->url());
}
@ -344,7 +344,7 @@ Message WebBrowser::messageFromExtractor(const QJsonDocument& extracted_data) co
return msg;
}
void WebBrowser::setFullArticleHtml(QObject* sndr, const QString& url, const QString& json_answer) {
void WebBrowser::setFullArticleHtml(const QObject* sndr, const QString& url, const QString& json_answer) {
if (sndr == this && !json_answer.isEmpty()) {
QJsonDocument json_doc = QJsonDocument::fromJson(json_answer.toUtf8());
@ -385,7 +385,7 @@ void WebBrowser::setFullArticleHtml(QObject* sndr, const QString& url, const QSt
}
}
void WebBrowser::fullArticleFailed(QObject* sndr, const QString& error) {
void WebBrowser::fullArticleFailed(const QObject* sndr, const QString& error) {
if (sndr == this && !error.isEmpty()) {
m_webView->setReadabledHtml(error, m_webView->url());
}

View File

@ -76,11 +76,11 @@ class RSSGUARD_DLLSPEC WebBrowser : public TabContent {
void readabilePage();
void getFullArticle();
void setReadabledHtml(QObject* sndr, const QString& better_html);
void readabilityFailed(QObject* sndr, const QString& error);
void setReadabledHtml(const QObject* sndr, const QString& better_html);
void readabilityFailed(const QObject* sndr, const QString& error);
void setFullArticleHtml(QObject* sndr, const QString &url, const QString& json_answer);
void fullArticleFailed(QObject* sndr, const QString& error);
void setFullArticleHtml(const QObject* sndr, const QString& url, const QString& json_answer);
void fullArticleFailed(const QObject* sndr, const QString& error);
signals:
void windowCloseRequested();

View File

@ -1369,19 +1369,25 @@ void Application::fillCmdArgumentsParser(QCommandLineParser& parser) {
QSL("[url-1 ... url-n]"));
}
void Application::onNodeJsPackageUpdateError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error) {
void Application::onNodeJsPackageUpdateError(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
const QString& error) {
Q_UNUSED(sndr)
qApp->showGuiMessage(Notification::Event::NodePackageFailedToUpdate,
{{},
tr("Packages %1 were NOT updated because of error: %2.")
{tr("Node.js"),
tr("Packages were NOT updated because of error: %2. Affected packages:\n%1")
.arg(NodeJs::packagesToString(pkgs), error),
QSystemTrayIcon::MessageIcon::Critical});
}
void Application::onNodeJsPackageInstalled(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date) {
void Application::onNodeJsPackageInstalled(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
bool already_up_to_date) {
Q_UNUSED(sndr)
if (!already_up_to_date) {
qApp->showGuiMessage(Notification::Event::NodePackageUpdated,
{{},
tr("Packages %1 were updated.").arg(NodeJs::packagesToString(pkgs)),
{tr("Node.js"),
tr("These packages were installed/updated:\n%1").arg(NodeJs::packagesToString(pkgs)),
QSystemTrayIcon::MessageIcon::Information});
}
}

View File

@ -218,8 +218,12 @@ class RSSGUARD_DLLSPEC Application : public SingleApplication {
void loadMessageToFeedAndArticleList(Feed* feed, const Message& message);
void fillCmdArgumentsParser(QCommandLineParser& parser);
void onNodeJsPackageUpdateError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error);
void onNodeJsPackageInstalled(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date);
void onNodeJsPackageUpdateError(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
const QString& error);
void onNodeJsPackageInstalled(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
bool already_up_to_date);
void onCommitData(QSessionManager& manager);
void onSaveState(QSessionManager& manager);
void onAboutToQuit();

View File

@ -110,7 +110,7 @@ NodeJs::PackageStatus NodeJs::packageStatus(const PackageMetadata& pkg) const {
}
}
void NodeJs::installUpdatePackages(const QList<PackageMetadata>& pkgs) {
void NodeJs::installUpdatePackages(const QObject* sndr, const QList<PackageMetadata>& pkgs) {
QList<PackageMetadata> to_install;
QStringList desc;
@ -130,19 +130,17 @@ void NodeJs::installUpdatePackages(const QList<PackageMetadata>& pkgs) {
}
}
catch (const ApplicationException& ex) {
emit packageError(pkgs, ex.message());
emit packageError(sndr, pkgs, ex.message());
return;
}
}
if (to_install.isEmpty()) {
qDebugNN << LOGSEC_NODEJS << "Packages" << QUOTE_W_SPACE(desc.join(QL1S(", "))) << "are up-to-date.";
emit packageInstalledUpdated(pkgs, true);
emit packageInstalledUpdated(sndr, pkgs, true);
}
else {
installPackages(pkgs);
installPackages(sndr, pkgs);
}
}
@ -150,15 +148,20 @@ QString NodeJs::packagesToString(const QList<PackageMetadata>& pkgs) {
QStringList desc;
for (const PackageMetadata& mt : pkgs) {
desc << QSL("%1@%2").arg(mt.m_name, mt.m_version);
desc << QSL("\u2022 %1@%2").arg(mt.m_name, mt.m_version);
}
return desc.join(QL1S(", "));
return desc.join(QL1S("\n"));
}
void NodeJs::installPackages(const QList<PackageMetadata>& pkgs) {
void NodeJs::installPackages(const QObject* sndr, const QList<PackageMetadata>& pkgs) {
QStringList to_install;
qApp->showGuiMessage(Notification::Event::NodePackageUpdated,
GuiMessage(tr("Node.js"),
tr("Some packages are missing and will be installed or updated:\n%1")
.arg(packagesToString(pkgs))));
try {
for (const PackageMetadata& mt : pkgs) {
to_install.append(QSL("%1@%2").arg(mt.m_name, mt.m_version));
@ -169,32 +172,31 @@ void NodeJs::installPackages(const QList<PackageMetadata>& pkgs) {
connect(proc,
QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
this,
[pkgs, this](int exit_code, QProcess::ExitStatus status) {
QProcess* sndr = qobject_cast<QProcess*>(sender());
[=](int exit_code, QProcess::ExitStatus status) {
QProcess* proc_sndr = qobject_cast<QProcess*>(sender());
if (exit_code != EXIT_SUCCESS || status == QProcess::ExitStatus::CrashExit) {
qCriticalNN << LOGSEC_NODEJS << "Error when installing packages"
<< QUOTE_W_SPACE_DOT(packagesToString(pkgs))
<< " Exit code:" << QUOTE_W_SPACE_DOT(exit_code)
<< " Message:" << QUOTE_W_SPACE_DOT(sndr->readAllStandardError());
qCriticalNN << LOGSEC_NODEJS << "Error when installing packages\n"
<< packagesToString(pkgs) << "\nExit code:" << QUOTE_W_SPACE_DOT(exit_code)
<< " Message:" << QUOTE_W_SPACE_DOT(proc_sndr->readAllStandardError());
emit packageError(pkgs, sndr->errorString());
emit packageError(sndr, pkgs, proc_sndr->errorString());
}
else {
qDebugNN << LOGSEC_NODEJS << "Installed/updated packages" << QUOTE_W_SPACE(packagesToString(pkgs));
emit packageInstalledUpdated(pkgs, false);
emit packageInstalledUpdated(sndr, pkgs, false);
}
});
connect(proc, &QProcess::errorOccurred, this, [pkgs, this](QProcess::ProcessError error) {
QProcess* sndr = qobject_cast<QProcess*>(sender());
qCriticalNN << LOGSEC_NODEJS << "Error when installing packages" << QUOTE_W_SPACE_DOT(packagesToString(pkgs))
<< " Message:" << QUOTE_W_SPACE_DOT(error);
qCriticalNN << LOGSEC_NODEJS << "Error when installing packages\n"
<< packagesToString(pkgs) << "\nMessage:" << QUOTE_W_SPACE_DOT(error);
emit packageError(pkgs, sndr->errorString());
emit packageError(sndr, pkgs, sndr->errorString());
});
qDebugNN << LOGSEC_NODEJS << "Installing packages" << QUOTE_W_SPACE_DOT(packagesToString(pkgs));
qDebugNN << LOGSEC_NODEJS << "Installing packages\n" << packagesToString(pkgs);
to_install.prepend(QSL("--production"));
to_install.prepend(QSL("install"));
@ -208,6 +210,6 @@ void NodeJs::installPackages(const QList<PackageMetadata>& pkgs) {
qCriticalNN << LOGSEC_NODEJS << "Packages" << QUOTE_W_SPACE(to_install)
<< "were not installed, error:" << QUOTE_W_SPACE_DOT(ex.message());
emit packageError(pkgs, ex.message());
emit packageError(sndr, pkgs, ex.message());
}
}

View File

@ -61,15 +61,15 @@ class NodeJs : public QObject {
// If package IS installed but out-of-date, it is updated to desired versions.
//
// NOTE: https://docs.npmjs.com/cli/v8/commands/npm-install
void installUpdatePackages(const QList<PackageMetadata>& pkgs);
void installUpdatePackages(const QObject* sndr, const QList<PackageMetadata>& pkgs);
void installPackages(const QList<PackageMetadata>& pkgs);
void installPackages(const QObject* sndr, const QList<PackageMetadata>& pkgs);
static QString packagesToString(const QList<PackageMetadata>& pkgs);
signals:
void packageError(const QList<PackageMetadata>& pkgs, const QString& error);
void packageInstalledUpdated(const QList<PackageMetadata>& pkgs, bool already_up_to_date);
void packageError(const QObject* sndr, const QList<PackageMetadata>& pkgs, const QString& error);
void packageInstalledUpdated(const QObject* sndr, const QList<PackageMetadata>& pkgs, bool already_up_to_date);
private:
Settings* m_settings;

View File

@ -106,7 +106,7 @@ void AdBlockManager::setEnabled(bool enabled) {
if (m_enabled) {
if (!m_installing) {
m_installing = true;
qApp->nodejs()->installUpdatePackages({{QSL(CLIQZ_ADBLOCKED_PACKAGE), QSL(CLIQZ_ADBLOCKED_VERSION)}});
qApp->nodejs()->installUpdatePackages(this, {{QSL(CLIQZ_ADBLOCKED_PACKAGE), QSL(CLIQZ_ADBLOCKED_VERSION)}});
}
}
else {
@ -177,7 +177,9 @@ void AdBlockManager::showDialog() {
AdBlockDialog(qApp->mainFormWidget()).exec();
}
void AdBlockManager::onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date) {
void AdBlockManager::onPackageReady(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
bool already_up_to_date) {
Q_UNUSED(already_up_to_date)
bool concerns_adblock = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) {
@ -201,7 +203,9 @@ void AdBlockManager::onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs,
}
}
void AdBlockManager::onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error) {
void AdBlockManager::onPackageError(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
const QString& error) {
bool concerns_adblock = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) {
return pkg.m_name == QSL(CLIQZ_ADBLOCKED_PACKAGE);
});

View File

@ -69,8 +69,8 @@ class AdBlockManager : public QObject {
void processTerminated();
private slots:
void onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date);
void onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error);
void onPackageReady(const QObject* sndr, const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date);
void onPackageError(const QObject* sndr, const QList<NodeJs::PackageMetadata>& pkgs, const QString& error);
void onServerProcessFinished(int exit_code, QProcess::ExitStatus exit_status);
private:

View File

@ -19,7 +19,9 @@ ArticleParse::ArticleParse(QObject* parent) : QObject{parent}, m_modulesInstalli
connect(qApp->nodejs(), &NodeJs::packageError, this, &ArticleParse::onPackageError);
}
void ArticleParse::onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date) {
void ArticleParse::onPackageReady(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
bool already_up_to_date) {
Q_UNUSED(already_up_to_date)
bool concerns_extractor = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) {
@ -40,10 +42,12 @@ void ArticleParse::onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, bo
{true, true, false});
// Emit this just to allow the action again for user.
emit articleParsed(nullptr, {}, tr("Packages for article-extractor are installed. You can now use this feature!"));
emit errorOnArticleParsing(sndr, tr("Packages for article-extractor are installed. You can now use this feature!"));
}
void ArticleParse::onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error) {
void ArticleParse::onPackageError(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
const QString& error) {
bool concerns_extractor = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) {
return pkg.m_name == QSL(EXTRACTOR_PACKAGE);
});
@ -61,9 +65,8 @@ void ArticleParse::onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, co
{true, true, false});
// Emit this just to allow readability again for user.
emit articleParsed(nullptr,
{},
tr("Packages for article-extractor are NOT installed. There is error: %1").arg(error));
emit errorOnArticleParsing(sndr,
tr("Packages for article-extractor are NOT installed. There is error: %1").arg(error));
}
void ArticleParse::parseArticle(QObject* sndr, const QString& url) {
@ -85,15 +88,8 @@ void ArticleParse::parseArticle(QObject* sndr, const QString& url) {
if (!m_modulesInstalling) {
// We make sure to update modules.
m_modulesInstalling = true;
qApp->showGuiMessage(Notification::Event::NodePackageUpdated,
{tr("Node.js libraries not installed"),
tr("%1 will now install some needed libraries, this will take only a few seconds. "
"You will be notified when installation is complete.")
.arg(QSL(APP_NAME)),
QSystemTrayIcon::MessageIcon::Warning},
{true, true, false});
qApp->nodejs()->installUpdatePackages({{QSL(EXTRACTOR_PACKAGE), QSL(EXTRACTOR_VERSION)},
qApp->nodejs()->installUpdatePackages(sndr,
{{QSL(EXTRACTOR_PACKAGE), QSL(EXTRACTOR_VERSION)},
{QSL(FETCH_PACKAGE), QSL(FETCH_VERSION)}});
}
@ -134,7 +130,7 @@ void ArticleParse::parseArticle(QObject* sndr, const QString& url) {
qApp->nodejs()->runScript(proc, m_scriptFilename, {url});
}
void ArticleParse::onParsingFinished(QObject* sndr,
void ArticleParse::onParsingFinished(const QObject *sndr,
const QString& url,
int exit_code,
QProcess::ExitStatus exit_status) {
@ -145,7 +141,7 @@ void ArticleParse::onParsingFinished(QObject* sndr,
}
else {
QString err = QString::fromUtf8(proc->readAllStandardError());
emit errorOnArticlePArsing(sndr, err);
emit errorOnArticleParsing(sndr, err);
}
proc->deleteLater();

View File

@ -17,13 +17,13 @@ class ArticleParse : public QObject {
void parseArticle(QObject* sndr, const QString& url);
private slots:
void onParsingFinished(QObject* sndr, const QString& url, int exit_code, QProcess::ExitStatus exit_status);
void onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date);
void onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error);
void onParsingFinished(const QObject* sndr, const QString& url, int exit_code, QProcess::ExitStatus exit_status);
void onPackageReady(const QObject* sndr, const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date);
void onPackageError(const QObject* sndr, const QList<NodeJs::PackageMetadata>& pkgs, const QString& error);
signals:
void articleParsed(QObject* sndr, const QString& url, const QString& better_html);
void errorOnArticlePArsing(QObject* sndr, const QString& error);
void articleParsed(const QObject* sndr, const QString& url, const QString& better_html);
void errorOnArticleParsing(const QObject* sndr, const QString& error);
private:
bool m_modulesInstalling;

View File

@ -19,7 +19,9 @@ Readability::Readability(QObject* parent) : QObject{parent}, m_modulesInstalling
connect(qApp->nodejs(), &NodeJs::packageError, this, &Readability::onPackageError);
}
void Readability::onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date) {
void Readability::onPackageReady(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
bool already_up_to_date) {
Q_UNUSED(already_up_to_date)
bool concerns_readability = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) {
@ -40,10 +42,12 @@ void Readability::onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, boo
{true, true, false});
// Emit this just to allow readability again for user.
emit htmlReadabled(nullptr, tr("Packages for reader mode are installed. You can now use reader mode!"));
emit errorOnHtmlReadabiliting(sndr, tr("Packages for reader mode are installed. You can now use reader mode!"));
}
void Readability::onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error) {
void Readability::onPackageError(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
const QString& error) {
bool concerns_readability = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) {
return pkg.m_name == QSL(READABILITY_PACKAGE);
});
@ -61,29 +65,22 @@ void Readability::onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, con
{true, true, false});
// Emit this just to allow readability again for user.
emit htmlReadabled(nullptr, tr("Packages for reader mode are NOT installed. There is error: %1").arg(error));
emit errorOnHtmlReadabiliting(sndr, tr("Packages for reader mode are NOT installed. There is error: %1").arg(error));
}
void Readability::makeHtmlReadable(QObject* sndr, const QString& html, const QString& base_url) {
if (!m_modulesInstalled) {
try {
NodeJs::PackageStatus stReadability =
NodeJs::PackageStatus st_readability =
qApp->nodejs()->packageStatus({QSL(READABILITY_PACKAGE), QSL(READABILITY_VERSION)});
NodeJs::PackageStatus stJsdom = qApp->nodejs()->packageStatus({QSL(JSDOM_PACKAGE), QSL(JSDOM_VERSION)});
NodeJs::PackageStatus st_jsdom = qApp->nodejs()->packageStatus({QSL(JSDOM_PACKAGE), QSL(JSDOM_VERSION)});
if (stReadability != NodeJs::PackageStatus::UpToDate || stJsdom != NodeJs::PackageStatus::UpToDate) {
if (st_readability != NodeJs::PackageStatus::UpToDate || st_jsdom != NodeJs::PackageStatus::UpToDate) {
if (!m_modulesInstalling) {
// We make sure to update modules.
m_modulesInstalling = true;
qApp->showGuiMessage(Notification::Event::NodePackageUpdated,
{tr("Node.js libraries not installed"),
tr("%1 will now install some needed libraries, this will take only a few seconds. "
"You will be notified when installation is complete.")
.arg(QSL(APP_NAME)),
QSystemTrayIcon::MessageIcon::Warning},
{true, true, false});
qApp->nodejs()->installUpdatePackages({{QSL(READABILITY_PACKAGE), QSL(READABILITY_VERSION)},
qApp->nodejs()->installUpdatePackages(sndr,
{{QSL(READABILITY_PACKAGE), QSL(READABILITY_VERSION)},
{QSL(JSDOM_PACKAGE), QSL(JSDOM_VERSION)}});
}
@ -104,9 +101,10 @@ void Readability::makeHtmlReadable(QObject* sndr, const QString& html, const QSt
qCriticalNN << LOGSEC_CORE << "Failed to check for Node.js package status:" << QUOTE_W_SPACE_DOT(ex.message());
// Emit this just to allow readability again for user.
emit htmlReadabled(sndr,
tr("Node.js is not configured properly. Go to \"Settings\" -> \"Node.js\" and check "
"if your Node.js is properly configured."));
emit
errorOnHtmlReadabiliting(sndr,
tr("Node.js is not configured properly. Go to \"Settings\" -> \"Node.js\" and check "
"if your Node.js is properly configured."));
}
}

View File

@ -18,12 +18,12 @@ class Readability : public QObject {
private slots:
void onReadabilityFinished(QObject* sndr, int exit_code, QProcess::ExitStatus exit_status);
void onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date);
void onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error);
void onPackageReady(const QObject* sndr, const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date);
void onPackageError(const QObject* sndr, const QList<NodeJs::PackageMetadata>& pkgs, const QString& error);
signals:
void htmlReadabled(QObject* sndr, const QString& better_html);
void errorOnHtmlReadabiliting(QObject* sndr, const QString& error);
void htmlReadabled(const QObject* sndr, const QString& better_html);
void errorOnHtmlReadabiliting(const QObject* sndr, const QString& error);
private:
bool m_modulesInstalling;