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

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: Sort tests. Created 5 years, 4 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 void ChangeOnePrefBecauseAnotherPrefHasChanged(
21 PrefService* prefs,
22 const std::string& other_pref_name,
23 const std::string& changed_pref_name) {
24 bool changed_pref = prefs->GetBoolean(changed_pref_name.c_str());
25 bool other_pref = prefs->GetBoolean(other_pref_name.c_str());
26 if (changed_pref != other_pref)
27 prefs->SetBoolean(other_pref_name, changed_pref);
28 // TODO(melandory): add histograms in order to track when we can stop
29 // migration.
30 }
31
32 } // namespace
33
34 PasswordManagerSettingMigraterService::PasswordManagerSettingMigraterService(
35 Profile* profile)
36 : profile_(profile), sync_service_(nullptr), both_pref_off_(true) {
37 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_ADDED,
38 content::Source<Profile>(profile));
39 // There should be user set values for preferences we're migrating, otherwise
40 // sync will overwrite default values with server data and this will generate
41 // pref changes notification even if prefs have not changed.
42 PrefService* prefs = profile_->GetPrefs();
43 bool legacy_pref_value =
44 prefs->GetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled);
45 bool new_pref_value =
46 prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService);
47 prefs->SetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled,
48 legacy_pref_value);
49 prefs->SetBoolean(password_manager::prefs::kCredentialsEnableService,
50 new_pref_value);
51 }
52
53 PasswordManagerSettingMigraterService::
54 ~PasswordManagerSettingMigraterService() {}
55
56 void PasswordManagerSettingMigraterService::Observe(
57 int type,
58 const content::NotificationSource& source,
59 const content::NotificationDetails& details) {
60 DCHECK_EQ(chrome::NOTIFICATION_PROFILE_ADDED, type);
61 if (ProfileSyncServiceFactory::HasProfileSyncService(profile_))
62 sync_service_ = ProfileSyncServiceFactory::GetForProfile(profile_);
63 InitObservers();
64 }
65
66 void PasswordManagerSettingMigraterService::InitObservers() {
67 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_);
68 bool legacy_pref_value =
69 prefs->GetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled);
70 bool new_pref_value =
71 prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService);
72 both_pref_off_ = (!legacy_pref_value) && (!new_pref_value);
73 pref_change_registrar_.Init(profile_->GetPrefs());
74 pref_change_registrar_.Add(
75 password_manager::prefs::kCredentialsEnableService,
76 base::Bind(&PasswordManagerSettingMigraterService::
77 OnCredentialsEnableServicePrefChanged,
78 base::Unretained(this)));
79 pref_change_registrar_.Add(
80 password_manager::prefs::kPasswordManagerSavingEnabled,
81 base::Bind(&PasswordManagerSettingMigraterService::
82 OnPasswordManagerSavingEnabledPrefChanged,
83 base::Unretained(this)));
84 if (!(sync_service_ && sync_service_->CanSyncStart())) {
85 PasswordManagerSettingMigraterService::MigrateOffState(prefs);
86 }
87 // This causes OnIsSyncingChanged to be called when the value of
88 // PrefService::IsSyncing() changes.
89 prefs->AddObserver(this);
90 }
91
92 void PasswordManagerSettingMigraterService::Shutdown() {
93 PrefService* prefs = profile_->GetPrefs();
94 MigrateOffState(prefs);
vabr (Chromium) 2015/08/26 14:42:43 I still think we should call prefs->RemoveObserver
melandory 2015/08/28 14:49:24 Done.
95 }
96
97 void PasswordManagerSettingMigraterService::
98 OnCredentialsEnableServicePrefChanged(
99 const std::string& changed_pref_name) {
100 PrefService* prefs = profile_->GetPrefs();
101 ChangeOnePrefBecauseAnotherPrefHasChanged(
102 prefs, password_manager::prefs::kPasswordManagerSavingEnabled,
103 password_manager::prefs::kCredentialsEnableService);
104 }
105
106 void PasswordManagerSettingMigraterService::
107 OnPasswordManagerSavingEnabledPrefChanged(
108 const std::string& changed_pref_name) {
109 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_);
110 // In order to preserve off value we need to hold a propagation of the update.
vabr (Chromium) 2015/08/26 14:42:43 nit: What does "hold a propagation" mean? Did you
melandory 2015/08/28 14:49:24 Not applicable any more.
111 if (!prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService) &&
112 !both_pref_off_) {
113 return;
114 }
115 ChangeOnePrefBecauseAnotherPrefHasChanged(
116 prefs, password_manager::prefs::kCredentialsEnableService,
117 password_manager::prefs::kPasswordManagerSavingEnabled);
118 }
119
120 void PasswordManagerSettingMigraterService::OnIsSyncingChanged() {
121 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_);
122 if (prefs->IsSyncing() && prefs->IsPrioritySyncing()) {
123 // Initial sync has finished.
124 MigrateOffState(prefs);
125 }
126 bool legacy_pref_value =
127 prefs->GetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled);
128 bool new_pref_value =
129 prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService);
130 if (prefs->IsPrioritySyncing() && prefs->IsSyncing()) {
131 both_pref_off_ = (!legacy_pref_value) && (!new_pref_value);
132 }
133 }
134
135 void PasswordManagerSettingMigraterService::MigrateOffState(
136 PrefService* prefs) {
137 bool new_pref_value =
138 prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService);
139 bool legacy_pref_value =
140 prefs->GetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled);
141 if (new_pref_value != legacy_pref_value) {
142 // Values are not equal, so we reconcile preferences to the off state.
143 prefs->SetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled,
144 false);
145 prefs->SetBoolean(password_manager::prefs::kCredentialsEnableService,
146 false);
147 }
148 }
149
150 // static
151 PasswordManagerSettingMigraterService::Factory*
152 PasswordManagerSettingMigraterService::Factory::GetInstance() {
153 return Singleton<PasswordManagerSettingMigraterService::Factory>::get();
154 }
155
156 // static
157 PasswordManagerSettingMigraterService*
158 PasswordManagerSettingMigraterService::Factory::GetForProfile(
159 Profile* profile) {
160 return static_cast<PasswordManagerSettingMigraterService*>(
161 GetInstance()->GetServiceForBrowserContext(profile, true));
162 }
163
164 PasswordManagerSettingMigraterService::Factory::Factory()
165 : BrowserContextKeyedServiceFactory(
166 "PasswordManagerSettingMigraterService",
167 BrowserContextDependencyManager::GetInstance()) {
168 DependsOn(ProfileSyncServiceFactory::GetInstance());
169 }
170
171 PasswordManagerSettingMigraterService::Factory::~Factory() {}
172
173 KeyedService*
174 PasswordManagerSettingMigraterService::Factory::BuildServiceInstanceFor(
175 content::BrowserContext* context) const {
176 return new PasswordManagerSettingMigraterService(
177 static_cast<Profile*>(context));
178 }
179
180 bool PasswordManagerSettingMigraterService::Factory::
181 ServiceIsCreatedWithBrowserContext() const {
182 return true;
183 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698