From 76af6dc385cb275da7af92933ec14c0177b229d6 Mon Sep 17 00:00:00 2001 From: Andrea Diamantini Date: Wed, 1 Aug 2012 10:46:15 +0200 Subject: Let WebView compile and work WARNING: Not everything compiles yet... --- src/webtab/networkaccessmanager.cpp | 105 +++++++++++++++++++++++++++++------- 1 file changed, 85 insertions(+), 20 deletions(-) (limited to 'src/webtab/networkaccessmanager.cpp') diff --git a/src/webtab/networkaccessmanager.cpp b/src/webtab/networkaccessmanager.cpp index dc10da1b..e817faca 100644 --- a/src/webtab/networkaccessmanager.cpp +++ b/src/webtab/networkaccessmanager.cpp @@ -32,16 +32,18 @@ // Local Includes #include "adblockmanager.h" -#include "application.h" -#include "webpage.h" // KDE Includes #include #include +#include // Qt Includes #include #include +#include +#include +#include class NullNetworkReply : public QNetworkReply @@ -54,7 +56,7 @@ public: setUrl(req.url()); setHeader(QNetworkRequest::ContentLengthHeader, 0); setHeader(QNetworkRequest::ContentTypeHeader, "text/plain"); - setError(QNetworkReply::ContentAccessDenied, i18n("Null reply")); + setError(QNetworkReply::ContentAccessDenied, i18n("Blocked by ad filter")); setAttribute(QNetworkRequest::User, QNetworkReply::ContentAccessDenied); QTimer::singleShot(0, this, SIGNAL(finished())); } @@ -76,6 +78,34 @@ protected: // ---------------------------------------------------------------------------------------------- +#define HIDABLE_ELEMENTS QL1S("audio,img,embed,object,iframe,frame,video") + + +static void hideBlockedElements(const QUrl& url, QWebElementCollection& collection) +{ + for (QWebElementCollection::iterator it = collection.begin(); it != collection.end(); ++it) + { + const QUrl baseUrl ((*it).webFrame()->baseUrl()); + QString src = (*it).attribute(QL1S("src")); + + if (src.isEmpty()) + src = (*it).evaluateJavaScript(QL1S("this.src")).toString(); + + if (src.isEmpty()) + continue; + const QUrl resolvedUrl (baseUrl.resolved(src)); + if (url == resolvedUrl) + { + //kDebug() << "*** HIDING ELEMENT: " << (*it).tagName() << resolvedUrl; + (*it).removeFromDocument(); + } + } +} + + +// ---------------------------------------------------------------------------------------------- + + NetworkAccessManager::NetworkAccessManager(QObject *parent) : AccessManager(parent) { @@ -92,29 +122,64 @@ NetworkAccessManager::NetworkAccessManager(QObject *parent) } -QNetworkReply *NetworkAccessManager::createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *outgoingData) +QNetworkReply *NetworkAccessManager::createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData) { - WebPage *parentPage = qobject_cast(parent()); + bool blocked = false; + + // Handle GET operations with AdBlock + if (op == QNetworkAccessManager::GetOperation) + blocked = AdBlockManager::self()->blockRequest(req); + + if (!blocked) + { + if (KProtocolInfo::isHelperProtocol(req.url())) + { + (void) new KRun(req.url(), qobject_cast(req.originatingObject())); + return new NullNetworkReply(req, this); + } - // NOTE: This to get sure we are NOT serving unused requests - if (!parentPage) - return new NullNetworkReply(request, this); + // set our "nice" accept-language header... + QNetworkRequest request = req; + request.setRawHeader("Accept-Language", _acceptLanguage); - QNetworkReply *reply = 0; + return KIO::AccessManager::createRequest(op, request, outgoingData); + } - // set our "nice" accept-language header... - QNetworkRequest req = request; - req.setRawHeader("Accept-Language", _acceptLanguage); + QWebFrame* frame = qobject_cast(req.originatingObject()); + if (frame) + { + if (!m_blockedRequests.contains(frame)) + connect(frame, SIGNAL(loadFinished(bool)), this, SLOT(slotFinished(bool))); + m_blockedRequests.insert(frame, req.url()); + } - // Handle GET operations with AdBlock - if (op == QNetworkAccessManager::GetOperation) - reply = rApp->adblockManager()->block(req, parentPage); + return new NullNetworkReply(req, this); +} + + +void NetworkAccessManager::slotFinished(bool ok) +{ + if (!ok) + return; + + if(!AdBlockManager::self()->isEnabled()) + return; + + if(!AdBlockManager::self()->isHidingElements()) + return; + + QWebFrame* frame = qobject_cast(sender()); + if (!frame) + return; - if (!reply) - reply = AccessManager::createRequest(op, req, outgoingData); + QList urls = m_blockedRequests.values(frame); + if (urls.isEmpty()) + return; - if (parentPage->hasNetworkAnalyzerEnabled()) - emit networkData(op, req, reply); + QWebElementCollection collection = frame->findAllElements(HIDABLE_ELEMENTS); + if (frame->parentFrame()) + collection += frame->parentFrame()->findAllElements(HIDABLE_ELEMENTS); - return reply; + Q_FOREACH(const QUrl& url, urls) + hideBlockedElements(url, collection); } -- cgit v1.2.1