summaryrefslogtreecommitdiff
path: root/src/adblock/adblockmanager.cpp
diff options
context:
space:
mode:
authorPaul Rohrbach <p.b.r@gmx.net>2013-07-30 21:15:24 +0200
committerAndrea Diamantini <adjam7@gmail.com>2013-07-30 21:17:12 +0200
commitf28c7dc42b6b6924e01b4b97736a89acdaddb244 (patch)
treebdca694cfc4da8e1786553f30c6fec6100daa2ee /src/adblock/adblockmanager.cpp
parentProperly resolve url before pasteAndGo (diff)
downloadrekonq-f28c7dc42b6b6924e01b4b97736a89acdaddb244.tar.xz
Adding domain-specific hiding support to the adblocker.
The domain-specific rules are stored in a QMultiHash, where the key is the domain and the values are the rules for the specified domain. This causes redundancy, because on rule can be applied to more than one domain, but has a really fast look-up time. The code for the generic hiding has not changed and is just relocated. REVIEW: 111521 REVIEWED-BY: adjam
Diffstat (limited to 'src/adblock/adblockmanager.cpp')
-rw-r--r--src/adblock/adblockmanager.cpp43
1 files changed, 12 insertions, 31 deletions
diff --git a/src/adblock/adblockmanager.cpp b/src/adblock/adblockmanager.cpp
index 51000a3b..114f7551 100644
--- a/src/adblock/adblockmanager.cpp
+++ b/src/adblock/adblockmanager.cpp
@@ -78,7 +78,6 @@ AdBlockManager::~AdBlockManager()
{
_whiteList.clear();
_blackList.clear();
- _hideList.clear();
}
@@ -118,7 +117,7 @@ void AdBlockManager::loadSettings()
_whiteList.clear();
_blackList.clear();
- _hideList.clear();
+ _elementHiding.clear();
KConfigGroup settingsGroup(_adblockConfig, "Settings");
_isAdblockEnabled = settingsGroup.readEntry("adBlockEnabled", false);
@@ -215,27 +214,19 @@ void AdBlockManager::loadRuleString(const QString &stringRule)
const QString filter = stringRule.mid(2);
if (filter.isEmpty())
return;
-
+
AdBlockRule rule(filter);
_whiteList << rule;
return;
}
// hide (CSS) rules
- if (stringRule.startsWith(QL1S("##")))
+ if (stringRule.contains(QL1S("##")))
{
- const QString filter = stringRule.mid(2);
- if (filter.isEmpty())
- return;
-
- _hideList << filter;
+ _elementHiding.addRule(stringRule);
return;
}
- // TODO implement domain-specific hiding
- if (stringRule.contains(QL1S("##")))
- return;
-
if (_hostBlackList.tryAddFilter(stringRule))
return;
@@ -249,8 +240,9 @@ bool AdBlockManager::blockRequest(const QNetworkRequest &request)
if (!_isAdblockEnabled)
return false;
- // we (ad)block just http traffic
- if (request.url().scheme() != QL1S("http"))
+ // we (ad)block just http & https traffic
+ if (request.url().scheme() != QL1S("http")
+ && request.url().scheme() != QL1S("https"))
return false;
QStringList whiteRefererList = ReKonfig::whiteReferer();
@@ -298,6 +290,7 @@ bool AdBlockManager::blockRequest(const QNetworkRequest &request)
return true;
}
}
+
// no match
return false;
}
@@ -410,7 +403,7 @@ void AdBlockManager::applyHidingRules(bool ok)
{
if (!ok)
return;
-
+
QWebFrame *frame = qobject_cast<QWebFrame *>(sender());
if (!frame)
return;
@@ -418,25 +411,13 @@ void AdBlockManager::applyHidingRules(bool ok)
WebPage *page = qobject_cast<WebPage *>(frame->page());
if (!page)
return;
-
+
QString mainPageHost = page->loadingUrl().host();
QStringList hosts = ReKonfig::whiteReferer();
if (hosts.contains(mainPageHost))
return;
-
- QWebElement document = frame->documentElement();
- // HIDE RULES
- Q_FOREACH(const QString & filter, _hideList)
- {
- QWebElementCollection elements = document.findAll(filter);
+ QWebElement document = frame->documentElement();
- Q_FOREACH(QWebElement el, elements)
- {
- if (el.isNull())
- continue;
- kDebug() << "Hide element: " << el.localName();
- el.removeFromDocument();
- }
- }
+ _elementHiding.apply(document, mainPageHost);
}