summaryrefslogtreecommitdiffstats
path: root/src/core/pref_service_adapter.cpp
diff options
context:
space:
mode:
authorLeander Beernaert <leander.beernaert@qt.io>2019-05-24 14:59:43 +0200
committerLeander Beernaert <leander.beernaert@qt.io>2019-06-13 14:33:37 +0200
commit9680828ac40d6e10eac02f4981f3668669409acf (patch)
treeaabb21fc66835ac66d2857b328ea80a7ba8a463d /src/core/pref_service_adapter.cpp
parent93827875d4515a686978d98ff239332ce1adcb01 (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/pref_service_adapter.cpp')
-rw-r--r--src/core/pref_service_adapter.cpp198
1 files changed, 198 insertions, 0 deletions
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)
+}