diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2022-05-23 15:14:56 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-06-14 03:49:17 +0000 |
commit | b5025d71b0d8aed787d353fd3a20a42d2283529f (patch) | |
tree | cb4c952201310ce1c5df84e82fc5819b22319756 /src | |
parent | f13ae31ea24d2766f57990e5c143c2088fc87065 (diff) |
Protect against default profile being deleted before its pages
Can really only happen in QML on exit.
Task-number: QTBUG-99445
Change-Id: I1a04d57b6c4c40ae264b5519d2e41c57bca79a61
Reviewed-by: Michal Klocek <michal.klocek@qt.io>
(cherry picked from commit 45c217646e3742070af15267df8fdb40c2a6c81a)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/core/api/qwebengineprofile.cpp | 2 | ||||
-rw-r--r-- | src/core/profile_adapter.cpp | 11 | ||||
-rw-r--r-- | src/core/profile_adapter.h | 1 | ||||
-rw-r--r-- | src/webenginequick/api/qquickwebengineprofile.cpp | 2 |
4 files changed, 13 insertions, 3 deletions
diff --git a/src/core/api/qwebengineprofile.cpp b/src/core/api/qwebengineprofile.cpp index 5fb0491ec..3f33b2f2c 100644 --- a/src/core/api/qwebengineprofile.cpp +++ b/src/core/api/qwebengineprofile.cpp @@ -184,6 +184,8 @@ QWebEngineProfilePrivate::~QWebEngineProfilePrivate() if (m_profileAdapter != QtWebEngineCore::ProfileAdapter::defaultProfileAdapter()) delete m_profileAdapter; + else if (m_profileAdapter) + m_profileAdapter->releaseAllWebContentsAdapterClients(); delete m_settings; } diff --git a/src/core/profile_adapter.cpp b/src/core/profile_adapter.cpp index 7bcdaf4bc..81fe4dc0e 100644 --- a/src/core/profile_adapter.cpp +++ b/src/core/profile_adapter.cpp @@ -118,9 +118,8 @@ ProfileAdapter::~ProfileAdapter() { m_cancelableTaskTracker->TryCancelAll(); m_profile->NotifyWillBeDestroyed(); - while (!m_webContentsAdapterClients.isEmpty()) { - m_webContentsAdapterClients.first()->releaseProfile(); - } + releaseAllWebContentsAdapterClients(); + WebEngineContext::current()->removeProfileAdapter(this); if (m_downloadManagerDelegate) { m_profile->GetDownloadManager()->Shutdown(); @@ -673,6 +672,12 @@ void ProfileAdapter::removeWebContentsAdapterClient(WebContentsAdapterClient *cl m_webContentsAdapterClients.removeAll(client); } +void ProfileAdapter::releaseAllWebContentsAdapterClients() +{ + while (!m_webContentsAdapterClients.isEmpty()) + m_webContentsAdapterClients.first()->releaseProfile(); +} + void ProfileAdapter::resetVisitedLinksManager() { m_visitedLinksManager.reset(new VisitedLinksManagerQt(m_profile.data(), persistVisitedLinks())); diff --git a/src/core/profile_adapter.h b/src/core/profile_adapter.h index 49945a4a3..548915437 100644 --- a/src/core/profile_adapter.h +++ b/src/core/profile_adapter.h @@ -139,6 +139,7 @@ public: void addWebContentsAdapterClient(WebContentsAdapterClient *client); void removeWebContentsAdapterClient(WebContentsAdapterClient *client); + void releaseAllWebContentsAdapterClients(); // KEEP IN SYNC with API or add mapping layer enum HttpCacheType { diff --git a/src/webenginequick/api/qquickwebengineprofile.cpp b/src/webenginequick/api/qquickwebengineprofile.cpp index 3dfb862e4..2d68f58f5 100644 --- a/src/webenginequick/api/qquickwebengineprofile.cpp +++ b/src/webenginequick/api/qquickwebengineprofile.cpp @@ -181,6 +181,8 @@ QQuickWebEngineProfilePrivate::~QQuickWebEngineProfilePrivate() if (m_profileAdapter != QtWebEngineCore::ProfileAdapter::defaultProfileAdapter()) delete m_profileAdapter; + else if (m_profileAdapter) + m_profileAdapter->releaseAllWebContentsAdapterClients(); } void QQuickWebEngineProfilePrivate::addWebContentsAdapterClient(QtWebEngineCore::WebContentsAdapterClient *adapter) |