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

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: Follow one variable per declaration rule. 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 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/common/password_manager_pref_names.h"
16 #include "components/sync_driver/sync_service.h"
17 #include "content/public/browser/notification_source.h"
18
19 namespace {
20
21 void ChangeOnePrefBecauseAnotherPrefHasChanged(
22 PrefService* prefs,
23 const std::string& other_pref_name,
24 const std::string& changed_pref_name) {
25 bool changed_pref = prefs->GetBoolean(changed_pref_name.c_str());
26 bool other_pref = prefs->GetBoolean(other_pref_name.c_str());
27 if (changed_pref != other_pref)
28 prefs->SetBoolean(other_pref_name, changed_pref);
29 // TODO(melandory): add histograms in order to track when we can stop
engedy 2015/09/01 23:10:58 Have you though of what metrics we could use to tr
melandory 2015/09/02 13:15:39 As per offline discussion: * Log initial values f
30 // migration.
31 }
32
33 // Change value of both kPasswordManagerSavingEnabled and
34 // kCredentialsEnableService to the |new_value| only if the current value of the
35 // pref differs.
36 void UpdatePreferencesValuesIfNeeded(PrefService* prefs, bool new_value) {
37 bool legacy_pref_value =
38 prefs->GetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled);
39 bool new_pref_value =
40 prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService);
41 if (legacy_pref_value != new_value) {
42 prefs->SetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled,
43 new_value);
44 }
45 if (new_pref_value != new_value) {
46 prefs->SetBoolean(password_manager::prefs::kCredentialsEnableService,
47 new_value);
48 }
49 }
50
51 void InitCurrentPrefState(PrefService* prefs,
52 bool* legacy_pref_value,
53 bool* new_pref_value,
54 std::vector<bool>* initial_values) {
55 *legacy_pref_value =
56 prefs->GetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled);
57 *new_pref_value =
58 prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService);
59 initial_values->clear();
60 initial_values->push_back(*new_pref_value);
61 initial_values->push_back(*legacy_pref_value);
62 }
63
64 } // namespace
65
66 PasswordManagerSettingMigraterService::PasswordManagerSettingMigraterService(
67 Profile* profile)
68 : profile_(profile), sync_service_(nullptr) {
69 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_ADDED,
engedy 2015/08/31 18:17:23 We should add a comment to summarize the discussio
melandory 2015/09/02 13:15:39 added to header
70 content::Source<Profile>(profile));
71 }
72
73 PasswordManagerSettingMigraterService::
74 ~PasswordManagerSettingMigraterService() {}
75
76 void PasswordManagerSettingMigraterService::Observe(
77 int type,
78 const content::NotificationSource& source,
79 const content::NotificationDetails& details) {
80 DCHECK_EQ(chrome::NOTIFICATION_PROFILE_ADDED, type);
81 if (ProfileSyncServiceFactory::HasProfileSyncService(profile_))
82 sync_service_ = ProfileSyncServiceFactory::GetForProfile(profile_);
83 InitObservers();
84 }
85
86 void PasswordManagerSettingMigraterService::InitObservers() {
87 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_);
88 bool legacy_pref_value;
89 bool new_pref_value;
90 InitCurrentPrefState(prefs, &legacy_pref_value, &new_pref_value,
91 &initial_values_);
engedy 2015/09/01 23:10:58 Could we just save to an |initial_new_pref_value_|
melandory 2015/09/02 13:15:39 Done.
92 pref_change_registrar_.Init(profile_->GetPrefs());
93 pref_change_registrar_.Add(
94 password_manager::prefs::kCredentialsEnableService,
95 base::Bind(&PasswordManagerSettingMigraterService::
96 OnCredentialsEnableServicePrefChanged,
97 base::Unretained(this)));
98 pref_change_registrar_.Add(
99 password_manager::prefs::kPasswordManagerSavingEnabled,
100 base::Bind(&PasswordManagerSettingMigraterService::
101 OnPasswordManagerSavingEnabledPrefChanged,
102 base::Unretained(this)));
103 if (!(sync_service_ && sync_service_->CanSyncStart())) {
104 PasswordManagerSettingMigraterService::MigrateOffState(prefs);
105 }
106 // This causes OnIsSyncingChanged to be called when the value of
107 // PrefService::IsSyncing() changes.
108 prefs->AddObserver(this);
109 }
110
111 void PasswordManagerSettingMigraterService::Shutdown() {
112 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_);
113 prefs->RemoveObserver(this);
114 }
115
116 void PasswordManagerSettingMigraterService::
117 OnCredentialsEnableServicePrefChanged(
118 const std::string& changed_pref_name) {
119 PrefService* prefs = profile_->GetPrefs();
120 sync_data_.push_back(
121 prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService));
122 ChangeOnePrefBecauseAnotherPrefHasChanged(
123 prefs, password_manager::prefs::kPasswordManagerSavingEnabled,
124 password_manager::prefs::kCredentialsEnableService);
125 }
126
127 void PasswordManagerSettingMigraterService::
128 OnPasswordManagerSavingEnabledPrefChanged(
129 const std::string& changed_pref_name) {
130 PrefService* prefs = profile_->GetPrefs();
131 sync_data_.push_back(prefs->GetBoolean(
132 password_manager::prefs::kPasswordManagerSavingEnabled));
133 ChangeOnePrefBecauseAnotherPrefHasChanged(
134 prefs, password_manager::prefs::kCredentialsEnableService,
135 password_manager::prefs::kPasswordManagerSavingEnabled);
136 }
137
138 void PasswordManagerSettingMigraterService::OnIsSyncingChanged() {
139 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_);
140 if (prefs->IsSyncing() && prefs->IsPrioritySyncing()) {
141 // Initial sync has finished.
142 MigrateAfterModelAssociation(prefs);
143 }
144
145 if (prefs->IsSyncing() == prefs->IsPrioritySyncing()) {
146 // Sync is not in model association step.
147 bool legacy_pref_value;
148 bool new_pref_value;
149 InitCurrentPrefState(prefs, &legacy_pref_value, &new_pref_value,
150 &initial_values_);
151 sync_data_.clear();
152 }
153 }
154
155 void PasswordManagerSettingMigraterService::MigrateOffState(
156 PrefService* prefs) {
157 bool new_pref_value =
158 prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService);
159 bool legacy_pref_value =
160 prefs->GetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled);
161 if (new_pref_value != legacy_pref_value) {
162 // Values are not equal, so we reconcile preferences to the off state.
163 UpdatePreferencesValuesIfNeeded(prefs, false);
164 }
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 DCHECK_EQ(2u, initial_values_.size());
177 bool inital_new_pref_value = initial_values_[1];
178 bool initial_legacy_pref_value = initial_values_[0];
179 bool sync_new_pref_value = sync_data_[0];
180 bool sync_legacy_pref_value = sync_data_[sync_data_.size() - 1];
181 if (sync_legacy_pref_value && sync_new_pref_value) {
182 UpdatePreferencesValuesIfNeeded(prefs, true);
183 } else if (!sync_legacy_pref_value && !sync_new_pref_value) {
184 UpdatePreferencesValuesIfNeeded(prefs, false);
185 } else if (!initial_legacy_pref_value && !inital_new_pref_value) {
186 UpdatePreferencesValuesIfNeeded(prefs, true);
187 } else {
188 UpdatePreferencesValuesIfNeeded(prefs, false);
189 }
190 }
191 }
192
193 // static
194 PasswordManagerSettingMigraterService::Factory*
195 PasswordManagerSettingMigraterService::Factory::GetInstance() {
196 return Singleton<PasswordManagerSettingMigraterService::Factory>::get();
197 }
198
199 // static
200 PasswordManagerSettingMigraterService*
201 PasswordManagerSettingMigraterService::Factory::GetForProfile(
202 Profile* profile) {
203 return static_cast<PasswordManagerSettingMigraterService*>(
204 GetInstance()->GetServiceForBrowserContext(profile, true));
205 }
206
207 PasswordManagerSettingMigraterService::Factory::Factory()
208 : BrowserContextKeyedServiceFactory(
209 "PasswordManagerSettingMigraterService",
210 BrowserContextDependencyManager::GetInstance()) {
211 DependsOn(ProfileSyncServiceFactory::GetInstance());
engedy 2015/08/31 18:17:23 We should add a comment to summarize the discussio
melandory 2015/09/02 13:15:39 added to header.
212 }
213
214 PasswordManagerSettingMigraterService::Factory::~Factory() {}
215
216 KeyedService*
217 PasswordManagerSettingMigraterService::Factory::BuildServiceInstanceFor(
218 content::BrowserContext* context) const {
219 return new PasswordManagerSettingMigraterService(
220 static_cast<Profile*>(context));
engedy 2015/08/31 18:17:23 nit: Profile::FromBrowserContext
melandory 2015/09/02 13:15:39 Done.
221 }
222
223 bool PasswordManagerSettingMigraterService::Factory::
224 ServiceIsCreatedWithBrowserContext() const {
225 return true;
226 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698