diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 8 | ||||
-rw-r--r-- | src/bookmarks.cpp | 6 | ||||
-rw-r--r-- | src/bookmarks.h | 5 | ||||
-rw-r--r-- | src/findbar.cpp | 11 | ||||
-rw-r--r-- | src/findbar.h | 2 | ||||
-rw-r--r-- | src/main.cpp | 2 | ||||
-rw-r--r-- | src/mainview.cpp | 91 | ||||
-rw-r--r-- | src/mainview.h | 22 | ||||
-rw-r--r-- | src/mainwindow.cpp | 46 | ||||
-rw-r--r-- | src/mainwindow.h | 10 | ||||
-rw-r--r-- | src/networkaccessmanager.cpp | 17 | ||||
-rw-r--r-- | src/networkaccessmanager.h | 14 | ||||
-rw-r--r-- | src/urlbar.cpp | 18 | ||||
-rw-r--r-- | src/urlbar.h | 16 | ||||
-rw-r--r-- | src/webpage.cpp | 192 | ||||
-rw-r--r-- | src/webpage.h | 77 | ||||
-rw-r--r-- | src/webview.cpp | 349 | ||||
-rw-r--r-- | src/webview.h | 75 |
18 files changed, 487 insertions, 474 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a64cc747..064fc0e6 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 @@ -41,18 +42,19 @@ KDE4_ADD_KCFG_FILES( rekonq_SRCS rekonq.kcfgc ) ### ------------------------------------------ -ADD_DEFINITIONS( ${KDE4_DEFINITIONS} ) +ADD_DEFINITIONS( ${KDE4_DEFINITIONS} ${KDEWEBKIT_DEFINITIONS} ) KDE4_ADD_EXECUTABLE( rekonq ${rekonq_SRCS} ) TARGET_LINK_LIBRARIES( rekonq ${QT_LIBRARIES} ${QT_QTNETWORK_LIBRARY} - ${QT_QTWEBKIT_LIBRARY} - ${QT_QTUITOOLS_LIBRARY} +# ${QT_QTWEBKIT_LIBRARY} +# ${QT_QTUITOOLS_LIBRARY} ${KDE4_KUTILS_LIBS} ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} + ${KDEWEBKIT_LIBRARIES} ) INSTALL( TARGETS rekonq ${INSTALL_TARGETS_DEFAULT_ARGS} ) diff --git a/src/bookmarks.cpp b/src/bookmarks.cpp index eb500985..9490ed0f 100644 --- a/src/bookmarks.cpp +++ b/src/bookmarks.cpp @@ -66,6 +66,12 @@ void BookmarkOwner::openBookmark(const KBookmark & bookmark, } +bool BookmarkOwner::supportsTabs() const +{ + return true; +} + + QString BookmarkOwner::currentUrl() const { return Application::instance()->mainWindow()->currentTab()->url().url(); diff --git a/src/bookmarks.h b/src/bookmarks.h index fef91413..8b4cf8e5 100644 --- a/src/bookmarks.h +++ b/src/bookmarks.h @@ -93,10 +93,7 @@ public: /** * This function returns whether the owner supports tabs. */ - virtual bool supportsTabs() const - { - return true; - } + virtual bool supportsTabs() const; /** * Called if the user wants to open every bookmark in this folder in a new tab. diff --git a/src/findbar.cpp b/src/findbar.cpp index 0e312e04..283453a8 100644 --- a/src/findbar.cpp +++ b/src/findbar.cpp @@ -113,13 +113,14 @@ void FindBar::clear() } -void FindBar::showFindBar() +void FindBar::show() { // show findbar if not visible - if (!isVisible()) - { - show(); - } + if (isVisible()) + return; + + QWidget::show(); + // set focus to findbar if user select showFindBar shortcut m_lineEdit->setFocus(); m_lineEdit->selectAll(); diff --git a/src/findbar.h b/src/findbar.h index a8a78970..739a573e 100644 --- a/src/findbar.h +++ b/src/findbar.h @@ -50,7 +50,7 @@ public: public slots: void clear(); - void showFindBar(); + void show(); protected Q_SLOTS: void keyPressEvent(QKeyEvent* event); diff --git a/src/main.cpp b/src/main.cpp index 600961c5..38c30b53 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -29,7 +29,7 @@ static const char description[] = I18N_NOOP("Webkit Based Browser for KDE"); -static const char version[] = "0.1"; +static const char version[] = "0.1.1"; int main(int argc, char **argv) diff --git a/src/mainview.cpp b/src/mainview.cpp index 8f3bf197..d8d1c2b5 100644 --- a/src/mainview.cpp +++ b/src/mainview.cpp @@ -58,9 +58,6 @@ #include <QtGui/QWidget> #include <QtGui/QMouseEvent> -#include <QtWebKit/QWebPage> - - MainView::MainView(QWidget *parent) : KTabWidget(parent) @@ -108,6 +105,49 @@ void MainView::postLaunch() m_recentlyClosedTabsAction->setEnabled(false); } + +UrlBar *MainView::currentUrlBar() const +{ + return urlBar(-1); +} + + +TabBar *MainView::tabBar() const +{ + return m_tabBar; +} + + +StackedUrlBar *MainView::urlBarStack() const +{ + return m_urlBars; +} + + +WebView *MainView::currentWebView() const +{ + return webView(currentIndex()); +} + + +int MainView::webViewIndex(WebView *webView) const +{ + return indexOf(webView); +} + + +KAction *MainView::recentlyClosedTabsAction() const +{ + return m_recentlyClosedTabsAction; +} + + +void MainView::setMakeBackTab(bool b) +{ + m_makeBackTab = b; +} + + void MainView::showTabBar() { if (ReKonfig::alwaysShowTabBar()) @@ -136,8 +176,7 @@ void MainView::showTabBar() void MainView::slotWebReload() { WebView *webView = currentWebView(); - QWebPage *currentParent = webView->webPage(); - QAction *action = currentParent->action(QWebPage::Reload); + QAction *action = webView->page()->action(QWebPage::Reload); action->trigger(); } @@ -145,8 +184,7 @@ void MainView::slotWebReload() void MainView::slotWebStop() { WebView *webView = currentWebView(); - QWebPage *currentParent = webView->webPage(); - QAction *action = currentParent->action(QWebPage::Stop); + QAction *action = webView->page()->action(QWebPage::Stop); action->trigger(); } @@ -154,8 +192,7 @@ void MainView::slotWebStop() void MainView::slotWebBack() { WebView *webView = currentWebView(); - QWebPage *currentParent = webView->webPage(); - QAction *action = currentParent->action(QWebPage::Back); + QAction *action = webView->page()->action(QWebPage::Back); action->trigger(); } @@ -163,8 +200,7 @@ void MainView::slotWebBack() void MainView::slotWebForward() { WebView *webView = currentWebView(); - QWebPage *currentParent = webView->webPage(); - QAction *action = currentParent->action(QWebPage::Forward); + QAction *action = webView->page()->action(QWebPage::Forward); action->trigger(); } @@ -172,8 +208,7 @@ void MainView::slotWebForward() void MainView::slotWebUndo() { WebView *webView = currentWebView(); - QWebPage *currentParent = webView->webPage(); - QAction *action = currentParent->action(QWebPage::Undo); + QAction *action = webView->page()->action(QWebPage::Undo); action->trigger(); } @@ -181,8 +216,7 @@ void MainView::slotWebUndo() void MainView::slotWebRedo() { WebView *webView = currentWebView(); - QWebPage *currentParent = webView->webPage(); - QAction *action = currentParent->action(QWebPage::Redo); + QAction *action = webView->page()->action(QWebPage::Redo); action->trigger(); } @@ -190,8 +224,7 @@ void MainView::slotWebRedo() void MainView::slotWebCut() { WebView *webView = currentWebView(); - QWebPage *currentParent = webView->webPage(); - QAction *action = currentParent->action(QWebPage::Cut); + QAction *action = webView->page()->action(QWebPage::Cut); action->trigger(); } @@ -199,8 +232,7 @@ void MainView::slotWebCut() void MainView::slotWebCopy() { WebView *webView = currentWebView(); - QWebPage *currentParent = webView->webPage(); - QAction *action = currentParent->action(QWebPage::Copy); + QAction *action = webView->page()->action(QWebPage::Copy); action->trigger(); } @@ -208,8 +240,7 @@ void MainView::slotWebCopy() void MainView::slotWebPaste() { WebView *webView = currentWebView(); - QWebPage *currentParent = webView->webPage(); - QAction *action = currentParent->action(QWebPage::Paste); + QAction *action = webView->page()->action(QWebPage::Paste); action->trigger(); } @@ -333,16 +364,8 @@ WebView *MainView::newWebView(Rekonq::OpenType type) // connecting webPage signals with mainview connect(webView->page(), SIGNAL(windowCloseRequested()), this, SLOT(windowCloseRequested())); - connect(webView->page(), SIGNAL(geometryChangeRequested(const QRect &)), - this, SIGNAL(geometryChangeRequested(const QRect &))); connect(webView->page(), SIGNAL(printRequested(QWebFrame *)), this, SIGNAL(printRequested(QWebFrame *))); - connect(webView->page(), SIGNAL(menuBarVisibilityChangeRequested(bool)), - this, SIGNAL(menuBarVisibilityChangeRequested(bool))); - connect(webView->page(), SIGNAL(statusBarVisibilityChangeRequested(bool)), - this, SIGNAL(statusBarVisibilityChangeRequested(bool))); - connect(webView->page(), SIGNAL(toolBarVisibilityChangeRequested(bool)), - this, SIGNAL(toolBarVisibilityChangeRequested(bool))); addTab(webView, i18n("(Untitled)")); @@ -460,10 +483,10 @@ void MainView::slotCloseTab(int index) if (tab->isModified()) { int risp = KMessageBox::questionYesNo(this , - i18n("You have modified this page and when closing it you would lose the modification.\n" - "Do you really want to close this page?\n"), - i18n("Do you really want to close this page?") - ); + i18n("You have modified this page and when closing it you would lose the modification.\n" + "Do you really want to close this page?\n"), + i18n("Do you really want to close this page?") + ); if (risp == KMessageBox::No) return; } @@ -532,7 +555,7 @@ void MainView::webViewLoadProgress(int progress) return; } - double totalBytes = static_cast<double>(webView->webPage()->totalBytes() / 1024); + double totalBytes = static_cast<double>(webView->page()->totalBytes() / 1024); QString message = i18n("Loading %1% (%2 %3)...", progress, totalBytes, QLatin1String("kB")); emit showStatusBarMessage(message); diff --git a/src/mainview.h b/src/mainview.h index 16d450d3..ff43576f 100644 --- a/src/mainview.h +++ b/src/mainview.h @@ -19,13 +19,12 @@ * ============================================================ */ - - #ifndef TABWIDGET_H #define TABWIDGET_H // Local Includes #include "webview.h" +#include "webpage.h" #include "application.h" // KDE Includes @@ -65,17 +64,16 @@ public: public: UrlBar *urlBar(int index) const; - UrlBar *currentUrlBar() const { return urlBar(-1); } + UrlBar *currentUrlBar() const; WebView *webView(int index) const; - QList<WebView *> tabs(); // ? // inlines - TabBar *tabBar() const { return m_tabBar; } - StackedUrlBar *urlBarStack() const { return m_urlBars; } - WebView *currentWebView() const { return webView(currentIndex()); } - int webViewIndex(WebView *webView) const { return indexOf(webView); } - KAction *recentlyClosedTabsAction() const { return m_recentlyClosedTabsAction; } - void setMakeBackTab(bool b) { m_makeBackTab = b; } + TabBar *tabBar() const; + StackedUrlBar *urlBarStack() const; + WebView *currentWebView() const; + int webViewIndex(WebView *webView) const; + KAction *recentlyClosedTabsAction() const; + void setMakeBackTab(bool b); /** * show and hide TabBar if user doesn't choose @@ -97,10 +95,6 @@ signals: void linkHovered(const QString &link); void loadProgress(int progress); - void geometryChangeRequested(const QRect &geometry); - void menuBarVisibilityChangeRequested(bool visible); - void statusBarVisibilityChangeRequested(bool visible); - void toolBarVisibilityChangeRequested(bool visible); void printRequested(QWebFrame *frame); public slots: diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 4f41652e..73ec3d6d 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -89,8 +89,8 @@ MainWindow::MainWindow() : KXmlGuiWindow() , m_view(new MainView(this)) - , m_findBar(new FindBar(this)) , m_searchBar(new SearchBar(this)) + , m_findBar(new FindBar(this)) , m_sidePanel(0) { // updating rekonq configuration @@ -143,6 +143,12 @@ MainWindow::~MainWindow() } +SidePanel *MainWindow::sidePanel() +{ + return m_sidePanel; +} + + void MainWindow::postLaunch() { // setup history menu: this has to be done AFTER setupGUI!! @@ -153,11 +159,6 @@ void MainWindow::postLaunch() connect(m_view, SIGNAL(loadProgress(int)), this, SLOT(slotLoadProgress(int))); connect(m_view, SIGNAL(printRequested(QWebFrame *)), this, SLOT(printRequested(QWebFrame *))); - // WARNING: these slots will be commented out until rekonq will have just ONE mainwindow -// connect(m_view, SIGNAL(geometryChangeRequested(const QRect &)), this, SLOT(geometryChangeRequested(const QRect &))); -// connect(m_view, SIGNAL(menuBarVisibilityChangeRequested(bool)), menuBar(), SLOT(setVisible(bool))); -// connect(m_view, SIGNAL(statusBarVisibilityChangeRequested(bool)), statusBar(), SLOT(setVisible(bool))); - // status bar messages connect(m_view, SIGNAL(showStatusBarMessage(const QString&)), statusBar(), SLOT(showMessage(const QString&))); connect(m_view, SIGNAL(linkHovered(const QString&)), statusBar(), SLOT(showMessage(const QString&))); @@ -221,7 +222,7 @@ void MainWindow::setupActions() KStandardAction::printPreview(this, SLOT(slotFilePrintPreview()), actionCollection()); KStandardAction::print(this, SLOT(slotFilePrint()), actionCollection()); KStandardAction::quit(this , SLOT(close()), actionCollection()); - KStandardAction::find(this, SLOT(slotViewFindBar()) , actionCollection()); + KStandardAction::find(m_findBar, SLOT(show()) , actionCollection()); KStandardAction::findNext(this, SLOT(slotFindNext()) , actionCollection()); KStandardAction::findPrev(this, SLOT(slotFindPrevious()) , actionCollection()); @@ -614,6 +615,7 @@ void MainWindow::slotPrivateBrowsing(bool enable) } } + void MainWindow::slotFind(const QString & search) { if (!currentTab()) @@ -623,12 +625,6 @@ void MainWindow::slotFind(const QString & search) } -void MainWindow::slotViewFindBar() -{ - m_findBar->showFindBar(); -} - - void MainWindow::slotFindNext() { if (!currentTab() && m_lastSearch.isEmpty()) @@ -780,10 +776,10 @@ void MainWindow::slotToggleInspector(bool enable) if (enable) { int result = KMessageBox::questionYesNo(this, - i18n("The web inspector will only work correctly for pages that were loaded after enabling.\n" - "Do you want to reload all pages?"), - i18n("Web Inspector") - ); + i18n("The web inspector will only work correctly for pages that were loaded after enabling.\n" + "Do you want to reload all pages?"), + i18n("Web Inspector") + ); if (result == KMessageBox::Yes) { @@ -910,12 +906,16 @@ bool MainWindow::queryClose() int answer = KMessageBox::questionYesNoCancel( this, - i18np("Are you sure you want to close the window?\n" "You have 1 tab open","Are you sure you want to close the window?\n" "You have %1 tabs open" , m_view->count()), - i18n("Are you sure you want to close the window?"), - KStandardGuiItem::quit(), - KGuiItem(i18n("C&lose Current Tab"), KIcon("tab-close")), - KStandardGuiItem::cancel(), - "confirmClosingMultipleTabs" + i18np( "Are you sure you want to close the window?\n" + "You have 1 tab open", + "Are you sure you want to close the window?\n" + "You have %1 tabs open", + m_view->count()), + i18n("Are you sure you want to close the window?"), + KStandardGuiItem::quit(), + KGuiItem(i18n("C&lose Current Tab"), KIcon("tab-close")), + KStandardGuiItem::cancel(), + "confirmClosingMultipleTabs" ); switch (answer) diff --git a/src/mainwindow.h b/src/mainwindow.h index 61d8f27b..7d0b2e5c 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -43,8 +43,8 @@ class KActionMenu; class KIcon; class KMenu; -class FindBar; class HistoryMenu; +class FindBar; class SidePanel; class WebView; @@ -73,10 +73,7 @@ private: void setupHistoryMenu(); void setupToolBars(); void setupSidePanel(); - SidePanel *sidePanel() - { - return m_sidePanel; - } + SidePanel *sidePanel(); public slots: void slotHome(); @@ -121,7 +118,6 @@ private slots: void slotViewTextSmaller(); void slotViewPageSource(); void slotViewFullScreen(bool enable); - void slotViewFindBar(); // Tools Menu slots void slotToggleInspector(bool enable); @@ -132,8 +128,8 @@ private slots: private: MainView *m_view; - FindBar *m_findBar; SearchBar *m_searchBar; + FindBar *m_findBar; SidePanel *m_sidePanel; KMenu *m_historyBackMenu; diff --git a/src/networkaccessmanager.cpp b/src/networkaccessmanager.cpp index cbf263b6..2eba844a 100644 --- a/src/networkaccessmanager.cpp +++ b/src/networkaccessmanager.cpp @@ -40,6 +40,7 @@ // Qt Includes #include <QtCore/QPointer> +#include <QtCore/QIODevice> #include <QtGui/QStyle> #include <QtGui/QTextDocument> @@ -47,11 +48,12 @@ #include <QtNetwork/QAuthenticator> #include <QtNetwork/QNetworkProxy> #include <QtNetwork/QNetworkReply> +#include <QtNetwork/QNetworkRequest> #include <QtNetwork/QSslError> NetworkAccessManager::NetworkAccessManager(QObject *parent) - : QNetworkAccessManager(parent) + : AccessManager(parent) { connect(this, SIGNAL(authenticationRequired(QNetworkReply*, QAuthenticator*)), SLOT(authenticationRequired(QNetworkReply*, QAuthenticator*))); @@ -60,7 +62,7 @@ NetworkAccessManager::NetworkAccessManager(QObject *parent) #ifndef QT_NO_OPENSSL connect(this, SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError>&)), - SLOT(sslErrors(QNetworkReply*, const QList<QSslError>&))); + SLOT(slotSSLErrors(QNetworkReply*, const QList<QSslError>&))); #endif loadSettings(); @@ -74,9 +76,9 @@ NetworkAccessManager::NetworkAccessManager(QObject *parent) void NetworkAccessManager::loadSettings() { - QNetworkProxy proxy; if (ReKonfig::isProxyEnabled()) { + QNetworkProxy proxy; if (ReKonfig::proxyType() == 0) { proxy.setType(QNetworkProxy::Socks5Proxy); @@ -89,8 +91,9 @@ void NetworkAccessManager::loadSettings() proxy.setPort(ReKonfig::proxyPort()); proxy.setUser(ReKonfig::proxyUserName()); proxy.setPassword(ReKonfig::proxyPassword()); + + setProxy(proxy); } - setProxy(proxy); } @@ -156,7 +159,7 @@ void NetworkAccessManager::proxyAuthenticationRequired(const QNetworkProxy &prox #ifndef QT_NO_OPENSSL -void NetworkAccessManager::sslErrors(QNetworkReply *reply, const QList<QSslError> &error) +void NetworkAccessManager::slotSSLErrors(QNetworkReply *reply, const QList<QSslError> &error) { MainWindow *mainWindow = Application::instance()->mainWindow(); @@ -164,7 +167,9 @@ void NetworkAccessManager::sslErrors(QNetworkReply *reply, const QList<QSslError for (int i = 0; i < error.count(); ++i) errorStrings += error.at(i).errorString(); QString errors = errorStrings.join(QLatin1String("\n")); - int ret = KMessageBox::warningContinueCancel(mainWindow, i18n("SSL Errors:\n\n") + reply->url().toString() + "\n\n" + QString(errors) + "\n\n"); + int ret = KMessageBox::warningContinueCancel(mainWindow, + i18n("SSL Errors:\n\n") + reply->url().toString() + "\n\n" + QString(errors) + "\n\n"); + if (ret == KMessageBox::Yes) reply->ignoreSslErrors(); } diff --git a/src/networkaccessmanager.h b/src/networkaccessmanager.h index 7da2f54f..8416d6a2 100644 --- a/src/networkaccessmanager.h +++ b/src/networkaccessmanager.h @@ -22,11 +22,15 @@ #ifndef NETWORKACCESSMANAGER_H #define NETWORKACCESSMANAGER_H -// Qt Includes -#include <QtNetwork/QNetworkAccessManager> +// KDE Includes +#include <KIO/AccessManager> +class QNetworkRequest; +class QIODevice; -class NetworkAccessManager : public QNetworkAccessManager +using namespace KIO; + +class NetworkAccessManager : public AccessManager { Q_OBJECT @@ -39,9 +43,11 @@ public slots: private slots: void authenticationRequired(QNetworkReply *reply, QAuthenticator *auth); void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *auth); + #ifndef QT_NO_OPENSSL - void sslErrors(QNetworkReply *reply, const QList<QSslError> &error); + void slotSSLErrors(QNetworkReply *reply, const QList<QSslError> &error); #endif + }; #endif // NETWORKACCESSMANAGER_H diff --git a/src/urlbar.cpp b/src/urlbar.cpp index e2756aa6..e1971ced 100644 --- a/src/urlbar.cpp +++ b/src/urlbar.cpp @@ -81,6 +81,24 @@ UrlBar::~UrlBar() } +void UrlBar::selectAll() const +{ + lineEdit()->selectAll(); +} + + +KUrl UrlBar::url() const +{ + return m_currentUrl; +} + + +KLineEdit *UrlBar::lineEdit() const +{ + return m_lineEdit; +} + + void UrlBar::setupLineEdit() { // Make m_lineEdit background transparent diff --git a/src/urlbar.h b/src/urlbar.h index d8fb9029..02d709bb 100644 --- a/src/urlbar.h +++ b/src/urlbar.h @@ -49,15 +49,8 @@ public: UrlBar(QWidget *parent = 0); ~UrlBar(); - void selectAll() const - { - lineEdit()->selectAll(); - } - KUrl url() const - { - return m_currentUrl; - } - + void selectAll() const; + KUrl url() const; QSize sizeHint() const; signals: @@ -80,10 +73,7 @@ protected: private: void setupLineEdit(); - KLineEdit *lineEdit() const - { - return m_lineEdit; - } + KLineEdit *lineEdit() const; static QLinearGradient generateGradient(const QColor &color, int height); diff --git a/src/webpage.cpp b/src/webpage.cpp new file mode 100644 index 00000000..cfbc32cf --- /dev/null +++ b/src/webpage.cpp @@ -0,0 +1,192 @@ +/* ============================================================ +* +* 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" +#include "webview.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> + + +WebPage::WebPage(QObject *parent) + : KWebPage(parent) +{ + setForwardUnsupportedContent(true); + + setNetworkAccessManager(Application::networkAccessManager()); + connect(networkAccessManager(), SIGNAL(finished(QNetworkReply*)), this, SLOT(manageNetworkErrors(QNetworkReply*))); +} + + +bool WebPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type) +{ + + // TODO: implement ioslaves protocols + QString scheme = request.url().scheme(); + if (scheme == QLatin1String("mailto")) + { + KToolInvocation::invokeMailer(request.url()); + return false; + } + + // create convenience fake api:// protocol for KDE apidox search and Qt docs + if (scheme == QLatin1String("api")) + { + QString path; + QString className = request.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 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(); +} + + +// FIXME: implement here (perhaps) mimetype discerning && file loading (KToolInvocation??) +// void WebPage::slotHandleUnsupportedContent(QNetworkReply *reply) +// { +// +// if (reply->error() == QNetworkReply::NoError) +// { +// return slotDownloadRequested(reply->request(), reply); +// } +// +// viewErrorPage(reply); +// } + + +void WebPage::manageNetworkErrors(QNetworkReply* reply) +{ + if(reply->error() == QNetworkReply::NoError) + return; + + viewErrorPage(reply); +} + + +void WebPage::viewErrorPage(QNetworkReply *reply) +{ + // 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()); + + // test + 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..1f8777bd --- /dev/null +++ b/src/webpage.h @@ -0,0 +1,77 @@ +/* ============================================================ +* +* 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 WebView; + + +class WebPage : public KWebPage +{ + Q_OBJECT + +public: + explicit WebPage(QObject *parent = 0); + +public slots: + void manageNetworkErrors(QNetworkReply* reply); + +protected: + bool acceptNavigationRequest(QWebFrame *frame, + const QNetworkRequest &request, + NavigationType type); + + KWebPage *createWindow(QWebPage::WebWindowType type); + +// protected Q_SLOTS: +// virtual void slotHandleUnsupportedContent(QNetworkReply *reply); + +private: + void viewErrorPage(QNetworkReply *); + + KUrl m_loadingUrl; +}; + +#endif diff --git a/src/webview.cpp b/src/webview.cpp index 01fd0d00..216c2bd1 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> @@ -44,6 +45,9 @@ #include <KDebug> #include <KToolInvocation> +#include <kdewebkit/kwebpage.h> +#include <kdewebkit/kwebview.h> + // Qt Includes #include <QtGui/QContextMenuEvent> #include <QtGui/QWheelEvent> @@ -60,248 +64,60 @@ #include <QtWebKit/QWebSettings> #include <QtWebKit/QWebView> -#include <QtUiTools/QUiLoader> - -WebPage::WebPage(QObject *parent) - : QWebPage(parent) - , m_keyboardModifiers(Qt::NoModifier) - , m_pressedButtons(Qt::NoButton) +WebView::WebView(QWidget* parent) + : KWebView(parent) + , m_page(new WebPage(this)) + , m_progress(0) { - setNetworkAccessManager(Application::networkAccessManager()); + setPage(m_page); + connect(page(), SIGNAL(statusBarMessage(const QString&)), this, SLOT(setStatusBarText(const QString&))); + connect(this, SIGNAL(loadProgress(int)), this, SLOT(setProgress(int))); + connect(this, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished())); - setForwardUnsupportedContent(true); - connect(this, SIGNAL(unsupportedContent(QNetworkReply *)), this, SLOT(handleUnsupportedContent(QNetworkReply *))); + connect(this, SIGNAL(openUrlInNewTab(const KUrl &)), this, SLOT(openLinkInNewTab(const KUrl &))); } -WebPage::~WebPage() +void WebView::setNewPage() { + setPage(new WebPage(this)); } -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); - 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); - return false; - } - } - - return QWebPage::acceptNavigationRequest(frame, request, type); +KUrl WebView::url() const +{ + return KUrl(QWebView::url()); } -QWebPage *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(); +QString WebView::lastStatusBarText() const +{ + return m_statusBarText; } -QObject *WebPage::createPlugin(const QString &classId, const QUrl &url, const QStringList ¶mNames, const QStringList ¶mValues) -{ - kDebug() << "creating PLUGIN for rekonq "; - kDebug() << "classId = " << classId; - kDebug() << "url = " << url; - kDebug() << "Param Names = " << paramNames; - kDebug() << "Param Values = " << paramValues; - - QUiLoader loader; - return loader.createWidget(classId, view()); +int WebView::progress() const +{ + return m_progress; } -void WebPage::handleUnsupportedContent(QNetworkReply *reply) +void WebView::load(const KUrl &url) { - // 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()); - } + QWebView::load(url); } -// ----------------------------------------------------------------------------------------------------------------- +void WebView::setProgress(int progress) +{ + m_progress = progress; +} -WebView::WebView(QWidget* parent) - : QWebView(parent) - , m_page(new WebPage(this)) - , m_progress(0) -{ - setPage(m_page); - connect(page(), SIGNAL(statusBarMessage(const QString&)), this, SLOT(setStatusBarText(const QString&))); - connect(this, SIGNAL(loadProgress(int)), this, SLOT(setProgress(int))); - connect(this, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished())); - connect(page(), SIGNAL(loadingUrl(const QUrl&)), this, SIGNAL(urlChanged(const QUrl &))); - connect(page(), SIGNAL(downloadRequested(const QNetworkRequest &)), this, SLOT(downloadRequested(const QNetworkRequest &))); - page()->setForwardUnsupportedContent(true); +void WebView::setStatusBarText(const QString &string) +{ + m_statusBarText = string; } @@ -315,14 +131,13 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) addBookmarkAction->setData(QVariant()); KMenu menu(this); - QAction *a; // link actions bool linkIsEmpty = result.linkUrl().isEmpty(); if (!linkIsEmpty) { - a = new KAction(KIcon("tab-new"), i18n("Open Link in New &Tab"), this); - connect(a, SIGNAL(triggered()), this, SLOT(openLinkInNewTab())); + QAction *a = pageAction(QWebPage::OpenLinkInNewWindow); + a->setText(i18n("Open Link in New &Tab")); menu.addAction(a); } else @@ -335,10 +150,7 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) // Developer Extras actions if (page()->settings()->testAttribute(QWebSettings::DeveloperExtrasEnabled)) { - a = pageAction(QWebPage::InspectElement); - a->setIcon(KIcon("tools-report-bug")); - a->setText(i18n("&Inspect Element")); - menu.addAction(a); + menu.addAction(pageAction(QWebPage::InspectElement)); menu.addSeparator(); } @@ -347,28 +159,19 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) if (result.isContentSelected() && result.isContentEditable()) { - a = pageAction(QWebPage::Cut); - a->setIcon(KIcon("edit-cut")); - a->setText(i18n("Cu&t")); - menu.addAction(a); + menu.addAction(pageAction(QWebPage::Cut)); b = true; } if (result.isContentSelected()) { - a = pageAction(QWebPage::Copy); - a->setIcon(KIcon("edit-copy")); - a->setText(i18n("&Copy")); - menu.addAction(a); + menu.addAction(pageAction(QWebPage::Copy)); b = true; } if (result.isContentEditable()) { - a = pageAction(QWebPage::Paste); - a->setIcon(KIcon("edit-paste")); - a->setText(i18n("&Paste")); - menu.addAction(a); + menu.addAction(pageAction(QWebPage::Paste)); b = true; } @@ -380,31 +183,15 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) // save/copy link actions if (!linkIsEmpty) { - a = pageAction(QWebPage::DownloadLinkToDisk); - a->setIcon(KIcon("folder-downloads")); - a->setText(i18n("&Save Link As...")); - menu.addAction(a); - - a = pageAction(QWebPage::CopyLinkToClipboard); - a->setIcon(KIcon("insert-link")); - a->setText(i18n("&Copy Link Location")); - menu.addAction(a); - + menu.addAction(pageAction(QWebPage::DownloadLinkToDisk)); + menu.addAction(pageAction(QWebPage::CopyLinkToClipboard)); menu.addSeparator(); if (!result.pixmap().isNull()) { // TODO Add "View Image" && remove copy_this_image action - a = pageAction(QWebPage::DownloadImageToDisk); - a->setIcon(KIcon("folder-image")); - a->setText(i18n("&Save Image As...")); - menu.addAction(a); - - a = pageAction(QWebPage::CopyImageToClipboard); - a->setIcon(KIcon("insert-image")); - a->setText(i18n("&Copy This Image")); - menu.addAction(a); - + menu.addAction(pageAction(QWebPage::DownloadImageToDisk)); + menu.addAction(pageAction(QWebPage::CopyImageToClipboard)); menu.addSeparator(); } } @@ -431,23 +218,10 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) } -void WebView::wheelEvent(QWheelEvent *event) -{ - if (QApplication::keyboardModifiers() & Qt::ControlModifier) - { - int numDegrees = event->delta() / 8; - int numSteps = numDegrees / 15; - setTextSizeMultiplier(textSizeMultiplier() + numSteps * 0.1); - event->accept(); - return; - } - QWebView::wheelEvent(event); -} - - -void WebView::openLinkInNewTab() +void WebView::openLinkInNewTab(const KUrl &url) { - pageAction(QWebPage::OpenLinkInNewWindow)->trigger(); + WebView *that = Application::instance()->newWebView(); + that->load(url); } @@ -462,37 +236,6 @@ void WebView::loadFinished() } -void WebView::mousePressEvent(QMouseEvent *event) -{ - m_page->m_pressedButtons = event->buttons(); - m_page->m_keyboardModifiers = event->modifiers(); - QWebView::mousePressEvent(event); -} - - -void WebView::mouseReleaseEvent(QMouseEvent *event) -{ - QWebView::mouseReleaseEvent(event); - if (!event->isAccepted() && (m_page->m_pressedButtons & Qt::MidButton)) - { - KUrl url(QApplication::clipboard()->text(QClipboard::Selection)); - if (!url.isEmpty() && url.isValid() && !url.scheme().isEmpty()) - { - setUrl(url); - } - } -} - - -void WebView::downloadRequested(const QNetworkRequest &request) -{ - KUrl srcUrl = request.url(); - QString path = ReKonfig::downloadDir() + QString("/") + srcUrl.fileName(); - KUrl destUrl = KUrl(path); - Application::downloadManager()->newDownload(srcUrl); -} - - void WebView::keyPressEvent(QKeyEvent *event) { if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_Tab)) diff --git a/src/webview.h b/src/webview.h index eba02505..2ac018d7 100644 --- a/src/webview.h +++ b/src/webview.h @@ -27,8 +27,12 @@ // KDE Includes #include <KUrl> +#include <kdewebkit/kwebpage.h> +#include <kdewebkit/kwebview.h> + // Qt Includes #include <QWebPage> +#include <QWebView> // Forward Declarations class MainWindow; @@ -41,62 +45,22 @@ class QAuthenticator; class QMouseEvent; class QNetworkProxy; class QNetworkReply; -class QSslError; +class WebPage; -class WebPage : public QWebPage +class WebView : public KWebView { Q_OBJECT -signals: - void loadingUrl(const QUrl &url); // WARNING has to be QUrl!! - public: - WebPage(QObject *parent = 0); - ~WebPage(); - -protected: - bool acceptNavigationRequest(QWebFrame *frame, - const QNetworkRequest &request, - NavigationType type); - - QWebPage *createWindow(QWebPage::WebWindowType type); - QObject *createPlugin(const QString &classId, - const QUrl &url, - const QStringList ¶mNames, - const QStringList ¶mValues); - -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; -}; + explicit WebView(QWidget *parent = 0); + KUrl url() const; + QString lastStatusBarText() const; + int progress() const; -// ---------------------------------------------------------------------------------------------------- - -// Qt Includes -#include <QWebView> - - -class WebView : public QWebView -{ - Q_OBJECT - -public: - WebView(QWidget *parent = 0); - - // inline - WebPage *webPage() const { return m_page; } - KUrl url() const { return KUrl(QWebView::url()); } - QString lastStatusBarText() const { return m_statusBarText; } - int progress() const { return m_progress; } +public Q_SLOTS: + void load(const KUrl &url); signals: // switching tabs @@ -104,10 +68,7 @@ signals: void shiftCtrlTabPressed(); protected: - void mousePressEvent(QMouseEvent *event); - void mouseReleaseEvent(QMouseEvent *event); void contextMenuEvent(QContextMenuEvent *event); - void wheelEvent(QWheelEvent *event); /** * Filters (SHIFT + ) CTRL + TAB events and emit (shift)ctrlTabPressed() @@ -115,12 +76,15 @@ protected: */ void keyPressEvent(QKeyEvent *event); + // to reimplement from KWebView + virtual void setNewPage(); + private slots: - void setProgress(int progress) { m_progress = progress; } + void setProgress(int progress); void loadFinished(); - void setStatusBarText(const QString &string) { m_statusBarText = string; } - void downloadRequested(const QNetworkRequest &request); - void openLinkInNewTab(); + void setStatusBarText(const QString &string); + + void openLinkInNewTab(const KUrl &); private: WebPage *m_page; @@ -130,4 +94,3 @@ private: }; #endif - |