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.cpp90
1 files changed, 33 insertions, 57 deletions
diff --git a/src/webengine/blockerrule.cpp b/src/webengine/blockerrule.cpp
index 4146e85..79669b9 100644
--- a/src/webengine/blockerrule.cpp
+++ b/src/webengine/blockerrule.cpp
@@ -28,7 +28,6 @@
BlockerRule::BlockerRule(QString rule, QObject *parent) :
QObject(parent)
{
- m_rule = rule;
QString pattern = rule;
// Empty rule or comment
@@ -37,6 +36,12 @@ BlockerRule::BlockerRule(QString rule, QObject *parent) :
return;
}
+ // Ignore element hiding rules for now
+ if(pattern.contains("##") || pattern.contains("#@#")) {
+ m_type = RuleType::Invalid;
+ return;
+ }
+
// Exception
if(pattern.startsWith("@@")) {
m_exception = true;
@@ -89,13 +94,6 @@ BlockerRule::BlockerRule(QString rule, QObject *parent) :
pattern.remove(pattern.indexOf("$"), pattern.length());
}
- // Domain
- if(pattern.startsWith("||")) {
- m_type = RuleType::DomainMatch;
- m_domain = pattern.mid(2, pattern.indexOf("^")-2);
- return;
- }
-
// Regular expression
if(rule.startsWith("/") && rule.endsWith("/")) {
m_type = RuleType::RegularExpressionMatch;
@@ -103,39 +101,48 @@ BlockerRule::BlockerRule(QString rule, QObject *parent) :
return;
}
+ // Domain rules
+ if(pattern.startsWith("||")) {
+ pattern.remove(0, 2);
+ // find the end point for the domain
+ int end = pattern.indexOf(QRegularExpression("(?:[^\\w\\d\\_\\-\\.\\%]|$)"), 0);
+ domainExpression.setPattern(pattern.mid(0, end));
+ pattern.remove(0, end+1);
+ } else if(pattern.startsWith("|") && pattern.endsWith("|")) {
+ pattern.remove(0, 1);
+ pattern.chop(1);
+ domainExpression.setPattern(pattern);
+ } else {
+ domainExpression.setPattern(".*");
+ }
+
// Regular rule
- ruleExpression.setPattern(fromWildcardMatch(pattern));
- m_type = RuleType::WildcardMatch;
+ ruleExpression.setWildcardPattern(pattern);
+ m_type = RuleType::RegularExpressionMatch;
}
bool BlockerRule::match(const QWebEngineUrlRequestInfo &info)
{
- bool shouldBlock = false;
-
switch (m_type) {
case RuleType::Invalid:
- shouldBlock = false;
break;
- case DomainMatch:
- if(info.requestUrl().host() == m_domain) {
- if(matchOptions(info, m_whitelistOptions)) {
- shouldBlock = false;
- } else {
+ case RuleType::RegularExpressionMatch:
+ if(domainExpression.match(info.requestUrl().host())) {
+ if(ruleExpression.match(info.requestUrl().toString())) {
+ if(matchOptions(info, m_whitelistOptions)) {
+ return false;
+ }
if(matchOptions(info, m_blacklistOptions)) {
- shouldBlock = true;
+ return true;
}
+ return true;
}
}
break;
-
- case RegularExpressionMatch:
- case WildcardMatch:
- shouldBlock = ruleExpression.match(info.requestUrl().toString()).hasMatch();
- break;
}
- return shouldBlock;
+ return false;
}
bool BlockerRule::isValid()
@@ -153,38 +160,7 @@ bool BlockerRule::isException()
QString BlockerRule::toString() const
{
- return m_rule;
-}
-
-QString BlockerRule::fromWildcardMatch(const QString &pattern)
-{
- QString parsed;
-
- for(int i=0; i<pattern.length(); i++) {
- const QChar c = pattern.at(i);
- switch (c.toLatin1()) {
- case '*':
- parsed.append(".*");
- break;
- case '^':
- parsed.append("(?:[^\\w\\d\\_\\-\\.\\%]|$)");
- break;
- case '|':
- if(i == 0) {
- // beginning of string
- parsed.append('^');
- } else {
- // end of string
- parsed.append('$');
- }
- break;
- default:
- parsed.append(c);
- break;
- }
- }
-
- return parsed;
+ return QString("On [%1]: %2 %3").arg(domainExpression.pattern()).arg(ruleExpression.pattern()).arg(QString::number(m_blacklistOptions, 2));
}
bool BlockerRule::matchOptions(const QWebEngineUrlRequestInfo &info, const RuleOptions &options)