diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/mainview.h | 1 | ||||
| -rw-r--r-- | src/webpage.cpp | 270 | ||||
| -rw-r--r-- | src/webpage.h | 80 | ||||
| -rw-r--r-- | src/webview.cpp | 212 | ||||
| -rw-r--r-- | src/webview.h | 35 | 
6 files changed, 354 insertions, 245 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 615a68e5..cbb1421d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -22,6 +22,7 @@ SET( rekonq_SRCS      panelhistory.cpp      lineedit.cpp      stackedurlbar.cpp +    webpage.cpp  )  KDE4_ADD_UI_FILES( rekonq_SRCS diff --git a/src/mainview.h b/src/mainview.h index 16d450d3..ceb8d1bf 100644 --- a/src/mainview.h +++ b/src/mainview.h @@ -26,6 +26,7 @@  // Local Includes  #include "webview.h" +#include "webpage.h"  #include "application.h"  // KDE Includes diff --git a/src/webpage.cpp b/src/webpage.cpp new file mode 100644 index 00000000..5fae4be3 --- /dev/null +++ b/src/webpage.cpp @@ -0,0 +1,270 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2008 Benjamin C. Meyer <ben@meyerhome.net> +* Copyright (C) 2009 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, or (at your option) any later version. +* +* 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. +* +* ============================================================ */ + + +// Self Includes +#include "webpage.h" +#include "webpage.moc" + +// Auto Includes +#include "rekonq.h" + +// Local Includes +#include "application.h" +#include "mainwindow.h" +#include "mainview.h" +#include "cookiejar.h" +#include "networkaccessmanager.h" +#include "download.h" +#include "history.h" + +// KDE Includes +#include <KStandardDirs> +#include <KUrl> +#include <KActionCollection> +#include <KDebug> +#include <KToolInvocation> + +#include <kdewebkit/kwebpage.h> +#include <kdewebkit/kwebview.h> + +// Qt Includes +#include <QtGui/QContextMenuEvent> +#include <QtGui/QWheelEvent> +#include <QtGui/QMouseEvent> +#include <QtGui/QClipboard> +#include <QtGui/QKeyEvent> + +#include <QtNetwork/QNetworkReply> +#include <QtNetwork/QNetworkRequest> + +#include <QtWebKit/QWebFrame> +#include <QtWebKit/QWebHitTestResult> +#include <QtWebKit/QWebPage> +#include <QtWebKit/QWebSettings> +#include <QtWebKit/QWebView> + +// #include <QtUiTools/QUiLoader> + + +WebPage::WebPage(QObject *parent) +        : KWebPage(parent) +        , m_keyboardModifiers(Qt::NoModifier) +        , m_pressedButtons(Qt::NoButton) +{ +    setNetworkAccessManager(Application::networkAccessManager()); + +    setForwardUnsupportedContent(true); +    connect(this, SIGNAL(unsupportedContent(QNetworkReply *)), this, SLOT(handleUnsupportedContent(QNetworkReply *))); +} + + +bool WebPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type) +{ +    QString scheme = request.url().scheme(); +    if (scheme == QLatin1String("mailto")) +    { +        KToolInvocation::invokeMailer(request.url()); +        return false; +    } + +    WebView *webView; + +    switch (type) +    { +    // user activated a submit button for an HTML form. +    case QWebPage::NavigationTypeFormSubmitted: +        kDebug() << "NavigationTypeFormSubmitted"; +        kDebug() << request.url(); +        break; + +    // An HTML form was submitted a second time. +    case QWebPage::NavigationTypeFormResubmitted: +        kDebug() << "NavigationTypeFormResubmitted"; +        break; + +    // A navigation to another document using a method not listed above. +    case QWebPage::NavigationTypeOther: +        kDebug() << "NavigationTypeOther"; +        break; + +    // user clicked on a link or pressed return on a focused link. +    case QWebPage::NavigationTypeLinkClicked: +        kDebug() << "NavigationTypeLinkClicked"; +        break; + +    // Navigation to a previously shown document in the back or forward history is requested. +    case QWebPage::NavigationTypeBackOrForward: +        kDebug() << "NavigationTypeBackOrForward"; +        break; + +        // user activated the reload action. +    case QWebPage::NavigationTypeReload: +        kDebug() << "NavigationTypeReload"; + +#if QT_VERSION <= 040500 +        // HACK Ported from Arora +        // A short term hack until QtWebKit can get a reload without cache QAction +        // *FYI* currently type is never NavigationTypeReload +        // See: https://bugs.webkit.org/show_bug.cgi?id=24283 +        if (qApp->keyboardModifiers() & Qt::ShiftModifier) +        { +            kDebug() << "Arora hack"; +            QNetworkRequest newRequest(request); +            newRequest.setAttribute(QNetworkRequest::CacheLoadControlAttribute, +                                    QNetworkRequest::AlwaysNetwork); +            mainFrame()->load(request); +            return false; +        } +#endif + +        break; + +        // should be nothing.. +    default: +        kDebug() << "Default NON extant case.."; +        break; +    } + +    if (m_keyboardModifiers & Qt::ControlModifier || m_pressedButtons == Qt::MidButton) +    { +        webView = Application::instance()->newWebView(); +        webView->setFocus(); +//         webView->load(request); FIXME NOW!! +        m_keyboardModifiers = Qt::NoModifier; +        m_pressedButtons = Qt::NoButton; +        return false; +    } + +    if (frame == mainFrame()) +    { +        m_loadingUrl = request.url(); +        emit loadingUrl(m_loadingUrl); +    } +    else +    { +        // if frame doesn't exists (perhaps) we are pointing to a blank target.. +        if (!frame) +        { +            webView = Application::instance()->newWebView(); +            webView->setFocus(); +//             webView->load(request); FIXME NOW!! +            return false; +        } +    } + +    return QWebPage::acceptNavigationRequest(frame, request, type); +} + + +KWebPage *WebPage::createWindow(QWebPage::WebWindowType type) +{ +    kDebug() << "creating window as new tab.. "; + +    // added to manage web modal dialogs +    if (type == QWebPage::WebModalDialog) +    { +        // FIXME : need a "real" implementation.. +        kDebug() << "Modal Dialog ---------------------------------------"; +    } + +    WebView *w = Application::instance()->newWebView(); +    return w->page(); +} + + +void WebPage::handleUnsupportedContent(QNetworkReply *reply) +{ +    // create convenience fake api:// protocol for KDE apidox search and Qt docs +    if (reply->url().scheme() == "api") +    { +        QString path; +        QString className = reply->url().host().toLower(); +        if (className[0] == 'k') +        { +            path = QString("http://api.kde.org/new.classmapper.php?class=%1").arg(className); +        } +        else if (className[0] == 'q') +        { +            path = QString("http://doc.trolltech.com/4.5/%1.html").arg(className); +        } +        KUrl url(path); + +        Application::instance()->mainWindow()->loadUrl(url); +        return; +    } + +    if (reply->error() == QNetworkReply::NoError) +    { +        // st iframe unwanted download fix +        if (reply->header(QNetworkRequest::ContentTypeHeader).isValid()) +        { +            KUrl srcUrl = reply->url(); +            Application::downloadManager()->newDownload(srcUrl); +        } +        else +        { +             kDebug() << "invalid content type header"; +        } +        return; +    } + +    // display "not found" page +    QString notfoundFilePath =  KStandardDirs::locate("data", "rekonq/htmls/notfound.html"); +    QFile file(notfoundFilePath); +    bool isOpened = file.open(QIODevice::ReadOnly); +    if (!isOpened) +    { +        kWarning() << "Couldn't open the notfound.html file"; +        return; +    } +    QString title = i18n("Error loading page: ") + reply->url().toString(); + +    QString imagePath = KIconLoader::global()->iconPath("rekonq", KIconLoader::NoGroup, false); + +    QString html = QString(QLatin1String(file.readAll())) +                   .arg(title) +                   .arg("file://" + imagePath) +                   .arg(reply->errorString()) +                   .arg(reply->url().toString()); + +    QList<QWebFrame*> frames; +    frames.append(mainFrame()); +    while (!frames.isEmpty()) +    { +        QWebFrame *firstFrame = frames.takeFirst(); +        if (firstFrame->url() == reply->url()) +        { +            firstFrame->setHtml(html, reply->url()); +            return; +        } +        QList<QWebFrame *> children = firstFrame->childFrames(); +        foreach(QWebFrame *frame, children) +        { +            frames.append(frame); +        } +    } +    if (m_loadingUrl == reply->url()) +    { +        mainFrame()->setHtml(html, reply->url()); +        // Don't put error pages to the history. +        Application::historyManager()->removeHistoryEntry(reply->url(), mainFrame()->title()); +    } +} diff --git a/src/webpage.h b/src/webpage.h new file mode 100644 index 00000000..cdb1d04f --- /dev/null +++ b/src/webpage.h @@ -0,0 +1,80 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2007-2008 Trolltech ASA. All rights reserved +* Copyright (C) 2008 Benjamin C. Meyer <ben@meyerhome.net> +* Copyright (C) 2008-2009 by Andrea Diamantini <adjam7 at gmail dot com> +* Copyright (C) 2009 by Paweł Prażak <pawelprazak 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, or (at your option) any later version. +* +* 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. +* +* ============================================================ */ + + +#ifndef WEBPAGE_H +#define WEBPAGE_H + +// KDE Includes +#include <KUrl> + +#include <kdewebkit/kwebpage.h> +#include <kdewebkit/kwebview.h> + +// Qt Includes +#include <QWebPage> + +// Forward Declarations +class MainWindow; +class Application; + +class KActionCollection; + +class QWebFrame; +class QAuthenticator; +class QMouseEvent; +class QNetworkProxy; +class QNetworkReply; +class QSslError; + + +class WebPage : public KWebPage +{ +    Q_OBJECT + +signals: +    void loadingUrl(const QUrl &url);   // WARNING has to be QUrl!! + +public: +    WebPage(QObject *parent = 0); + + +protected: +    bool acceptNavigationRequest(QWebFrame *frame, +                                 const QNetworkRequest &request, +                                 NavigationType type); + +    KWebPage *createWindow(QWebPage::WebWindowType type); + +private slots: +    void handleUnsupportedContent(QNetworkReply *reply); + +private: +    friend class WebView; + +    // set the webview mousepressedevent +    Qt::KeyboardModifiers m_keyboardModifiers; +    Qt::MouseButtons m_pressedButtons; +    KUrl m_loadingUrl; +}; + +#endif diff --git a/src/webview.cpp b/src/webview.cpp index 6887c29b..2f9e794e 100644 --- a/src/webview.cpp +++ b/src/webview.cpp @@ -36,6 +36,7 @@  #include "networkaccessmanager.h"  #include "download.h"  #include "history.h" +#include "webpage.h"  // KDE Includes  #include <KStandardDirs> @@ -63,217 +64,6 @@  #include <QtWebKit/QWebSettings>  #include <QtWebKit/QWebView> -// #include <QtUiTools/QUiLoader> - - -WebPage::WebPage(QObject *parent) -        : KWebPage(parent) -        , m_keyboardModifiers(Qt::NoModifier) -        , m_pressedButtons(Qt::NoButton) -{ -    setNetworkAccessManager(Application::networkAccessManager()); - -    setForwardUnsupportedContent(true); -    connect(this, SIGNAL(unsupportedContent(QNetworkReply *)), this, SLOT(handleUnsupportedContent(QNetworkReply *))); -} - - -bool WebPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type) -{ -    QString scheme = request.url().scheme(); -    if (scheme == QLatin1String("mailto")) -    { -        KToolInvocation::invokeMailer(request.url()); -        return false; -    } - -    WebView *webView; - -    switch (type) -    { -    // user activated a submit button for an HTML form. -    case QWebPage::NavigationTypeFormSubmitted: -        kDebug() << "NavigationTypeFormSubmitted"; -        kDebug() << request.url(); -        break; - -    // An HTML form was submitted a second time. -    case QWebPage::NavigationTypeFormResubmitted: -        kDebug() << "NavigationTypeFormResubmitted"; -        break; - -    // A navigation to another document using a method not listed above. -    case QWebPage::NavigationTypeOther: -        kDebug() << "NavigationTypeOther"; -        break; - -    // user clicked on a link or pressed return on a focused link. -    case QWebPage::NavigationTypeLinkClicked: -        kDebug() << "NavigationTypeLinkClicked"; -        break; - -    // Navigation to a previously shown document in the back or forward history is requested. -    case QWebPage::NavigationTypeBackOrForward: -        kDebug() << "NavigationTypeBackOrForward"; -        break; - -        // user activated the reload action. -    case QWebPage::NavigationTypeReload: -        kDebug() << "NavigationTypeReload"; - -#if QT_VERSION <= 040500 -        // HACK Ported from Arora -        // A short term hack until QtWebKit can get a reload without cache QAction -        // *FYI* currently type is never NavigationTypeReload -        // See: https://bugs.webkit.org/show_bug.cgi?id=24283 -        if (qApp->keyboardModifiers() & Qt::ShiftModifier) -        { -            kDebug() << "Arora hack"; -            QNetworkRequest newRequest(request); -            newRequest.setAttribute(QNetworkRequest::CacheLoadControlAttribute, -                                    QNetworkRequest::AlwaysNetwork); -            mainFrame()->load(request); -            return false; -        } -#endif - -        break; - -        // should be nothing.. -    default: -        kDebug() << "Default NON extant case.."; -        break; -    } - -    if (m_keyboardModifiers & Qt::ControlModifier || m_pressedButtons == Qt::MidButton) -    { -        webView = Application::instance()->newWebView(); -        webView->setFocus(); -//         webView->load(request); FIXME NOW!! -        m_keyboardModifiers = Qt::NoModifier; -        m_pressedButtons = Qt::NoButton; -        return false; -    } - -    if (frame == mainFrame()) -    { -        m_loadingUrl = request.url(); -        emit loadingUrl(m_loadingUrl); -    } -    else -    { -        // if frame doesn't exists (perhaps) we are pointing to a blank target.. -        if (!frame) -        { -            webView = Application::instance()->newWebView(); -            webView->setFocus(); -//             webView->load(request); FIXME NOW!! -            return false; -        } -    } - -    return QWebPage::acceptNavigationRequest(frame, request, type); -} - - -KWebPage *WebPage::createWindow(QWebPage::WebWindowType type) -{ -    kDebug() << "creating window as new tab.. "; - -    // added to manage web modal dialogs -    if (type == QWebPage::WebModalDialog) -    { -        // FIXME : need a "real" implementation.. -        kDebug() << "Modal Dialog ---------------------------------------"; -    } - -    WebView *w = Application::instance()->newWebView(); -    return w->page(); -} - - -void WebPage::handleUnsupportedContent(QNetworkReply *reply) -{ -    // create convenience fake api:// protocol for KDE apidox search and Qt docs -    if (reply->url().scheme() == "api") -    { -        QString path; -        QString className = reply->url().host().toLower(); -        if (className[0] == 'k') -        { -            path = QString("http://api.kde.org/new.classmapper.php?class=%1").arg(className); -        } -        else if (className[0] == 'q') -        { -            path = QString("http://doc.trolltech.com/4.5/%1.html").arg(className); -        } -        KUrl url(path); - -        Application::instance()->mainWindow()->loadUrl(url); -        return; -    } - -    if (reply->error() == QNetworkReply::NoError) -    { -        // st iframe unwanted download fix -        if (reply->header(QNetworkRequest::ContentTypeHeader).isValid()) -        { -            KUrl srcUrl = reply->url(); -            Application::downloadManager()->newDownload(srcUrl); -        } -        else -        { -             kDebug() << "invalid content type header"; -        } -        return; -    } - -    // display "not found" page -    QString notfoundFilePath =  KStandardDirs::locate("data", "rekonq/htmls/notfound.html"); -    QFile file(notfoundFilePath); -    bool isOpened = file.open(QIODevice::ReadOnly); -    if (!isOpened) -    { -        kWarning() << "Couldn't open the notfound.html file"; -        return; -    } -    QString title = i18n("Error loading page: ") + reply->url().toString(); - -    QString imagePath = KIconLoader::global()->iconPath("rekonq", KIconLoader::NoGroup, false); - -    QString html = QString(QLatin1String(file.readAll())) -                   .arg(title) -                   .arg("file://" + imagePath) -                   .arg(reply->errorString()) -                   .arg(reply->url().toString()); - -    QList<QWebFrame*> frames; -    frames.append(mainFrame()); -    while (!frames.isEmpty()) -    { -        QWebFrame *firstFrame = frames.takeFirst(); -        if (firstFrame->url() == reply->url()) -        { -            firstFrame->setHtml(html, reply->url()); -            return; -        } -        QList<QWebFrame *> children = firstFrame->childFrames(); -        foreach(QWebFrame *frame, children) -        { -            frames.append(frame); -        } -    } -    if (m_loadingUrl == reply->url()) -    { -        mainFrame()->setHtml(html, reply->url()); -        // Don't put error pages to the history. -        Application::historyManager()->removeHistoryEntry(reply->url(), mainFrame()->title()); -    } -} - - -// ----------------------------------------------------------------------------------------------------------------- -  WebView::WebView(QWidget* parent)          : KWebView(parent) diff --git a/src/webview.h b/src/webview.h index eff5f98b..cef46a80 100644 --- a/src/webview.h +++ b/src/webview.h @@ -45,40 +45,7 @@ class QMouseEvent;  class QNetworkProxy;  class QNetworkReply;  class QSslError; - - -class WebPage : public KWebPage -{ -    Q_OBJECT - -signals: -    void loadingUrl(const QUrl &url);   // WARNING has to be QUrl!! - -public: -    WebPage(QObject *parent = 0); - - -protected: -    bool acceptNavigationRequest(QWebFrame *frame, -                                 const QNetworkRequest &request, -                                 NavigationType type); - -    KWebPage *createWindow(QWebPage::WebWindowType type); - -private slots: -    void handleUnsupportedContent(QNetworkReply *reply); - -private: -    friend class WebView; - -    // set the webview mousepressedevent -    Qt::KeyboardModifiers m_keyboardModifiers; -    Qt::MouseButtons m_pressedButtons; -    KUrl m_loadingUrl; -}; - - -// ---------------------------------------------------------------------------------------------------- +class WebPage;  // Qt Includes  #include <QWebView>  | 
