summaryrefslogtreecommitdiff
path: root/src/protocolhandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/protocolhandler.cpp')
-rw-r--r--src/protocolhandler.cpp273
1 files changed, 168 insertions, 105 deletions
diff --git a/src/protocolhandler.cpp b/src/protocolhandler.cpp
index cd75d06f..51bd7e9a 100644
--- a/src/protocolhandler.cpp
+++ b/src/protocolhandler.cpp
@@ -2,16 +2,16 @@
*
* This file is a part of the rekonq project
*
-* Copyright (C) 2009 by Andrea Diamantini <adjam7 at gmail dot com>
+* Copyright (C) 2010 by Andrea Diamantini <adjam7 at gmail dot com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License or (at your option) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
-* by the membership of KDE e.V.), which shall act as a proxy
+* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
-*
+*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
@@ -36,7 +36,9 @@
#include "mainwindow.h"
#include "mainview.h"
#include "urlbar.h"
+#include "webtab.h"
#include "historymanager.h"
+#include "adblockmanager.h"
// KDE Includes
#include <klocalizedstring.h>
@@ -44,13 +46,13 @@
#include <KRun>
#include <KToolInvocation>
#include <KStandardDirs>
-#include <KDebug>
#include <KMimeType>
#include <KIconLoader>
#include <KDirLister>
#include <KFileItem>
#include <KJob>
#include <kio/udsentry.h>
+#include <KMessageBox>
// Qt Includes
#include <QLatin1String>
@@ -62,11 +64,10 @@
ProtocolHandler::ProtocolHandler(QObject *parent)
- : QObject(parent)
- , _lister(new KDirLister)
- , _frame(0)
+ : QObject(parent)
+ , _lister(0)
+ , _frame(0)
{
- connect( _lister, SIGNAL(newItems(const KFileItemList &)), this, SLOT(showResults(const KFileItemList &)));
}
@@ -79,38 +80,49 @@ bool ProtocolHandler::preHandling(const QNetworkRequest &request, QWebFrame *fra
{
_url = request.url();
_frame = frame;
-
- kDebug() << "URL PROTOCOL: " << _url;
-
- // relative urls
- if(_url.isRelative())
- return false;
-
+
// "http(s)" (fast) handling
- if( _url.protocol() == QLatin1String("http") || _url.protocol() == QLatin1String("https") )
+ if (_url.protocol() == QL1S("http") || _url.protocol() == QL1S("https"))
+ return false;
+
+ // relative urls
+ if (_url.isRelative())
return false;
-
+
// javascript handling
- if( _url.protocol() == QLatin1String("javascript") )
+ if (_url.protocol() == QL1S("javascript"))
{
QString scriptSource = _url.authority();
QVariant result = frame->evaluateJavaScript(scriptSource);
return true;
}
-
+
// "mailto" handling
- if ( _url.protocol() == QLatin1String("mailto") )
+ if (_url.protocol() == QL1S("mailto"))
{
KToolInvocation::invokeMailer(_url);
return true;
}
+ // "abp" handling
+ if (_url.protocol() == QL1S("abp"))
+ {
+ abpHandling();
+ return true;
+ }
+
// "about" handling
- if ( _url.protocol() == QLatin1String("about") )
+ if (_url.protocol() == QL1S("about"))
{
- if( _url == KUrl("about:home") )
+ // let webkit manage the about:blank url...
+ if (_url == KUrl("about:blank"))
+ {
+ return false;
+ }
+
+ if (_url == KUrl("about:home"))
{
- switch(ReKonfig::newTabStartPage())
+ switch (ReKonfig::newTabStartPage())
{
case 0: // favorites
_url = KUrl("about:favorites");
@@ -118,28 +130,24 @@ bool ProtocolHandler::preHandling(const QNetworkRequest &request, QWebFrame *fra
case 1: // closed tabs
_url = KUrl("about:closedTabs");
break;
- case 2: // history
- _url = KUrl("about:history");
- break;
- case 3: // bookmarks
+ case 2: // bookmarks
_url = KUrl("about:bookmarks");
break;
+ case 3: // history
+ _url = KUrl("about:history");
+ break;
+ case 4: // downloads
+ _url = KUrl("about:downloads");
default: // unuseful
break;
}
}
- if( _url == KUrl("about:closedTabs")
- || _url == KUrl("about:history")
- || _url == KUrl("about:bookmarks")
- || _url == KUrl("about:favorites")
- )
- {
- NewTabPage p(frame);
- p.generate(_url);
- return true;
- }
+
+ NewTabPage p(frame);
+ p.generate(_url);
+ return true;
}
-
+
return false;
}
@@ -148,16 +156,16 @@ bool ProtocolHandler::postHandling(const QNetworkRequest &request, QWebFrame *fr
{
_url = request.url();
_frame = frame;
-
+
kDebug() << "URL PROTOCOL: " << _url;
-
+
// "http(s)" (fast) handling
- if( _url.protocol() == QLatin1String("http") || _url.protocol() == QLatin1String("https") )
+ if (_url.protocol() == QL1S("http") || _url.protocol() == QL1S("https"))
return false;
-
+
// "mailto" handling: It needs to be handled both here(mail links clicked)
// and in prehandling (mail url launched)
- if ( _url.protocol() == QLatin1String("mailto") )
+ if (_url.protocol() == QL1S("mailto"))
{
KToolInvocation::invokeMailer(_url);
return true;
@@ -168,48 +176,63 @@ bool ProtocolHandler::postHandling(const QNetworkRequest &request, QWebFrame *fr
// My idea is: webkit cannot handle in any way ftp. So we have surely to return true here.
// We start trying to guess what the url represent: it's a dir? show its contents (and download them).
// it's a file? download it. It's another thing? beat me, but I don't know what to do...
- if( _url.protocol() == QLatin1String("ftp") )
+ if (_url.protocol() == QL1S("ftp"))
{
KIO::StatJob *job = KIO::stat(_url);
- connect(job, SIGNAL(result(KJob*)), this, SLOT( slotMostLocalUrlResult(KJob*) ));
+ connect(job, SIGNAL(result(KJob*)), this, SLOT(slotMostLocalUrlResult(KJob*)));
return true;
}
-
+
// "file" handling. This is quite trivial :)
- if(_url.protocol() == QLatin1String("file") )
+ if (_url.protocol() == QL1S("file"))
{
- QFileInfo fileInfo( _url.path() );
- if(fileInfo.isDir())
+ QFileInfo fileInfo(_url.path());
+ if (fileInfo.isDir())
{
+ _lister = new KDirLister;
+ connect(_lister, SIGNAL(newItems(const KFileItemList &)), this, SLOT(showResults(const KFileItemList &)));
_lister->openUrl(_url);
- Application::instance()->mainWindow()->mainView()->urlBar()->setUrl(_url);
+
return true;
}
}
-
+
return false;
}
-QString ProtocolHandler::dirHandling(const KFileItemList &list)
-{
+// ---------------------------------------------------------------------------------------------------------------------------
+
- KFileItem mainItem = _lister->rootItem();
- KUrl rootUrl = mainItem.url();
-
- if (mainItem.isNull())
+void ProtocolHandler::showResults(const KFileItemList &list)
+{
+ if (!_lister->rootItem().isNull() && _lister->rootItem().isReadable() && _lister->rootItem().isFile())
{
- QString errStr = i18n("Error opening: %1: No such file or directory", rootUrl.prettyUrl() );
- return errStr;
+ emit downloadUrl(_lister->rootItem().url());
+ return;
}
-
- if (!mainItem.isReadable())
+
+ QString html = dirHandling(list);
+ _frame->setHtml(html, _url);
+
+ Application::instance()->mainWindow()->currentTab()->setFocus();
+ Application::historyManager()->addHistoryEntry(_url.prettyUrl());
+
+ delete _lister;
+}
+
+
+QString ProtocolHandler::dirHandling(const KFileItemList &list)
+{
+ if (!_lister)
{
- QString errStr = i18n("Unable to read %1", rootUrl.prettyUrl() );
- return errStr;
+ return QString("rekonq error, sorry :(");
}
-
- // display "rekonq info" page
+
+ // let me modify it..
+ KUrl rootUrl = _url;
+
+ // display "rekonq info" page
QString infoFilePath = KStandardDirs::locate("data", "rekonq/htmls/rekonqinfo.html");
QFile file(infoFilePath);
@@ -219,18 +242,18 @@ QString ProtocolHandler::dirHandling(const KFileItemList &list)
return QString("rekonq error, sorry :(");
}
- QString title = _url.prettyUrl();
- QString msg = "<h1>" + i18n("Index of ") + _url.prettyUrl() + "</h1>";
+ QString title = _url.prettyUrl();
+ QString msg = i18nc("%1=an URL", "<h1>Index of %1</h1>", _url.prettyUrl());
- if(rootUrl.cd(".."))
+ if (rootUrl.cd(".."))
{
QString path = rootUrl.prettyUrl();
- QString uparrow = KIconLoader::global()->iconPath( "arrow-up", KIconLoader::Small );
+ QString uparrow = KIconLoader::global()->iconPath("arrow-up", KIconLoader::Small);
msg += "<img src=\"file://" + uparrow + "\" alt=\"up-arrow\" />";
msg += "<a href=\"" + path + "\">" + i18n("Up to higher level directory") + "</a><br /><br />";
}
-
+
msg += "<table width=\"100%\">";
msg += "<tr><th align=\"left\">" + i18n("Name") + "</th><th>" + i18n("Size") + "</th><th>" + i18n("Last Modified") + "</th></tr>";
@@ -238,63 +261,43 @@ QString ProtocolHandler::dirHandling(const KFileItemList &list)
{
msg += "<tr>";
QString fullPath = item.url().prettyUrl();
-
+
QString iconName = item.iconName();
- QString icon = QString("file://") + KIconLoader::global()->iconPath( iconName, KIconLoader::Small );
-
+ QString icon = QString("file://") + KIconLoader::global()->iconPath(iconName, KIconLoader::Small);
+
msg += "<td width=\"70%\">";
msg += "<img src=\"" + icon + "\" alt=\"" + iconName + "\" /> ";
msg += "<a href=\"" + fullPath + "\">" + item.name() + "</a>";
msg += "</td>";
-
+
msg += "<td align=\"right\">";
- if(item.isFile())
+ if (item.isFile())
{
- msg += QString::number( item.size()/1024 ) + " KB";
+ msg += QString::number(item.size() / 1024) + " KB";
}
msg += "</td>";
-
+
msg += "<td align=\"right\">";
msg += item.timeString();
msg += "</td>";
-
+
msg += "</tr>";
}
msg += "</table>";
-
-
- QString html = QString(QLatin1String(file.readAll()))
- .arg(title)
- .arg(msg)
- ;
-
- return html;
-}
-void ProtocolHandler::showResults(const KFileItemList &list)
-{
- if(_lister->rootItem().isFile())
- {
- WebPage *page = qobject_cast<WebPage *>( _frame->page() );
- page->downloadUrl( _lister->rootItem().url() );
- return;
- }
-
- if ( list.isEmpty() )
- return;
-
- QString html = dirHandling(list);
- _frame->setHtml(html);
+ QString html = QString(QL1S(file.readAll()))
+ .arg(title)
+ .arg(msg)
+ ;
- Application::instance()->mainWindow()->mainView()->urlBar()->setUrl(_url);
- Application::historyManager()->addHistoryEntry( _url.prettyUrl() );
+ return html;
}
void ProtocolHandler::slotMostLocalUrlResult(KJob *job)
{
- if(job->error())
+ if (job->error())
{
// TODO
kDebug() << "error";
@@ -303,9 +306,69 @@ void ProtocolHandler::slotMostLocalUrlResult(KJob *job)
{
KIO::StatJob *statJob = static_cast<KIO::StatJob*>(job);
KIO::UDSEntry entry = statJob->statResult();
- if( entry.isDir() )
+ if (entry.isDir())
+ {
+ _lister = new KDirLister;
+ connect(_lister, SIGNAL(newItems(const KFileItemList &)), this, SLOT(showResults(const KFileItemList &)));
_lister->openUrl(_url);
+ }
else
+ {
emit downloadUrl(_url);
+ }
+ }
+}
+
+
+/**
+ * abp scheme (easy) explanation
+ *
+ */
+void ProtocolHandler::abpHandling()
+{
+ kDebug() << _url;
+
+ QString path = _url.path();
+ if (path != QL1S("subscribe"))
+ return;
+
+ QMap<QString, QString> map = _url.queryItems(KUrl::CaseInsensitiveKeys);
+
+ QString location = map.value(QL1S("location"));
+ kDebug() << location;
+
+ QString title = map.value(QL1S("title"));
+ kDebug() << title;
+
+ QString requireslocation = map.value(QL1S("requireslocation"));
+ kDebug() << requireslocation;
+
+ QString requirestitle = map.value(QL1S("requirestitle"));
+ kDebug() << requirestitle;
+
+ QString info;
+ if (requirestitle.isEmpty() || requireslocation.isEmpty())
+ {
+ info = title;
+ }
+ else
+ {
+ info = i18n("\n %1,\n %2 (required by %3)\n", title, requirestitle, title);
+ }
+
+ if (KMessageBox::questionYesNo(0,
+ i18n("Do you want to add the following subscriptions to your adblock settings?\n") + info,
+ i18n("Add automatic subscription to the adblock"),
+ KGuiItem(i18n("Add")),
+ KGuiItem(i18n("Discard"))
+ )
+ )
+ {
+ if (!requireslocation.isEmpty() && !requirestitle.isEmpty())
+ {
+ Application::adblockManager()->addSubscription(requirestitle, requireslocation);
+ }
+ Application::adblockManager()->addSubscription(title, location);
+ Application::adblockManager()->loadSettings(false);
}
}