summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/mainview.h1
-rw-r--r--src/webpage.cpp270
-rw-r--r--src/webpage.h80
-rw-r--r--src/webview.cpp212
-rw-r--r--src/webview.h35
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>