summaryrefslogtreecommitdiff
path: root/src/webview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/webview.cpp')
-rw-r--r--src/webview.cpp349
1 files changed, 46 insertions, 303 deletions
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 &paramNames, const QStringList &paramValues)
-{
- 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))