Make sure _profile and _page are deleted in the correct order

Inspired by https://github.com/electron/electron/pull/15028

Closes https://github.com/nextcloud/desktop/issues/941
Closes https://github.com/nextcloud/desktop/issues/950
This commit is contained in:
Chih-Hsuan Yen 2018-12-19 21:44:54 +08:00
parent 24907acc2a
commit 09b0055dc3
No known key found for this signature in database
GPG Key ID: F98EF2A7B0A098AE
4 changed files with 25 additions and 0 deletions

View File

@ -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);
}

View File

@ -21,6 +21,9 @@ public:
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);

View File

@ -105,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) {

View File

@ -21,6 +21,7 @@ class WebView : public QWidget
Q_OBJECT
public:
WebView(QWidget *parent = nullptr);
virtual ~WebView();
void setUrl(const QUrl &url);
signals: