aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/webengine/blockerrule.cpp105
-rw-r--r--src/webengine/blockerrule.h33
-rw-r--r--src/webengine/urlinterceptor.cpp7
3 files changed, 108 insertions, 37 deletions
diff --git a/src/webengine/blockerrule.cpp b/src/webengine/blockerrule.cpp
index 8ecc1af..4146e85 100644
--- a/src/webengine/blockerrule.cpp
+++ b/src/webengine/blockerrule.cpp
@@ -48,11 +48,41 @@ BlockerRule::BlockerRule(QString rule, QObject *parent) :
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("~"));
+ if(opt.startsWith("~")) {
+ m_whitelistOptions.setFlag(RuleOption::script, true);
+ } else {
+ m_blacklistOptions.setFlag(RuleOption::script, true);
+ }
} else if(opt.endsWith("image")) {
- m_blacklistOptions.setFlag(RuleOption::image, true);
- m_whitelistOptions.setFlag(RuleOption::image, opt.startsWith("~"));
+ if(opt.startsWith("~")) {
+ m_whitelistOptions.setFlag(RuleOption::image, true);
+ } else {
+ m_blacklistOptions.setFlag(RuleOption::image, true);
+ }
+ } else if(opt.endsWith("stylesheet")) {
+ if(opt.startsWith("~")) {
+ m_whitelistOptions.setFlag(RuleOption::stylesheet, true);
+ } else {
+ m_blacklistOptions.setFlag(RuleOption::stylesheet, true);
+ }
+ } else if(opt.endsWith("object")) {
+ if(opt.startsWith("~")) {
+ m_whitelistOptions.setFlag(RuleOption::object, true);
+ } else {
+ m_blacklistOptions.setFlag(RuleOption::object, true);
+ }
+ } else if(opt.endsWith("object-subrequest")) {
+ if(opt.startsWith("~")) {
+ m_whitelistOptions.setFlag(RuleOption::objectsubrequest, true);
+ } else {
+ m_blacklistOptions.setFlag(RuleOption::objectsubrequest, true);
+ }
+ } else if(opt.endsWith("subdocument")) {
+ if(opt.startsWith("~")) {
+ m_whitelistOptions.setFlag(RuleOption::subdocument, true);
+ } else {
+ m_blacklistOptions.setFlag(RuleOption::subdocument, true);
+ }
}
}
@@ -89,7 +119,13 @@ bool BlockerRule::match(const QWebEngineUrlRequestInfo &info)
case DomainMatch:
if(info.requestUrl().host() == m_domain) {
- shouldBlock = true;
+ if(matchOptions(info, m_whitelistOptions)) {
+ shouldBlock = false;
+ } else {
+ if(matchOptions(info, m_blacklistOptions)) {
+ shouldBlock = true;
+ }
+ }
}
break;
@@ -99,19 +135,6 @@ bool BlockerRule::match(const QWebEngineUrlRequestInfo &info)
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;
}
@@ -163,3 +186,49 @@ QString BlockerRule::fromWildcardMatch(const QString &pattern)
return parsed;
}
+
+bool BlockerRule::matchOptions(const QWebEngineUrlRequestInfo &info, const RuleOptions &options)
+{
+ // no options are defined
+ if(options == 0) {
+ return false;
+ }
+
+ bool ret = false;
+ switch (info.resourceType()) {
+ case QWebEngineUrlRequestInfo::ResourceTypeScript:
+ if(options.testFlag(RuleOption::script)) {
+ ret = true;
+ }
+ break;
+ case QWebEngineUrlRequestInfo::ResourceTypeImage:
+ if(options.testFlag(RuleOption::image)) {
+ ret = true;
+ }
+ break;
+ case QWebEngineUrlRequestInfo::ResourceTypeStylesheet:
+ if(options.testFlag(RuleOption::stylesheet)) {
+ ret = true;
+ }
+ break;
+ case QWebEngineUrlRequestInfo::ResourceTypeObject:
+ if(options.testFlag(RuleOption::object)) {
+ ret = true;
+ }
+ break;
+ case QWebEngineUrlRequestInfo::ResourceTypePluginResource:
+ if(options.testFlag(RuleOption::objectsubrequest)) {
+ ret = true;
+ }
+ break;
+ case QWebEngineUrlRequestInfo::ResourceTypeSubFrame:
+ if(options.testFlag(RuleOption::subdocument)) {
+ ret = true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
diff --git a/src/webengine/blockerrule.h b/src/webengine/blockerrule.h
index df09d10..810de6d 100644
--- a/src/webengine/blockerrule.h
+++ b/src/webengine/blockerrule.h
@@ -38,22 +38,22 @@ public:
};
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
+ script = 1,
+ image = 2,
+ stylesheet = 4,
+ object = 8,
+ xmlhttprequest = 16,
+ objectsubrequest = 32,
+ subdocument = 64,
+ ping = 128,
+ websocket = 256,
+ document = 512,
+
+ elemhide = 1024,
+ generichide = 2048,
+ genericblock = 4096,
+
+ other = 8192
};
Q_DECLARE_FLAGS(RuleOptions, RuleOption)
@@ -72,6 +72,7 @@ public slots:
private:
// TODO: subclass QRegularExpression and move this there
QString fromWildcardMatch(const QString &pattern);
+ bool matchOptions(const QWebEngineUrlRequestInfo &info, const RuleOptions &options);
QString m_rule;
diff --git a/src/webengine/urlinterceptor.cpp b/src/webengine/urlinterceptor.cpp
index fbcef64..9352af6 100644
--- a/src/webengine/urlinterceptor.cpp
+++ b/src/webengine/urlinterceptor.cpp
@@ -29,7 +29,7 @@ void UrlRequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo &info)
{
for(BlockerRule *rule : m_sub->urlWhitelist()) {
if(rule->match(info)) {
- qDebug("OK %s", qUtf8Printable(info.requestUrl().toString()));
+ qDebug("OK %i %s", info.resourceType(), qUtf8Printable(info.requestUrl().toString()));
return;
}
}
@@ -37,12 +37,13 @@ void UrlRequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo &info)
for(BlockerRule *rule : m_sub->urlBlacklist()) {
if(rule->match(info)) {
info.block(true);
- qDebug(" %s", qUtf8Printable(info.requestUrl().toString()));
+ qDebug(" %i %s", info.resourceType(), qUtf8Printable(info.requestUrl().toString()));
return;
}
}
- qDebug("OK %s", qUtf8Printable(info.requestUrl().toString()));
+ // rule is neither in whitelist nor blacklist
+ qDebug("OK %i %s", info.resourceType(), qUtf8Printable(info.requestUrl().toString()));
}