diff options
author | Leander Beernaert <leander.beernaert@qt.io> | 2019-05-24 14:59:43 +0200 |
---|---|---|
committer | Leander Beernaert <leander.beernaert@qt.io> | 2019-06-13 14:33:37 +0200 |
commit | 9680828ac40d6e10eac02f4981f3668669409acf (patch) | |
tree | aabb21fc66835ac66d2857b328ea80a7ba8a463d /src/core | |
parent | 93827875d4515a686978d98ff239332ce1adcb01 (diff) |
Persistent storage of preferences between app runs
We can now persist the user preferences to disk at application exit so
they are correctly remembered for the next run. The preferences are
stored in dataPath()/user_prefs.json. This is managed via the
PrefServiceAdapter class.
It's not possible to test this in a correct pattern as we require the
app to exit properly to be able to guarantee that the preferences are
written to disk. The code added in ~PrefServiceAdapter() does not
provide any guarantees in the next profile construction that the
previous preferences have been written to disk.
Fixes: QTBUG-75740
Change-Id: I96bb3037707d90b05b3dfab4f083702351923aee
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/core')
-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; |