diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/adblock/adblockmanager.cpp | 6 | ||||
-rw-r--r-- | src/adblock/adblockrule.h | 5 | ||||
-rw-r--r-- | src/adblock/adblockrulefallbackimpl.cpp | 42 | ||||
-rw-r--r-- | src/adblock/adblockrulefallbackimpl.h | 5 | ||||
-rw-r--r-- | src/adblock/adblockruleimpl.h | 3 | ||||
-rw-r--r-- | src/adblock/adblockruletextmatchimpl.cpp | 3 | ||||
-rw-r--r-- | src/adblock/adblockruletextmatchimpl.h | 2 |
7 files changed, 54 insertions, 12 deletions
diff --git a/src/adblock/adblockmanager.cpp b/src/adblock/adblockmanager.cpp index 8deb0bcd..f7c61cdb 100644 --- a/src/adblock/adblockmanager.cpp +++ b/src/adblock/adblockmanager.cpp @@ -187,7 +187,7 @@ QNetworkReply *AdBlockManager::block(const QNetworkRequest &request, WebPage *pa foreach(const AdBlockRule &filter, _whiteList) { - if (filter.match(urlString, urlStringLowerCase)) + if (filter.match(request, urlString, urlStringLowerCase)) { kDebug() << "****ADBLOCK: WHITE RULE (@@) Matched: ***********"; kDebug() << "UrlString: " << urlString; @@ -205,7 +205,7 @@ QNetworkReply *AdBlockManager::block(const QNetworkRequest &request, WebPage *pa foreach(const AdBlockRule &filter, _blackList) { - if (filter.match(urlString, urlStringLowerCase)) + if (filter.match(request, urlString, urlStringLowerCase)) { kDebug() << "****ADBLOCK: BLACK RULE Matched: ***********"; kDebug() << "UrlString: " << urlString; @@ -215,7 +215,7 @@ QNetworkReply *AdBlockManager::block(const QNetworkRequest &request, WebPage *pa foreach(QWebElement el, elements) { const QString srcAttribute = el.attribute("src"); - if (filter.match(srcAttribute, srcAttribute.toLower())) + if (filter.match(request, srcAttribute, srcAttribute.toLower())) { kDebug() << "MATCHES ATTRIBUTE!!!!!"; el.setStyleProperty(QL1S("visibility"), QL1S("hidden")); diff --git a/src/adblock/adblockrule.h b/src/adblock/adblockrule.h index ef7b2f5f..701a9fe1 100644 --- a/src/adblock/adblockrule.h +++ b/src/adblock/adblockrule.h @@ -63,6 +63,7 @@ #include <QSharedPointer> // Forward Includes +class QNetworkRequest; class QString; class AdBlockRule @@ -70,10 +71,10 @@ class AdBlockRule public: AdBlockRule(const QString &filter); - bool match(const QString &encodedUrl, const QString &encodedUrlLowerCase) const + bool match(const QNetworkRequest &request, const QString &encodedUrl, const QString &encodedUrlLowerCase) const { Q_ASSERT(encodedUrl.toLower() == encodedUrlLowerCase); - return m_implementation->match(encodedUrl, encodedUrlLowerCase); + return m_implementation->match(request, encodedUrl, encodedUrlLowerCase); } private: diff --git a/src/adblock/adblockrulefallbackimpl.cpp b/src/adblock/adblockrulefallbackimpl.cpp index 988f2895..959050da 100644 --- a/src/adblock/adblockrulefallbackimpl.cpp +++ b/src/adblock/adblockrulefallbackimpl.cpp @@ -30,8 +30,11 @@ #include "rekonq_defines.h" // Qt Includes +#include <QWebFrame> +#include <QNetworkReply> #include <QStringList> + static inline bool isRegExpFilter(const QString &filter) { return filter.startsWith(QL1C('/')) && filter.endsWith(QL1C('/')); @@ -48,9 +51,24 @@ AdBlockRuleFallbackImpl::AdBlockRuleFallbackImpl(const QString &filter) const int optionsNumber = parsedLine.lastIndexOf(QL1C('$')); if (optionsNumber >= 0 && !isRegExpFilter(parsedLine)) { const QStringList options(parsedLine.mid(optionsNumber + 1).split(QL1C(','))); + parsedLine = parsedLine.left(optionsNumber); + if (options.contains(QL1S("match-case"))) m_regExp.setCaseSensitivity(Qt::CaseSensitive); - parsedLine = parsedLine.left(optionsNumber); + + foreach (const QString &option, options) { + // Domain restricted filter + const QString domainKeyword(QL1S("domain=")); + if (option.startsWith(domainKeyword)) { + QStringList domainList = option.mid(domainKeyword.length()).split(QL1C('|')); + foreach (const QString &domain, domainList) { + if (domain.startsWith(QL1C('~'))) + m_whiteDomains.insert(domain.toLower()); + else + m_blackDomains.insert(domain.toLower()); + } + } + } } if (isRegExpFilter(parsedLine)) @@ -61,9 +79,27 @@ AdBlockRuleFallbackImpl::AdBlockRuleFallbackImpl(const QString &filter) m_regExp.setPattern(parsedLine); } -bool AdBlockRuleFallbackImpl::match(const QString &encodedUrl, const QString &) const +bool AdBlockRuleFallbackImpl::match(const QNetworkRequest &request, const QString &encodedUrl, const QString &) const { - return m_regExp.indexIn(encodedUrl) != -1; + const bool regexpMatch = m_regExp.indexIn(encodedUrl) != -1; + + if (regexpMatch && (!m_whiteDomains.isEmpty() || !m_blackDomains.isEmpty())) { + Q_ASSERT(qobject_cast<QWebFrame*>(request.originatingObject())); + const QWebFrame *const origin = static_cast<QWebFrame *const>(request.originatingObject()); + + const QString originDomain = origin->url().host(); + + if (!m_whiteDomains.isEmpty()) { + // In this context, white domains means we block anything but what is in the list. + if (m_whiteDomains.contains(originDomain)) + return false; + return true; + } else if (m_blackDomains.contains(originDomain)) { + return true; + } + return false; + } + return regexpMatch; } QString AdBlockRuleFallbackImpl::convertPatternToRegExp(const QString &wildcardPattern) diff --git a/src/adblock/adblockrulefallbackimpl.h b/src/adblock/adblockrulefallbackimpl.h index ed0f6dc6..8cb02e10 100644 --- a/src/adblock/adblockrulefallbackimpl.h +++ b/src/adblock/adblockrulefallbackimpl.h @@ -31,17 +31,20 @@ // Qt Includes #include <QRegExp> #include <QString> +#include <QSet> class AdBlockRuleFallbackImpl : public AdBlockRuleImpl { public: AdBlockRuleFallbackImpl(const QString &filter); - bool match(const QString &encodedUrl, const QString &encodedUrlLowerCase) const; + bool match(const QNetworkRequest &request, const QString &encodedUrl, const QString &encodedUrlLowerCase) const; private: QString convertPatternToRegExp(const QString &wildcardPattern); QRegExp m_regExp; + QSet<QString> m_whiteDomains; + QSet<QString> m_blackDomains; }; #endif // ADBLOCKRULEFALLBACKIMPL_H diff --git a/src/adblock/adblockruleimpl.h b/src/adblock/adblockruleimpl.h index db5cec30..7702217b 100644 --- a/src/adblock/adblockruleimpl.h +++ b/src/adblock/adblockruleimpl.h @@ -27,13 +27,14 @@ #define ADBLOCKRULEIMPL_H class QString; +class QNetworkRequest; class AdBlockRuleImpl { public: AdBlockRuleImpl(const QString &) {} virtual ~AdBlockRuleImpl() {} - virtual bool match(const QString &encodedUrl, const QString &encodedUrlLowerCase) const = 0; + virtual bool match(const QNetworkRequest &request, const QString &encodedUrl, const QString &encodedUrlLowerCase) const = 0; }; #endif // ADBLOCKRULEIMPL_H diff --git a/src/adblock/adblockruletextmatchimpl.cpp b/src/adblock/adblockruletextmatchimpl.cpp index 892d78e0..2d534a3a 100644 --- a/src/adblock/adblockruletextmatchimpl.cpp +++ b/src/adblock/adblockruletextmatchimpl.cpp @@ -38,9 +38,10 @@ AdBlockRuleTextMatchImpl::AdBlockRuleTextMatchImpl(const QString &filter) m_textToMatch.remove(QL1C('*')); } -bool AdBlockRuleTextMatchImpl::match(const QString &encodedUrl, const QString &encodedUrlLowerCase) const +bool AdBlockRuleTextMatchImpl::match(const QNetworkRequest &request, const QString &encodedUrl, const QString &encodedUrlLowerCase) const { Q_UNUSED(encodedUrl); + Q_UNUSED(request); // Case sensitive compare is faster, but would be incorrect with encodedUrl since // we do want case insensitive. // What we do is work on a lowercase version of m_textToMatch, and compare to the lowercase diff --git a/src/adblock/adblockruletextmatchimpl.h b/src/adblock/adblockruletextmatchimpl.h index 28b0656c..b2c6e239 100644 --- a/src/adblock/adblockruletextmatchimpl.h +++ b/src/adblock/adblockruletextmatchimpl.h @@ -36,7 +36,7 @@ class AdBlockRuleTextMatchImpl : public AdBlockRuleImpl { public: AdBlockRuleTextMatchImpl(const QString &filter); - bool match(const QString &encodedUrl, const QString &encodedUrlLowerCase) const; + bool match(const QNetworkRequest &request, const QString &encodedUrl, const QString &encodedUrlLowerCase) const; static bool isTextMatchFilter(const QString &filter); |