summaryrefslogtreecommitdiffstats
path: root/examples/webenginewidgets/simplebrowser/webview.cpp
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@theqtcompany.com>2016-02-23 15:48:03 +0100
committerKai Koehne <kai.koehne@theqtcompany.com>2016-03-16 07:58:00 +0000
commit0b6a32543f53784789991a4d4e8ad4f98c8446c6 (patch)
tree6c717eaf2114aa07c581d0d67534e6ff6828a877 /examples/webenginewidgets/simplebrowser/webview.cpp
parentb3cc469ef024c864be6b6e757e7759736e373fef (diff)
Strip down demobrowser to become simplebrowser
Demobrowser changes: * remove QLocalServer/Socket * remove AutoSaver * remove restoreLastSession * remove general QSettings * remove downloadManager * remove bookmarkManager * remove historyManager * remove searchBar * favor setStyleSheet over overriding paint methods * use lambdas where suitable * use QProgressBar instead of own painted widget * use QToolButton instead of own painted buttons * remove QStackWidget, use single UrlLineEdit per window instead of per tab * split files to keep own classes: webpage and webview * remove tracking windows by QPoiner * remove WebPageActionMapper, TabBar classes * remove QDrag dead code * remove special OS X close app handling * fix encapsulation, clean up application logic Change-Id: I4849b6a2de739dea4f01229abdb90418601a2397 Reviewed-by: Kai Koehne <kai.koehne@theqtcompany.com> Reviewed-by: Alexandru Croitor <alexandru.croitor@theqtcompany.com>
Diffstat (limited to 'examples/webenginewidgets/simplebrowser/webview.cpp')
-rw-r--r--examples/webenginewidgets/simplebrowser/webview.cpp189
1 files changed, 189 insertions, 0 deletions
diff --git a/examples/webenginewidgets/simplebrowser/webview.cpp b/examples/webenginewidgets/simplebrowser/webview.cpp
new file mode 100644
index 000000000..1fabcc69f
--- /dev/null
+++ b/examples/webenginewidgets/simplebrowser/webview.cpp
@@ -0,0 +1,189 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "browser.h"
+#include "browserwindow.h"
+#include "tabwidget.h"
+#include "webpage.h"
+#include "webpopupwindow.h"
+#include "webview.h"
+#include <QContextMenuEvent>
+#include <QMenu>
+#include <QMessageBox>
+#include <QNetworkReply>
+#include <QTimer>
+
+WebView::WebView(QWidget *parent)
+ : QWebEngineView(parent)
+ , m_loadProgress(0)
+{
+ connect(this, &QWebEngineView::loadProgress, [this](int progress) {
+ m_loadProgress = progress;
+ });
+ connect(this, &QWebEngineView::loadFinished, [this](bool success) {
+ if (!success) {
+ qWarning() << "Could not load page: " << url();
+ m_loadProgress = 0;
+ }
+ });
+ connect(this, &QWebEngineView::iconUrlChanged, this, &WebView::handleIconUrlChanged);
+ connect(this, &QWebEngineView::renderProcessTerminated,
+ [this](QWebEnginePage::RenderProcessTerminationStatus termStatus, int statusCode) {
+ QString status;
+ switch (termStatus) {
+ case QWebEnginePage::NormalTerminationStatus:
+ status = tr("Render process normal exit");
+ break;
+ case QWebEnginePage::AbnormalTerminationStatus:
+ status = tr("Render process abnormal exit");
+ break;
+ case QWebEnginePage::CrashedTerminationStatus:
+ status = tr("Render process crashed");
+ break;
+ case QWebEnginePage::KilledTerminationStatus:
+ status = tr("Render process killed");
+ break;
+ }
+ QMessageBox::critical(window(), status, tr("Render process exited with code: %1").arg(statusCode));
+ QTimer::singleShot(0, [this] { reload(); });
+ });
+}
+
+void WebView::setPage(WebPage *page)
+{
+ createWebActionTrigger(page,QWebEnginePage::Forward);
+ createWebActionTrigger(page,QWebEnginePage::Back);
+ createWebActionTrigger(page,QWebEnginePage::Reload);
+ createWebActionTrigger(page,QWebEnginePage::Stop);
+ QWebEngineView::setPage(page);
+}
+
+QIcon WebView::icon() const
+{
+ if (!m_icon.isNull())
+ return m_icon;
+ return QIcon(QLatin1String(":defaulticon.png"));
+}
+
+int WebView::loadProgress() const
+{
+ return m_loadProgress;
+}
+
+void WebView::createWebActionTrigger(QWebEnginePage *page, QWebEnginePage::WebAction webAction)
+{
+ QAction *action = page->action(webAction);
+ connect(action, &QAction::changed, [this, action, webAction]{
+ emit webActionEnabledChanged(webAction, action->isEnabled());
+ });
+}
+
+bool WebView::isWebActionEnabled(QWebEnginePage::WebAction webAction) const
+{
+ return page()->action(webAction)->isEnabled();
+}
+
+QNetworkAccessManager &WebView::networkAccessManager()
+{
+ static QNetworkAccessManager networkAccessManager;
+ return networkAccessManager;
+}
+
+QWebEngineView *WebView::createWindow(QWebEnginePage::WebWindowType type)
+{
+ switch (type) {
+ case QWebEnginePage::WebBrowserTab: {
+ BrowserWindow *mainWindow = qobject_cast<BrowserWindow*>(window());
+ return mainWindow->tabWidget()->createTab();
+ }
+ case QWebEnginePage::WebBrowserWindow: {
+ BrowserWindow *mainWindow = new BrowserWindow();
+ Browser::instance().addWindow(mainWindow);
+ return mainWindow->currentTab();
+ }
+ case QWebEnginePage::WebDialog: {
+ WebPopupWindow *popup = new WebPopupWindow(page()->profile());
+ return popup->view();
+ }
+ }
+ return nullptr;
+}
+
+void WebView::contextMenuEvent(QContextMenuEvent *event)
+{
+ QMenu *menu = page()->createStandardContextMenu();
+ const QList<QAction*> actions = menu->actions();
+ auto it = std::find(actions.cbegin(), actions.cend(), page()->action(QWebEnginePage::OpenLinkInThisWindow));
+ if (it != actions.cend()) {
+ (*it)->setText(tr("Open Link in This Tab"));
+ ++it;
+ menu->insertAction(*it, page()->action(QWebEnginePage::OpenLinkInNewWindow));
+ menu->insertAction(*it, page()->action(QWebEnginePage::OpenLinkInNewTab));
+ }
+ menu->popup(event->globalPos());
+}
+
+void WebView::handleIconUrlChanged(const QUrl &url)
+{
+ QNetworkRequest iconRequest(url);
+#ifndef QT_NO_OPENSSL
+ QSslConfiguration conf = iconRequest.sslConfiguration();
+ conf.setPeerVerifyMode(QSslSocket::VerifyNone);
+ iconRequest.setSslConfiguration(conf);
+#endif
+ QNetworkReply *iconReply = networkAccessManager().get(iconRequest);
+ iconReply->setParent(this);
+ connect(iconReply, &QNetworkReply::finished, this, &WebView::handleIconLoaded);
+}
+
+void WebView::handleIconLoaded()
+{
+ QNetworkReply *iconReply = qobject_cast<QNetworkReply*>(sender());
+ if (iconReply && iconReply->error() == QNetworkReply::NoError) {
+ QByteArray data = iconReply->readAll();
+ QPixmap pixmap;
+ pixmap.loadFromData(data);
+ m_icon.addPixmap(pixmap);
+ iconReply->deleteLater();
+ } else {
+ m_icon = QIcon(QStringLiteral(":defaulticon.png"));
+ }
+ emit iconChanged(m_icon);
+}