diff options
author | Michal Klocek <michal.klocek@qt.io> | 2019-02-28 10:49:22 +0100 |
---|---|---|
committer | Michal Klocek <michal.klocek@qt.io> | 2019-03-01 15:59:37 +0000 |
commit | 56fadb571f32b721d8b99554e6e38692009ec37f (patch) | |
tree | 0d57ee708bca414342c69dbf924a016f09361169 /src/core | |
parent | ddfa2997939fc4de2993b3e0de2201eca534af61 (diff) |
Force destruction of webcontent client before profile adapter
Currently users might forget to delete webcontent client before
profile adapter. This might be nasty if users are not aware of default
profile. Instead of asserting badly in chromium, clean up and release
chromium resources.
This avoids the crash, but might leak memory if users never deletes
page.
Task-number: QTBUG-74021
Change-Id: I66f466f169d12f7ee08866d505260dca47800bb0
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/profile_adapter.cpp | 14 | ||||
-rw-r--r-- | src/core/profile_adapter.h | 5 | ||||
-rw-r--r-- | src/core/profile_adapter_client.h | 2 | ||||
-rw-r--r-- | src/core/web_contents_adapter_client.h | 1 |
4 files changed, 22 insertions, 0 deletions
diff --git a/src/core/profile_adapter.cpp b/src/core/profile_adapter.cpp index 50a97a6ac..1b946949a 100644 --- a/src/core/profile_adapter.cpp +++ b/src/core/profile_adapter.cpp @@ -53,6 +53,7 @@ #include "type_conversion.h" #include "visited_links_manager_qt.h" #include "web_engine_context.h" +#include "web_contents_adapter_client.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" @@ -92,6 +93,9 @@ ProfileAdapter::ProfileAdapter(const QString &storageName): ProfileAdapter::~ProfileAdapter() { + while (!m_webContentsAdapterClients.isEmpty()) { + m_webContentsAdapterClients.first()->releaseProfile(); + } WebEngineContext::current()->removeProfileAdapter(this); if (m_downloadManagerDelegate) { m_profile->GetDownloadManager(m_profile.data())->Shutdown(); @@ -547,6 +551,16 @@ bool ProfileAdapter::isSpellCheckEnabled() const #endif } +void ProfileAdapter::addWebContentsAdapterClient(WebContentsAdapterClient *client) +{ + m_webContentsAdapterClients.append(client); +} + +void ProfileAdapter::removeWebContentsAdapterClient(WebContentsAdapterClient *client) +{ + m_webContentsAdapterClients.removeAll(client); +} + void ProfileAdapter::resetVisitedLinksManager() { m_visitedLinksManager.reset(new VisitedLinksManagerQt(this)); diff --git a/src/core/profile_adapter.h b/src/core/profile_adapter.h index 9bc92b54a..7ed5c13f5 100644 --- a/src/core/profile_adapter.h +++ b/src/core/profile_adapter.h @@ -73,6 +73,7 @@ class DownloadManagerDelegateQt; class ProfileQt; class UserResourceControllerHost; class VisitedLinksManagerQt; +class WebContentsAdapterClient; class QWEBENGINECORE_PRIVATE_EXPORT ProfileAdapter : public QObject { @@ -127,6 +128,9 @@ public: void setSpellCheckEnabled(bool enabled); bool isSpellCheckEnabled() const; + void addWebContentsAdapterClient(WebContentsAdapterClient *client); + void removeWebContentsAdapterClient(WebContentsAdapterClient *client); + // KEEP IN SYNC with API or add mapping layer enum HttpCacheType { MemoryHttpCache = 0, @@ -211,6 +215,7 @@ private: VisitedLinksPolicy m_visitedLinksPolicy; QHash<QByteArray, QWebEngineUrlSchemeHandler *> m_customUrlSchemeHandlers; QList<ProfileAdapterClient*> m_clients; + QVector<WebContentsAdapterClient *> m_webContentsAdapterClients; int m_httpCacheMaxSize; Q_DISABLE_COPY(ProfileAdapter) diff --git a/src/core/profile_adapter_client.h b/src/core/profile_adapter_client.h index 06051fab6..19af12ca4 100644 --- a/src/core/profile_adapter_client.h +++ b/src/core/profile_adapter_client.h @@ -142,6 +142,8 @@ public: virtual void downloadRequested(DownloadItemInfo &info) = 0; virtual void downloadUpdated(const DownloadItemInfo &info) = 0; + virtual void addWebContentsAdapterClient(WebContentsAdapterClient *adapter) = 0; + virtual void removeWebContentsAdapterClient(WebContentsAdapterClient *adapter) = 0; static QString downloadInterruptReasonToString(DownloadInterruptReason reason); }; diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h index 55cbe13dd..28be33c23 100644 --- a/src/core/web_contents_adapter_client.h +++ b/src/core/web_contents_adapter_client.h @@ -478,6 +478,7 @@ public: virtual ProfileAdapter *profileAdapter() = 0; virtual WebContentsAdapter* webContentsAdapter() = 0; + virtual void releaseProfile() = 0; }; |