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