Quellcode durchsuchen

Merge pull request #541 from nextcloud/bugfix/noid/wizard-external-links

Make links open in an external browser
Camila Ayres vor 7 Jahren
Ursprung
Commit
92aaa09643
2 geänderte Dateien mit 41 neuen und 3 gelöschten Zeilen
  1. 39 2
      src/gui/wizard/webview.cpp
  2. 2 1
      src/gui/wizard/webview.h

+ 39 - 2
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,19 @@ Q_SIGNALS:
     void urlCatched(QString user, QString pass, QString host);
 };
 
+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),
@@ -45,11 +59,13 @@ WebView::WebView(QWidget *parent)
 
     _webview = new QWebEngineView(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 +136,27 @@ 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;
+}
+
 }
 
 #include "webview.moc"

+ 2 - 1
src/gui/wizard/webview.h

@@ -14,6 +14,7 @@ namespace OCC {
 
 class WebViewPageUrlRequestInterceptor;
 class WebViewPageUrlSchemeHandler;
+class WebEnginePage;
 
 class WebView : public QWidget
 {
@@ -30,7 +31,7 @@ private:
 
     QWebEngineView *_webview;
     QWebEngineProfile *_profile;
-    QWebEnginePage *_page;
+    WebEnginePage *_page;
 
     WebViewPageUrlRequestInterceptor *_interceptor;
     WebViewPageUrlSchemeHandler *_schemeHandler;