diff options
author | joi@chromium.org <joi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-22 17:24:44 +0000 |
---|---|---|
committer | joi@chromium.org <joi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-22 17:24:44 +0000 |
commit | 5b19952e27008d9cca170c1a517987795d145928 (patch) | |
tree | 34fea6a6f74a0388c68c4ba8cd8846f3ac879027 /chrome/browser/prefs/chrome_pref_service_factory.cc | |
parent | 96828ec57f67f91b3b1b2269963680501a6de4b9 (diff) | |
download | chromium_src-5b19952e27008d9cca170c1a517987795d145928.zip chromium_src-5b19952e27008d9cca170c1a517987795d145928.tar.gz chromium_src-5b19952e27008d9cca170c1a517987795d145928.tar.bz2 |
Split PrefService into PrefService, PrefServiceSimple and PrefServiceSyncable.
The first two (PrefServiceSimple is a subclass of PrefService) know
nothing about sync or any Chrome or content concepts.
The third (PrefServiceSyncable, a separate subclass of PrefService)
knows about sync and requires users to choose whether each individual
preference is syncable or not when it is registered.
BrowserProcess::local_state() is a PrefServiceSimple after this
change, and Profile::prefs() is a PrefServiceSyncable.
COLLABORATOR=kaiwang@chromium.org
TBR=ben@chromium.org
BUG=155525
Review URL: https://chromiumcodereview.appspot.com/11570009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@174531 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/prefs/chrome_pref_service_factory.cc')
-rw-r--r-- | chrome/browser/prefs/chrome_pref_service_factory.cc | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/chrome/browser/prefs/chrome_pref_service_factory.cc b/chrome/browser/prefs/chrome_pref_service_factory.cc new file mode 100644 index 0000000..a074a34 --- /dev/null +++ b/chrome/browser/prefs/chrome_pref_service_factory.cc @@ -0,0 +1,133 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/prefs/chrome_pref_service_factory.h" + +#include "base/bind.h" +#include "base/file_path.h" +#include "base/file_util.h" +#include "base/metrics/histogram.h" +#include "base/prefs/default_pref_store.h" +#include "base/prefs/json_pref_store.h" +#include "chrome/browser/policy/configuration_policy_pref_store.h" +#include "chrome/browser/prefs/command_line_pref_store.h" +#include "chrome/browser/prefs/pref_model_associator.h" +#include "chrome/browser/prefs/pref_notifier_impl.h" +#include "chrome/browser/prefs/pref_service.h" +#include "chrome/browser/prefs/pref_service_syncable_builder.h" +#include "chrome/browser/prefs/pref_value_store.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/profile_error_dialog.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/browser_thread.h" +#include "grit/chromium_strings.h" +#include "grit/generated_resources.h" + +using content::BrowserContext; +using content::BrowserThread; + +namespace { + +// Shows notifications which correspond to PersistentPrefStore's reading errors. +void HandleReadError(PersistentPrefStore::PrefReadError error) { + if (error != PersistentPrefStore::PREF_READ_ERROR_NONE) { + // Failing to load prefs on startup is a bad thing(TM). See bug 38352 for + // an example problem that this can cause. + // Do some diagnosis and try to avoid losing data. + int message_id = 0; + if (error <= PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE) { + message_id = IDS_PREFERENCES_CORRUPT_ERROR; + } else if (error != PersistentPrefStore::PREF_READ_ERROR_NO_FILE) { + message_id = IDS_PREFERENCES_UNREADABLE_ERROR; + } + + if (message_id) { + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, + base::Bind(&ShowProfileErrorDialog, message_id)); + } + UMA_HISTOGRAM_ENUMERATION("PrefService.ReadError", error, + PersistentPrefStore::PREF_READ_ERROR_MAX_ENUM); + } +} + +void PrepareBuilder( + PrefServiceSyncableBuilder* builder, + const FilePath& pref_filename, + base::SequencedTaskRunner* pref_io_task_runner, + policy::PolicyService* policy_service, + PrefStore* extension_prefs, + bool async) { +#if defined(OS_LINUX) + // We'd like to see what fraction of our users have the preferences + // stored on a network file system, as we've had no end of troubles + // with NFS/AFS. + // TODO(evanm): remove this once we've collected state. + file_util::FileSystemType fstype; + if (file_util::GetFileSystemType(pref_filename.DirName(), &fstype)) { + UMA_HISTOGRAM_ENUMERATION("PrefService.FileSystemType", + static_cast<int>(fstype), + file_util::FILE_SYSTEM_TYPE_COUNT); + } +#endif + +#if defined(ENABLE_CONFIGURATION_POLICY) + using policy::ConfigurationPolicyPrefStore; + builder->WithManagedPrefs( + ConfigurationPolicyPrefStore::CreateMandatoryPolicyPrefStore( + policy_service)); + builder->WithRecommendedPrefs( + ConfigurationPolicyPrefStore::CreateRecommendedPolicyPrefStore( + policy_service)); +#endif // ENABLE_CONFIGURATION_POLICY + + builder->WithAsync(async); + builder->WithExtensionPrefs(extension_prefs); + builder->WithCommandLinePrefs( + new CommandLinePrefStore(CommandLine::ForCurrentProcess())); + builder->WithReadErrorCallback(base::Bind(&HandleReadError)); + builder->WithUserPrefs(new JsonPrefStore(pref_filename, pref_io_task_runner)); +} + +} // namespace + +// TODO(joi): Find a better home for this. +PrefServiceBase* PrefServiceBase::FromBrowserContext(BrowserContext* context) { + return static_cast<Profile*>(context)->GetPrefs(); +} + +namespace chrome_prefs { + +PrefServiceSimple* CreateLocalState( + const FilePath& pref_filename, + base::SequencedTaskRunner* pref_io_task_runner, + policy::PolicyService* policy_service, + PrefStore* extension_prefs, + bool async) { + PrefServiceSyncableBuilder builder; + PrepareBuilder(&builder, + pref_filename, + pref_io_task_runner, + policy_service, + extension_prefs, + async); + return builder.CreateSimple(); +} + +PrefServiceSyncable* CreateProfilePrefs( + const FilePath& pref_filename, + base::SequencedTaskRunner* pref_io_task_runner, + policy::PolicyService* policy_service, + PrefStore* extension_prefs, + bool async) { + PrefServiceSyncableBuilder builder; + PrepareBuilder(&builder, + pref_filename, + pref_io_task_runner, + policy_service, + extension_prefs, + async); + return builder.CreateSyncable(); +} + +} // namespace chrome_prefs |