From 05dbc6fb7d8833c183485ec0d846c151b6299c92 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Fri, 3 Feb 2017 19:24:40 +0100 Subject: option parsing --- src/forms/blockerdialog.cpp | 4 +-- src/webengine/blockerrule.cpp | 66 +++++++++++++++++++++++++++++++++------- src/webengine/blockerrule.h | 32 +++++++++++++++++-- src/webengine/urlinterceptor.cpp | 4 +-- 4 files changed, 88 insertions(+), 18 deletions(-) diff --git a/src/forms/blockerdialog.cpp b/src/forms/blockerdialog.cpp index 5377c97..fa613bd 100644 --- a/src/forms/blockerdialog.cpp +++ b/src/forms/blockerdialog.cpp @@ -47,10 +47,10 @@ BlockerDialog::BlockerDialog(QWidget *parent) : // show subscription items for(BlockerRule *rule : m_subscription->urlBlacklist()) { - ui->blacklist_listWidget->addItem(rule->pattern()); + ui->blacklist_listWidget->addItem(rule->toString()); } for(BlockerRule *rule : m_subscription->urlWhitelist()) { - ui->whitelist_listWidget->addItem(rule->pattern()); + ui->whitelist_listWidget->addItem(rule->toString()); } } diff --git a/src/webengine/blockerrule.cpp b/src/webengine/blockerrule.cpp index 3146854..8ecc1af 100644 --- a/src/webengine/blockerrule.cpp +++ b/src/webengine/blockerrule.cpp @@ -28,6 +28,7 @@ BlockerRule::BlockerRule(QString rule, QObject *parent) : QObject(parent) { + m_rule = rule; QString pattern = rule; // Empty rule or comment @@ -39,7 +40,23 @@ BlockerRule::BlockerRule(QString rule, QObject *parent) : // Exception if(pattern.startsWith("@@")) { m_exception = true; - pattern = pattern.remove(0, 2); + pattern.remove(0, 2); + } + + // Options + if(pattern.contains("$")) { + QString opts = pattern.mid(pattern.indexOf("$")+1); + for(QString opt : opts.split(',')) { + if(opt.endsWith("script")) { + m_blacklistOptions.setFlag(RuleOption::script, true); + m_whitelistOptions.setFlag(RuleOption::script, opt.startsWith("~")); + } else if(opt.endsWith("image")) { + m_blacklistOptions.setFlag(RuleOption::image, true); + m_whitelistOptions.setFlag(RuleOption::image, opt.startsWith("~")); + } + } + + pattern.remove(pattern.indexOf("$"), pattern.length()); } // Domain @@ -61,19 +78,41 @@ BlockerRule::BlockerRule(QString rule, QObject *parent) : m_type = RuleType::WildcardMatch; } -QString BlockerRule::pattern() const +bool BlockerRule::match(const QWebEngineUrlRequestInfo &info) { - return ruleExpression.pattern(); -} + bool shouldBlock = false; -QString BlockerRule::domain() const -{ - return m_domain; -} + switch (m_type) { + case RuleType::Invalid: + shouldBlock = false; + break; -bool BlockerRule::match(const QUrl &url) -{ - return ruleExpression.match(url.toString()).hasMatch(); + case DomainMatch: + if(info.requestUrl().host() == m_domain) { + shouldBlock = true; + } + break; + + case RegularExpressionMatch: + case WildcardMatch: + shouldBlock = ruleExpression.match(info.requestUrl().toString()).hasMatch(); + break; + } + + if(shouldBlock) { + if(m_whitelistOptions.testFlag(RuleOption::image) && info.resourceType() == QWebEngineUrlRequestInfo::ResourceTypeImage) { + shouldBlock = false; + } + } + if(shouldBlock) { + if(m_blacklistOptions.testFlag(RuleOption::image) && info.resourceType() == QWebEngineUrlRequestInfo::ResourceTypeImage) { + shouldBlock = true; + } else { + shouldBlock = false; + } + } + + return shouldBlock; } bool BlockerRule::isValid() @@ -89,6 +128,11 @@ bool BlockerRule::isException() return m_exception; } +QString BlockerRule::toString() const +{ + return m_rule; +} + QString BlockerRule::fromWildcardMatch(const QString &pattern) { QString parsed; diff --git a/src/webengine/blockerrule.h b/src/webengine/blockerrule.h index 95d82b7..df09d10 100644 --- a/src/webengine/blockerrule.h +++ b/src/webengine/blockerrule.h @@ -24,6 +24,7 @@ #include #include #include +#include class BlockerRule : public QObject { @@ -36,13 +37,33 @@ public: WildcardMatch }; + enum RuleOption { + script = 0, + image = 1, + stylesheet = 2, + object = 4, + xmlhttprequest = 8, + objectsubrequest = 16, + subdocument = 32, + ping = 64, + websocket = 128, + document = 256, + + elemhide = 512, + generichide = 1024, + genericblock = 2048, + + other = 4096 + }; + + Q_DECLARE_FLAGS(RuleOptions, RuleOption) + explicit BlockerRule(QString rule, QObject *parent = 0); - QString pattern() const; - QString domain() const; - bool match(const QUrl &url); + bool match(const QWebEngineUrlRequestInfo &info); bool isValid(); bool isException(); + QString toString() const; signals: @@ -52,10 +73,15 @@ private: // TODO: subclass QRegularExpression and move this there QString fromWildcardMatch(const QString &pattern); + QString m_rule; + RuleType m_type; bool m_exception = false; QString m_domain; QRegularExpression ruleExpression; + + RuleOptions m_blacklistOptions; + RuleOptions m_whitelistOptions; }; #endif // ADBLOCKRULE_H diff --git a/src/webengine/urlinterceptor.cpp b/src/webengine/urlinterceptor.cpp index cc196ba..fbcef64 100644 --- a/src/webengine/urlinterceptor.cpp +++ b/src/webengine/urlinterceptor.cpp @@ -28,14 +28,14 @@ UrlRequestInterceptor::UrlRequestInterceptor(QObject *parent) : void UrlRequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo &info) { for(BlockerRule *rule : m_sub->urlWhitelist()) { - if(rule->match(info.requestUrl())) { + if(rule->match(info)) { qDebug("OK %s", qUtf8Printable(info.requestUrl().toString())); return; } } for(BlockerRule *rule : m_sub->urlBlacklist()) { - if(rule->match(info.requestUrl())) { + if(rule->match(info)) { info.block(true); qDebug(" %s", qUtf8Printable(info.requestUrl().toString())); return; -- cgit v1.2.1