| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/string16.h" | 10 #include "base/string16.h" |
| 11 #include "chrome/browser/autofill/autofill_dialog.h" | 11 #include "chrome/browser/autofill/autofill_dialog.h" |
| 12 #include "chrome/browser/autofill/autofill_infobar_delegate.h" | |
| 13 #include "chrome/browser/autofill/form_structure.h" | 12 #include "chrome/browser/autofill/form_structure.h" |
| 14 #include "chrome/browser/pref_service.h" | 13 #include "chrome/browser/pref_service.h" |
| 15 #include "chrome/browser/profile.h" | 14 #include "chrome/browser/profile.h" |
| 16 #include "chrome/browser/renderer_host/render_view_host.h" | 15 #include "chrome/browser/renderer_host/render_view_host.h" |
| 17 #include "chrome/browser/tab_contents/tab_contents.h" | 16 #include "chrome/browser/tab_contents/tab_contents.h" |
| 18 #include "chrome/common/chrome_switches.h" | 17 #include "chrome/common/chrome_switches.h" |
| 19 #include "chrome/common/pref_names.h" | 18 #include "chrome/common/pref_names.h" |
| 20 #include "webkit/glue/form_data.h" | 19 #include "webkit/glue/form_data.h" |
| 21 #include "webkit/glue/form_field.h" | 20 #include "webkit/glue/form_field.h" |
| 22 | 21 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 40 | 39 |
| 41 } // namespace | 40 } // namespace |
| 42 | 41 |
| 43 // TODO(jhawkins): Maybe this should be in a grd file? | 42 // TODO(jhawkins): Maybe this should be in a grd file? |
| 44 const char* kAutoFillLearnMoreUrl = | 43 const char* kAutoFillLearnMoreUrl = |
| 45 "http://www.google.com/support/chrome/bin/answer.py?answer=142893"; | 44 "http://www.google.com/support/chrome/bin/answer.py?answer=142893"; |
| 46 | 45 |
| 47 AutoFillManager::AutoFillManager(TabContents* tab_contents) | 46 AutoFillManager::AutoFillManager(TabContents* tab_contents) |
| 48 : tab_contents_(tab_contents), | 47 : tab_contents_(tab_contents), |
| 49 personal_data_(NULL), | 48 personal_data_(NULL), |
| 50 download_manager_(tab_contents_->profile()), | 49 download_manager_(tab_contents_->profile()) { |
| 51 infobar_(NULL) { | |
| 52 DCHECK(tab_contents); | 50 DCHECK(tab_contents); |
| 53 | 51 |
| 54 // |personal_data_| is NULL when using TestTabContents. | 52 // |personal_data_| is NULL when using TestTabContents. |
| 55 personal_data_ = | 53 personal_data_ = |
| 56 tab_contents_->profile()->GetOriginalProfile()->GetPersonalDataManager(); | 54 tab_contents_->profile()->GetOriginalProfile()->GetPersonalDataManager(); |
| 57 download_manager_.SetObserver(this); | 55 download_manager_.SetObserver(this); |
| 58 } | 56 } |
| 59 | 57 |
| 60 AutoFillManager::~AutoFillManager() { | 58 AutoFillManager::~AutoFillManager() { |
| 61 download_manager_.SetObserver(NULL); | 59 download_manager_.SetObserver(NULL); |
| 62 } | 60 } |
| 63 | 61 |
| 64 // static | 62 // static |
| 65 void AutoFillManager::RegisterBrowserPrefs(PrefService* prefs) { | 63 void AutoFillManager::RegisterBrowserPrefs(PrefService* prefs) { |
| 66 prefs->RegisterDictionaryPref(prefs::kAutoFillDialogPlacement); | 64 prefs->RegisterDictionaryPref(prefs::kAutoFillDialogPlacement); |
| 67 } | 65 } |
| 68 | 66 |
| 69 // static | 67 // static |
| 70 void AutoFillManager::RegisterUserPrefs(PrefService* prefs) { | 68 void AutoFillManager::RegisterUserPrefs(PrefService* prefs) { |
| 71 prefs->RegisterBooleanPref(prefs::kAutoFillInfoBarShown, false); | |
| 72 prefs->RegisterBooleanPref(prefs::kAutoFillEnabled, true); | 69 prefs->RegisterBooleanPref(prefs::kAutoFillEnabled, true); |
| 73 prefs->RegisterBooleanPref(prefs::kAutoFillAuxiliaryProfilesEnabled, true); | 70 prefs->RegisterBooleanPref(prefs::kAutoFillAuxiliaryProfilesEnabled, true); |
| 74 | 71 |
| 75 prefs->RegisterRealPref(prefs::kAutoFillPositiveUploadRate, | 72 prefs->RegisterRealPref(prefs::kAutoFillPositiveUploadRate, |
| 76 kAutoFillPositiveUploadRateDefaultValue); | 73 kAutoFillPositiveUploadRateDefaultValue); |
| 77 prefs->RegisterRealPref(prefs::kAutoFillNegativeUploadRate, | 74 prefs->RegisterRealPref(prefs::kAutoFillNegativeUploadRate, |
| 78 kAutoFillNegativeUploadRateDefaultValue); | 75 kAutoFillNegativeUploadRateDefaultValue); |
| 79 } | 76 } |
| 80 | 77 |
| 81 void AutoFillManager::FormSubmitted(const FormData& form) { | 78 void AutoFillManager::FormSubmitted(const FormData& form) { |
| 82 if (!IsAutoFillEnabled()) | 79 if (!IsAutoFillEnabled()) |
| 83 return; | 80 return; |
| 84 | 81 |
| 85 if (tab_contents_->profile()->IsOffTheRecord()) | 82 if (tab_contents_->profile()->IsOffTheRecord()) |
| 86 return; | 83 return; |
| 87 | 84 |
| 88 // Grab a copy of the form data. | 85 // Grab a copy of the form data. |
| 89 upload_form_structure_.reset(new FormStructure(form)); | 86 upload_form_structure_.reset(new FormStructure(form)); |
| 90 | 87 |
| 91 if (!upload_form_structure_->IsAutoFillable()) | 88 if (!upload_form_structure_->IsAutoFillable()) |
| 92 return; | 89 return; |
| 93 | 90 |
| 94 // Determine the possible field types and upload the form structure to the | 91 // Determine the possible field types and upload the form structure to the |
| 95 // PersonalDataManager. | 92 // PersonalDataManager. |
| 96 DeterminePossibleFieldTypes(upload_form_structure_.get()); | 93 DeterminePossibleFieldTypes(upload_form_structure_.get()); |
| 97 HandleSubmit(); | 94 HandleSubmit(); |
| 98 | |
| 99 if (upload_form_structure_->HasAutoFillableValues()) { | |
| 100 PrefService* prefs = tab_contents_->profile()->GetPrefs(); | |
| 101 bool infobar_shown = prefs->GetBoolean(prefs::kAutoFillInfoBarShown); | |
| 102 if (!infobar_shown) { | |
| 103 // Ask the user for permission to save form information. | |
| 104 infobar_.reset(new AutoFillInfoBarDelegate(tab_contents_, this)); | |
| 105 } | |
| 106 } | |
| 107 } | 95 } |
| 108 | 96 |
| 109 void AutoFillManager::FormsSeen(const std::vector<FormData>& forms) { | 97 void AutoFillManager::FormsSeen(const std::vector<FormData>& forms) { |
| 110 if (!IsAutoFillEnabled()) | 98 if (!IsAutoFillEnabled()) |
| 111 return; | 99 return; |
| 112 | 100 |
| 113 for (std::vector<FormData>::const_iterator iter = | 101 for (std::vector<FormData>::const_iterator iter = |
| 114 forms.begin(); | 102 forms.begin(); |
| 115 iter != forms.end(); ++iter) { | 103 iter != forms.end(); ++iter) { |
| 116 FormStructure* form_structure = new FormStructure(*iter); | 104 FormStructure* form_structure = new FormStructure(*iter); |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 } | 309 } |
| 322 | 310 |
| 323 void AutoFillManager::ShowAutoFillDialog() { | 311 void AutoFillManager::ShowAutoFillDialog() { |
| 324 ::ShowAutoFillDialog(tab_contents_->GetContentNativeView(), | 312 ::ShowAutoFillDialog(tab_contents_->GetContentNativeView(), |
| 325 personal_data_, | 313 personal_data_, |
| 326 tab_contents_->profile()->GetOriginalProfile(), | 314 tab_contents_->profile()->GetOriginalProfile(), |
| 327 NULL, | 315 NULL, |
| 328 NULL); | 316 NULL); |
| 329 } | 317 } |
| 330 | 318 |
| 331 void AutoFillManager::OnInfoBarClosed() { | |
| 332 PrefService* prefs = tab_contents_->profile()->GetPrefs(); | |
| 333 prefs->SetBoolean(prefs::kAutoFillEnabled, true); | |
| 334 | |
| 335 // Save the imported form data as a profile. | |
| 336 personal_data_->SaveImportedFormData(); | |
| 337 } | |
| 338 | |
| 339 void AutoFillManager::OnInfoBarAccepted() { | |
| 340 PrefService* prefs = tab_contents_->profile()->GetPrefs(); | |
| 341 prefs->SetBoolean(prefs::kAutoFillEnabled, true); | |
| 342 | |
| 343 // This is the first time the user is interacting with AutoFill, so set the | |
| 344 // uploaded form structure as the initial profile and credit card in the | |
| 345 // AutoFillDialog. | |
| 346 AutoFillProfile* profile = NULL; | |
| 347 CreditCard* credit_card = NULL; | |
| 348 // TODO(dhollowa) Now that we aren't immediately saving the imported form | |
| 349 // data, we should store the profile and CC in the AFM instead of the PDM. | |
| 350 personal_data_->GetImportedFormData(&profile, &credit_card); | |
| 351 ::ShowAutoFillDialog(tab_contents_->GetContentNativeView(), | |
| 352 personal_data_, | |
| 353 tab_contents_->profile()->GetOriginalProfile(), | |
| 354 profile, | |
| 355 credit_card); | |
| 356 } | |
| 357 | |
| 358 void AutoFillManager::OnInfoBarCancelled() { | |
| 359 PrefService* prefs = tab_contents_->profile()->GetPrefs(); | |
| 360 prefs->SetBoolean(prefs::kAutoFillEnabled, false); | |
| 361 } | |
| 362 | |
| 363 void AutoFillManager::Reset() { | 319 void AutoFillManager::Reset() { |
| 364 upload_form_structure_.reset(); | 320 upload_form_structure_.reset(); |
| 365 form_structures_.reset(); | 321 form_structures_.reset(); |
| 366 } | 322 } |
| 367 | 323 |
| 368 void AutoFillManager::OnLoadedAutoFillHeuristics( | 324 void AutoFillManager::OnLoadedAutoFillHeuristics( |
| 369 const std::string& heuristic_xml) { | 325 const std::string& heuristic_xml) { |
| 370 // TODO(jhawkins): Store |upload_required| in the AutoFillManager. | 326 // TODO(jhawkins): Store |upload_required| in the AutoFillManager. |
| 371 UploadRequired upload_required; | 327 UploadRequired upload_required; |
| 372 FormStructure::ParseQueryResponse(heuristic_xml, | 328 FormStructure::ParseQueryResponse(heuristic_xml, |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 431 AutoFillManager::AutoFillManager() | 387 AutoFillManager::AutoFillManager() |
| 432 : tab_contents_(NULL), | 388 : tab_contents_(NULL), |
| 433 personal_data_(NULL), | 389 personal_data_(NULL), |
| 434 download_manager_(NULL) { | 390 download_manager_(NULL) { |
| 435 } | 391 } |
| 436 | 392 |
| 437 AutoFillManager::AutoFillManager(TabContents* tab_contents, | 393 AutoFillManager::AutoFillManager(TabContents* tab_contents, |
| 438 PersonalDataManager* personal_data) | 394 PersonalDataManager* personal_data) |
| 439 : tab_contents_(tab_contents), | 395 : tab_contents_(tab_contents), |
| 440 personal_data_(personal_data), | 396 personal_data_(personal_data), |
| 441 download_manager_(NULL), // No download manager in tests. | 397 download_manager_(NULL) { |
| 442 infobar_(NULL) { | |
| 443 DCHECK(tab_contents); | 398 DCHECK(tab_contents); |
| 444 } | 399 } |
| 445 | 400 |
| 446 void AutoFillManager::GetProfileSuggestions(FormStructure* form, | 401 void AutoFillManager::GetProfileSuggestions(FormStructure* form, |
| 447 const FormField& field, | 402 const FormField& field, |
| 448 AutoFillType type, | 403 AutoFillType type, |
| 449 std::vector<string16>* values, | 404 std::vector<string16>* values, |
| 450 std::vector<string16>* labels) { | 405 std::vector<string16>* labels) { |
| 451 const std::vector<AutoFillProfile*>& profiles = personal_data_->profiles(); | 406 const std::vector<AutoFillProfile*>& profiles = personal_data_->profiles(); |
| 452 for (std::vector<AutoFillProfile*>::const_iterator iter = profiles.begin(); | 407 for (std::vector<AutoFillProfile*>::const_iterator iter = profiles.begin(); |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 614 field->set_value(number); | 569 field->set_value(number); |
| 615 } else if (has_valid_suffix_and_prefix && | 570 } else if (has_valid_suffix_and_prefix && |
| 616 field->size() == kAutoFillPhoneNumberSuffixCount) { | 571 field->size() == kAutoFillPhoneNumberSuffixCount) { |
| 617 number = number.substr(kAutoFillPhoneNumberSuffixOffset, | 572 number = number.substr(kAutoFillPhoneNumberSuffixOffset, |
| 618 kAutoFillPhoneNumberSuffixCount); | 573 kAutoFillPhoneNumberSuffixCount); |
| 619 field->set_value(number); | 574 field->set_value(number); |
| 620 } else { | 575 } else { |
| 621 field->set_value(number); | 576 field->set_value(number); |
| 622 } | 577 } |
| 623 } | 578 } |
| OLD | NEW |