diff options
-rw-r--r-- | src/core/core_chromium.pri | 3 | ||||
-rw-r--r-- | src/core/pref_service_adapter.cpp | 198 | ||||
-rw-r--r-- | src/core/pref_service_adapter.h | 85 | ||||
-rw-r--r-- | src/core/profile_adapter.cpp | 11 | ||||
-rw-r--r-- | src/core/profile_qt.cpp | 89 | ||||
-rw-r--r-- | src/core/profile_qt.h | 17 |
6 files changed, 330 insertions, 73 deletions
diff --git a/src/core/core_chromium.pri b/src/core/core_chromium.pri index d8ef25d8c..69a7f48d8 100644 --- a/src/core/core_chromium.pri +++ b/src/core/core_chromium.pri @@ -109,6 +109,7 @@ SOURCES = \ profile_io_data_qt.cpp \ quota_permission_context_qt.cpp \ quota_request_controller_impl.cpp \ + pref_service_adapter.cpp \ register_protocol_handler_request_controller_impl.cpp \ render_view_context_menu_qt.cpp \ render_widget_host_view_qt.cpp \ @@ -205,6 +206,7 @@ HEADERS = \ ozone/surface_factory_qt.h \ permission_manager_qt.h \ platform_notification_service_qt.h \ + pref_service_adapter.h \ process_main.h \ profile_adapter.h \ profile_adapter_client.h \ @@ -247,7 +249,6 @@ HEADERS = \ web_engine_settings.h \ web_event_factory.h - qtConfig(webengine-system-x11): hasX11Dependencies() { HEADERS += ozone/gl_ozone_glx_qt.h \ ozone/gl_surface_glx_qt.h diff --git a/src/core/pref_service_adapter.cpp b/src/core/pref_service_adapter.cpp new file mode 100644 index 000000000..40062cce5 --- /dev/null +++ b/src/core/pref_service_adapter.cpp @@ -0,0 +1,198 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "pref_service_adapter.h" + +#include "command_line_pref_store_qt.h" +#include "profile_adapter.h" +#include "type_conversion.h" +#include "web_engine_context.h" + +#include "content/public/browser/browser_thread.h" +#include "components/prefs/pref_member.h" +#include "components/prefs/in_memory_pref_store.h" +#include "components/prefs/json_pref_store.h" +#include "components/prefs/pref_service.h" +#include "components/prefs/pref_service_factory.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/user_prefs/user_prefs.h" +#include "components/proxy_config/pref_proxy_config_tracker_impl.h" +#include "chrome/common/pref_names.h" +#include "extensions/buildflags/buildflags.h" +#include "content/public/browser/browser_context.h" + +#if QT_CONFIG(webengine_spellchecker) +#include "chrome/browser/spellchecker/spellcheck_service.h" +#include "components/spellcheck/browser/pref_names.h" +#endif + +#if BUILDFLAG(ENABLE_EXTENSIONS) +#include "components/guest_view/browser/guest_view_manager.h" +#include "extensions/browser/extension_protocols.h" +#include "extensions/browser/pref_names.h" +#include "extensions/browser/process_manager.h" +#include "extensions/common/constants.h" +#endif + +namespace { +static const char kPrefMediaDeviceIDSalt[] = "qtwebengine.media_device_salt_id"; +} + +namespace QtWebEngineCore { + +void PrefServiceAdapter::setup(const ProfileAdapter &profileAdapter) +{ + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + PrefServiceFactory factory; + factory.set_command_line_prefs(base::MakeRefCounted<CommandLinePrefStoreQt>( + WebEngineContext::commandLine())); + + QString userPrefStorePath = profileAdapter.dataPath(); + if (userPrefStorePath.isEmpty() || profileAdapter.isOffTheRecord()) { + factory.set_user_prefs(new InMemoryPrefStore); + } else { + userPrefStorePath += QDir::separator(); + userPrefStorePath += QStringLiteral("user_prefs.json"); + factory.set_user_prefs(base::MakeRefCounted<JsonPrefStore>(toFilePath(userPrefStorePath))); + } + + PrefRegistrySimple *registry = new PrefRegistrySimple(); + PrefProxyConfigTrackerImpl::RegisterPrefs(registry); + +#if QT_CONFIG(webengine_spellchecker) + // Initial spellcheck settings + registry->RegisterStringPref(prefs::kAcceptLanguages, std::string()); + registry->RegisterListPref(spellcheck::prefs::kSpellCheckDictionaries, std::make_unique<base::ListValue>()); + registry->RegisterListPref(spellcheck::prefs::kSpellCheckForcedDictionaries, std::make_unique<base::ListValue>()); + registry->RegisterStringPref(spellcheck::prefs::kSpellCheckDictionary, std::string()); + registry->RegisterBooleanPref(spellcheck::prefs::kSpellCheckEnable, false); + registry->RegisterBooleanPref(spellcheck::prefs::kSpellCheckUseSpellingService, false); +#endif // QT_CONFIG(webengine_spellchecker) + registry->RegisterBooleanPref(prefs::kShowInternalAccessibilityTree, false); + registry->RegisterIntegerPref(prefs::kNotificationNextPersistentId, 10000); + +#if BUILDFLAG(ENABLE_EXTENSIONS) + registry->RegisterDictionaryPref(extensions::pref_names::kExtensions); + registry->RegisterListPref(extensions::pref_names::kInstallAllowList); + registry->RegisterListPref(extensions::pref_names::kInstallDenyList); + registry->RegisterDictionaryPref(extensions::pref_names::kInstallForceList); + registry->RegisterDictionaryPref(extensions::pref_names::kInstallLoginScreenAppList); + registry->RegisterListPref(extensions::pref_names::kAllowedTypes); + registry->RegisterBooleanPref(extensions::pref_names::kStorageGarbageCollect, false); + registry->RegisterListPref(extensions::pref_names::kAllowedInstallSites); + registry->RegisterStringPref(extensions::pref_names::kLastChromeVersion, std::string()); + registry->RegisterListPref(extensions::pref_names::kNativeMessagingBlacklist); + registry->RegisterListPref(extensions::pref_names::kNativeMessagingWhitelist); + registry->RegisterBooleanPref(extensions::pref_names::kNativeMessagingUserLevelHosts, true); +#endif // BUILDFLAG(ENABLE_EXTENSIONS) + + // Media device salt id key + // Can't be a random value since every time we run the setup code the + // default value will be different. We'll need to initialize it later. + registry->RegisterStringPref(kPrefMediaDeviceIDSalt, std::string()); + + m_prefService = factory.Create(registry); + + // Initialize salt value if none was stored before + if (m_prefService->GetString(kPrefMediaDeviceIDSalt).empty()) { + m_prefService->SetString(kPrefMediaDeviceIDSalt, + content::BrowserContext::CreateRandomMediaDeviceIDSalt()); + } + +} + +void PrefServiceAdapter::commit() +{ + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + // Make sure modified preferences are written to disk + m_prefService->CommitPendingWrite(); +} + +PrefService* PrefServiceAdapter::prefService() +{ + return m_prefService.get(); +} + +const PrefService* PrefServiceAdapter::prefService() const +{ + return m_prefService.get(); +} + +std::string PrefServiceAdapter::mediaDeviceIdSalt() const +{ + return m_prefService->GetString(kPrefMediaDeviceIDSalt); +} + +#if QT_CONFIG(webengine_spellchecker) + +void PrefServiceAdapter::setSpellCheckLanguages(const QStringList &languages) +{ + StringListPrefMember dictionaries_pref; + dictionaries_pref.Init(spellcheck::prefs::kSpellCheckDictionaries, m_prefService.get()); + std::vector<std::string> dictionaries; + dictionaries.reserve(languages.size()); + for (const auto &language : languages) + dictionaries.push_back(language.toStdString()); + dictionaries_pref.SetValue(dictionaries); +} + +QStringList PrefServiceAdapter::spellCheckLanguages() const +{ + QStringList spellcheck_dictionaries; + for (const auto &value : *m_prefService->GetList(spellcheck::prefs::kSpellCheckDictionaries)) { + std::string dictionary; + if (value.GetAsString(&dictionary)) + spellcheck_dictionaries.append(QString::fromStdString(dictionary)); + } + + return spellcheck_dictionaries; +} + +void PrefServiceAdapter::setSpellCheckEnabled(bool enabled) +{ + m_prefService->SetBoolean(spellcheck::prefs::kSpellCheckEnable, enabled); +} + +bool PrefServiceAdapter::isSpellCheckEnabled() const +{ + return m_prefService->GetBoolean(spellcheck::prefs::kSpellCheckEnable); +} + +#endif // QT_CONFIG(webengine_spellchecker) +} diff --git a/src/core/pref_service_adapter.h b/src/core/pref_service_adapter.h new file mode 100644 index 000000000..83f6a322e --- /dev/null +++ b/src/core/pref_service_adapter.h @@ -0,0 +1,85 @@ + +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef PREF_SRVICE_ADAPTER_H +#define PREF_SERIVE_ADAPTER_H + +#include "components/prefs/pref_service.h" +#include "qtwebenginecoreglobal_p.h" + +QT_BEGIN_NAMESPACE +class QStringList; +QT_END_NAMESPACE + +class ProfileAdapter; + +namespace QtWebEngineCore { + +class ProfileAdapter; + +// PrefServiceAdapter manages the collection of tunable preferences. +// Any new preference should be defined and register in the registry +// before it can be used +class PrefServiceAdapter +{ +public: + + PrefServiceAdapter() = default; + + void setup(const ProfileAdapter &adapter); + void commit(); + PrefService *prefService(); + const PrefService *prefService() const; + std::string mediaDeviceIdSalt() const; + +#if QT_CONFIG(webengine_spellchecker) + void setSpellCheckLanguages(const QStringList &languages); + QStringList spellCheckLanguages() const; + void setSpellCheckEnabled(bool enabled); + bool isSpellCheckEnabled() const; +#endif // QT_CONFIG(webengine_spellchecker) + +private: + std::unique_ptr<PrefService> m_prefService; +}; + +} + +#endif // PREF_SERIVE_ADAPTER_H diff --git a/src/core/profile_adapter.cpp b/src/core/profile_adapter.cpp index ff0199833..8d32aad84 100644 --- a/src/core/profile_adapter.cpp +++ b/src/core/profile_adapter.cpp @@ -126,6 +126,7 @@ void ProfileAdapter::setStorageName(const QString &storageName) return; m_name = storageName; if (!m_offTheRecord) { + m_profile->setupPrefService(); if (m_profile->m_urlRequestContextGetter.get()) m_profile->m_profileIOData->updateStorageSettings(); if (m_visitedLinksManager) @@ -138,6 +139,7 @@ void ProfileAdapter::setOffTheRecord(bool offTheRecord) if (offTheRecord == m_offTheRecord) return; m_offTheRecord = offTheRecord; + m_profile->setupPrefService(); if (m_profile->m_urlRequestContextGetter.get()) m_profile->m_profileIOData->updateStorageSettings(); if (m_visitedLinksManager) @@ -263,6 +265,7 @@ void ProfileAdapter::setDataPath(const QString &path) return; m_dataPath = path; if (!m_offTheRecord) { + m_profile->setupPrefService(); if (m_profile->m_urlRequestContextGetter.get()) m_profile->m_profileIOData->updateStorageSettings(); if (m_visitedLinksManager) @@ -614,14 +617,14 @@ void ProfileAdapter::clearHttpCache() void ProfileAdapter::setSpellCheckLanguages(const QStringList &languages) { #if QT_CONFIG(webengine_spellchecker) - m_profile->setSpellCheckLanguages(languages); + m_profile->prefServiceAdapter().setSpellCheckLanguages(languages); #endif } QStringList ProfileAdapter::spellCheckLanguages() const { #if QT_CONFIG(webengine_spellchecker) - return m_profile->spellCheckLanguages(); + return m_profile->prefServiceAdapter().spellCheckLanguages(); #else return QStringList(); #endif @@ -630,14 +633,14 @@ QStringList ProfileAdapter::spellCheckLanguages() const void ProfileAdapter::setSpellCheckEnabled(bool enabled) { #if QT_CONFIG(webengine_spellchecker) - m_profile->setSpellCheckEnabled(enabled); + m_profile->prefServiceAdapter().setSpellCheckEnabled(enabled); #endif } bool ProfileAdapter::isSpellCheckEnabled() const { #if QT_CONFIG(webengine_spellchecker) - return m_profile->isSpellCheckEnabled(); + return m_profile->prefServiceAdapter().isSpellCheckEnabled(); #else return false; #endif diff --git a/src/core/profile_qt.cpp b/src/core/profile_qt.cpp index 5977a28a8..25b2169dd 100644 --- a/src/core/profile_qt.cpp +++ b/src/core/profile_qt.cpp @@ -61,6 +61,7 @@ #include "components/prefs/pref_member.h" #include "components/prefs/pref_service.h" #include "components/prefs/in_memory_pref_store.h" +#include "components/prefs/json_pref_store.h" #include "components/prefs/pref_service.h" #include "components/prefs/pref_service_factory.h" #include "components/prefs/pref_registry_simple.h" @@ -92,41 +93,7 @@ ProfileQt::ProfileQt(ProfileAdapter *profileAdapter) , m_extensionSystem(nullptr) #endif // BUILDFLAG(ENABLE_EXTENSIONS) { - PrefServiceFactory factory; - factory.set_user_prefs(new InMemoryPrefStore); - factory.set_command_line_prefs(base::MakeRefCounted<CommandLinePrefStoreQt>( - WebEngineContext::commandLine())); - PrefRegistrySimple *registry = new PrefRegistrySimple(); - PrefProxyConfigTrackerImpl::RegisterPrefs(registry); -#if QT_CONFIG(webengine_spellchecker) - // Initial spellcheck settings - registry->RegisterStringPref(prefs::kAcceptLanguages, std::string()); - registry->RegisterListPref(spellcheck::prefs::kSpellCheckDictionaries, std::make_unique<base::ListValue>()); - registry->RegisterListPref(spellcheck::prefs::kSpellCheckForcedDictionaries, std::make_unique<base::ListValue>()); - registry->RegisterStringPref(spellcheck::prefs::kSpellCheckDictionary, std::string()); - registry->RegisterBooleanPref(spellcheck::prefs::kSpellCheckEnable, false); - registry->RegisterBooleanPref(spellcheck::prefs::kSpellCheckUseSpellingService, false); -#endif // QT_CONFIG(webengine_spellchecker) - registry->RegisterBooleanPref(prefs::kShowInternalAccessibilityTree, false); - registry->RegisterIntegerPref(prefs::kNotificationNextPersistentId, 10000); - -#if BUILDFLAG(ENABLE_EXTENSIONS) - registry->RegisterDictionaryPref(extensions::pref_names::kExtensions); - registry->RegisterListPref(extensions::pref_names::kInstallAllowList); - registry->RegisterListPref(extensions::pref_names::kInstallDenyList); - registry->RegisterDictionaryPref(extensions::pref_names::kInstallForceList); - registry->RegisterDictionaryPref(extensions::pref_names::kInstallLoginScreenAppList); - registry->RegisterListPref(extensions::pref_names::kAllowedTypes); - registry->RegisterBooleanPref(extensions::pref_names::kStorageGarbageCollect, false); - registry->RegisterListPref(extensions::pref_names::kAllowedInstallSites); - registry->RegisterStringPref(extensions::pref_names::kLastChromeVersion, std::string()); - registry->RegisterListPref(extensions::pref_names::kNativeMessagingBlacklist); - registry->RegisterListPref(extensions::pref_names::kNativeMessagingWhitelist); - registry->RegisterBooleanPref(extensions::pref_names::kNativeMessagingUserLevelHosts, true); -#endif // BUILDFLAG(ENABLE_EXTENSIONS) - - m_prefService = factory.Create(registry); - user_prefs::UserPrefs::Set(this, m_prefService.get()); + setupPrefService(); // Mark the context as live. This prevents the use-after-free DCHECK in // AssertBrowserContextWasntDestroyed from being triggered when a new @@ -143,6 +110,7 @@ ProfileQt::ProfileQt(ProfileAdapter *profileAdapter) ProfileQt::~ProfileQt() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + m_prefServiceAdapter.commit(); content::BrowserContext::NotifyWillBeDestroyed(this); BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices(this); ShutdownStoragePartitions(); @@ -153,12 +121,12 @@ ProfileQt::~ProfileQt() PrefService* ProfileQt::GetPrefs() { - return m_prefService.get(); + return m_prefServiceAdapter.prefService(); } const PrefService* ProfileQt::GetPrefs() const { - return m_prefService.get(); + return m_prefServiceAdapter.prefService(); } base::FilePath ProfileQt::GetPath() const @@ -313,46 +281,41 @@ void ProfileQt::FailedToLoadDictionary(const std::string &language) LOG(WARNING) << "Could not load dictionary for:" << language; LOG(INFO) << "Make sure that correct bdic file is in:" << WebEngineLibraryInfo::getPath(base::DIR_APP_DICTIONARIES); } +#endif // QT_CONFIG(webengine_spellchecker) -void ProfileQt::setSpellCheckLanguages(const QStringList &languages) +#if BUILDFLAG(ENABLE_EXTENSIONS) +extensions::ExtensionSystemQt* ProfileQt::GetExtensionSystem() { - StringListPrefMember dictionaries_pref; - dictionaries_pref.Init(spellcheck::prefs::kSpellCheckDictionaries, m_prefService.get()); - std::vector<std::string> dictionaries; - dictionaries.reserve(languages.size()); - for (const auto &language : languages) - dictionaries.push_back(language.toStdString()); - dictionaries_pref.SetValue(dictionaries); + return m_extensionSystem; } +#endif // BUILDFLAG(ENABLE_EXTENSIONS) -QStringList ProfileQt::spellCheckLanguages() const +std::string ProfileQt::GetMediaDeviceIDSalt() { - QStringList spellcheck_dictionaries; - for (const auto &value : *m_prefService->GetList(spellcheck::prefs::kSpellCheckDictionaries)) { - std::string dictionary; - if (value.GetAsString(&dictionary)) - spellcheck_dictionaries.append(QString::fromStdString(dictionary)); - } - - return spellcheck_dictionaries; + return m_prefServiceAdapter.mediaDeviceIdSalt(); } -void ProfileQt::setSpellCheckEnabled(bool enabled) +void ProfileQt::setupPrefService() { - m_prefService->SetBoolean(spellcheck::prefs::kSpellCheckEnable, enabled); + // Remove previous handler before we set a new one or we will assert + // TODO: Remove in Qt6 + if (m_prefServiceAdapter.prefService() != nullptr) { + user_prefs::UserPrefs::Remove(this); + m_prefServiceAdapter.commit(); + } + m_prefServiceAdapter.setup(*m_profileAdapter); + user_prefs::UserPrefs::Set(this, m_prefServiceAdapter.prefService()); } -bool ProfileQt::isSpellCheckEnabled() const +PrefServiceAdapter &ProfileQt::prefServiceAdapter() { - return m_prefService->GetBoolean(spellcheck::prefs::kSpellCheckEnable); + return m_prefServiceAdapter; } -#endif // QT_CONFIG(webengine_spellchecker) -#if BUILDFLAG(ENABLE_EXTENSIONS) -extensions::ExtensionSystemQt* ProfileQt::GetExtensionSystem() +const PrefServiceAdapter &ProfileQt::prefServiceAdapter() const { - return m_extensionSystem; + return m_prefServiceAdapter; } -#endif // BUILDFLAG(ENABLE_EXTENSIONS) + } // namespace QtWebEngineCore diff --git a/src/core/profile_qt.h b/src/core/profile_qt.h index 704c5a6e4..76749fdfe 100644 --- a/src/core/profile_qt.h +++ b/src/core/profile_qt.h @@ -45,6 +45,7 @@ #include "content/public/browser/resource_context.h" #include "extensions/buildflags/buildflags.h" #include "net/url_request/url_request_context.h" +#include "pref_service_adapter.h" #include "profile_io_data_qt.h" #include <QtGlobal> @@ -107,6 +108,7 @@ public: std::vector<network::mojom::CorsOriginPatternPtr> block_patterns, base::OnceClosure closure) override; const content::SharedCorsOriginAccessList* GetSharedCorsOriginAccessList() const override; + std::string GetMediaDeviceIDSalt() override; // Profile implementation: PrefService *GetPrefs() override; @@ -118,15 +120,19 @@ public: #if QT_CONFIG(webengine_spellchecker) void FailedToLoadDictionary(const std::string &language) override; - void setSpellCheckLanguages(const QStringList &languages); - QStringList spellCheckLanguages() const; - void setSpellCheckEnabled(bool enabled); - bool isSpellCheckEnabled() const; #endif #if BUILDFLAG(ENABLE_EXTENSIONS) extensions::ExtensionSystemQt* GetExtensionSystem(); #endif // defined(ENABLE_EXTENSIONS) + // Build/Re-build the preference service. Call when updating the storage + // data path. + void setupPrefService(); + + PrefServiceAdapter &prefServiceAdapter(); + + const PrefServiceAdapter &prefServiceAdapter() const; + private: friend class ContentBrowserClientQt; friend class WebContentsAdapter; @@ -134,10 +140,11 @@ private: std::unique_ptr<BrowsingDataRemoverDelegateQt> m_removerDelegate; std::unique_ptr<PermissionManagerQt> m_permissionManager; std::unique_ptr<SSLHostStateDelegateQt> m_sslHostStateDelegate; - std::unique_ptr<PrefService> m_prefService; scoped_refptr<content::SharedCorsOriginAccessList> m_sharedCorsOriginAccessList; std::unique_ptr<ProfileIODataQt> m_profileIOData; ProfileAdapter *m_profileAdapter; + PrefServiceAdapter m_prefServiceAdapter; + friend class ProfileAdapter; #if BUILDFLAG(ENABLE_EXTENSIONS) extensions::ExtensionSystemQt *m_extensionSystem; |