blob: ef2cc258c36c0fc760b009782d094150565df0c0 [file] [log] [blame]
// Copyright (c) 2017 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 "services/preferences/public/cpp/in_process_service_factory.h"
#include "base/bind.h"
#include "components/prefs/persistent_pref_store.h"
#include "components/prefs/pref_registry.h"
#include "services/preferences/public/cpp/pref_service_main.h"
namespace prefs {
// Registers all provided |PrefStore|s with the pref service. The pref stores
// remaining registered for the life time of |this|.
class InProcessPrefServiceFactory::RegisteringDelegate
: public PrefValueStore::Delegate {
public:
RegisteringDelegate(base::WeakPtr<InProcessPrefServiceFactory> factory)
: factory_(std::move(factory)) {}
// PrefValueStore::Delegate:
void Init(PrefStore* managed_prefs,
PrefStore* supervised_user_prefs,
PrefStore* extension_prefs,
PrefStore* command_line_prefs,
PrefStore* user_prefs,
PrefStore* recommended_prefs,
PrefStore* default_prefs,
PrefNotifier* /*pref_notifier*/) override {
if (!factory_)
return;
factory_->managed_prefs_ = base::WrapRefCounted(managed_prefs);
factory_->supervised_user_prefs_ =
base::WrapRefCounted(supervised_user_prefs);
factory_->extension_prefs_ = base::WrapRefCounted(extension_prefs);
factory_->command_line_prefs_ = base::WrapRefCounted(command_line_prefs);
if (!factory_->user_prefs_) {
factory_->user_prefs_ =
base::WrapRefCounted(static_cast<PersistentPrefStore*>(user_prefs));
}
factory_->recommended_prefs_ = base::WrapRefCounted(recommended_prefs);
}
void InitIncognitoUserPrefs(
scoped_refptr<PersistentPrefStore> incognito_user_prefs_overlay,
scoped_refptr<PersistentPrefStore> incognito_user_prefs_underlay,
const std::vector<const char*>& persistent_perf_names) override {
factory_->user_prefs_ = std::move(incognito_user_prefs_overlay);
factory_->incognito_user_prefs_underlay_ =
std::move(incognito_user_prefs_underlay);
factory_->persistent_perf_names_ = persistent_perf_names;
}
void InitPrefRegistry(PrefRegistry* pref_registry) override {
factory_->pref_registry_ = base::WrapRefCounted(pref_registry);
}
void UpdateCommandLinePrefStore(PrefStore* command_line_prefs) override {
// TODO(tibell): Once we have a way to deregister stores, do so here. At the
// moment only local state uses this and local state doesn't use the pref
// service yet.
}
private:
base::WeakPtr<InProcessPrefServiceFactory> factory_;
DISALLOW_COPY_AND_ASSIGN(RegisteringDelegate);
};
InProcessPrefServiceFactory::InProcessPrefServiceFactory() = default;
InProcessPrefServiceFactory::~InProcessPrefServiceFactory() {
if (quit_closure_)
std::move(quit_closure_).Run();
}
std::unique_ptr<PrefValueStore::Delegate>
InProcessPrefServiceFactory::CreateDelegate() {
return std::make_unique<RegisteringDelegate>(weak_factory_.GetWeakPtr());
}
std::unique_ptr<service_manager::Service>
InProcessPrefServiceFactory::CreatePrefService(
service_manager::mojom::ServiceRequest request) {
auto result = prefs::CreatePrefService(
std::move(request), managed_prefs_.get(), supervised_user_prefs_.get(),
extension_prefs_.get(), command_line_prefs_.get(), user_prefs_.get(),
incognito_user_prefs_underlay_.get(), recommended_prefs_.get(),
pref_registry_.get(), std::move(persistent_perf_names_));
quit_closure_ = std::move(result.second);
return std::move(result.first);
}
} // namespace prefs