integrate nodejs in a better way, fix APP_REVISION missing
This commit is contained in:
parent
da7ffc34a1
commit
b2343a0189
@ -164,6 +164,24 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Load git commit hash.
|
||||||
|
if(REVISION_FROM_GIT AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
|
||||||
|
execute_process(COMMAND "git" "rev-parse" "--short" "HEAD"
|
||||||
|
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
||||||
|
OUTPUT_VARIABLE APP_REVISION
|
||||||
|
ERROR_QUIET
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
|
||||||
|
message(STATUS "Detected git revision: '${APP_REVISION}'.")
|
||||||
|
else()
|
||||||
|
set(APP_REVISION "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT USE_WEBENGINE)
|
||||||
|
set(APP_REVISION "${APP_REVISION}-nowebengine")
|
||||||
|
endif()
|
||||||
|
|
||||||
# Pass common defines.
|
# Pass common defines.
|
||||||
add_compile_definitions(
|
add_compile_definitions(
|
||||||
APP_NAME="${APP_NAME}"
|
APP_NAME="${APP_NAME}"
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
<url type="donation">https://github.com/sponsors/martinrotter</url>
|
<url type="donation">https://github.com/sponsors/martinrotter</url>
|
||||||
<content_rating type="oars-1.1" />
|
<content_rating type="oars-1.1" />
|
||||||
<releases>
|
<releases>
|
||||||
<release version="4.1.2" date="2022-02-09"/>
|
<release version="4.1.2" date="2022-02-10"/>
|
||||||
</releases>
|
</releases>
|
||||||
<content_rating type="oars-1.0">
|
<content_rating type="oars-1.0">
|
||||||
<content_attribute id="violence-cartoon">none</content_attribute>
|
<content_attribute id="violence-cartoon">none</content_attribute>
|
||||||
|
@ -17,6 +17,7 @@ There is a [Discord server](https://discord.gg/7xbVMPPNqH) for user communicatio
|
|||||||
- [Built-in Web Browser with AdBlock](#webb)
|
- [Built-in Web Browser with AdBlock](#webb)
|
||||||
- [Minor Features](#mife)
|
- [Minor Features](#mife)
|
||||||
- [Files Downloader](#downl)
|
- [Files Downloader](#downl)
|
||||||
|
- [Node.js](#node)
|
||||||
- [Labels](#lbls)
|
- [Labels](#lbls)
|
||||||
- [Skins](#skin)
|
- [Skins](#skin)
|
||||||
- [GUI Tweaking](#guit)
|
- [GUI Tweaking](#guit)
|
||||||
@ -426,18 +427,13 @@ If you're not sure which version to use, **use the WebEngine-based RSS Guard**.
|
|||||||
#### AdBlock <a id="adbl"></a>
|
#### AdBlock <a id="adbl"></a>
|
||||||
[Web-based variant](#webb) of RSS Guard offers ad-blocking functionality via [Adblocker](https://github.com/cliqz-oss/adblocker). Adblocker offers similar performance to [uBlock Origin](https://github.com/gorhill/uBlock).
|
[Web-based variant](#webb) of RSS Guard offers ad-blocking functionality via [Adblocker](https://github.com/cliqz-oss/adblocker). Adblocker offers similar performance to [uBlock Origin](https://github.com/gorhill/uBlock).
|
||||||
|
|
||||||
If you want to enable AdBlock in RSS Guard you need to do this:
|
If you want to use AdBlock, you need to have [Node.js](#node) installed.
|
||||||
|
|
||||||
1. Have [Node.js](https://nodejs.org) with [NPM](https://www.npmjs.com) (which is usually included in Node.js installer) installed. Also you need to have paths `node.exe` and `npm` added to your system `PATH` environment available.
|
|
||||||
2. The implementation requires additional [npm](https://www.npmjs.com) modules to be installed. You see the list of needed modules near the top of [this](https://github.com/martinrotter/rssguard/blob/master/resources/scripts/adblock/adblock-server.js) file.
|
|
||||||
|
|
||||||
I understand that the above installation is not trivial, but it is necessary evil to have up-to-date and modern implementation of AdBlock in RSS Guard. Previous, `C++`-based, implementation was buggy, slow, and hard to maintain.
|
|
||||||
|
|
||||||
You can find elaborate lists of AdBlock rules [here](https://easylist.to). You can just copy direct hyperlinks to those lists and paste them into the "Filter lists" text-box as shown below. Remember to always separate individual links with newlines. Same applies to "Custom filters", where you can insert individual filters, for example [filter](https://adblockplus.org/filter-cheatsheet) "idnes" to block all URLs with "idnes" in them.
|
You can find elaborate lists of AdBlock rules [here](https://easylist.to). You can just copy direct hyperlinks to those lists and paste them into the "Filter lists" text-box as shown below. Remember to always separate individual links with newlines. Same applies to "Custom filters", where you can insert individual filters, for example [filter](https://adblockplus.org/filter-cheatsheet) "idnes" to block all URLs with "idnes" in them.
|
||||||
|
|
||||||
<img alt="alt-img" src="images/adblock.png" width="350px">
|
<img alt="alt-img" src="images/adblock.png" width="350px">
|
||||||
|
|
||||||
The way ad-blocking internally works is that RSS Guard starts local HTTP browser which provides ad-blocking API, which is subsequently called by RSS Guard. There is some caching done in between, which speeds up some ad-blocking decisions.
|
The way ad-blocking internally works is that RSS Guard starts local `HTTP` browser which provides ad-blocking API, which is subsequently called by RSS Guard. There is some caching done in between, which speeds up some ad-blocking decisions.
|
||||||
|
|
||||||
## Minor Features <a id="mife"></a>
|
## Minor Features <a id="mife"></a>
|
||||||
|
|
||||||
@ -452,6 +448,12 @@ You can right click on any item in embedded web browser and hit `Save as` button
|
|||||||
|
|
||||||
You can download up to 6 files simultaneously.
|
You can download up to 6 files simultaneously.
|
||||||
|
|
||||||
|
### Node.js <a id="node"></a>
|
||||||
|
RSS Guard integrates [`Node.js`](https://nodejs.org). Go to `Node.js` section of `Settings` dialog to see more.
|
||||||
|
|
||||||
|
`Node.js` is used for some advanced functionality like [AdBlock](#adbl).
|
||||||
|
|
||||||
|
|
||||||
### Labels <a id="lbls"></a>
|
### Labels <a id="lbls"></a>
|
||||||
RSS Guard supports labels (tags). Any number of tags can be assigned to any article.
|
RSS Guard supports labels (tags). Any number of tags can be assigned to any article.
|
||||||
|
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
// Simple local HTTP server providing ad-blocking functionality via https://github.com/cliqz-oss/adblocker
|
// Simple local HTTP server providing ad-blocking functionality via https://github.com/cliqz-oss/adblocker
|
||||||
//
|
//
|
||||||
// How to install:
|
// How to install:
|
||||||
// npm i -g tldts-experimental
|
// npm i @cliqz/adblocker
|
||||||
// npm i -g @cliqz/adblocker
|
|
||||||
//
|
//
|
||||||
// How to run:
|
// How to run:
|
||||||
// NODE_PATH="C:\Users\<user>\AppData\Roaming\npm\node_modules" node ./adblock-server.js "<port>" "<filters-file-path>"
|
// NODE_PATH="..." node ./adblock-server.js "<port>" "<filters-file-path>"
|
||||||
//
|
//
|
||||||
// How to use:
|
// How to use:
|
||||||
// curl -i -X POST --data '
|
// curl -i -X POST --data '
|
||||||
|
@ -514,24 +514,6 @@ set(GMAIL_CLIENT_SECRET "" CACHE STRING "GMail client secret")
|
|||||||
set(INOREADER_CLIENT_ID "" CACHE STRING "Inoreader client ID")
|
set(INOREADER_CLIENT_ID "" CACHE STRING "Inoreader client ID")
|
||||||
set(INOREADER_CLIENT_SECRET "" CACHE STRING "Inoreader client secret")
|
set(INOREADER_CLIENT_SECRET "" CACHE STRING "Inoreader client secret")
|
||||||
|
|
||||||
# Load git commit hash.
|
|
||||||
if(REVISION_FROM_GIT AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
|
|
||||||
execute_process(COMMAND "git" "rev-parse" "--short" "HEAD"
|
|
||||||
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
|
||||||
OUTPUT_VARIABLE APP_REVISION
|
|
||||||
ERROR_QUIET
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
|
|
||||||
message(STATUS "Detected git revision: '${APP_REVISION}'.")
|
|
||||||
else()
|
|
||||||
set(APP_REVISION "")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT USE_WEBENGINE)
|
|
||||||
set(APP_REVISION "${APP_REVISION}-nowebengine")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Bundle icons on some platforms which do not provide system-wide icon themes.
|
# Bundle icons on some platforms which do not provide system-wide icon themes.
|
||||||
if(APPLE OR WIN32 OR OS2)
|
if(APPLE OR WIN32 OR OS2)
|
||||||
qt_add_resources(SOURCES ${CMAKE_SOURCE_DIR}/resources/icons.qrc)
|
qt_add_resources(SOURCES ${CMAKE_SOURCE_DIR}/resources/icons.qrc)
|
||||||
|
@ -368,7 +368,7 @@ void FeedDownloader::updateOneFeed(ServiceRoot* acc,
|
|||||||
<< feed->customId() << " stored in DB.";
|
<< feed->customId() << " stored in DB.";
|
||||||
|
|
||||||
if (updated_messages.first > 0) {
|
if (updated_messages.first > 0) {
|
||||||
m_results.appendUpdatedFeed(QPair<QString, int>(feed->title(), updated_messages.first));
|
m_results.appendUpdatedFeed({ feed->title(), updated_messages.first });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (const FeedFetchException& feed_ex) {
|
catch (const FeedFetchException& feed_ex) {
|
||||||
@ -412,8 +412,7 @@ void FeedDownloader::finalizeUpdate() {
|
|||||||
emit updateFinished(m_results);
|
emit updateFinished(m_results);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FeedDownloader::isCacheSynchronizationRunning() const
|
bool FeedDownloader::isCacheSynchronizationRunning() const {
|
||||||
{
|
|
||||||
return m_isCacheSynchronizationRunning;
|
return m_isCacheSynchronizationRunning;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#define SERVICE_CODE_REDDIT "reddit"
|
#define SERVICE_CODE_REDDIT "reddit"
|
||||||
|
|
||||||
#define ADBLOCK_SERVER_PORT 48484
|
#define ADBLOCK_SERVER_PORT 48484
|
||||||
#define ADBLOCK_HOWTO "https://github.com/martinrotter/rssguard/blob/master/resources/docs/Documentation.md#adblock"
|
#define ADBLOCK_HOWTO "https://github.com/martinrotter/rssguard/blob/master/resources/docs/Documentation.md#adbl"
|
||||||
#define ADBLOCK_ICON_ACTIVE "adblock"
|
#define ADBLOCK_ICON_ACTIVE "adblock"
|
||||||
#define ADBLOCK_ICON_DISABLED "adblock-disabled"
|
#define ADBLOCK_ICON_DISABLED "adblock-disabled"
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ SettingsGeneral::SettingsGeneral(Settings* settings, QWidget* parent)
|
|||||||
: SettingsPanel(settings, parent), m_ui(new Ui::SettingsGeneral) {
|
: SettingsPanel(settings, parent), m_ui(new Ui::SettingsGeneral) {
|
||||||
m_ui->setupUi(this);
|
m_ui->setupUi(this);
|
||||||
m_ui->m_checkAutostart->setText(m_ui->m_checkAutostart->text().arg(QSL(APP_NAME)));
|
m_ui->m_checkAutostart->setText(m_ui->m_checkAutostart->text().arg(QSL(APP_NAME)));
|
||||||
|
m_ui->m_checkForUpdatesOnStart->setText(m_ui->m_checkForUpdatesOnStart->text().arg(QSL(APP_NAME)));
|
||||||
|
|
||||||
connect(m_ui->m_checkAutostart, &QCheckBox::stateChanged, this, &SettingsGeneral::dirtifySettings);
|
connect(m_ui->m_checkAutostart, &QCheckBox::stateChanged, this, &SettingsGeneral::dirtifySettings);
|
||||||
connect(m_ui->m_checkForUpdatesOnStart, &QCheckBox::stateChanged, this, &SettingsGeneral::dirtifySettings);
|
connect(m_ui->m_checkForUpdatesOnStart, &QCheckBox::stateChanged, this, &SettingsGeneral::dirtifySettings);
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QCheckBox" name="m_checkForUpdatesOnStart">
|
<widget class="QCheckBox" name="m_checkForUpdatesOnStart">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Check for updates on application startup</string>
|
<string>Check for %1 updates on application startup</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -60,6 +60,7 @@ Application::Application(const QString& id, int& argc, char** argv)
|
|||||||
m_mainForm = nullptr;
|
m_mainForm = nullptr;
|
||||||
m_trayIcon = nullptr;
|
m_trayIcon = nullptr;
|
||||||
m_settings = Settings::setupSettings(this);
|
m_settings = Settings::setupSettings(this);
|
||||||
|
m_nodejs = new NodeJs(m_settings, this);
|
||||||
m_webFactory = new WebFactory(this);
|
m_webFactory = new WebFactory(this);
|
||||||
m_system = new SystemFactory(this);
|
m_system = new SystemFactory(this);
|
||||||
m_skins = new SkinFactory(this);
|
m_skins = new SkinFactory(this);
|
||||||
@ -68,7 +69,6 @@ Application::Application(const QString& id, int& argc, char** argv)
|
|||||||
m_database = new DatabaseFactory(this);
|
m_database = new DatabaseFactory(this);
|
||||||
m_downloadManager = nullptr;
|
m_downloadManager = nullptr;
|
||||||
m_notifications = new NotificationFactory(this);
|
m_notifications = new NotificationFactory(this);
|
||||||
m_nodejs = new NodeJs(m_settings, this);
|
|
||||||
m_shouldRestart = false;
|
m_shouldRestart = false;
|
||||||
|
|
||||||
determineFirstRuns();
|
determineFirstRuns();
|
||||||
@ -663,13 +663,9 @@ void Application::downloadRequested(QWebEngineDownloadItem* download_item) {
|
|||||||
void Application::onAdBlockFailure() {
|
void Application::onAdBlockFailure() {
|
||||||
qApp->showGuiMessage(Notification::Event::GeneralEvent, {
|
qApp->showGuiMessage(Notification::Event::GeneralEvent, {
|
||||||
tr("AdBlock needs to be configured"),
|
tr("AdBlock needs to be configured"),
|
||||||
tr("AdBlock component is not configured properly."),
|
tr("AdBlock component is not configured properly. Go to \"Settings\" -> \"Node.js\" and check "
|
||||||
QSystemTrayIcon::MessageIcon::Critical },
|
"if your Node.js is properly configured."),
|
||||||
{}, {
|
QSystemTrayIcon::MessageIcon::Critical }, {});
|
||||||
tr("Configure now"),
|
|
||||||
[=]() {
|
|
||||||
m_webFactory->adBlock()->showDialog();
|
|
||||||
} });
|
|
||||||
|
|
||||||
qApp->settings()->setValue(GROUP(AdBlock), AdBlock::AdBlockEnabled, false);
|
qApp->settings()->setValue(GROUP(AdBlock), AdBlock::AdBlockEnabled, false);
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,16 @@
|
|||||||
|
|
||||||
NodeJs::NodeJs(Settings* settings, QObject* parent) : QObject(parent), m_settings(settings) {}
|
NodeJs::NodeJs(Settings* settings, QObject* parent) : QObject(parent), m_settings(settings) {}
|
||||||
|
|
||||||
|
void NodeJs::runScript(QProcess* proc, const QString& script, const QStringList& arguments) const {
|
||||||
|
QStringList arg = { script }; arg.append(arguments);
|
||||||
|
QProcessEnvironment env;
|
||||||
|
QString node_modules = processedPackageFolder() + QDir::separator() + QSL("node_modules");
|
||||||
|
|
||||||
|
env.insert(QSL("NODE_PATH"), node_modules);
|
||||||
|
|
||||||
|
IOFactory::startProcess(proc, nodeJsExecutable(), arg, env);
|
||||||
|
}
|
||||||
|
|
||||||
QString NodeJs::nodeJsExecutable() const {
|
QString NodeJs::nodeJsExecutable() const {
|
||||||
return QDir::toNativeSeparators(m_settings->value(GROUP(Node), SETTING(Node::NodeJsExecutable)).toString());
|
return QDir::toNativeSeparators(m_settings->value(GROUP(Node), SETTING(Node::NodeJsExecutable)).toString());
|
||||||
}
|
}
|
||||||
@ -94,6 +104,8 @@ void NodeJs::installUpdatePackage(const PackageMetadata& pkg) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PackageStatus::UpToDate:
|
case PackageStatus::UpToDate:
|
||||||
|
qDebugNN << LOGSEC_NODEJS << "Package" << QUOTE_W_SPACE(pkg.m_name) << "is up-to-date.";
|
||||||
|
|
||||||
emit packageInstalledUpdated(pkg);
|
emit packageInstalledUpdated(pkg);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -101,8 +113,6 @@ void NodeJs::installUpdatePackage(const PackageMetadata& pkg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void NodeJs::installPackage(const PackageMetadata& pkg) {
|
void NodeJs::installPackage(const PackageMetadata& pkg) {
|
||||||
// npm install --prefix "." @cliqz/adblocker@">=1.0.0 <2.0.0" --production --save-exact
|
|
||||||
//https://docs.npmjs.com/cli/v8/commands/npm-install
|
|
||||||
try {
|
try {
|
||||||
QProcess* proc = new QProcess();
|
QProcess* proc = new QProcess();
|
||||||
|
|
||||||
@ -132,6 +142,8 @@ void NodeJs::installPackage(const PackageMetadata& pkg) {
|
|||||||
emit packageError(pkg, sndr->errorString());
|
emit packageError(pkg, sndr->errorString());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
qDebugNN << LOGSEC_NODEJS << "Installing package" << QUOTE_W_SPACE_DOT(pkg.m_name);
|
||||||
|
|
||||||
IOFactory::startProcess(proc,
|
IOFactory::startProcess(proc,
|
||||||
npmExecutable(),
|
npmExecutable(),
|
||||||
{ QSL("install"), QSL("--production"),
|
{ QSL("install"), QSL("--production"),
|
||||||
@ -139,11 +151,9 @@ void NodeJs::installPackage(const PackageMetadata& pkg) {
|
|||||||
QSL("--prefix"), processedPackageFolder() });
|
QSL("--prefix"), processedPackageFolder() });
|
||||||
}
|
}
|
||||||
catch (const ProcessException& ex) {
|
catch (const ProcessException& ex) {
|
||||||
|
qCriticalNN << LOGSEC_NODEJS << "Package" << QUOTE_W_SPACE(pkg.m_name)
|
||||||
|
"was not installed, error:" << QUOTE_W_SPACE_DOT(ex.message());
|
||||||
|
|
||||||
emit packageError(pkg, ex.message());
|
emit packageError(pkg, ex.message());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeJs::updatePackage(const PackageMetadata& pkg) {
|
|
||||||
// npm update --prefix "." @cliqz/adblocker@">=1.0.0 <2.0.0" --production --save-exact
|
|
||||||
//https://docs.npmjs.com/cli/v8/commands/npm-update
|
|
||||||
}
|
|
||||||
|
@ -6,35 +6,38 @@
|
|||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
|
||||||
class Settings;
|
class Settings;
|
||||||
|
class QProcess;
|
||||||
|
|
||||||
class NodeJs : public QObject {
|
class NodeJs : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
struct PackageMetadata {
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Name of package.
|
|
||||||
QString m_name;
|
|
||||||
|
|
||||||
// Version description. This could be fixed version or empty
|
|
||||||
// string (latest version) or perhaps version range.
|
|
||||||
QString m_version;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class PackageStatus {
|
|
||||||
// Package not installed.
|
|
||||||
NotInstalled,
|
|
||||||
|
|
||||||
// Package installed but out-of-date.
|
|
||||||
OutOfDate,
|
|
||||||
|
|
||||||
// Package installed and up-to-date.
|
|
||||||
UpToDate
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
struct PackageMetadata {
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Name of package.
|
||||||
|
QString m_name;
|
||||||
|
|
||||||
|
// Version description. This could be fixed version or empty
|
||||||
|
// string (latest version) or perhaps version range.
|
||||||
|
QString m_version;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class PackageStatus {
|
||||||
|
// Package not installed.
|
||||||
|
NotInstalled,
|
||||||
|
|
||||||
|
// Package installed but out-of-date.
|
||||||
|
OutOfDate,
|
||||||
|
|
||||||
|
// Package installed and up-to-date.
|
||||||
|
UpToDate
|
||||||
|
};
|
||||||
|
|
||||||
explicit NodeJs(Settings* settings, QObject* parent = nullptr);
|
explicit NodeJs(Settings* settings, QObject* parent = nullptr);
|
||||||
|
|
||||||
|
void runScript(QProcess* proc, const QString& script, const QStringList& arguments) const;
|
||||||
|
|
||||||
QString nodeJsExecutable() const;
|
QString nodeJsExecutable() const;
|
||||||
void setNodeJsExecutable(const QString& exe) const;
|
void setNodeJsExecutable(const QString& exe) const;
|
||||||
|
|
||||||
@ -67,7 +70,6 @@ class NodeJs : public QObject {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void installPackage(const PackageMetadata& pkg);
|
void installPackage(const PackageMetadata& pkg);
|
||||||
void updatePackage(const PackageMetadata& pkg);
|
|
||||||
|
|
||||||
Settings* m_settings;
|
Settings* m_settings;
|
||||||
};
|
};
|
||||||
|
@ -112,7 +112,7 @@ void AdBlockDialog::onAdBlockProcessTerminated() {
|
|||||||
m_ui.m_cbEnable->setChecked(false);
|
m_ui.m_cbEnable->setChecked(false);
|
||||||
m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error,
|
m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error,
|
||||||
tr("There is error, check application log for more details and "
|
tr("There is error, check application log for more details and "
|
||||||
"head to online documentation. Also make sure that Node.js is installed."),
|
"head to online documentation."),
|
||||||
tr("ERROR!"));
|
tr("ERROR!"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,11 +25,14 @@
|
|||||||
#include <QWebEngineProfile>
|
#include <QWebEngineProfile>
|
||||||
|
|
||||||
AdBlockManager::AdBlockManager(QObject* parent)
|
AdBlockManager::AdBlockManager(QObject* parent)
|
||||||
: QObject(parent), m_loaded(false), m_enabled(false), m_interceptor(new AdBlockUrlInterceptor(this)),
|
: QObject(parent), m_loaded(false), m_enabled(false), m_installing(false), m_interceptor(new AdBlockUrlInterceptor(this)),
|
||||||
m_serverProcess(nullptr), m_cacheBlocks({}) {
|
m_serverProcess(nullptr), m_cacheBlocks({}) {
|
||||||
m_adblockIcon = new AdBlockIcon(this);
|
m_adblockIcon = new AdBlockIcon(this);
|
||||||
m_adblockIcon->setObjectName(QSL("m_adblockIconAction"));
|
m_adblockIcon->setObjectName(QSL("m_adblockIconAction"));
|
||||||
m_unifiedFiltersFile = qApp->userDataFolder() + QDir::separator() + QSL("adblock-unified-filters.txt");
|
m_unifiedFiltersFile = qApp->userDataFolder() + QDir::separator() + QSL("adblock-unified-filters.txt");
|
||||||
|
|
||||||
|
connect(qApp->nodejs(), &NodeJs::packageInstalledUpdated, this, &AdBlockManager::onPackageReady);
|
||||||
|
connect(qApp->nodejs(), &NodeJs::packageError, this, &AdBlockManager::onPackageError);
|
||||||
}
|
}
|
||||||
|
|
||||||
AdBlockManager::~AdBlockManager() {
|
AdBlockManager::~AdBlockManager() {
|
||||||
@ -98,16 +101,9 @@ void AdBlockManager::setEnabled(bool enabled) {
|
|||||||
emit enabledChanged(m_enabled);
|
emit enabledChanged(m_enabled);
|
||||||
|
|
||||||
if (m_enabled) {
|
if (m_enabled) {
|
||||||
try {
|
if (!m_installing) {
|
||||||
updateUnifiedFiltersFileAndStartServer();
|
m_installing = true;
|
||||||
}
|
qApp->nodejs()->installUpdatePackage({ QSL(CLIQZ_ADBLOCKED_PACKAGE), QSL(CLIQZ_ADBLOCKED_VERSION) });
|
||||||
catch (const ApplicationException& ex) {
|
|
||||||
qCriticalNN << LOGSEC_ADBLOCK
|
|
||||||
<< "Failed to write unified filters to file or re-start server, error:"
|
|
||||||
<< QUOTE_W_SPACE_DOT(ex.message());
|
|
||||||
|
|
||||||
m_enabled = false;
|
|
||||||
emit enabledChanged(m_enabled);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -179,6 +175,37 @@ void AdBlockManager::showDialog() {
|
|||||||
AdBlockDialog(qApp->mainFormWidget()).exec();
|
AdBlockDialog(qApp->mainFormWidget()).exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AdBlockManager::onPackageReady(const NodeJs::PackageMetadata& pkg) {
|
||||||
|
if (pkg.m_name == QSL(CLIQZ_ADBLOCKED_PACKAGE)) {
|
||||||
|
m_installing = false;
|
||||||
|
|
||||||
|
if (m_enabled) {
|
||||||
|
try {
|
||||||
|
updateUnifiedFiltersFileAndStartServer();
|
||||||
|
}
|
||||||
|
catch (const ApplicationException& ex) {
|
||||||
|
qCriticalNN << LOGSEC_ADBLOCK
|
||||||
|
<< "Failed to setup filters and start server:"
|
||||||
|
<< QUOTE_W_SPACE_DOT(ex.message());
|
||||||
|
|
||||||
|
m_enabled = false;
|
||||||
|
emit enabledChanged(m_enabled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdBlockManager::onPackageError(const NodeJs::PackageMetadata& pkg, const QString& error) {
|
||||||
|
if (pkg.m_name == QSL(CLIQZ_ADBLOCKED_PACKAGE)) {
|
||||||
|
m_installing = false;
|
||||||
|
m_enabled = false;
|
||||||
|
|
||||||
|
qCriticalNN << LOGSEC_ADBLOCK << "Needed Node.js packages were not installed:" << QUOTE_W_SPACE_DOT(error);
|
||||||
|
|
||||||
|
emit processTerminated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void AdBlockManager::onServerProcessFinished(int exit_code, QProcess::ExitStatus exit_status) {
|
void AdBlockManager::onServerProcessFinished(int exit_code, QProcess::ExitStatus exit_status) {
|
||||||
Q_UNUSED(exit_status)
|
Q_UNUSED(exit_status)
|
||||||
killServer();
|
killServer();
|
||||||
@ -281,48 +308,54 @@ QProcess* AdBlockManager::startServer(int port) {
|
|||||||
|
|
||||||
QProcess* proc = new QProcess(this);
|
QProcess* proc = new QProcess(this);
|
||||||
|
|
||||||
#if defined(Q_OS_WIN)
|
proc->setProcessChannelMode(QProcess::ProcessChannelMode::ForwardedErrorChannel);
|
||||||
proc->setProgram(QSL("node.exe"));
|
|
||||||
#else
|
|
||||||
proc->setProgram(QSL("node"));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
proc->setArguments({
|
connect(proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, &AdBlockManager::onServerProcessFinished);
|
||||||
QDir::toNativeSeparators(temp_server),
|
|
||||||
|
qApp->nodejs()->runScript(proc, QDir::toNativeSeparators(temp_server), {
|
||||||
QString::number(port),
|
QString::number(port),
|
||||||
QDir::toNativeSeparators(m_unifiedFiltersFile)
|
QDir::toNativeSeparators(m_unifiedFiltersFile)
|
||||||
});
|
});
|
||||||
|
|
||||||
proc->setProcessEnvironment(QProcessEnvironment::systemEnvironment());
|
/*
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
|
proc->setProgram(QSL("node.exe"));
|
||||||
|
#else
|
||||||
|
proc->setProgram(QSL("node"));
|
||||||
|
#endif
|
||||||
|
|
||||||
auto pe = proc->processEnvironment();
|
proc->setArguments({
|
||||||
|
QDir::toNativeSeparators(temp_server),
|
||||||
|
QString::number(port),
|
||||||
|
QDir::toNativeSeparators(m_unifiedFiltersFile)
|
||||||
|
});
|
||||||
|
|
||||||
if (!pe.contains(QSL("NODE_PATH"))) {
|
proc->setProcessEnvironment(QProcessEnvironment::systemEnvironment());
|
||||||
try {
|
|
||||||
|
auto pe = proc->processEnvironment();
|
||||||
|
|
||||||
|
if (!pe.contains(QSL("NODE_PATH"))) {
|
||||||
|
try {
|
||||||
const QString system_node_prefix = IOFactory::startProcessGetOutput(
|
const QString system_node_prefix = IOFactory::startProcessGetOutput(
|
||||||
#if defined(Q_OS_WIN)
|
#if defined(Q_OS_WIN)
|
||||||
QSL("npm.cmd")
|
QSL("npm.cmd")
|
||||||
#else
|
#else
|
||||||
QSL("npm")
|
QSL("npm")
|
||||||
#endif
|
#endif
|
||||||
, { QSL("root"), QSL("--quiet"), QSL("-g") }
|
, { QSL("root"), QSL("--quiet"), QSL("-g") }
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!system_node_prefix.isEmpty()) {
|
if (!system_node_prefix.isEmpty()) {
|
||||||
pe.insert(QSL("NODE_PATH"), system_node_prefix.simplified());
|
pe.insert(QSL("NODE_PATH"), system_node_prefix.simplified());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (const ApplicationException& ex) {
|
catch (const ApplicationException& ex) {
|
||||||
qWarningNN << LOGSEC_ADBLOCK << "Failed to get NPM root path:" << QUOTE_W_SPACE_DOT(ex.message());
|
qWarningNN << LOGSEC_ADBLOCK << "Failed to get NPM root path:" << QUOTE_W_SPACE_DOT(ex.message());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
proc->setProcessEnvironment(pe);
|
proc->setProcessEnvironment(pe);
|
||||||
proc->setProcessChannelMode(QProcess::ProcessChannelMode::ForwardedErrorChannel);
|
*/
|
||||||
|
|
||||||
connect(proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, &AdBlockManager::onServerProcessFinished);
|
|
||||||
|
|
||||||
proc->open();
|
|
||||||
|
|
||||||
qDebugNN << LOGSEC_ADBLOCK << "Attempting to start AdBlock server.";
|
qDebugNN << LOGSEC_ADBLOCK << "Attempting to start AdBlock server.";
|
||||||
return proc;
|
return proc;
|
||||||
|
@ -5,9 +5,14 @@
|
|||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "miscellaneous/nodejs.h"
|
||||||
|
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
|
|
||||||
|
#define CLIQZ_ADBLOCKED_PACKAGE "@cliqz/adblocker"
|
||||||
|
#define CLIQZ_ADBLOCKED_VERSION "1.23.5"
|
||||||
|
|
||||||
class QUrl;
|
class QUrl;
|
||||||
class AdblockRequestInfo;
|
class AdblockRequestInfo;
|
||||||
class AdBlockUrlInterceptor;
|
class AdBlockUrlInterceptor;
|
||||||
@ -66,6 +71,8 @@ class AdBlockManager : public QObject {
|
|||||||
void processTerminated();
|
void processTerminated();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
void onPackageReady(const NodeJs::PackageMetadata& pkg);
|
||||||
|
void onPackageError(const NodeJs::PackageMetadata& pkg, const QString& error);
|
||||||
void onServerProcessFinished(int exit_code, QProcess::ExitStatus exit_status);
|
void onServerProcessFinished(int exit_code, QProcess::ExitStatus exit_status);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -79,6 +86,7 @@ class AdBlockManager : public QObject {
|
|||||||
private:
|
private:
|
||||||
bool m_loaded;
|
bool m_loaded;
|
||||||
bool m_enabled;
|
bool m_enabled;
|
||||||
|
bool m_installing;
|
||||||
AdBlockIcon* m_adblockIcon;
|
AdBlockIcon* m_adblockIcon;
|
||||||
AdBlockUrlInterceptor* m_interceptor;
|
AdBlockUrlInterceptor* m_interceptor;
|
||||||
QString m_unifiedFiltersFile;
|
QString m_unifiedFiltersFile;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user