diff options
| -rw-r--r-- | kwebapp/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | kwebapp/kwebmain.cpp | 3 | ||||
| -rw-r--r-- | kwebapp/rekonqview.cpp | 2 | ||||
| -rw-r--r-- | kwebapp/urlresolver.cpp | 93 | ||||
| -rw-r--r-- | kwebapp/urlresolver.h | 46 | ||||
| -rw-r--r-- | kwebapp/webpage.cpp | 85 | ||||
| -rw-r--r-- | kwebapp/webpage.h | 10 | ||||
| -rw-r--r-- | src/tests/link_test.html | 7 | 
8 files changed, 225 insertions, 22 deletions
diff --git a/kwebapp/CMakeLists.txt b/kwebapp/CMakeLists.txt index fab9106a..459c5a45 100644 --- a/kwebapp/CMakeLists.txt +++ b/kwebapp/CMakeLists.txt @@ -1,6 +1,7 @@  set( kwebapp_SRCS      rekonqview.cpp      searchengine.cpp +    urlresolver.cpp      walletbar.cpp      webview.cpp      webpage.cpp diff --git a/kwebapp/kwebmain.cpp b/kwebapp/kwebmain.cpp index 9e6c7452..08dfbaa5 100644 --- a/kwebapp/kwebmain.cpp +++ b/kwebapp/kwebmain.cpp @@ -26,6 +26,7 @@  // Local Includes  #include "rekonqview.h" +#include "urlresolver.h"  // KDE Includes  #include <KApplication> @@ -68,7 +69,7 @@ int main(int argc, char **argv)      }      RekonqView *widg = new RekonqView(); -    widg->loadUrl(KUrl(QUrl::fromUserInput(args->arg(0)))); +    widg->loadUrl( UrlResolver::urlFromTextTyped(args->arg(0)) );      widg->show();      args->clear(); diff --git a/kwebapp/rekonqview.cpp b/kwebapp/rekonqview.cpp index b737bc11..ec8ca01d 100644 --- a/kwebapp/rekonqview.cpp +++ b/kwebapp/rekonqview.cpp @@ -227,7 +227,7 @@ void RekonqView::notifyMessage(const QString &msg)      }      m_hidePopupTimer->stop(); -    m_hidePopupTimer->start(500); +    m_hidePopupTimer->start(3000);      QString msgToShow = Qt::escape(msg); diff --git a/kwebapp/urlresolver.cpp b/kwebapp/urlresolver.cpp new file mode 100644 index 00000000..173dc613 --- /dev/null +++ b/kwebapp/urlresolver.cpp @@ -0,0 +1,93 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2012 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 +* 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 +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program.  If not, see <http://www.gnu.org/licenses/>. +* +* ============================================================ */ + + +// Self Includes +#include "urlresolver.h" + +// Local Includes +#include "searchengine.h" + +// KDE Includes +#include <KService> +#include <KProtocolInfo> +#include <KDebug> + + +// NOTE +// default kurifilter plugin list (at least in my box): +// 1. "kshorturifilter" +// 2. "kurisearchfilter" +// 3. "localdomainurifilter" +// 4 ."kuriikwsfilter" +// 5. "fixhosturifilter" + + +KUrl UrlResolver::urlFromTextTyped(const QString &typedText) +{ +    QString typedString = typedText.trimmed(); + +    // Url from KService +    KService::Ptr engine = SearchEngine::fromString(typedString); +    if (engine) +    { +        QString query = typedString; +        query = query.remove(0, typedString.indexOf(SearchEngine::delimiter()) + 1); + +        QString url = SearchEngine::buildQuery(engine, query); + +        kDebug() << "Url from service: " << url; +        return KUrl(url); +    } + +    // Url from User Input +    QUrl urlFromUserInput = QUrl::fromUserInput(typedString); +    if (urlFromUserInput.isValid()) +    { +        // ensure http(s) hosts are lower cases +        if (urlFromUserInput.scheme().startsWith("http")) +        { +            QString hst = urlFromUserInput.host(); +            urlFromUserInput.setHost(hst.toLower()); +        } + +        kDebug() << "(Q)Url from user input: " << urlFromUserInput; +        return urlFromUserInput; +    } + +    // failed... +    kDebug() << "KUrl fallback: " << typedText; +    return KUrl(typedText); +} + + +bool UrlResolver::isKDEUrl(const QString &urlString) +{ +    KService::Ptr engine = SearchEngine::fromString(urlString); +    if (engine) +        return true; + +    return false; +} diff --git a/kwebapp/urlresolver.h b/kwebapp/urlresolver.h new file mode 100644 index 00000000..1c5ad354 --- /dev/null +++ b/kwebapp/urlresolver.h @@ -0,0 +1,46 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2012 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 +* 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 +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program.  If not, see <http://www.gnu.org/licenses/>. +* +* ============================================================ */ + + +#ifndef URL_RESOLVER_H +#define URL_RESOLVER_H + + +// KDE Includes +#include <KUrl> + +// Qt Includes +#include <QString> + + +namespace UrlResolver +{ +    KUrl urlFromTextTyped(const QString &); + +    bool isKDEUrl(const QString &); +} + + +#endif // URL_RESOLVER_H diff --git a/kwebapp/webpage.cpp b/kwebapp/webpage.cpp index cdca10bd..afe23035 100644 --- a/kwebapp/webpage.cpp +++ b/kwebapp/webpage.cpp @@ -28,19 +28,32 @@  #include "webpage.h"  #include "webpage.moc" +// Local Includes +#include "urlresolver.h" +  // KDE Includes  #include <KRun> +#include <KToolInvocation> +#include <KProtocolInfo> +#include <KDebug>  // Qt Includes  #include <QNetworkRequest> +#include <QNetworkReply> +#include <QWebFrame> + +// Defines +#define QL1S(x) QLatin1String(x)  WebPage::WebPage(QObject *parent)      : KWebPage(parent) -    , _selfLoading(true)  { -    connect(this, SIGNAL(loadFinished(bool)), this, SLOT(disableSelfLoading())); +    // ----- handling unsupported content... +    setForwardUnsupportedContent(true); +    connect(this, SIGNAL(unsupportedContent(QNetworkReply*)), this, SLOT(handleUnsupportedContent(QNetworkReply*))); +    // downloads      connect(this, SIGNAL(unsupportedContent(QNetworkReply*)), this, SLOT(downloadResponse(QNetworkReply*)));      connect(this, SIGNAL(downloadRequested(QNetworkRequest)), this, SLOT(downloadRequest(QNetworkRequest)));  } @@ -48,21 +61,69 @@ WebPage::WebPage(QObject *parent)  bool WebPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type)  { -    return KWebPage::acceptNavigationRequest(frame, request, type); +    QUrl reqUrl = request.url(); +    QString protocol = reqUrl.scheme(); +     +    // javascript handling +    if (protocol == QL1S("javascript")) +    { +        QString scriptSource = QUrl::fromPercentEncoding(reqUrl.toString().mid(11).toUtf8()); +        mainFrame()->evaluateJavaScript(scriptSource); +        return false; +    } -    // FIXME -//     (void)new KRun(request.url(), view(), 0); -//     return false; -} +    // "mailto" handling: It needs to be handled both here (mail url launched) +    // and in handleUnsupportedContent (mail links clicked) +    if (protocol == QL1S("mailto")) +    { +        KToolInvocation::invokeMailer(reqUrl); +        return false; +    } +    if (frame && UrlResolver::isKDEUrl(reqUrl.toString())) +    { +        QUrl newReqUrl = UrlResolver::urlFromTextTyped(reqUrl.toString()); +        frame->load(newReqUrl); +        return false; +    } -void WebPage::setSelfLoadingEnabled(bool b) -{ -    _selfLoading = b; +    // don't let webkit try to load an unknown (or missing) protocol... +    if (!KProtocolInfo::isKnownProtocol(protocol)) +    { +        kDebug() << "UNKNOWN PROTOCOL: " << protocol; +        return false; +    } + +    return KWebPage::acceptNavigationRequest(frame, request, type);  } -void WebPage::disableSelfLoading() +void WebPage::handleUnsupportedContent(QNetworkReply *reply)  { -    _selfLoading = false; +    Q_ASSERT(reply); + +    if (!reply) +    { +        kDebug() << "NO REPLY. Why????"; +        return; +    } + +    QUrl replyUrl = reply->url(); +    QString protocol = replyUrl.scheme(); + +    // "http(s)" (fast) handling +    if (protocol == QL1S("http") || protocol == QL1S("https")) +    { +        kDebug() << "Error: " << protocol; +        return; +    } +     +    // "mailto" handling. +    if (protocol == QL1S("mailto")) +    { +        KToolInvocation::invokeMailer(replyUrl); +        return; +    } + +    return;  } diff --git a/kwebapp/webpage.h b/kwebapp/webpage.h index 33d06a31..97d7102a 100644 --- a/kwebapp/webpage.h +++ b/kwebapp/webpage.h @@ -39,17 +39,11 @@ class WebPage : public KWebPage  public:      WebPage(QObject *parent = 0); -    void setSelfLoadingEnabled(bool); - -private Q_SLOTS: -    void disableSelfLoading(); -  protected:      virtual bool acceptNavigationRequest(QWebFrame *, const QNetworkRequest &, NavigationType); -private: -    bool _selfLoading; - +private Q_SLOTS: +    void handleUnsupportedContent(QNetworkReply *);  };  #endif // _WEB_PAGE_H diff --git a/src/tests/link_test.html b/src/tests/link_test.html index e5b393ab..8798f3bc 100644 --- a/src/tests/link_test.html +++ b/src/tests/link_test.html @@ -24,6 +24,13 @@  </tr>  <tr> +<td>gg:ciao</td> +<td>KDE shortcut</td> +<td><a href="gg:ciao">link</a></td> +<td><a href="gg:ciao" target="_blank">link</a></td> +</tr> + +<tr>  <td>ftp://ftp.eutelia.it/</td>  <td>FTP test link</td>  <td><a href="ftp://ftp.eutelia.it/">link</a></td>  | 
