Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/autofill/autofill_manager.h" | 5 #include "chrome/browser/autofill/autofill_manager.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <map> | 10 #include <map> |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 182 personal_data_(NULL), | 182 personal_data_(NULL), |
| 183 download_manager_(tab_contents->profile(), this), | 183 download_manager_(tab_contents->profile(), this), |
| 184 disable_download_manager_requests_(false), | 184 disable_download_manager_requests_(false), |
| 185 metric_logger_(new AutofillMetrics), | 185 metric_logger_(new AutofillMetrics), |
| 186 has_logged_autofill_enabled_(false), | 186 has_logged_autofill_enabled_(false), |
| 187 has_logged_address_suggestions_count_(false), | 187 has_logged_address_suggestions_count_(false), |
| 188 did_show_suggestions_(false), | 188 did_show_suggestions_(false), |
| 189 user_did_type_(false), | 189 user_did_type_(false), |
| 190 user_did_autofill_(false), | 190 user_did_autofill_(false), |
| 191 user_did_edit_autofilled_field_(false), | 191 user_did_edit_autofilled_field_(false), |
| 192 password_sync_enabled_(false), | |
| 192 password_generation_enabled_(false), | 193 password_generation_enabled_(false), |
| 193 external_delegate_(NULL) { | 194 external_delegate_(NULL) { |
| 194 // |personal_data_| is NULL when using test-enabled WebContents. | 195 // |personal_data_| is NULL when using test-enabled WebContents. |
| 195 personal_data_ = PersonalDataManagerFactory::GetForProfile( | 196 personal_data_ = PersonalDataManagerFactory::GetForProfile( |
| 196 tab_contents->profile()->GetOriginalProfile()); | 197 tab_contents->profile()->GetOriginalProfile()); |
| 197 RegisterWithSyncService(); | 198 RegisterWithSyncService(); |
| 199 registrar_.Init(tab_contents->profile()->GetPrefs()); | |
| 200 registrar_.Add(prefs::kPasswordGenerationEnabled, this); | |
| 198 } | 201 } |
| 199 | 202 |
| 200 AutofillManager::~AutofillManager() { | 203 AutofillManager::~AutofillManager() { |
| 201 if (sync_service_ && sync_service_->HasObserver(this)) | 204 if (sync_service_ && sync_service_->HasObserver(this)) |
| 202 sync_service_->RemoveObserver(this); | 205 sync_service_->RemoveObserver(this); |
| 203 } | 206 } |
| 204 | 207 |
| 205 // static | 208 // static |
| 206 void AutofillManager::RegisterUserPrefs(PrefService* prefs) { | 209 void AutofillManager::RegisterUserPrefs(PrefService* prefs) { |
| 207 prefs->RegisterBooleanPref(prefs::kAutofillEnabled, | 210 prefs->RegisterBooleanPref(prefs::kAutofillEnabled, |
| 208 true, | 211 true, |
| 209 PrefService::SYNCABLE_PREF); | 212 PrefService::SYNCABLE_PREF); |
| 213 prefs->RegisterBooleanPref(prefs::kPasswordGenerationEnabled, | |
| 214 true, | |
|
Garrett Casto
2012/04/26 23:23:59
We are going to have this be an opt-in feature at
zysxqn
2012/04/27 18:38:34
Done.
| |
| 215 PrefService::SYNCABLE_PREF); | |
| 210 #if defined(OS_MACOSX) | 216 #if defined(OS_MACOSX) |
| 211 prefs->RegisterBooleanPref(prefs::kAutofillAuxiliaryProfilesEnabled, | 217 prefs->RegisterBooleanPref(prefs::kAutofillAuxiliaryProfilesEnabled, |
| 212 true, | 218 true, |
| 213 PrefService::SYNCABLE_PREF); | 219 PrefService::SYNCABLE_PREF); |
| 214 #else | 220 #else |
| 215 prefs->RegisterBooleanPref(prefs::kAutofillAuxiliaryProfilesEnabled, | 221 prefs->RegisterBooleanPref(prefs::kAutofillAuxiliaryProfilesEnabled, |
| 216 false, | 222 false, |
| 217 PrefService::UNSYNCABLE_PREF); | 223 PrefService::UNSYNCABLE_PREF); |
| 218 #endif | 224 #endif |
| 219 prefs->RegisterDoublePref(prefs::kAutofillPositiveUploadRate, | 225 prefs->RegisterDoublePref(prefs::kAutofillPositiveUploadRate, |
| 220 kAutofillPositiveUploadRateDefaultValue, | 226 kAutofillPositiveUploadRateDefaultValue, |
| 221 PrefService::UNSYNCABLE_PREF); | 227 PrefService::UNSYNCABLE_PREF); |
| 222 prefs->RegisterDoublePref(prefs::kAutofillNegativeUploadRate, | 228 prefs->RegisterDoublePref(prefs::kAutofillNegativeUploadRate, |
| 223 kAutofillNegativeUploadRateDefaultValue, | 229 kAutofillNegativeUploadRateDefaultValue, |
| 224 PrefService::UNSYNCABLE_PREF); | 230 PrefService::UNSYNCABLE_PREF); |
| 225 } | 231 } |
| 226 | 232 |
| 227 void AutofillManager::RegisterWithSyncService() { | 233 void AutofillManager::RegisterWithSyncService() { |
| 228 ProfileSyncService* temp_sync_service = | 234 ProfileSyncService* temp_sync_service = |
| 229 ProfileSyncServiceFactory::GetForProfile( | 235 ProfileSyncServiceFactory::GetForProfile( |
| 230 tab_contents_wrapper_->profile()); | 236 tab_contents_wrapper_->profile()); |
| 231 if (temp_sync_service) { | 237 if (temp_sync_service) { |
| 232 sync_service_ = temp_sync_service->AsWeakPtr(); | 238 sync_service_ = temp_sync_service->AsWeakPtr(); |
| 233 sync_service_->AddObserver(this); | 239 sync_service_->AddObserver(this); |
| 234 } | 240 } |
| 235 } | 241 } |
| 236 | 242 |
| 243 void AutofillManager::SendPasswordSyncStateToRenderer( | |
|
Garrett Casto
2012/04/26 23:23:59
Remove this.
| |
| 244 content::RenderViewHost* host, bool enabled) { | |
| 245 host->Send(new AutofillMsg_PasswordSyncEnabled(host->GetRoutingID(), | |
| 246 enabled)); | |
| 247 } | |
| 248 | |
| 249 void AutofillManager::UpdatePasswordSyncState( | |
| 250 content::RenderViewHost* host, | |
| 251 bool new_renderer) { | |
| 252 if (!sync_service_) | |
| 253 return; | |
| 254 | |
| 255 // Also need to check whether password manager is enabled. | |
| 256 syncable::ModelTypeSet sync_set = sync_service_->GetPreferredDataTypes(); | |
| 257 bool new_password_sync_enabled = | |
| 258 sync_service_->HasSyncSetupCompleted() && | |
| 259 sync_set.Has(syncable::PASSWORDS) && | |
| 260 tab_contents_wrapper_->password_manager()->IsEnabled(); | |
| 261 if (new_password_sync_enabled != password_sync_enabled_ || | |
| 262 new_renderer) { | |
| 263 password_sync_enabled_ = new_password_sync_enabled; | |
| 264 SendPasswordSyncStateToRenderer(host, password_sync_enabled_); | |
| 265 } | |
| 266 } | |
| 267 | |
| 237 void AutofillManager::SendPasswordGenerationStateToRenderer( | 268 void AutofillManager::SendPasswordGenerationStateToRenderer( |
| 238 content::RenderViewHost* host, bool enabled) { | 269 content::RenderViewHost* host, bool enabled) { |
| 239 host->Send(new AutofillMsg_PasswordGenerationEnabled(host->GetRoutingID(), | 270 host->Send(new AutofillMsg_PasswordGenerationEnabled(host->GetRoutingID(), |
| 240 enabled)); | 271 enabled)); |
| 241 } | 272 } |
| 242 | 273 |
| 243 void AutofillManager::UpdatePasswordGenerationState( | 274 void AutofillManager::UpdatePasswordGenerationState( |
| 244 content::RenderViewHost* host, | 275 content::RenderViewHost* host, bool new_renderer) { |
| 245 bool new_renderer) { | 276 Profile* profile = Profile::FromBrowserContext( |
| 246 if (!sync_service_) | 277 web_contents()->GetBrowserContext()); |
| 247 return; | 278 // Also need to check whether password manager is enabled. |
| 248 | |
| 249 // Password generation requires sync for passwords and the password manager | |
| 250 // to both be enabled. | |
| 251 syncable::ModelTypeSet sync_set = sync_service_->GetPreferredDataTypes(); | |
| 252 bool password_sync_enabled = (sync_service_->HasSyncSetupCompleted() && | |
| 253 sync_set.Has(syncable::PASSWORDS)); | |
| 254 bool new_password_generation_enabled = | 279 bool new_password_generation_enabled = |
| 255 password_sync_enabled && | 280 profile->GetPrefs()->GetBoolean(prefs::kPasswordGenerationEnabled) && |
|
Garrett Casto
2012/04/26 23:23:59
This should check if password sync is enabled as w
| |
| 256 tab_contents_wrapper_->password_manager()->IsEnabled(); | 281 tab_contents_wrapper_->password_manager()->IsEnabled(); |
| 257 if (new_password_generation_enabled != password_generation_enabled_ || | 282 if (new_password_generation_enabled != password_generation_enabled_ || |
| 258 new_renderer) { | 283 new_renderer) { |
| 259 password_generation_enabled_ = new_password_generation_enabled; | 284 password_generation_enabled_ = new_password_generation_enabled; |
| 260 SendPasswordGenerationStateToRenderer(host, password_generation_enabled_); | 285 SendPasswordGenerationStateToRenderer(host, password_generation_enabled_); |
| 261 } | 286 } |
| 262 } | 287 } |
| 263 | 288 |
| 264 void AutofillManager::RenderViewCreated(content::RenderViewHost* host) { | 289 void AutofillManager::RenderViewCreated(content::RenderViewHost* host) { |
| 265 UpdatePasswordGenerationState(host, true); | 290 UpdatePasswordSyncState(host, true); |
|
Garrett Casto
2012/04/26 23:23:59
This should just call UpdatePasswordGenerationStat
| |
| 291 UpdatePasswordGenerationState(host, true); | |
| 292 } | |
| 293 | |
| 294 void AutofillManager::Observe( | |
| 295 int type, | |
| 296 const content::NotificationSource& source, | |
| 297 const content::NotificationDetails& details) { | |
| 298 switch (type) { | |
|
Garrett Casto
2012/04/26 23:23:59
I'm actually not totally sure that we need this ob
zysxqn
2012/04/27 18:38:34
I feel that it is useful since users sometimes exp
| |
| 299 case chrome::NOTIFICATION_PREF_CHANGED: { | |
| 300 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 301 std::string* pref = content::Details<std::string>(details).ptr(); | |
| 302 DCHECK(*pref == prefs::kPasswordGenerationEnabled); | |
| 303 UpdatePasswordGenerationState(web_contents()->GetRenderViewHost(), false); | |
| 304 break; | |
| 305 } | |
| 306 default: | |
| 307 NOTREACHED(); | |
| 308 } | |
| 266 } | 309 } |
| 267 | 310 |
| 268 void AutofillManager::OnStateChanged() { | 311 void AutofillManager::OnStateChanged() { |
| 269 // It is possible for sync state to change during tab contents destruction. | 312 // It is possible for sync state to change during tab contents destruction. |
| 270 // In this case, we don't need to update the renderer since it's going away. | 313 // In this case, we don't need to update the renderer since it's going away. |
| 271 if (web_contents() && web_contents()->GetRenderViewHost()) { | 314 if (web_contents() && web_contents()->GetRenderViewHost()) { |
| 272 UpdatePasswordGenerationState(web_contents()->GetRenderViewHost(), | 315 UpdatePasswordSyncState(web_contents()->GetRenderViewHost(), |
|
Garrett Casto
2012/04/26 23:23:59
Don't change this.
| |
| 273 false); | 316 false); |
| 274 } | 317 } |
| 275 } | 318 } |
| 276 | 319 |
| 277 void AutofillManager::DidNavigateMainFrame( | 320 void AutofillManager::DidNavigateMainFrame( |
| 278 const content::LoadCommittedDetails& details, | 321 const content::LoadCommittedDetails& details, |
| 279 const content::FrameNavigateParams& params) { | 322 const content::FrameNavigateParams& params) { |
| 280 Reset(); | 323 Reset(); |
| 281 } | 324 } |
| 282 | 325 |
| (...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 832 personal_data_(personal_data), | 875 personal_data_(personal_data), |
| 833 download_manager_(tab_contents->profile(), this), | 876 download_manager_(tab_contents->profile(), this), |
| 834 disable_download_manager_requests_(true), | 877 disable_download_manager_requests_(true), |
| 835 metric_logger_(new AutofillMetrics), | 878 metric_logger_(new AutofillMetrics), |
| 836 has_logged_autofill_enabled_(false), | 879 has_logged_autofill_enabled_(false), |
| 837 has_logged_address_suggestions_count_(false), | 880 has_logged_address_suggestions_count_(false), |
| 838 did_show_suggestions_(false), | 881 did_show_suggestions_(false), |
| 839 user_did_type_(false), | 882 user_did_type_(false), |
| 840 user_did_autofill_(false), | 883 user_did_autofill_(false), |
| 841 user_did_edit_autofilled_field_(false), | 884 user_did_edit_autofilled_field_(false), |
| 885 password_sync_enabled_(false), | |
| 842 password_generation_enabled_(false), | 886 password_generation_enabled_(false), |
| 843 external_delegate_(NULL) { | 887 external_delegate_(NULL) { |
| 844 DCHECK(tab_contents); | 888 DCHECK(tab_contents); |
| 845 RegisterWithSyncService(); | 889 RegisterWithSyncService(); |
| 890 // Test code doens't need registrar_. | |
| 846 } | 891 } |
| 847 | 892 |
| 848 void AutofillManager::set_metric_logger(const AutofillMetrics* metric_logger) { | 893 void AutofillManager::set_metric_logger(const AutofillMetrics* metric_logger) { |
| 849 metric_logger_.reset(metric_logger); | 894 metric_logger_.reset(metric_logger); |
| 850 } | 895 } |
| 851 | 896 |
| 852 bool AutofillManager::GetHost(const std::vector<AutofillProfile*>& profiles, | 897 bool AutofillManager::GetHost(const std::vector<AutofillProfile*>& profiles, |
| 853 const std::vector<CreditCard*>& credit_cards, | 898 const std::vector<CreditCard*>& credit_cards, |
| 854 RenderViewHost** host) const { | 899 RenderViewHost** host) const { |
| 855 if (!IsAutofillEnabled()) | 900 if (!IsAutofillEnabled()) |
| (...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1327 *profile_guid = IDToGUID(profile_id); | 1372 *profile_guid = IDToGUID(profile_id); |
| 1328 } | 1373 } |
| 1329 | 1374 |
| 1330 void AutofillManager::UpdateInitialInteractionTimestamp( | 1375 void AutofillManager::UpdateInitialInteractionTimestamp( |
| 1331 const TimeTicks& interaction_timestamp) { | 1376 const TimeTicks& interaction_timestamp) { |
| 1332 if (initial_interaction_timestamp_.is_null() || | 1377 if (initial_interaction_timestamp_.is_null() || |
| 1333 interaction_timestamp < initial_interaction_timestamp_) { | 1378 interaction_timestamp < initial_interaction_timestamp_) { |
| 1334 initial_interaction_timestamp_ = interaction_timestamp; | 1379 initial_interaction_timestamp_ = interaction_timestamp; |
| 1335 } | 1380 } |
| 1336 } | 1381 } |
| OLD | NEW |