File nextcloud-client-fix-qt-5.12.patch of Package nextcloud-client
--- a/src/gui/creds/webflowcredentialsdialog.cpp
+++ b/src/gui/creds/webflowcredentialsdialog.cpp
@@ -29,6 +29,14 @@ WebFlowCredentialsDialog::WebFlowCredentialsDialog(QWidget *parent)
connect(_webView, &WebView::urlCatched, this, &WebFlowCredentialsDialog::urlCatched);
}
+void WebFlowCredentialsDialog::closeEvent(QCloseEvent *e) {
+ Q_UNUSED(e);
+
+ // Force calling WebView::~WebView() earlier so that _profile and _page are
+ // deleted in the correct order.
+ delete _webView;
+}
+
void WebFlowCredentialsDialog::setUrl(const QUrl &url) {
_webView->setUrl(url);
}
--- a/src/gui/creds/webflowcredentialsdialog.h
+++ b/src/gui/creds/webflowcredentialsdialog.h
@@ -21,6 +21,9 @@ class WebFlowCredentialsDialog : public QDialog
void setInfo(const QString &msg);
void setError(const QString &error);
+protected:
+ void closeEvent(QCloseEvent *e) override;
+
signals:
void urlCatched(const QString user, const QString pass, const QString host);
--- a/src/gui/wizard/webview.cpp
+++ b/src/gui/wizard/webview.cpp
@@ -10,6 +10,7 @@
#include <QProgressBar>
#include <QLoggingCategory>
#include <QLocale>
+#include <QWebEngineCertificateError>
#include "common/utility.h"
@@ -104,6 +105,19 @@ void WebView::setUrl(const QUrl &url) {
_page->setUrl(url);
}
+WebView::~WebView() {
+ /*
+ * The Qt implmentation deletes children in the order they are added to the
+ * object tree, so in this case _page is deleted after _profile, which
+ * violates the assumption that _profile should exist longer than
+ * _page [1]. Here I delete _page manually so that _profile can be safely
+ * deleted later.
+ *
+ * [1] https://doc.qt.io/qt-5/qwebenginepage.html#QWebEnginePage-1
+ */
+ delete _page;
+}
+
WebViewPageUrlRequestInterceptor::WebViewPageUrlRequestInterceptor(QObject *parent)
: QWebEngineUrlRequestInterceptor(parent) {
--- a/src/gui/wizard/webview.h
+++ b/src/gui/wizard/webview.h
@@ -21,6 +21,7 @@ class WebView : public QWidget
Q_OBJECT
public:
WebView(QWidget *parent = nullptr);
+ virtual ~WebView();
void setUrl(const QUrl &url);
signals: