chrome_pref_service_factory.cc revision 58537e28ecd584eab876aee8be7156509866d23a
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/chrome_pref_service_factory.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/debug/trace_event.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/file_util.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/default_pref_store.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/json_pref_store.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_notifier_impl.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_value_store.h" 18c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "chrome/browser/browser_process.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/command_line_pref_store.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/pref_model_associator.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable_builder.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/profile_error_dialog.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_context.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/chromium_strings.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/generated_resources.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY) 30c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "chrome/browser/policy/browser_policy_connector.h" 31c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "chrome/browser/policy/configuration_policy_pref_store.h" 32c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "chrome/browser/policy/policy_types.h" 33c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif 34c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS) 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/managed_mode/supervised_user_pref_store.h" 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserContext; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserThread; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Shows notifications which correspond to PersistentPrefStore's reading errors. 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HandleReadError(PersistentPrefStore::PrefReadError error) { 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Sample the histogram also for the successful case in order to get a 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // baseline on the success rate in addition to the error distribution. 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("PrefService.ReadError", error, 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PersistentPrefStore::PREF_READ_ERROR_MAX_ENUM); 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (error != PersistentPrefStore::PREF_READ_ERROR_NONE) { 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if !defined(OS_CHROMEOS) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Failing to load prefs on startup is a bad thing(TM). See bug 38352 for 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // an example problem that this can cause. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Do some diagnosis and try to avoid losing data. 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int message_id = 0; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (error <= PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE) { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_id = IDS_PREFERENCES_CORRUPT_ERROR; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (error != PersistentPrefStore::PREF_READ_ERROR_NO_FILE) { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_id = IDS_PREFERENCES_UNREADABLE_ERROR; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (message_id) { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&ShowProfileErrorDialog, message_id)); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // On ChromeOS error screen with message about broken local state 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // will be displayed. 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrepareBuilder( 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefServiceSyncableBuilder* builder, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& pref_filename, 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedTaskRunner* pref_io_task_runner, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy::PolicyService* policy_service, 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ManagedUserSettingsService* managed_user_settings, 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<PrefStore>& extension_prefs, 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool async) { 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We'd like to see what fraction of our users have the preferences 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // stored on a network file system, as we've had no end of troubles 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // with NFS/AFS. 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(evanm): remove this once we've collected state. 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_util::FileSystemType fstype; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (file_util::GetFileSystemType(pref_filename.DirName(), &fstype)) { 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("PrefService.FileSystemType", 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<int>(fstype), 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_util::FILE_SYSTEM_TYPE_COUNT); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) using policy::ConfigurationPolicyPrefStore; 97c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch builder->WithManagedPrefs(new ConfigurationPolicyPrefStore( 98c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch policy_service, 99c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch g_browser_process->browser_policy_connector()->GetHandlerList(), 100c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch policy::POLICY_LEVEL_MANDATORY)); 101c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch builder->WithRecommendedPrefs(new ConfigurationPolicyPrefStore( 102c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch policy_service, 103c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch g_browser_process->browser_policy_connector()->GetHandlerList(), 104c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch policy::POLICY_LEVEL_RECOMMENDED)); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // ENABLE_CONFIGURATION_POLICY 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS) 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (managed_user_settings) { 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) builder->WithSupervisedUserPrefs( 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new SupervisedUserPrefStore(managed_user_settings)); 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) builder->WithAsync(async); 115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) builder->WithExtensionPrefs(extension_prefs.get()); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) builder->WithCommandLinePrefs( 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new CommandLinePrefStore(CommandLine::ForCurrentProcess())); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) builder->WithReadErrorCallback(base::Bind(&HandleReadError)); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) builder->WithUserPrefs(new JsonPrefStore(pref_filename, pref_io_task_runner)); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chrome_prefs { 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrefService* CreateLocalState( 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& pref_filename, 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedTaskRunner* pref_io_task_runner, 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy::PolicyService* policy_service, 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<PrefRegistry>& pref_registry, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool async) { 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefServiceSyncableBuilder builder; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrepareBuilder(&builder, 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_filename, 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_io_task_runner, 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy_service, 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NULL, 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NULL, 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) async); 140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return builder.Create(pref_registry.get()); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrefServiceSyncable* CreateProfilePrefs( 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& pref_filename, 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedTaskRunner* pref_io_task_runner, 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy::PolicyService* policy_service, 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ManagedUserSettingsService* managed_user_settings, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<PrefStore>& extension_prefs, 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const scoped_refptr<user_prefs::PrefRegistrySyncable>& pref_registry, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool async) { 151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TRACE_EVENT0("browser", "chrome_prefs::CreateProfilePrefs"); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefServiceSyncableBuilder builder; 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrepareBuilder(&builder, 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_filename, 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_io_task_runner, 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy_service, 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) managed_user_settings, 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_prefs, 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) async); 160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return builder.CreateSyncable(pref_registry.get()); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chrome_prefs 164