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/webengine/blockerrule.cpp | 66 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 11 deletions(-) (limited to 'src/webengine/blockerrule.cpp') 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; -- cgit v1.2.1