Git commit 90eab081fa7f46961cd1597a7cb98c1dc32bd0b8 by Andrea Diamantini. Committed on 24/02/2013 at 18:25. Pushed by adjam into branch 'master'. AdBlock Improvement Hiding rules support (at least the easy ones, the most ones, against hiding id && classes) :D To test it, take a look (in example) at the url: http://simple-adblock.com/faq/testing-your-adblocker/ M +52 -1 src/adblock/adblockmanager.cpp M +5 -1 src/adblock/adblockmanager.h M +3 -3 src/webtab/networkaccessmanager.cpp M +2 -2 src/webtab/networkaccessmanager.h M +5 -2 src/webtab/webpage.cpp http://commits.kde.org/rekonq/90eab081fa7f46961cd1597a7cb98c1dc32bd0b8 diff --git a/src/adblock/adblockmanager.cpp b/src/adblock/adblockmanager.cpp index 62f8930..51000a3 100644 --- a/src/adblock/adblockmanager.cpp +++ b/src/adblock/adblockmanager.cpp @@ -34,6 +34,8 @@ // Local Includes #include "adblocksettingwidget.h" = +#include "webpage.h" + // KDE Includes #include #include @@ -115,6 +117,7 @@ void AdBlockManager::loadSettings() = _whiteList.clear(); _blackList.clear(); + _hideList.clear(); = KConfigGroup settingsGroup(_adblockConfig, "Settings"); @@ -224,7 +227,7 @@ void AdBlockManager::loadRuleString(const QString &stri= ngRule) const QString filter =3D stringRule.mid(2); if (filter.isEmpty()) return; - + = _hideList << filter; return; } @@ -389,3 +392,51 @@ bool AdBlockManager::isAdblockEnabledForHost(const QSt= ring &host) { return ! _hostWhiteList.match(host); } + + +void AdBlockManager::applyHidingRules(QWebFrame *frame) +{ + if (!frame) + return; + + if (!_isAdblockEnabled) + return; + + connect(frame, SIGNAL(loadFinished(bool)), this, SLOT(applyHidingRules= (bool))); +} + + +void AdBlockManager::applyHidingRules(bool ok) +{ + if (!ok) + return; + = + QWebFrame *frame =3D qobject_cast(sender()); + if (!frame) + return; + + WebPage *page =3D qobject_cast(frame->page()); + if (!page) + return; + = + QString mainPageHost =3D page->loadingUrl().host(); + QStringList hosts =3D ReKonfig::whiteReferer(); + if (hosts.contains(mainPageHost)) + return; + = + QWebElement document =3D frame->documentElement(); + + // HIDE RULES + Q_FOREACH(const QString & filter, _hideList) + { + QWebElementCollection elements =3D document.findAll(filter); + + Q_FOREACH(QWebElement el, elements) + { + if (el.isNull()) + continue; + kDebug() << "Hide element: " << el.localName(); + el.removeFromDocument(); + } + } +} diff --git a/src/adblock/adblockmanager.h b/src/adblock/adblockmanager.h index 7f044f3..3d329ad 100644 --- a/src/adblock/adblockmanager.h +++ b/src/adblock/adblockmanager.h @@ -139,7 +139,7 @@ = // Forward Includes class QNetworkRequest; -class WebPage; +class QWebFrame; = // Definitions typedef QList AdBlockRuleList; @@ -186,6 +186,9 @@ private Q_SLOTS: = void slotFinished(KJob *); = + void applyHidingRules(QWebFrame *); + void applyHidingRules(bool); + = Q_SIGNALS: void reloadCurrentPage(); = @@ -197,6 +200,7 @@ private: AdBlockHostMatcher _hostWhiteList; AdBlockRuleList _blackList; AdBlockRuleList _whiteList; + = QStringList _hideList; = KSharedConfig::Ptr _adblockConfig; diff --git a/src/webtab/networkaccessmanager.cpp b/src/webtab/networkaccess= manager.cpp index 95bfa47..8e1394c 100644 --- a/src/webtab/networkaccessmanager.cpp +++ b/src/webtab/networkaccessmanager.cpp @@ -149,7 +149,7 @@ QNetworkReply *NetworkAccessManager::createRequest(Oper= ation op, const QNetworkR if (frame) { if (!m_blockedRequests.contains(frame)) - connect(frame, SIGNAL(loadFinished(bool)), this, SLOT(slotFini= shed(bool))); + connect(frame, SIGNAL(loadFinished(bool)), this, SLOT(applyHid= ingBlockedElements(bool))); m_blockedRequests.insert(frame, req.url()); } = @@ -157,7 +157,7 @@ QNetworkReply *NetworkAccessManager::createRequest(Oper= ation op, const QNetworkR } = = -void NetworkAccessManager::slotFinished(bool ok) +void NetworkAccessManager::applyHidingBlockedElements(bool ok) { if (!ok) return; @@ -181,5 +181,5 @@ void NetworkAccessManager::slotFinished(bool ok) collection +=3D frame->parentFrame()->findAllElements(HIDABLE_ELEM= ENTS); = Q_FOREACH(const QUrl & url, urls) - hideBlockedElements(url, collection); + hideBlockedElements(url, collection); } diff --git a/src/webtab/networkaccessmanager.h b/src/webtab/networkaccessma= nager.h index d839bdd..3bf45e1 100644 --- a/src/webtab/networkaccessmanager.h +++ b/src/webtab/networkaccessmanager.h @@ -53,8 +53,8 @@ protected: virtual QNetworkReply *createRequest(QNetworkAccessManager::Operation = op, const QNetworkRequest &request, QIODevice *outgoingData =3D 0); = private Q_SLOTS: - void slotFinished(bool); - + void applyHidingBlockedElements(bool); + = private: QMultiHash m_blockedRequests; QByteArray _acceptLanguage; diff --git a/src/webtab/webpage.cpp b/src/webtab/webpage.cpp index 958dc5c..b61f66c 100644 --- a/src/webtab/webpage.cpp +++ b/src/webtab/webpage.cpp @@ -38,6 +38,7 @@ #include "rekonq.h" = // Local Includes +#include "adblockmanager.h" #include "downloadmanager.h" #include "historymanager.h" #include "iconmanager.h" @@ -175,6 +176,8 @@ WebPage::WebPage(QWidget *parent, bool isPrivateBrowsin= g) connect(this, SIGNAL(loadStarted()), this, SLOT(loadStarted())); connect(this, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool= ))); = + connect(this, SIGNAL(frameCreated(QWebFrame *)), AdBlockManager::self(= ), SLOT(applyHidingRules(QWebFrame *))); + = // protocol handler signals connect(&_protHandler, SIGNAL(downloadUrl(KUrl)), this, SLOT(downloadU= rl(KUrl))); } @@ -292,7 +295,7 @@ bool WebPage::acceptNavigationRequest(QWebFrame *frame,= const QNetworkRequest &r if (!settings()->testAttribute(QWebSettings::PrivateBrowsingEnabled)) { // Get the SSL information sent, if any... - KIO::AccessManager *manager =3D qobject_cast(= networkAccessManager()); + NetworkAccessManager *manager =3D qobject_cast(networkAccessManager()); KIO::MetaData metaData =3D manager->requestMetaData(); if (metaData.contains(QL1S("ssl_in_use"))) { @@ -502,7 +505,7 @@ void WebPage::loadStarted() = int value =3D val.toInt(); if (value !=3D 10) - mainFrame()->setZoomFactor(QVariant(value).toReal() / 10); // Don= 't allox max +1 values + mainFrame()->setZoomFactor(QVariant(value).toReal() / 10); // Don= 't allox max +1 values = } = =20