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

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: Add guard 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/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 if (!IsSettingsMigrationActive()) {
67 // TODO(melandory) Add histogram which will log initial values for the both
68 // settings.
69 return;
70 }
71 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_ADDED,
72 content::Source<Profile>(profile));
73 }
74
75 PasswordManagerSettingMigraterService::
76 ~PasswordManagerSettingMigraterService() {}
77
78 void PasswordManagerSettingMigraterService::Observe(
79 int type,
80 const content::NotificationSource& source,
81 const content::NotificationDetails& details) {
82 DCHECK_EQ(chrome::NOTIFICATION_PROFILE_ADDED, type);
83 if (ProfileSyncServiceFactory::HasProfileSyncService(profile_))
84 sync_service_ = ProfileSyncServiceFactory::GetForProfile(profile_);
85 InitObservers();
86 }
87
88 void PasswordManagerSettingMigraterService::InitObservers() {
89 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_);
90 InitCurrentPrefState(prefs, &initial_legacy_pref_value_,
91 &initial_new_pref_value_);
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 InitCurrentPrefState(prefs, &initial_legacy_pref_value_,
148 &initial_new_pref_value_);
149 sync_data_.clear();
150 }
151 }
152
153 void PasswordManagerSettingMigraterService::MigrateOffState(
154 PrefService* prefs) {
155 bool new_pref_value =
156 prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService);
157 bool legacy_pref_value =
158 prefs->GetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled);
159 UpdatePreferencesValuesIfNeeded(prefs, new_pref_value && legacy_pref_value);
160 }
161
162 void PasswordManagerSettingMigraterService::MigrateAfterModelAssociation(
163 PrefService* prefs) {
164 if (sync_data_.empty()) {
165 MigrateOffState(prefs);
166 } else if (sync_data_.size() == 1) {
167 // Only one value has came from sync. This value should be assigned to both
168 // preferences.
169 UpdatePreferencesValuesIfNeeded(prefs, sync_data_[0]);
170 } else {
171 bool sync_new_pref_value = sync_data_[0];
172 bool sync_legacy_pref_value = sync_data_[sync_data_.size() - 1];
173 if (sync_legacy_pref_value && sync_new_pref_value) {
174 UpdatePreferencesValuesIfNeeded(prefs, true);
175 } else if (!sync_legacy_pref_value && !sync_new_pref_value) {
176 UpdatePreferencesValuesIfNeeded(prefs, false);
177 } else if (!initial_legacy_pref_value_ && !initial_new_pref_value_) {
178 UpdatePreferencesValuesIfNeeded(prefs, true);
179 } else {
180 UpdatePreferencesValuesIfNeeded(prefs, false);
181 }
182 }
183 }
184
185 // static
186 PasswordManagerSettingMigraterService::Factory*
187 PasswordManagerSettingMigraterService::Factory::GetInstance() {
188 return Singleton<PasswordManagerSettingMigraterService::Factory>::get();
189 }
190
191 // static
192 PasswordManagerSettingMigraterService*
193 PasswordManagerSettingMigraterService::Factory::GetForProfile(
194 Profile* profile) {
195 return static_cast<PasswordManagerSettingMigraterService*>(
196 GetInstance()->GetServiceForBrowserContext(profile, true));
197 }
198
199 PasswordManagerSettingMigraterService::Factory::Factory()
200 : BrowserContextKeyedServiceFactory(
201 "PasswordManagerSettingMigraterService",
202 BrowserContextDependencyManager::GetInstance()) {
203 DependsOn(ProfileSyncServiceFactory::GetInstance());
204 }
205
206 PasswordManagerSettingMigraterService::Factory::~Factory() {}
207
208 KeyedService*
209 PasswordManagerSettingMigraterService::Factory::BuildServiceInstanceFor(
210 content::BrowserContext* context) const {
211 return new PasswordManagerSettingMigraterService(
212 Profile::FromBrowserContext(context));
213 }
214
215 bool PasswordManagerSettingMigraterService::Factory::
216 ServiceIsCreatedWithBrowserContext() const {
217 return true;
218 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698