38#include <QMutexLocker>
44#include <QElapsedTimer>
56 qRegisterMetaType<AdBlockedRequest>();
63 qDeleteAll(m_subscriptions);
68 return qz_adblock_manager();
73 if (m_enabled == enabled) {
86 mApp->reloadUserStyleSheet();
88 QMutexLocker locker(&m_mutex);
99 return m_subscriptions;
104 QMutexLocker locker(&m_mutex);
114 const QString urlString = QString::fromUtf8(request.requestUrl().toEncoded().toLower());
115 const QString urlDomain = request.requestUrl().host().toLower();
116 const QString urlScheme = request.requestUrl().scheme().toLower();
122 const AdBlockRule* blockedRule = m_matcher->
match(request, urlDomain, urlString);
125 ruleFilter = blockedRule->
filter();
128 qDebug() <<
"BLOCKED: " << timer.elapsed() << blockedRule->
filter() << request.requestUrl();
133 qDebug() << timer.elapsed() << request.requestUrl();
141 return m_blockedRequests.value(url);
146 if (m_blockedRequests.remove(url)) {
153 return m_disabledRules;
158 m_disabledRules.append(filter);
163 m_disabledRules.removeOne(filter);
168 const QList<QPair<QString, QString> > queryItems = QUrlQuery(url).queryItems(QUrl::FullyDecoded);
170 QString subscriptionTitle;
171 QString subscriptionUrl;
173 for (
int i = 0;
i < queryItems.count(); ++
i) {
174 QPair<QString, QString> pair = queryItems.at(
i);
175 if (pair.first.endsWith(
QL1S(
"location")))
176 subscriptionUrl = pair.second;
177 else if (pair.first.endsWith(
QL1S(
"title")))
178 subscriptionTitle = pair.second;
181 if (subscriptionTitle.isEmpty() || subscriptionUrl.isEmpty())
184 const QString message = AdBlockManager::tr(
"Do you want to add <b>%1</b> subscription?").arg(subscriptionTitle);
186 QMessageBox::StandardButton result = QMessageBox::question(
nullptr, AdBlockManager::tr(
"AdBlock Subscription"), message, QMessageBox::Yes | QMessageBox::No);
187 if (result == QMessageBox::Yes) {
197 if (title.isEmpty() || url.isEmpty()) {
204 QByteArray data =
QSL(
"Title: %1\nUrl: %2\n[Adblock Plus 1.1.1]").arg(title, url).toLatin1();
206 QSaveFile file(filePath);
207 if (!file.open(QFile::WriteOnly)) {
208 qWarning() <<
"AdBlockManager: Cannot write to file" << filePath;
215 subscription->setUrl(QUrl(url));
216 subscription->setFilePath(filePath);
217 subscription->loadSubscription(m_disabledRules);
219 m_subscriptions.insert(m_subscriptions.count() - 1, subscription);
228 QMutexLocker locker(&m_mutex);
230 if (!m_subscriptions.contains(subscription) || !subscription->
canBeRemoved()) {
234 QFile(subscription->
filePath()).remove();
235 m_subscriptions.removeOne(subscription);
246 auto* list = qobject_cast<AdBlockCustomList*>(subscription);
258 QMutexLocker locker(&m_mutex);
271 m_enabled = settings.
value(
QSL(
"enabled"), m_enabled).toBool();
272 m_disabledRules = settings.
value(
QSL(
"disabledRules"), QStringList()).toStringList();
273 QDateTime lastUpdate = settings.
value(
QSL(
"lastUpdate"), QDateTime()).toDateTime();
282 if (!adblockDir.exists()) {
286 const auto fileNames = adblockDir.entryList(QStringList(
QSL(
"*.txt")), QDir::Files);
287 for (
const QString &fileName : fileNames) {
288 if (fileName == QLatin1String(
"customlist.txt")) {
292 const QString absolutePath = adblockDir.absoluteFilePath(fileName);
293 QFile file(absolutePath);
294 if (!file.open(QFile::ReadOnly)) {
298 QTextStream textStream(&file);
299 textStream.setEncoding(QStringConverter::Utf8);
300 QString title = textStream.readLine(1024).remove(QLatin1String(
"Title: "));
301 QUrl url = QUrl(textStream.readLine(1024).remove(QLatin1String(
"Url: ")));
303 if (title.isEmpty() || !url.isValid()) {
304 qWarning() <<
"AdBlockManager: Invalid subscription file" << absolutePath;
309 subscription->setUrl(url);
310 subscription->setFilePath(absolutePath);
312 m_subscriptions.append(subscription);
316 if (m_subscriptions.isEmpty()) {
320 m_subscriptions.append(easyList);
325 m_subscriptions.append(noCoinList);
334 subscription->loadSubscription(m_disabledRules);
340 if (lastUpdate.addDays(5) < QDateTime::currentDateTime()) {
345 qDebug() <<
"AdBlock loaded in" << timer.elapsed();
356 mApp->networkManager()->installUrlInterceptor(m_interceptor);
361 QMutexLocker locker(&m_mutex);
363 mApp->networkManager()->removeUrlInterceptor(m_interceptor);
365 mApp->networkManager()->installUrlInterceptor(m_interceptor);
371 subscription->updateSubscription();
376 settings.
setValue(
QSL(
"lastUpdate"), QDateTime::currentDateTime());
387 subscription->saveSubscription();
393 settings.
setValue(
QSL(
"disabledRules"), m_disabledRules);
404 return !(scheme ==
QL1S(
"file") || scheme ==
QL1S(
"qrc") || scheme ==
QL1S(
"view-source")
405 || scheme ==
QL1S(
"falkon") || scheme ==
QL1S(
"data") || scheme ==
QL1S(
"abp"));
432 if (subscription->title() == name) {
442 if (!m_adBlockDialog) {
446 m_adBlockDialog.data()->show();
447 m_adBlockDialog.data()->raise();
448 m_adBlockDialog.data()->activateWindow();
450 return m_adBlockDialog.data();
455 if (
auto* action = qobject_cast<QAction*>(sender())) {
#define ADBLOCK_NOCOINLIST_URL
#define ADBLOCK_EASYLIST_URL
void showRule(const AdBlockRule *rule) const
void removeDisabledRule(const QString &filter)
void setEnabled(bool enabled)
bool canRunOnScheme(const QString &scheme) const
void enabledChanged(bool enabled)
AdBlockSubscription * addSubscription(const QString &title, const QString &url)
bool block(QWebEngineUrlRequestInfo &request, QString &ruleFilter, QString &ruleSubscription)
void blockedRequestsChanged(const QUrl &url)
QStringList disabledRules() const
bool addSubscriptionFromUrl(const QUrl &url)
AdBlockCustomList * customList() const
AdBlockSubscription * subscriptionByName(const QString &name) const
QVector< AdBlockedRequest > blockedRequestsForUrl(const QUrl &url) const
static AdBlockManager * instance()
QString elementHidingRules(const QUrl &url) const
void clearBlockedRequestsForUrl(const QUrl &url)
bool removeSubscription(AdBlockSubscription *subscription)
AdBlockDialog * showDialog(QWidget *parent=nullptr)
void addDisabledRule(const QString &filter)
QList< AdBlockSubscription * > subscriptions() const
void updateAllSubscriptions()
bool canBeBlocked(const QUrl &url) const
QString elementHidingRulesForDomain(const QUrl &url) const
bool adBlockDisabledForUrl(const QUrl &url) const
const AdBlockRule * match(const QWebEngineUrlRequestInfo &request, const QString &urlDomain, const QString &urlString) const
QString elementHidingRules() const
QString elementHidingRulesForDomain(const QString &domain) const
bool elemHideDisabledForUrl(const QUrl &url) const
bool genericElemHideDisabledForUrl(const QUrl &url) const
AdBlockSubscription * subscription() const
virtual bool canBeRemoved() const
void subscriptionChanged()
void subscriptionUpdated()
void requestBlocked(const AdBlockedRequest &request)
static QString currentProfilePath()
void reloadUserStyleSheet()
void beginGroup(const QString &prefix)
QVariant value(const QString &key, const QVariant &defaultValue=QVariant())
void setValue(const QString &key, const QVariant &defaultValue=QVariant())