diff options
Diffstat (limited to 'src/protocolhandler.cpp')
-rw-r--r-- | src/protocolhandler.cpp | 151 |
1 files changed, 113 insertions, 38 deletions
diff --git a/src/protocolhandler.cpp b/src/protocolhandler.cpp index c90afd19..c97bc475 100644 --- a/src/protocolhandler.cpp +++ b/src/protocolhandler.cpp @@ -2,7 +2,7 @@ * * 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 @@ -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> @@ -51,6 +53,7 @@ #include <KFileItem> #include <KJob> #include <kio/udsentry.h> +#include <KMessageBox> // Qt Includes #include <QLatin1String> @@ -60,13 +63,15 @@ #include <QFile> #include <QDateTime> +// Defines +#define QL1S(x) QLatin1String(x) + ProtocolHandler::ProtocolHandler(QObject *parent) : QObject(parent) - , _lister(new KDirLister) + , _lister(0) , _frame(0) { - connect( _lister, SIGNAL(newItems(const KFileItemList &)), this, SLOT(showResults(const KFileItemList &))); } @@ -80,18 +85,16 @@ bool ProtocolHandler::preHandling(const QNetworkRequest &request, QWebFrame *fra _url = request.url(); _frame = frame; - kDebug() << "URL PROTOCOL: " << _url; - + // "http(s)" (fast) handling + if( _url.protocol() == QL1S("http") || _url.protocol() == QL1S("https") ) + return false; + // relative urls if(_url.isRelative()) return false; - - // "http(s)" (fast) handling - if( _url.protocol() == QLatin1String("http") || _url.protocol() == QLatin1String("https") ) - return false; - + // javascript handling - if( _url.protocol() == QLatin1String("javascript") ) + if( _url.protocol() == QL1S("javascript") ) { QString scriptSource = _url.authority(); QVariant result = frame->evaluateJavaScript(scriptSource); @@ -99,15 +102,28 @@ bool ProtocolHandler::preHandling(const QNetworkRequest &request, QWebFrame *fra } // "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") ) { + // let webkit manage the about:blank url... + if( _url == KUrl("about:blank") ) + { + return false; + } + if( _url == KUrl("about:home") ) { switch(ReKonfig::newTabStartPage()) @@ -118,26 +134,22 @@ 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; @@ -152,12 +164,12 @@ bool ProtocolHandler::postHandling(const QNetworkRequest &request, QWebFrame *fr 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,7 +180,7 @@ 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*) )); @@ -176,13 +188,15 @@ bool ProtocolHandler::postHandling(const QNetworkRequest &request, QWebFrame *fr } // "file" handling. This is quite trivial :) - if(_url.protocol() == QLatin1String("file") ) + if( _url.protocol() == QL1S("file") ) { 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; } } @@ -193,6 +207,10 @@ bool ProtocolHandler::postHandling(const QNetworkRequest &request, QWebFrame *fr QString ProtocolHandler::dirHandling(const KFileItemList &list) { + if (!_lister) + { + return QString("rekonq error, sorry :("); + } KFileItem mainItem = _lister->rootItem(); KUrl rootUrl = mainItem.url(); @@ -263,7 +281,7 @@ QString ProtocolHandler::dirHandling(const KFileItemList &list) msg += "</table>"; - QString html = QString(QLatin1String(file.readAll())) + QString html = QString(QL1S(file.readAll())) .arg(title) .arg(msg) ; @@ -281,14 +299,13 @@ void ProtocolHandler::showResults(const KFileItemList &list) return; } - if ( list.isEmpty() ) - return; - QString html = dirHandling(list); - _frame->setHtml(html); + _frame->setHtml( html, _url ); - Application::instance()->mainWindow()->mainView()->urlBar()->setUrl(_url); + Application::instance()->mainWindow()->currentTab()->setFocus(); Application::historyManager()->addHistoryEntry( _url.prettyUrl() ); + + delete _lister; } @@ -304,8 +321,66 @@ void ProtocolHandler::slotMostLocalUrlResult(KJob *job) KIO::StatJob *statJob = static_cast<KIO::StatJob*>(job); KIO::UDSEntry entry = statJob->statResult(); 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); + } +} |