From 1af5fc922877a5ec4db5dfa068b0e88c55fdc1c7 Mon Sep 17 00:00:00 2001 From: Andrea Diamantini Date: Thu, 14 Jan 2010 03:28:15 +0100 Subject: Better AdBlocking things :) --- src/adblock/adblockmanager.cpp | 73 +++++++++++++++++++++++++++++++++--- src/adblock/adblockmanager.h | 36 ++++++++++-------- src/adblock/adblockrule.cpp | 20 ---------- src/adblock/adblockrule.h | 3 -- src/adblock/tests/RULES | 19 ++++++++++ src/adblock/tests/divhidingtest.html | 15 ++++++++ src/webpage.cpp | 3 ++ 7 files changed, 125 insertions(+), 44 deletions(-) create mode 100644 src/adblock/tests/RULES create mode 100644 src/adblock/tests/divhidingtest.html diff --git a/src/adblock/adblockmanager.cpp b/src/adblock/adblockmanager.cpp index 209c2ab0..5290d561 100644 --- a/src/adblock/adblockmanager.cpp +++ b/src/adblock/adblockmanager.cpp @@ -30,6 +30,7 @@ // Local Includes #include "adblocknetworkreply.h" +#include "webpage.h" // KDE Includes #include @@ -38,6 +39,7 @@ // Qt Includes #include +#include AdBlockManager::AdBlockManager(QObject *parent) @@ -64,11 +66,13 @@ void AdBlockManager::loadSettings() _isAdblockEnabled = cg.readEntry("Enabled", false); _isHideAdsEnabled = cg.readEntry("Shrink", false); - filterList.clear(); - // no need to load filters if adblock is not enabled :) if(!_isAdblockEnabled) return; + + _whiteList.clear(); + _blackList.clear(); + _hideList.clear(); QMap entryMap = cg.entryMap(); QMap::ConstIterator it; @@ -79,8 +83,27 @@ void AdBlockManager::loadSettings() if (name.startsWith(QLatin1String("Filter"))) { - AdBlockRule filter(url); - filterList << filter; + if(url.startsWith("!")) + { + continue; + } + + if(url.startsWith("@@")) + { + AdBlockRule rule( url.mid(2) ); + _whiteList << rule; + continue; + } + + if(url.startsWith("##")) + { + _hideList << url.mid(2); + } + else + { + AdBlockRule rule( url ); + _blackList << rule; + } } } } @@ -98,14 +121,52 @@ QNetworkReply *AdBlockManager::block(const QNetworkRequest &request) QString urlString = request.url().toString(); - foreach(const AdBlockRule &filter, filterList) + // check white rules before :) + foreach(const AdBlockRule &filter, _whiteList) { if(filter.match(urlString)) { - kDebug() << "****ADBLOCK: Matched: ***********" << urlString; + kDebug() << "****ADBLOCK: WHITE RULE (@@) Matched: ***********" << urlString; + return 0; + } + } + + // then check the black ones :( + foreach(const AdBlockRule &filter, _blackList) + { + if(filter.match(urlString)) + { + kDebug() << "****ADBLOCK: BLACK RULE Matched: ***********" << urlString; AdBlockNetworkReply *reply = new AdBlockNetworkReply(request, urlString, this); return reply; } } + + // no match return 0; } + + +void AdBlockManager::applyHidingRules(WebPage *page) +{ + if(!page || !page->mainFrame()) + return; + + if (!_isAdblockEnabled) + return; + + if (!_isHideAdsEnabled) + return; + + foreach(const QString &filter, _hideList) + { + QWebElement document = page->mainFrame()->documentElement(); + QWebElementCollection elements = document.findAll(filter); + + foreach (QWebElement element, elements) + { + element.setStyleProperty(QLatin1String("visibility"), QLatin1String("hidden")); + element.removeFromDocument(); + } + } +} diff --git a/src/adblock/adblockmanager.h b/src/adblock/adblockmanager.h index 1f53b76e..45c3fa18 100644 --- a/src/adblock/adblockmanager.h +++ b/src/adblock/adblockmanager.h @@ -28,19 +28,6 @@ #ifndef ADBLOCK_MANAGER_H #define ADBLOCK_MANAGER_H -// Local Includes -#include "adblockrule.h" - -// Qt Includes -#include -#include - -// Forward Includes -class QNetworkRequest; - -// Definitions -typedef QList AdBlockRuleList; - // NOTE: AdBlockPlus Filters (fast) summary // @@ -114,7 +101,23 @@ typedef QList AdBlockRuleList; // // The previous rule will hide every div whose class is named "advise". Usual CSS selectors apply here :) // -// END NOTE +// END NOTE ---------------------------------------------------------------------------------------------------------- + + +// Local Includes +#include "adblockrule.h" + +// Qt Includes +#include +#include + +// Forward Includes +class QNetworkRequest; +class WebPage; +class QStringList; + +// Definitions +typedef QList AdBlockRuleList; class AdBlockManager : public QObject @@ -127,12 +130,15 @@ public: void loadSettings(); QNetworkReply *block(const QNetworkRequest &request); + void applyHidingRules(WebPage *page); private: bool _isAdblockEnabled; bool _isHideAdsEnabled; - AdBlockRuleList filterList; + AdBlockRuleList _blackList; + AdBlockRuleList _whiteList; + QStringList _hideList; }; #endif diff --git a/src/adblock/adblockrule.cpp b/src/adblock/adblockrule.cpp index 870ad825..ea3e17de 100644 --- a/src/adblock/adblockrule.cpp +++ b/src/adblock/adblockrule.cpp @@ -60,24 +60,10 @@ AdBlockRule::AdBlockRule(const QString &filter) - : m_cssRule(false) - , m_exceptionRule(false) - , m_enabledRule(true) { bool isRegExpRule = false; - if (filter.startsWith(QLatin1String("!")) || filter.trimmed().isEmpty()) - m_enabledRule = false; - - if (filter.contains(QLatin1String("##"))) - m_cssRule = true; - QString parsedLine = filter; - if (parsedLine.startsWith(QLatin1String("@@"))) - { - m_exceptionRule = true; - parsedLine = parsedLine.mid(2); - } if (parsedLine.startsWith(QLatin1Char('/'))) { @@ -113,12 +99,6 @@ AdBlockRule::AdBlockRule(const QString &filter) // return true means "matched rule", so stop url! bool AdBlockRule::match(const QString &encodedUrl) const { - if (m_cssRule) - return false; - - if (!m_enabledRule) - return false; - bool matched = m_regExp.indexIn(encodedUrl) != -1; if (matched && !m_options.isEmpty()) diff --git a/src/adblock/adblockrule.h b/src/adblock/adblockrule.h index 8680942f..7c4c4161 100644 --- a/src/adblock/adblockrule.h +++ b/src/adblock/adblockrule.h @@ -72,9 +72,6 @@ public: private: QString convertPatternToRegExp(const QString &wildcardPattern); - bool m_cssRule; - bool m_exceptionRule; - bool m_enabledRule; QRegExp m_regExp; QStringList m_options; }; diff --git a/src/adblock/tests/RULES b/src/adblock/tests/RULES new file mode 100644 index 00000000..ee8485a6 --- /dev/null +++ b/src/adblock/tests/RULES @@ -0,0 +1,19 @@ +! cancel ALL your rules in the adblock, +! load these and test rekonq against +! the proposed sites +! Good Luck! +! +! This rule will block EVERY site containing adv +adv +! +! This one will wildcard EVERY site containing the word "advice" +@@advice +! +! Block every google site :) +|http://google* +! +! Block every pdf file! +*pdf| +! +! Block every div of the class "advise" +##div.advise \ No newline at end of file diff --git a/src/adblock/tests/divhidingtest.html b/src/adblock/tests/divhidingtest.html new file mode 100644 index 00000000..a38e9ea1 --- /dev/null +++ b/src/adblock/tests/divhidingtest.html @@ -0,0 +1,15 @@ + + + + + + + +
+

Oh oh.. an advise!!

+
+

no advises here :)

+At least, I hope so... + + + \ No newline at end of file diff --git a/src/webpage.cpp b/src/webpage.cpp index cfa5ff04..6bf172a6 100644 --- a/src/webpage.cpp +++ b/src/webpage.cpp @@ -42,6 +42,7 @@ #include "webtab.h" #include "webpluginfactory.h" #include "networkaccessmanager.h" +#include "adblockmanager.h" // KDE Includes #include @@ -179,6 +180,8 @@ void WebPage::handleUnsupportedContent(QNetworkReply *reply) void WebPage::loadFinished(bool) { + Application::adblockManager()->applyHidingRules(this); + // KWallet Integration // TODO: Add check for sites exempt from automatic form filling... if (wallet()) -- cgit v1.2.1