diff options
author | Julius Härtl <jus@bitgrid.net> | 2018-08-11 14:12:13 +0300 |
---|---|---|
committer | Julius Härtl <jus@bitgrid.net> | 2018-08-11 18:38:08 +0300 |
commit | 8dedb9084e5023238fb476489cfd615761b20fcb (patch) | |
tree | e1973d30a9adb14cfe31cffa0aad2571a84797af /src | |
parent | f6ef11a5c9ac2f9e2394c43f8f9649b19ef43f9e (diff) |
Make links open in an external browser
Signed-off-by: Julius Härtl <jus@bitgrid.net>
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/wizard/webview.cpp | 66 | ||||
-rw-r--r-- | src/gui/wizard/webview.h | 6 |
2 files changed, 67 insertions, 5 deletions
diff --git a/src/gui/wizard/webview.cpp b/src/gui/wizard/webview.cpp index 36451b3af..e50ef4a13 100644 --- a/src/gui/wizard/webview.cpp +++ b/src/gui/wizard/webview.cpp @@ -6,6 +6,7 @@ #include <QWebEngineUrlRequestJob> #include <QWebEngineUrlSchemeHandler> #include <QWebEngineView> +#include <QDesktopServices> #include <QProgressBar> #include <QLoggingCategory> #include <QLocale> @@ -36,6 +37,27 @@ Q_SIGNALS: void urlCatched(QString user, QString pass, QString host); }; +class WebEngineView : public QWebEngineView { + Q_OBJECT +public: + WebEngineView(QWidget* parent = 0); + bool acceptNavigationRequest(const QUrl &url, QWebEnginePage::NavigationType type, bool isMainFrame); +}; + + +class WebEnginePage : public QWebEnginePage { +public: + WebEnginePage(QWebEngineProfile *profile, QObject* parent = nullptr); + QWebEnginePage * createWindow(QWebEnginePage::WebWindowType type) override; +}; + +// We need a separate class here, since we cannot simply return the same WebEnginePage object +// this leads to a strage segfault somewhere deep inside of the QWebEngine code +class ExternalWebEnginePage : public QWebEnginePage { +public: + ExternalWebEnginePage(QWebEngineProfile *profile, QObject* parent = nullptr); + bool acceptNavigationRequest(const QUrl &url, QWebEnginePage::NavigationType type, bool isMainFrame) override; +}; WebView::WebView(QWidget *parent) : QWidget(parent), @@ -43,13 +65,15 @@ WebView::WebView(QWidget *parent) { _ui.setupUi(this); - _webview = new QWebEngineView(this); + _webview = new WebEngineView(this); _profile = new QWebEngineProfile(this); - _page = new QWebEnginePage(_profile); + _page = new WebEnginePage(_profile); _interceptor = new WebViewPageUrlRequestInterceptor(this); _schemeHandler = new WebViewPageUrlSchemeHandler(this); - _profile->setHttpUserAgent(Utility::userAgentString()); + const QString userAgent(Utility::userAgentString()); + _profile->setHttpUserAgent(userAgent); + QWebEngineProfile::defaultProfile()->setHttpUserAgent(userAgent); _profile->setRequestInterceptor(_interceptor); _profile->installUrlSchemeHandler("nc", _schemeHandler); @@ -120,6 +144,42 @@ void WebViewPageUrlSchemeHandler::requestStarted(QWebEngineUrlRequestJob *reques emit urlCatched(user, password, server); } + +WebEnginePage::WebEnginePage(QWebEngineProfile *profile, QObject* parent) : QWebEnginePage(profile, parent) { + +} + +QWebEnginePage * WebEnginePage::createWindow(QWebEnginePage::WebWindowType type) { + ExternalWebEnginePage *view = new ExternalWebEnginePage(this->profile()); + return view; +} + +ExternalWebEnginePage::ExternalWebEnginePage(QWebEngineProfile *profile, QObject* parent) : QWebEnginePage(profile, parent) { + +} + + +bool ExternalWebEnginePage::acceptNavigationRequest(const QUrl &url, QWebEnginePage::NavigationType type, bool isMainFrame) +{ + QDesktopServices::openUrl(url); + return false; +} + + +WebEngineView::WebEngineView(QWidget* parent) : QWebEngineView (parent) { + +} + +bool WebEngineView::acceptNavigationRequest(const QUrl &url, QWebEnginePage::NavigationType type, bool isMainFrame) +{ + if (type == QWebEnginePage::NavigationTypeLinkClicked) + { + QDesktopServices::openUrl(url); + return false; + } + return true; +} + } #include "webview.moc" diff --git a/src/gui/wizard/webview.h b/src/gui/wizard/webview.h index 5e5a8793a..01529ef09 100644 --- a/src/gui/wizard/webview.h +++ b/src/gui/wizard/webview.h @@ -14,6 +14,8 @@ namespace OCC { class WebViewPageUrlRequestInterceptor; class WebViewPageUrlSchemeHandler; +class WebEngineView; +class WebEnginePage; class WebView : public QWidget { @@ -28,9 +30,9 @@ signals: private: Ui_WebView _ui; - QWebEngineView *_webview; + WebEngineView *_webview; QWebEngineProfile *_profile; - QWebEnginePage *_page; + WebEnginePage *_page; WebViewPageUrlRequestInterceptor *_interceptor; WebViewPageUrlSchemeHandler *_schemeHandler; |