Introduce PrefServiceBuilder, use for ChromePrefServiceBuilder.
This change extracts a non-test PrefServiceBuilder from
PrefServiceMockBuilder, and extracts the Chrome-specific logic
previously in pref_service.cc that was used to put together a
PrefService for Chrome into a ChromePrefServiceBuilder subclass
thereof.
[email protected]
BUG=155525
Review URL: https://chromiumcodereview.appspot.com/11570007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@173988 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/prefs/pref_service.cc b/chrome/browser/prefs/pref_service.cc
index efe9a93..87330dd11 100644
--- a/chrome/browser/prefs/pref_service.cc
+++ b/chrome/browser/prefs/pref_service.cc
@@ -9,12 +9,10 @@
#include "base/bind.h"
#include "base/command_line.h"
#include "base/file_path.h"
-#include "base/file_util.h"
#include "base/logging.h"
#include "base/message_loop.h"
#include "base/metrics/histogram.h"
#include "base/prefs/default_pref_store.h"
-#include "base/prefs/json_pref_store.h"
#include "base/prefs/overlay_user_pref_store.h"
#include "base/stl_util.h"
#include "base/string_number_conversions.h"
@@ -22,24 +20,15 @@
#include "base/value_conversions.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/extensions/extension_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_observer.h"
#include "chrome/browser/prefs/pref_value_store.h"
-#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/prefs/prefs_tab_helper.h"
-#include "chrome/browser/ui/profile_error_dialog.h"
-#include "chrome/common/pref_names.h"
-#include "content/public/browser/browser_thread.h"
-#include "grit/chromium_strings.h"
-#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
using content::BrowserContext;
-using content::BrowserThread;
namespace {
@@ -83,103 +72,25 @@
return Value::CreateNullValue();
}
-// Forwards a notification after a PostMessage so that we can wait for the
-// MessageLoop to run.
-void NotifyReadError(int message_id) {
- ShowProfileErrorDialog(message_id);
-}
-
-// Shows notifications which correspond to PersistentPrefStore's reading errors.
+// TODO(joi): Change the interface on PersistentPrefStore to just take
+// a callback of this type. Then we can also typedef the callback in
+// PersistentPrefStore and use that as the type of the callback used
+// to initialize PrefService.
class ReadErrorHandler : public PersistentPrefStore::ReadErrorDelegate {
public:
- virtual void OnError(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;
- }
+ ReadErrorHandler(base::Callback<void(PersistentPrefStore::PrefReadError)> cb)
+ : callback_(cb) {}
- if (message_id) {
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
- base::Bind(&NotifyReadError, message_id));
- }
- UMA_HISTOGRAM_ENUMERATION("PrefService.ReadError", error,
- PersistentPrefStore::PREF_READ_ERROR_MAX_ENUM);
- }
+ virtual void OnError(PersistentPrefStore::PrefReadError error) {
+ callback_.Run(error);
}
+
+ private:
+ base::Callback<void(PersistentPrefStore::PrefReadError)> callback_;
};
} // namespace
-PrefServiceBase* PrefServiceBase::FromBrowserContext(BrowserContext* context) {
- return static_cast<Profile*>(context)->GetPrefs();
-}
-
-// static
-PrefService* PrefService::CreatePrefService(
- const FilePath& pref_filename,
- base::SequencedTaskRunner* pref_io_task_runner,
- policy::PolicyService* policy_service,
- PrefStore* extension_prefs,
- bool async) {
- using policy::ConfigurationPolicyPrefStore;
-
-#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)
- ConfigurationPolicyPrefStore* managed =
- ConfigurationPolicyPrefStore::CreateMandatoryPolicyPrefStore(
- policy_service);
- ConfigurationPolicyPrefStore* recommended =
- ConfigurationPolicyPrefStore::CreateRecommendedPolicyPrefStore(
- policy_service);
-#else
- ConfigurationPolicyPrefStore* managed = NULL;
- ConfigurationPolicyPrefStore* recommended = NULL;
-#endif // ENABLE_CONFIGURATION_POLICY
-
- CommandLinePrefStore* command_line =
- new CommandLinePrefStore(CommandLine::ForCurrentProcess());
- JsonPrefStore* user = new JsonPrefStore(
- pref_filename, pref_io_task_runner);
- DefaultPrefStore* default_pref_store = new DefaultPrefStore();
-
- PrefNotifierImpl* pref_notifier = new PrefNotifierImpl();
- PrefModelAssociator* pref_sync_associator = new PrefModelAssociator();
-
- return new PrefService(
- pref_notifier,
- new PrefValueStore(
- managed,
- extension_prefs,
- command_line,
- user,
- recommended,
- default_pref_store,
- pref_sync_associator,
- pref_notifier),
- user,
- default_pref_store,
- pref_sync_associator,
- async);
-}
-
PrefService* PrefService::CreateIncognitoPrefService(
PrefStore* incognito_extension_prefs) {
pref_service_forked_ = true;
@@ -201,20 +112,25 @@
incognito_pref_store,
default_store_.get(),
NULL,
+ read_error_callback_,
false);
}
-PrefService::PrefService(PrefNotifierImpl* pref_notifier,
- PrefValueStore* pref_value_store,
- PersistentPrefStore* user_prefs,
- DefaultPrefStore* default_store,
- PrefModelAssociator* pref_sync_associator,
- bool async)
+PrefService::PrefService(
+ PrefNotifierImpl* pref_notifier,
+ PrefValueStore* pref_value_store,
+ PersistentPrefStore* user_prefs,
+ DefaultPrefStore* default_store,
+ PrefModelAssociator* pref_sync_associator,
+ base::Callback<void(PersistentPrefStore::PrefReadError)>
+ read_error_callback,
+ bool async)
: pref_notifier_(pref_notifier),
pref_value_store_(pref_value_store),
user_pref_store_(user_prefs),
default_store_(default_store),
pref_sync_associator_(pref_sync_associator),
+ read_error_callback_(read_error_callback),
pref_service_forked_(false) {
pref_notifier_->SetPrefService(this);
if (pref_sync_associator_.get())
@@ -235,15 +151,14 @@
void PrefService::InitFromStorage(bool async) {
if (!async) {
- ReadErrorHandler error_handler;
- error_handler.OnError(user_pref_store_->ReadPrefs());
+ read_error_callback_.Run(user_pref_store_->ReadPrefs());
} else {
// Guarantee that initialization happens after this function returned.
MessageLoop::current()->PostTask(
FROM_HERE,
base::Bind(&PersistentPrefStore::ReadPrefsAsync,
user_pref_store_.get(),
- new ReadErrorHandler()));
+ new ReadErrorHandler(read_error_callback_)));
}
}
@@ -293,7 +208,6 @@
} // namespace
-
// Local State prefs.
void PrefService::RegisterBooleanPref(const char* path,
bool default_value) {