/**************************************************************************** ** ** 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( 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(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); registry->RegisterListPref(spellcheck::prefs::kSpellCheckForcedDictionaries); registry->RegisterListPref(spellcheck::prefs::kSpellCheckBlacklistedDictionaries); 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->RegisterBooleanPref(prefs::kAccessibilityImageLabelsEnabled, 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::kLoginScreenExtensions); 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); registry->RegisterBooleanPref(extensions::pref_names::kInsecureExtensionUpdatesEnabled, false); #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()); } #if QT_CONFIG(webengine_spellchecker) // Ignore stored values for these options to preserve backwards compatibility. m_prefService->ClearPref(spellcheck::prefs::kSpellCheckEnable); m_prefService->ClearPref(spellcheck::prefs::kSpellCheckDictionaries); #endif // QT_CONFIG(webengine_spellchecker) } 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 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) }