From 7d4a39ce4fa406121ded4e14a357e40791a1b99c Mon Sep 17 00:00:00 2001 From: Burak Hancerli Date: Mon, 10 Feb 2025 15:24:48 +0100 Subject: [PATCH] DVConnector: Prevent QWebEngineView from double-free Task-number: QDS-14702 Change-Id: Ia24b2d92a49c6fb9871b081587fdbd33595edd19 Reviewed-by: Tim Jenssen --- .../components/designviewer/dvconnector.cpp | 21 +++++++++++-------- .../components/designviewer/dvconnector.h | 5 ++--- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/plugins/qmldesigner/components/designviewer/dvconnector.cpp b/src/plugins/qmldesigner/components/designviewer/dvconnector.cpp index a765d5896ed..15f57ae37d5 100644 --- a/src/plugins/qmldesigner/components/designviewer/dvconnector.cpp +++ b/src/plugins/qmldesigner/components/designviewer/dvconnector.cpp @@ -120,23 +120,25 @@ DVConnector::DVConnector(QObject *parent) , m_isWebViewerVisible(false) , m_connectorStatus(ConnectorStatus::NotLoggedIn) { - m_webEngineProfile.reset(new QWebEngineProfile("DesignViewer", this)); - m_webEngineProfile->setPersistentCookiesPolicy(QWebEngineProfile::ForcePersistentCookies); - m_webEnginePage.reset(new CustomWebEnginePage(m_webEngineProfile.data(), this)); - m_webEngineView.reset(new QWebEngineView(Core::ICore::instance()->dialogParent())); - m_webEngineView->setPage(m_webEnginePage.data()); + QWebEngineProfile *webEngineProfile = new QWebEngineProfile("DesignViewer"); + webEngineProfile->setPersistentCookiesPolicy(QWebEngineProfile::ForcePersistentCookies); + + m_webEnginePage = new CustomWebEnginePage(webEngineProfile); + webEngineProfile->setParent(m_webEnginePage); + + m_webEngineView = new QWebEngineView(m_webEnginePage, Core::ICore::instance()->dialogParent()); m_webEngineView->resize(1024, 750); m_webEngineView->setWindowFlag(Qt::Dialog); m_webEngineView->installEventFilter(this); m_webEngineView->hide(); m_networkCookieJar.reset( - new CustomCookieJar(this, m_webEngineProfile->persistentStoragePath() + "/dv_cookies.txt")); + new CustomCookieJar(this, webEngineProfile->persistentStoragePath() + "/dv_cookies.txt")); m_networkAccessManager.reset(new QNetworkAccessManager(this)); m_networkAccessManager->setCookieJar(m_networkCookieJar.data()); m_networkCookieJar->loadCookies(); - connect(m_webEngineProfile->cookieStore(), + connect(webEngineProfile->cookieStore(), &QWebEngineCookieStore::cookieAdded, this, [&](const QNetworkCookie &cookie) { @@ -194,7 +196,7 @@ QString DVConnector::loginUrl() const bool DVConnector::eventFilter(QObject *obj, QEvent *e) { - if (obj == m_webEngineView.data()) { + if (obj == m_webEngineView) { if (m_isWebViewerVisible != m_webEngineView->isVisible()) { m_isWebViewerVisible = m_webEngineView->isVisible(); emit webViewerVisibleChanged(); @@ -651,7 +653,8 @@ void DVConnector::logout() evaluatorData.reply = m_networkAccessManager->get(request); evaluatorData.description = "Logout"; evaluatorData.successCallback = [this](const QByteArray &, const QList &) { - m_webEngineProfile->cookieStore()->deleteAllCookies(); + QWebEngineCookieStore *cookieStore = m_webEnginePage->profile()->cookieStore(); + cookieStore->deleteAllCookies(); m_connectorStatus = ConnectorStatus::NotLoggedIn; emit connectorStatusUpdated(m_connectorStatus); }; diff --git a/src/plugins/qmldesigner/components/designviewer/dvconnector.h b/src/plugins/qmldesigner/components/designviewer/dvconnector.h index 7d012fae234..e64c413bcbd 100644 --- a/src/plugins/qmldesigner/components/designviewer/dvconnector.h +++ b/src/plugins/qmldesigner/components/designviewer/dvconnector.h @@ -90,9 +90,8 @@ private: QScopedPointer m_networkCookieJar; // login - QScopedPointer m_webEngineProfile; - QScopedPointer m_webEnginePage; - QScopedPointer m_webEngineView; + QWebEnginePage *m_webEnginePage; + QWebEngineView *m_webEngineView; bool m_isWebViewerVisible; // status