summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/adblock/adblockmanager.cpp6
-rw-r--r--src/adblock/adblockrule.h5
-rw-r--r--src/adblock/adblockrulefallbackimpl.cpp42
-rw-r--r--src/adblock/adblockrulefallbackimpl.h5
-rw-r--r--src/adblock/adblockruleimpl.h3
-rw-r--r--src/adblock/adblockruletextmatchimpl.cpp3
-rw-r--r--src/adblock/adblockruletextmatchimpl.h2
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);