aboutsummaryrefslogtreecommitdiff
path: root/src/webengine/blockerrule.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/webengine/blockerrule.cpp')
-rw-r--r--src/webengine/blockerrule.cpp66
1 files changed, 55 insertions, 11 deletions
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;