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

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 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
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) {
vabr (Chromium) 2015/08/28 16:58:19 nit: We have a clash in the meaning of "new" in ne
melandory 2015/08/31 08:54:38 I prefer to have new_pref_value instead of current
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 } // namespace
52
53 PasswordManagerSettingMigraterService::PasswordManagerSettingMigraterService(
54 Profile* profile)
55 : profile_(profile), sync_service_(nullptr) {
56 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_ADDED,
57 content::Source<Profile>(profile));
58 }
59
60 PasswordManagerSettingMigraterService::
61 ~PasswordManagerSettingMigraterService() {}
62
63 void PasswordManagerSettingMigraterService::Observe(
64 int type,
65 const content::NotificationSource& source,
66 const content::NotificationDetails& details) {
67 DCHECK_EQ(chrome::NOTIFICATION_PROFILE_ADDED, type);
68 if (ProfileSyncServiceFactory::HasProfileSyncService(profile_))
69 sync_service_ = ProfileSyncServiceFactory::GetForProfile(profile_);
70 InitObservers();
71 }
72
73 void PasswordManagerSettingMigraterService::InitObservers() {
74 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_);
75 bool legacy_pref_value =
76 prefs->GetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled);
77 bool new_pref_value =
78 prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService);
79 initial_values_.push_back(new_pref_value);
80 initial_values_.push_back(legacy_pref_value);
81 pref_change_registrar_.Init(profile_->GetPrefs());
82 pref_change_registrar_.Add(
83 password_manager::prefs::kCredentialsEnableService,
84 base::Bind(&PasswordManagerSettingMigraterService::
85 OnCredentialsEnableServicePrefChanged,
86 base::Unretained(this)));
87 pref_change_registrar_.Add(
88 password_manager::prefs::kPasswordManagerSavingEnabled,
89 base::Bind(&PasswordManagerSettingMigraterService::
90 OnPasswordManagerSavingEnabledPrefChanged,
91 base::Unretained(this)));
92 if (!(sync_service_ && sync_service_->CanSyncStart())) {
93 PasswordManagerSettingMigraterService::MigrateOffState(prefs);
94 }
95 // This causes OnIsSyncingChanged to be called when the value of
96 // PrefService::IsSyncing() changes.
97 prefs->AddObserver(this);
98 }
99
100 void PasswordManagerSettingMigraterService::Shutdown() {
101 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_);
102 prefs->RemoveObserver(this);
103 }
104
105 void PasswordManagerSettingMigraterService::
106 OnCredentialsEnableServicePrefChanged(
107 const std::string& changed_pref_name) {
108 PrefService* prefs = profile_->GetPrefs();
109 sync_data_.push_back(
110 prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService));
111 ChangeOnePrefBecauseAnotherPrefHasChanged(
112 prefs, password_manager::prefs::kPasswordManagerSavingEnabled,
113 password_manager::prefs::kCredentialsEnableService);
114 }
115
116 void PasswordManagerSettingMigraterService::
117 OnPasswordManagerSavingEnabledPrefChanged(
118 const std::string& changed_pref_name) {
119 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_);
120 sync_data_.push_back(prefs->GetBoolean(
121 password_manager::prefs::kPasswordManagerSavingEnabled));
122 ChangeOnePrefBecauseAnotherPrefHasChanged(
123 prefs, password_manager::prefs::kCredentialsEnableService,
124 password_manager::prefs::kPasswordManagerSavingEnabled);
125 }
126
127 void PasswordManagerSettingMigraterService::OnIsSyncingChanged() {
128 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_);
129 if (prefs->IsSyncing() && prefs->IsPrioritySyncing()) {
130 // Initial sync has finished.
131 MigrateAfterModelAssociation(prefs);
132 }
133
134 if (prefs->IsSyncing() == prefs->IsPrioritySyncing()) {
135 // Sync is not model association step.
136 bool legacy_pref_value = prefs->GetBoolean(
137 password_manager::prefs::kPasswordManagerSavingEnabled);
138 bool new_pref_value =
139 prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService);
140 initial_values_.clear();
141 initial_values_.push_back(new_pref_value);
142 initial_values_.push_back(legacy_pref_value);
143 sync_data_.clear();
144 }
145 }
146
147 void PasswordManagerSettingMigraterService::MigrateOffState(
148 PrefService* prefs) {
149 bool new_pref_value =
150 prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService);
151 bool legacy_pref_value =
152 prefs->GetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled);
153 if (new_pref_value != legacy_pref_value) {
154 // Values are not equal, so we reconcile preferences to the off state.
155 UpdatePreferencesValuesIfNeeded(prefs, false);
156 }
157 }
158
159 void PasswordManagerSettingMigraterService::MigrateAfterModelAssociation(
160 PrefService* prefs) {
161 if (sync_data_.empty()) {
162 MigrateOffState(prefs);
163 } else if (sync_data_.size() == 1) {
164 // Only one value has came from sync. This value should be assigned to both
165 // preferences.
166 UpdatePreferencesValuesIfNeeded(prefs, sync_data_[0]);
167 } else {
168 bool inital_new_pref = initial_values_[1];
169 bool initial_legacy_pref = initial_values_[0];
170 bool sync_new_pref = sync_data_[0];
171 bool sync_legacy_pref = sync_data_[sync_data_.size() - 1];
172 if (sync_legacy_pref && sync_new_pref) {
173 UpdatePreferencesValuesIfNeeded(prefs, true);
174 } else if (!sync_legacy_pref && !sync_new_pref) {
175 UpdatePreferencesValuesIfNeeded(prefs, false);
176 } else if (!initial_legacy_pref && !inital_new_pref) {
177 UpdatePreferencesValuesIfNeeded(prefs, true);
178 } else {
179 UpdatePreferencesValuesIfNeeded(prefs, false);
180 }
181 }
182 }
183
184 // static
185 PasswordManagerSettingMigraterService::Factory*
186 PasswordManagerSettingMigraterService::Factory::GetInstance() {
187 return Singleton<PasswordManagerSettingMigraterService::Factory>::get();
188 }
189
190 // static
191 PasswordManagerSettingMigraterService*
192 PasswordManagerSettingMigraterService::Factory::GetForProfile(
193 Profile* profile) {
194 return static_cast<PasswordManagerSettingMigraterService*>(
195 GetInstance()->GetServiceForBrowserContext(profile, true));
196 }
197
198 PasswordManagerSettingMigraterService::Factory::Factory()
199 : BrowserContextKeyedServiceFactory(
200 "PasswordManagerSettingMigraterService",
201 BrowserContextDependencyManager::GetInstance()) {
202 DependsOn(ProfileSyncServiceFactory::GetInstance());
203 }
204
205 PasswordManagerSettingMigraterService::Factory::~Factory() {}
206
207 KeyedService*
208 PasswordManagerSettingMigraterService::Factory::BuildServiceInstanceFor(
209 content::BrowserContext* context) const {
210 return new PasswordManagerSettingMigraterService(
211 static_cast<Profile*>(context));
212 }
213
214 bool PasswordManagerSettingMigraterService::Factory::
215 ServiceIsCreatedWithBrowserContext() const {
216 return true;
217 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698