Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Side by Side Diff: chrome/browser/password_manager/password_manager_setting_migrater_service.cc

Issue 1256803002: [Smart Lock, Prefs reconciliation] Prefs migration logic for desktop platforms. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 (c) The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/password_manager/password_manager_setting_migrater_serv ice.h"
6
7 #include "base/bind.h"
8 #include "base/bind_helpers.h"
9 #include "chrome/browser/chrome_notification_types.h"
10 #include "chrome/browser/prefs/pref_service_syncable.h"
11 #include "chrome/browser/profiles/profile.h"
12 #include "chrome/browser/sync/profile_sync_service.h"
13 #include "chrome/browser/sync/profile_sync_service_factory.h"
14 #include "components/keyed_service/content/browser_context_dependency_manager.h"
15 #include "components/password_manager/core/browser/password_manager_settings_mig ration_experiment.h"
16 #include "components/password_manager/core/common/password_manager_pref_names.h"
17 #include "components/sync_driver/sync_service.h"
18 #include "content/public/browser/notification_source.h"
19
20 namespace {
21
22 void ChangeOnePrefBecauseAnotherPrefHasChanged(
23 PrefService* prefs,
24 const std::string& other_pref_name,
25 const std::string& changed_pref_name) {
26 bool changed_pref = prefs->GetBoolean(changed_pref_name.c_str());
27 bool other_pref = prefs->GetBoolean(other_pref_name.c_str());
28 if (changed_pref != other_pref)
29 prefs->SetBoolean(other_pref_name, changed_pref);
30 // TODO(melandory): add histograms in order to track when we can stop
31 // migration.
32 }
33
34 // Change value of both kPasswordManagerSavingEnabled and
35 // kCredentialsEnableService to the |new_value| only if the current value of the
36 // pref differs.
37 void UpdatePreferencesValuesIfNeeded(PrefService* prefs, bool new_value) {
38 bool legacy_pref_value =
39 prefs->GetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled);
40 bool new_pref_value =
41 prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService);
42 if (legacy_pref_value != new_value) {
43 prefs->SetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled,
44 new_value);
45 }
46 if (new_pref_value != new_value) {
47 prefs->SetBoolean(password_manager::prefs::kCredentialsEnableService,
48 new_value);
49 }
50 }
51
52 void InitCurrentPrefState(PrefService* prefs,
53 bool* legacy_pref_value,
54 bool* new_pref_value) {
55 *legacy_pref_value =
56 prefs->GetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled);
57 *new_pref_value =
58 prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService);
59 }
60
61 } // namespace
62
63 PasswordManagerSettingMigraterService::PasswordManagerSettingMigraterService(
64 Profile* profile)
65 : profile_(profile), sync_service_(nullptr) {
66 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_ADDED,
67 content::Source<Profile>(profile));
68 }
69
70 PasswordManagerSettingMigraterService::
71 ~PasswordManagerSettingMigraterService() {}
72
73 void PasswordManagerSettingMigraterService::Observe(
74 int type,
75 const content::NotificationSource& source,
76 const content::NotificationDetails& details) {
77 DCHECK_EQ(chrome::NOTIFICATION_PROFILE_ADDED, type);
78 if (!IsSettingsMigrationActive()) {
79 // TODO(melandory) Add histogram which will log initial values for the both
80 // settings.
81 LOG(ERROR) << "Sorry, you are not in experiment";
82 return;
83 }
84 if (ProfileSyncServiceFactory::HasProfileSyncService(profile_))
85 sync_service_ = ProfileSyncServiceFactory::GetForProfile(profile_);
86 InitObservers();
87 }
88
89 void PasswordManagerSettingMigraterService::InitObservers() {
90 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_);
91 InitCurrentPrefState(prefs, &initial_legacy_pref_value_,
92 &initial_new_pref_value_);
93 pref_change_registrar_.Init(profile_->GetPrefs());
94 pref_change_registrar_.Add(
95 password_manager::prefs::kCredentialsEnableService,
96 base::Bind(&PasswordManagerSettingMigraterService::
97 OnCredentialsEnableServicePrefChanged,
98 base::Unretained(this)));
99 pref_change_registrar_.Add(
100 password_manager::prefs::kPasswordManagerSavingEnabled,
101 base::Bind(&PasswordManagerSettingMigraterService::
102 OnPasswordManagerSavingEnabledPrefChanged,
103 base::Unretained(this)));
104 if (!CanSyncStart()) {
105 PasswordManagerSettingMigraterService::MigrateOffState(prefs);
106 }
107 // This causes OnIsSyncingChanged to be called when the value of
108 // PrefService::IsSyncing() changes.
109 prefs->AddObserver(this);
110 }
111
112 bool PasswordManagerSettingMigraterService::CanSyncStart() {
113 return sync_service_ && sync_service_->CanSyncStart();
114 }
115
116 void PasswordManagerSettingMigraterService::Shutdown() {
117 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_);
118 prefs->RemoveObserver(this);
119 }
120
121 void PasswordManagerSettingMigraterService::
122 OnCredentialsEnableServicePrefChanged(
123 const std::string& changed_pref_name) {
124 PrefService* prefs = profile_->GetPrefs();
125 sync_data_.push_back(
126 prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService));
127 ChangeOnePrefBecauseAnotherPrefHasChanged(
128 prefs, password_manager::prefs::kPasswordManagerSavingEnabled,
129 password_manager::prefs::kCredentialsEnableService);
130 }
131
132 void PasswordManagerSettingMigraterService::
133 OnPasswordManagerSavingEnabledPrefChanged(
134 const std::string& changed_pref_name) {
135 PrefService* prefs = profile_->GetPrefs();
136 sync_data_.push_back(prefs->GetBoolean(
137 password_manager::prefs::kPasswordManagerSavingEnabled));
138 ChangeOnePrefBecauseAnotherPrefHasChanged(
139 prefs, password_manager::prefs::kCredentialsEnableService,
140 password_manager::prefs::kPasswordManagerSavingEnabled);
141 }
142
143 void PasswordManagerSettingMigraterService::OnIsSyncingChanged() {
144 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_);
145 if (prefs->IsSyncing() && prefs->IsPrioritySyncing()) {
146 // Initial sync has finished.
147 MigrateAfterModelAssociation(prefs);
148 }
149
150 if (prefs->IsSyncing() == prefs->IsPrioritySyncing()) {
151 // Sync is not in model association step.
152 InitCurrentPrefState(prefs, &initial_legacy_pref_value_,
153 &initial_new_pref_value_);
154 sync_data_.clear();
155 }
156 }
157
158 void PasswordManagerSettingMigraterService::MigrateOffState(
159 PrefService* prefs) {
160 bool new_pref_value =
161 prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService);
162 bool legacy_pref_value =
163 prefs->GetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled);
164 UpdatePreferencesValuesIfNeeded(prefs, new_pref_value && legacy_pref_value);
165 }
166
167 void PasswordManagerSettingMigraterService::MigrateAfterModelAssociation(
168 PrefService* prefs) {
169 if (sync_data_.empty()) {
170 MigrateOffState(prefs);
171 } else if (sync_data_.size() == 1) {
172 // Only one value has came from sync. This value should be assigned to both
173 // preferences.
174 UpdatePreferencesValuesIfNeeded(prefs, sync_data_[0]);
175 } else {
176 bool sync_new_pref_value = sync_data_[0];
177 bool sync_legacy_pref_value = sync_data_[sync_data_.size() - 1];
178 if (sync_legacy_pref_value && sync_new_pref_value) {
179 UpdatePreferencesValuesIfNeeded(prefs, true);
180 } else if (!sync_legacy_pref_value && !sync_new_pref_value) {
181 UpdatePreferencesValuesIfNeeded(prefs, false);
182 } else if (!initial_legacy_pref_value_ && !initial_new_pref_value_) {
183 UpdatePreferencesValuesIfNeeded(prefs, true);
184 } else {
185 UpdatePreferencesValuesIfNeeded(prefs, false);
186 }
187 }
188 }
189
190 // static
191 PasswordManagerSettingMigraterService::Factory*
192 PasswordManagerSettingMigraterService::Factory::GetInstance() {
193 return base::Singleton<PasswordManagerSettingMigraterService::Factory>::get();
194 }
195
196 // static
197 PasswordManagerSettingMigraterService*
198 PasswordManagerSettingMigraterService::Factory::GetForProfile(
199 Profile* profile) {
200 return static_cast<PasswordManagerSettingMigraterService*>(
201 GetInstance()->GetServiceForBrowserContext(profile, true));
202 }
203
204 PasswordManagerSettingMigraterService::Factory::Factory()
205 : BrowserContextKeyedServiceFactory(
206 "PasswordManagerSettingMigraterService",
207 BrowserContextDependencyManager::GetInstance()) {
208 DependsOn(ProfileSyncServiceFactory::GetInstance());
209 }
210
211 PasswordManagerSettingMigraterService::Factory::~Factory() {}
212
213 KeyedService*
214 PasswordManagerSettingMigraterService::Factory::BuildServiceInstanceFor(
215 content::BrowserContext* context) const {
216 return new PasswordManagerSettingMigraterService(
217 Profile::FromBrowserContext(context));
218 }
219
220 bool PasswordManagerSettingMigraterService::Factory::
221 ServiceIsCreatedWithBrowserContext() const {
222 return true;
223 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698