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 "components/autofill/browser/autofill_manager.h" | 5 #include "components/autofill/browser/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 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
322 IPC_MESSAGE_HANDLER(AutofillHostMsg_MaybeShowAutocheckoutBubble, | 322 IPC_MESSAGE_HANDLER(AutofillHostMsg_MaybeShowAutocheckoutBubble, |
323 OnMaybeShowAutocheckoutBubble) | 323 OnMaybeShowAutocheckoutBubble) |
324 IPC_MESSAGE_UNHANDLED(handled = false) | 324 IPC_MESSAGE_UNHANDLED(handled = false) |
325 IPC_END_MESSAGE_MAP() | 325 IPC_END_MESSAGE_MAP() |
326 | 326 |
327 return handled; | 327 return handled; |
328 } | 328 } |
329 | 329 |
330 bool AutofillManager::OnFormSubmitted(const FormData& form, | 330 bool AutofillManager::OnFormSubmitted(const FormData& form, |
331 const TimeTicks& timestamp) { | 331 const TimeTicks& timestamp) { |
332 // Let AutoComplete know as well. | |
333 autocomplete_history_manager_.OnFormSubmitted(form); | |
334 | |
335 if (!IsAutofillEnabled()) | 332 if (!IsAutofillEnabled()) |
336 return false; | 333 return false; |
337 | 334 |
338 if (web_contents()->GetBrowserContext()->IsOffTheRecord()) | 335 // Let AutoComplete know as well. |
339 return false; | 336 autocomplete_history_manager_.OnFormSubmitted(form); |
Ilya Sherman
2013/06/15 00:28:09
I think this check is still needed.
sgurun-gerrit only
2013/06/17 21:20:32
Done.
|
Ilya Sherman
2013/06/15 00:28:09
Does this re-ordering still make sense given the u
sgurun-gerrit only
2013/06/17 21:20:32
There seems multiple issues with enabling/disablin
|
340 | 337 |
341 // Don't save data that was submitted through JavaScript. | 338 // Don't save data that was submitted through JavaScript. |
342 if (!form.user_submitted) | 339 if (!form.user_submitted) |
343 return false; | 340 return false; |
344 | 341 |
342 // If there is no personal_data_, nothing to do. | |
343 if (!personal_data_) | |
344 return false; | |
345 | |
345 // Grab a copy of the form data. | 346 // Grab a copy of the form data. |
346 scoped_ptr<FormStructure> submitted_form( | 347 scoped_ptr<FormStructure> submitted_form( |
347 new FormStructure(form, GetAutocheckoutURLPrefix())); | 348 new FormStructure(form, GetAutocheckoutURLPrefix())); |
348 | 349 |
349 // Disregard forms that we wouldn't ever autofill in the first place. | 350 // Disregard forms that we wouldn't ever autofill in the first place. |
350 if (!submitted_form->ShouldBeParsed(true)) | 351 if (!submitted_form->ShouldBeParsed(true)) |
351 return false; | 352 return false; |
352 | 353 |
353 // Ignore forms not present in our cache. These are typically forms with | 354 // Ignore forms not present in our cache. These are typically forms with |
354 // wonky JavaScript that also makes them not auto-fillable. | 355 // wonky JavaScript that also makes them not auto-fillable. |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
487 std::vector<int> unique_ids; | 488 std::vector<int> unique_ids; |
488 | 489 |
489 if (external_delegate_) { | 490 if (external_delegate_) { |
490 external_delegate_->OnQuery(query_id, | 491 external_delegate_->OnQuery(query_id, |
491 form, | 492 form, |
492 field, | 493 field, |
493 bounding_box, | 494 bounding_box, |
494 display_warning); | 495 display_warning); |
495 } | 496 } |
496 | 497 |
498 GetAutofillSuggestions(form, | |
499 field, | |
500 &values, | |
501 &labels, | |
502 &icons, | |
503 &unique_ids); | |
Ilya Sherman
2013/06/15 00:28:09
nit: This all fits on a single line.
Ilya Sherman
2013/06/15 00:28:09
What's the purpose of decomposing out this method?
sgurun-gerrit only
2013/06/17 21:20:32
Done.
sgurun-gerrit only
2013/06/17 21:20:32
Done.
| |
504 | |
505 // Add the results from AutoComplete. They come back asynchronously, so we | |
506 // hand off what we generated and they will send the results back to the | |
507 // renderer. | |
508 autocomplete_history_manager_.OnGetAutocompleteSuggestions( | |
509 query_id, field.name, field.value, values, labels, icons, unique_ids); | |
510 } | |
511 | |
512 void AutofillManager::GetAutofillSuggestions( | |
513 const FormData& form, | |
514 const FormFieldData& field, | |
515 std::vector<base::string16>* values, | |
516 std::vector<base::string16>* labels, | |
517 std::vector<string16>* icons, | |
518 std::vector<int>* unique_ids) { | |
497 RenderViewHost* host = NULL; | 519 RenderViewHost* host = NULL; |
498 FormStructure* form_structure = NULL; | 520 FormStructure* form_structure = NULL; |
499 AutofillField* autofill_field = NULL; | 521 AutofillField* autofill_field = NULL; |
500 if (GetHost(&host) && | 522 if (GetHost(&host) && |
501 GetCachedFormAndField(form, field, &form_structure, &autofill_field) && | 523 GetCachedFormAndField(form, field, &form_structure, &autofill_field) && |
502 // Don't send suggestions for forms that aren't auto-fillable. | 524 // Don't send suggestions for forms that aren't auto-fillable. |
503 form_structure->IsAutofillable(false)) { | 525 form_structure->IsAutofillable(false)) { |
504 AutofillFieldType type = autofill_field->type(); | 526 AutofillFieldType type = autofill_field->type(); |
505 bool is_filling_credit_card = | 527 bool is_filling_credit_card = |
506 (AutofillType(type).group() == AutofillType::CREDIT_CARD); | 528 (AutofillType(type).group() == AutofillType::CREDIT_CARD); |
507 if (is_filling_credit_card) { | 529 if (is_filling_credit_card) { |
508 GetCreditCardSuggestions( | 530 GetCreditCardSuggestions( |
509 field, type, &values, &labels, &icons, &unique_ids); | 531 field, type, values, labels, icons, unique_ids); |
510 } else { | 532 } else { |
511 GetProfileSuggestions( | 533 GetProfileSuggestions( |
512 form_structure, field, type, &values, &labels, &icons, &unique_ids); | 534 form_structure, field, type, values, labels, icons, unique_ids); |
513 } | 535 } |
514 | 536 |
515 DCHECK_EQ(values.size(), labels.size()); | 537 DCHECK_EQ(values->size(), labels->size()); |
516 DCHECK_EQ(values.size(), icons.size()); | 538 DCHECK_EQ(values->size(), icons->size()); |
517 DCHECK_EQ(values.size(), unique_ids.size()); | 539 DCHECK_EQ(values->size(), unique_ids->size()); |
518 | 540 |
519 if (!values.empty()) { | 541 if (!values->empty()) { |
520 // Don't provide Autofill suggestions when Autofill is disabled, and don't | 542 // Don't provide Autofill suggestions when Autofill is disabled, and don't |
521 // provide credit card suggestions for non-HTTPS pages. However, provide a | 543 // provide credit card suggestions for non-HTTPS pages. However, provide a |
522 // warning to the user in these cases. | 544 // warning to the user in these cases. |
523 int warning = 0; | 545 int warning = 0; |
524 if (!form_structure->IsAutofillable(true)) | 546 if (!form_structure->IsAutofillable(true)) |
525 warning = IDS_AUTOFILL_WARNING_FORM_DISABLED; | 547 warning = IDS_AUTOFILL_WARNING_FORM_DISABLED; |
526 else if (is_filling_credit_card && !FormIsHTTPS(*form_structure)) | 548 else if (is_filling_credit_card && !FormIsHTTPS(*form_structure)) |
527 warning = IDS_AUTOFILL_WARNING_INSECURE_CONNECTION; | 549 warning = IDS_AUTOFILL_WARNING_INSECURE_CONNECTION; |
528 if (warning) { | 550 if (warning) { |
529 values.assign(1, l10n_util::GetStringUTF16(warning)); | 551 values->assign(1, l10n_util::GetStringUTF16(warning)); |
530 labels.assign(1, base::string16()); | 552 labels->assign(1, base::string16()); |
531 icons.assign(1, base::string16()); | 553 icons->assign(1, base::string16()); |
532 unique_ids.assign(1, | 554 unique_ids->assign(1, |
533 WebKit::WebAutofillClient::MenuItemIDWarningMessage); | 555 WebKit::WebAutofillClient::MenuItemIDWarningMessage); |
534 } else { | 556 } else { |
535 bool section_is_autofilled = | 557 bool section_is_autofilled = |
536 SectionIsAutofilled(*form_structure, form, | 558 SectionIsAutofilled(*form_structure, form, |
537 autofill_field->section()); | 559 autofill_field->section()); |
538 if (section_is_autofilled) { | 560 if (section_is_autofilled) { |
539 // If the relevant section is auto-filled and the renderer is querying | 561 // If the relevant section is auto-filled and the renderer is querying |
540 // for suggestions, then the user is editing the value of a field. | 562 // for suggestions, then the user is editing the value of a field. |
541 // In this case, mimic autocomplete: don't display labels or icons, | 563 // In this case, mimic autocomplete: don't display labels or icons, |
542 // as that information is redundant. | 564 // as that information is redundant. |
543 labels.assign(labels.size(), base::string16()); | 565 labels->assign(labels->size(), base::string16()); |
544 icons.assign(icons.size(), base::string16()); | 566 icons->assign(icons->size(), base::string16()); |
545 } | 567 } |
546 | 568 |
547 // When filling credit card suggestions, the values and labels are | 569 // When filling credit card suggestions, the values and labels are |
548 // typically obfuscated, which makes detecting duplicates hard. Since | 570 // typically obfuscated, which makes detecting duplicates hard. Since |
549 // duplicates only tend to be a problem when filling address forms | 571 // duplicates only tend to be a problem when filling address forms |
550 // anyway, only don't de-dup credit card suggestions. | 572 // anyway, only don't de-dup credit card suggestions. |
551 if (!is_filling_credit_card) | 573 if (!is_filling_credit_card) |
552 RemoveDuplicateSuggestions(&values, &labels, &icons, &unique_ids); | 574 RemoveDuplicateSuggestions(values, labels, icons, unique_ids); |
553 | 575 |
554 // The first time we show suggestions on this page, log the number of | 576 // The first time we show suggestions on this page, log the number of |
555 // suggestions shown. | 577 // suggestions shown. |
556 if (!has_logged_address_suggestions_count_ && !section_is_autofilled) { | 578 if (!has_logged_address_suggestions_count_ && !section_is_autofilled) { |
557 metric_logger_->LogAddressSuggestionsCount(values.size()); | 579 metric_logger_->LogAddressSuggestionsCount(values->size()); |
558 has_logged_address_suggestions_count_ = true; | 580 has_logged_address_suggestions_count_ = true; |
559 } | 581 } |
560 } | 582 } |
561 } | 583 } |
562 } | 584 } |
563 | |
564 // Add the results from AutoComplete. They come back asynchronously, so we | |
565 // hand off what we generated and they will send the results back to the | |
566 // renderer. | |
567 autocomplete_history_manager_.OnGetAutocompleteSuggestions( | |
568 query_id, field.name, field.value, values, labels, icons, unique_ids); | |
569 } | 585 } |
570 | 586 |
571 void AutofillManager::OnFillAutofillFormData(int query_id, | 587 void AutofillManager::OnFillAutofillFormData(int query_id, |
572 const FormData& form, | 588 const FormData& form, |
573 const FormFieldData& field, | 589 const FormFieldData& field, |
574 int unique_id) { | 590 int unique_id) { |
575 RenderViewHost* host = NULL; | 591 RenderViewHost* host = NULL; |
576 const AutofillDataModel* data_model = NULL; | 592 const AutofillDataModel* data_model = NULL; |
577 size_t variant = 0; | 593 size_t variant = 0; |
578 FormStructure* form_structure = NULL; | 594 FormStructure* form_structure = NULL; |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
857 autocheckout_manager_.OnClickFailed(status); | 873 autocheckout_manager_.OnClickFailed(status); |
858 } | 874 } |
859 | 875 |
860 std::string AutofillManager::GetAutocheckoutURLPrefix() const { | 876 std::string AutofillManager::GetAutocheckoutURLPrefix() const { |
861 if (!web_contents()) | 877 if (!web_contents()) |
862 return std::string(); | 878 return std::string(); |
863 | 879 |
864 autofill::autocheckout::WhitelistManager* whitelist_manager = | 880 autofill::autocheckout::WhitelistManager* whitelist_manager = |
865 manager_delegate_->GetAutocheckoutWhitelistManager(); | 881 manager_delegate_->GetAutocheckoutWhitelistManager(); |
866 | 882 |
867 return whitelist_manager->GetMatchedURLPrefix(web_contents()->GetURL()); | 883 return whitelist_manager ? |
884 whitelist_manager->GetMatchedURLPrefix(web_contents()->GetURL()) : | |
885 std::string(); | |
868 } | 886 } |
869 | 887 |
870 bool AutofillManager::IsAutofillEnabled() const { | 888 bool AutofillManager::IsAutofillEnabled() const { |
871 return manager_delegate_->GetPrefs()->GetBoolean(prefs::kAutofillEnabled); | 889 return manager_delegate_->GetPrefs()->GetBoolean(prefs::kAutofillEnabled) |
890 && !manager_delegate_->ShouldIgnoreFormData() ; | |
Ilya Sherman
2013/06/15 00:28:09
nit: The "&&" should go on the previous line.
sgurun-gerrit only
2013/06/17 21:20:32
Done.
| |
872 } | 891 } |
873 | 892 |
874 void AutofillManager::SendAutofillTypePredictions( | 893 void AutofillManager::SendAutofillTypePredictions( |
875 const std::vector<FormStructure*>& forms) const { | 894 const std::vector<FormStructure*>& forms) const { |
876 if (!CommandLine::ForCurrentProcess()->HasSwitch( | 895 if (!CommandLine::ForCurrentProcess()->HasSwitch( |
877 switches::kShowAutofillTypePredictions)) | 896 switches::kShowAutofillTypePredictions)) |
878 return; | 897 return; |
879 | 898 |
880 RenderViewHost* host = web_contents()->GetRenderViewHost(); | 899 RenderViewHost* host = web_contents()->GetRenderViewHost(); |
881 if (!host) | 900 if (!host) |
882 return; | 901 return; |
883 | 902 |
884 std::vector<FormDataPredictions> type_predictions; | 903 std::vector<FormDataPredictions> type_predictions; |
885 FormStructure::GetFieldTypePredictions(forms, &type_predictions); | 904 FormStructure::GetFieldTypePredictions(forms, &type_predictions); |
886 host->Send( | 905 host->Send( |
887 new AutofillMsg_FieldTypePredictionsAvailable(host->GetRoutingID(), | 906 new AutofillMsg_FieldTypePredictionsAvailable(host->GetRoutingID(), |
888 type_predictions)); | 907 type_predictions)); |
889 } | 908 } |
890 | 909 |
891 void AutofillManager::ImportFormData(const FormStructure& submitted_form) { | 910 void AutofillManager::ImportFormData(const FormStructure& submitted_form) { |
892 const CreditCard* imported_credit_card; | 911 const CreditCard* imported_credit_card; |
912 | |
Ilya Sherman
2013/06/15 00:28:09
nit: Spurious diff.
sgurun-gerrit only
2013/06/17 21:20:32
Done.
| |
893 if (!personal_data_->ImportFormData(submitted_form, &imported_credit_card)) | 913 if (!personal_data_->ImportFormData(submitted_form, &imported_credit_card)) |
894 return; | 914 return; |
895 | 915 |
896 // If credit card information was submitted, we need to confirm whether to | 916 // If credit card information was submitted, we need to confirm whether to |
897 // save it. | 917 // save it. |
898 if (imported_credit_card) { | 918 if (imported_credit_card) { |
899 manager_delegate_->ConfirmSaveCreditCard( | 919 manager_delegate_->ConfirmSaveCreditCard( |
900 *metric_logger_, | 920 *metric_logger_, |
901 *imported_credit_card, | 921 *imported_credit_card, |
902 base::Bind(&PersonalDataManager::SaveImportedCreditCard, | 922 base::Bind(&PersonalDataManager::SaveImportedCreditCard, |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1003 weak_ptr_factory_(this) { | 1023 weak_ptr_factory_(this) { |
1004 DCHECK(web_contents); | 1024 DCHECK(web_contents); |
1005 DCHECK(manager_delegate_); | 1025 DCHECK(manager_delegate_); |
1006 } | 1026 } |
1007 | 1027 |
1008 void AutofillManager::set_metric_logger(const AutofillMetrics* metric_logger) { | 1028 void AutofillManager::set_metric_logger(const AutofillMetrics* metric_logger) { |
1009 metric_logger_.reset(metric_logger); | 1029 metric_logger_.reset(metric_logger); |
1010 } | 1030 } |
1011 | 1031 |
1012 bool AutofillManager::GetHost(RenderViewHost** host) const { | 1032 bool AutofillManager::GetHost(RenderViewHost** host) const { |
1033 | |
Ilya Sherman
2013/06/15 00:28:09
nit: Spurious diff.
sgurun-gerrit only
2013/06/17 21:20:32
Done.
| |
1013 if (!IsAutofillEnabled()) | 1034 if (!IsAutofillEnabled()) |
1014 return false; | 1035 return false; |
1015 | 1036 |
1037 if (!personal_data_) | |
1038 return false; | |
1039 | |
1016 // No autofill data to return if the profiles are empty. | 1040 // No autofill data to return if the profiles are empty. |
1017 if (personal_data_->GetProfiles().empty() && | 1041 if (personal_data_->GetProfiles().empty() && |
1018 personal_data_->GetCreditCards().empty()) { | 1042 personal_data_->GetCreditCards().empty()) { |
1019 return false; | 1043 return false; |
1020 } | 1044 } |
1021 | 1045 |
1022 *host = web_contents()->GetRenderViewHost(); | 1046 *host = web_contents()->GetRenderViewHost(); |
1023 if (!*host) | 1047 if (!*host) |
1024 return false; | 1048 return false; |
1025 | 1049 |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1316 | 1340 |
1317 void AutofillManager::UpdateInitialInteractionTimestamp( | 1341 void AutofillManager::UpdateInitialInteractionTimestamp( |
1318 const TimeTicks& interaction_timestamp) { | 1342 const TimeTicks& interaction_timestamp) { |
1319 if (initial_interaction_timestamp_.is_null() || | 1343 if (initial_interaction_timestamp_.is_null() || |
1320 interaction_timestamp < initial_interaction_timestamp_) { | 1344 interaction_timestamp < initial_interaction_timestamp_) { |
1321 initial_interaction_timestamp_ = interaction_timestamp; | 1345 initial_interaction_timestamp_ = interaction_timestamp; |
1322 } | 1346 } |
1323 } | 1347 } |
1324 | 1348 |
1325 } // namespace autofill | 1349 } // namespace autofill |
OLD | NEW |