summaryrefslogtreecommitdiff
path: root/src/webtab/networkaccessmanager.cpp
diff options
context:
space:
mode:
authorAndrea Diamantini <adjam7@gmail.com>2012-08-01 10:46:15 +0200
committerAndrea Diamantini <adjam7@gmail.com>2012-12-10 02:48:04 +0100
commit76af6dc385cb275da7af92933ec14c0177b229d6 (patch)
tree95658c2e0019f082a4aad695d2d14a9edfe49ba9 /src/webtab/networkaccessmanager.cpp
parentCopy webtab related files from rekonq repo (diff)
downloadrekonq-76af6dc385cb275da7af92933ec14c0177b229d6.tar.xz
Let WebView compile and work
WARNING: Not everything compiles yet...
Diffstat (limited to 'src/webtab/networkaccessmanager.cpp')
-rw-r--r--src/webtab/networkaccessmanager.cpp105
1 files changed, 85 insertions, 20 deletions
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 <KLocale>
#include <KProtocolManager>
+#include <KRun>
// Qt Includes
#include <QNetworkReply>
#include <QTimer>
+#include <QWebElement>
+#include <QWebFrame>
+#include <QWidget>
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<WebPage *>(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<QWidget*>(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<QWebFrame*>(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<QWebFrame*>(sender());
+ if (!frame)
+ return;
- if (!reply)
- reply = AccessManager::createRequest(op, req, outgoingData);
+ QList<QUrl> 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);
}