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 <limits> | 7 #include <limits> |
8 #include <map> | 8 #include <map> |
9 #include <set> | 9 #include <set> |
10 #include <utility> | 10 #include <utility> |
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
491 FieldTypeSet field_types; | 491 FieldTypeSet field_types; |
492 personal_data_->GetPossibleFieldTypes(field->value(), &field_types); | 492 personal_data_->GetPossibleFieldTypes(field->value(), &field_types); |
493 DCHECK(!field_types.empty()); | 493 DCHECK(!field_types.empty()); |
494 submitted_form->set_possible_types(i, field_types); | 494 submitted_form->set_possible_types(i, field_types); |
495 } | 495 } |
496 } | 496 } |
497 | 497 |
498 void AutoFillManager::LogMetricsAboutSubmittedForm( | 498 void AutoFillManager::LogMetricsAboutSubmittedForm( |
499 const FormData& form, | 499 const FormData& form, |
500 const FormStructure* submitted_form) { | 500 const FormStructure* submitted_form) { |
501 FormStructure* cached_submitted_form = NULL; | 501 FormStructure* cached_submitted_form; |
502 AutoFillField* ignored; | 502 if (!FindCachedForm(form, &cached_submitted_form)) { |
503 if (!FindCachedFormAndField(form, form.fields.front(), | 503 NOTREACHED(); |
504 &cached_submitted_form, &ignored)) { | 504 return; |
505 cached_submitted_form = NULL; | |
506 } | 505 } |
507 | 506 |
508 for (size_t i = 0; i < submitted_form->field_count(); i++) { | 507 // Map from field signatures to cached fields. |
| 508 std::map<std::string, const AutoFillField*> cached_fields; |
| 509 for (size_t i = 0; i < cached_submitted_form->field_count(); ++i) { |
| 510 const AutoFillField* field = cached_submitted_form->field(i); |
| 511 cached_fields[field->FieldSignature()] = field; |
| 512 } |
| 513 |
| 514 for (size_t i = 0; i < submitted_form->field_count(); ++i) { |
509 const AutoFillField* field = submitted_form->field(i); | 515 const AutoFillField* field = submitted_form->field(i); |
510 FieldTypeSet field_types; | 516 FieldTypeSet field_types; |
511 personal_data_->GetPossibleFieldTypes(field->value(), &field_types); | 517 personal_data_->GetPossibleFieldTypes(field->value(), &field_types); |
512 DCHECK(!field_types.empty()); | 518 DCHECK(!field_types.empty()); |
513 | 519 |
514 if (field->form_control_type() == ASCIIToUTF16("select-one")) { | 520 if (field->form_control_type() == ASCIIToUTF16("select-one")) { |
515 // TODO(isherman): <select> fields don't support |is_autofilled()|. Since | 521 // TODO(isherman): <select> fields don't support |is_autofilled()|. Since |
516 // this is heavily relied upon by our metrics, we just don't log anything | 522 // this is heavily relied upon by our metrics, we just don't log anything |
517 // for all <select> fields. Better to have less data than misleading data. | 523 // for all <select> fields. Better to have less data than misleading data. |
518 continue; | 524 continue; |
519 } | 525 } |
520 | 526 |
521 // Log various quality metrics. | 527 // Log various quality metrics. |
522 metric_logger_->Log(AutoFillMetrics::FIELD_SUBMITTED); | 528 metric_logger_->Log(AutoFillMetrics::FIELD_SUBMITTED); |
523 if (field_types.find(EMPTY_TYPE) == field_types.end() && | 529 if (field_types.find(EMPTY_TYPE) == field_types.end() && |
524 field_types.find(UNKNOWN_TYPE) == field_types.end()) { | 530 field_types.find(UNKNOWN_TYPE) == field_types.end()) { |
525 if (field->is_autofilled()) { | 531 if (field->is_autofilled()) { |
526 metric_logger_->Log(AutoFillMetrics::FIELD_AUTOFILLED); | 532 metric_logger_->Log(AutoFillMetrics::FIELD_AUTOFILLED); |
527 } else { | 533 } else { |
528 metric_logger_->Log(AutoFillMetrics::FIELD_AUTOFILL_FAILED); | 534 metric_logger_->Log(AutoFillMetrics::FIELD_AUTOFILL_FAILED); |
529 | 535 |
530 AutoFillFieldType heuristic_type = cached_submitted_form? | 536 AutoFillFieldType heuristic_type = UNKNOWN_TYPE; |
531 cached_submitted_form->field(i)->heuristic_type() : | 537 AutoFillFieldType server_type = NO_SERVER_DATA; |
532 UNKNOWN_TYPE; | 538 std::map<std::string, const AutoFillField*>::const_iterator |
| 539 cached_field = cached_fields.find(field->FieldSignature()); |
| 540 if (cached_field != cached_fields.end()) { |
| 541 heuristic_type = cached_field->second->heuristic_type(); |
| 542 server_type = cached_field->second->server_type(); |
| 543 } |
| 544 |
533 if (heuristic_type == UNKNOWN_TYPE) | 545 if (heuristic_type == UNKNOWN_TYPE) |
534 metric_logger_->Log(AutoFillMetrics::FIELD_HEURISTIC_TYPE_UNKNOWN); | 546 metric_logger_->Log(AutoFillMetrics::FIELD_HEURISTIC_TYPE_UNKNOWN); |
535 else if (field_types.count(heuristic_type)) | 547 else if (field_types.count(heuristic_type)) |
536 metric_logger_->Log(AutoFillMetrics::FIELD_HEURISTIC_TYPE_MATCH); | 548 metric_logger_->Log(AutoFillMetrics::FIELD_HEURISTIC_TYPE_MATCH); |
537 else | 549 else |
538 metric_logger_->Log(AutoFillMetrics::FIELD_HEURISTIC_TYPE_MISMATCH); | 550 metric_logger_->Log(AutoFillMetrics::FIELD_HEURISTIC_TYPE_MISMATCH); |
539 | 551 |
540 AutoFillFieldType server_type = cached_submitted_form? | |
541 cached_submitted_form->field(i)->server_type() : | |
542 NO_SERVER_DATA; | |
543 if (server_type == NO_SERVER_DATA) | 552 if (server_type == NO_SERVER_DATA) |
544 metric_logger_->Log(AutoFillMetrics::FIELD_SERVER_TYPE_UNKNOWN); | 553 metric_logger_->Log(AutoFillMetrics::FIELD_SERVER_TYPE_UNKNOWN); |
545 else if (field_types.count(server_type)) | 554 else if (field_types.count(server_type)) |
546 metric_logger_->Log(AutoFillMetrics::FIELD_SERVER_TYPE_MATCH); | 555 metric_logger_->Log(AutoFillMetrics::FIELD_SERVER_TYPE_MATCH); |
547 else | 556 else |
548 metric_logger_->Log(AutoFillMetrics::FIELD_SERVER_TYPE_MISMATCH); | 557 metric_logger_->Log(AutoFillMetrics::FIELD_SERVER_TYPE_MISMATCH); |
549 } | 558 } |
550 | 559 |
551 // TODO(isherman): Other things we might want to log here: | 560 // TODO(isherman): Other things we might want to log here: |
552 // * Per Vadim's email, a combination of (1) whether heuristics fired, | 561 // * Per Vadim's email, a combination of (1) whether heuristics fired, |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 if (profiles.empty() && credit_cards.empty()) | 652 if (profiles.empty() && credit_cards.empty()) |
644 return false; | 653 return false; |
645 | 654 |
646 *host = tab_contents_->render_view_host(); | 655 *host = tab_contents_->render_view_host(); |
647 if (!*host) | 656 if (!*host) |
648 return false; | 657 return false; |
649 | 658 |
650 return true; | 659 return true; |
651 } | 660 } |
652 | 661 |
653 bool AutoFillManager::FindCachedFormAndField(const FormData& form, | 662 bool AutoFillManager::FindCachedForm(const FormData& form, |
654 const FormField& field, | 663 FormStructure** form_structure) { |
655 FormStructure** form_structure, | |
656 AutoFillField** autofill_field) { | |
657 // Find the FormStructure that corresponds to |form|. | 664 // Find the FormStructure that corresponds to |form|. |
658 *form_structure = NULL; | 665 *form_structure = NULL; |
659 for (std::vector<FormStructure*>::const_iterator iter = | 666 for (std::vector<FormStructure*>::const_iterator iter = |
660 form_structures_.begin(); | 667 form_structures_.begin(); |
661 iter != form_structures_.end(); ++iter) { | 668 iter != form_structures_.end(); ++iter) { |
662 if (**iter == form) { | 669 if (**iter == form) { |
663 *form_structure = *iter; | 670 *form_structure = *iter; |
664 break; | 671 break; |
665 } | 672 } |
666 } | 673 } |
667 | 674 |
668 if (!(*form_structure)) | 675 if (!(*form_structure)) |
669 return false; | 676 return false; |
670 | 677 |
| 678 return true; |
| 679 } |
| 680 |
| 681 bool AutoFillManager::FindCachedFormAndField(const FormData& form, |
| 682 const FormField& field, |
| 683 FormStructure** form_structure, |
| 684 AutoFillField** autofill_field) { |
| 685 // Find the FormStructure that corresponds to |form|. |
| 686 if (!FindCachedForm(form, form_structure)) |
| 687 return false; |
| 688 |
671 // No data to return if there are no auto-fillable fields. | 689 // No data to return if there are no auto-fillable fields. |
672 if (!(*form_structure)->autofill_count()) | 690 if (!(*form_structure)->autofill_count()) |
673 return false; | 691 return false; |
674 | 692 |
675 // Find the AutoFillField that corresponds to |field|. | 693 // Find the AutoFillField that corresponds to |field|. |
676 *autofill_field = NULL; | 694 *autofill_field = NULL; |
677 for (std::vector<AutoFillField*>::const_iterator iter = | 695 for (std::vector<AutoFillField*>::const_iterator iter = |
678 (*form_structure)->begin(); | 696 (*form_structure)->begin(); |
679 iter != (*form_structure)->end(); ++iter) { | 697 iter != (*form_structure)->end(); ++iter) { |
680 // The field list is terminated with a NULL AutoFillField, so don't try to | 698 // The field list is terminated with a NULL AutoFillField, so don't try to |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
892 return std::string(); | 910 return std::string(); |
893 | 911 |
894 std::map<int, std::string>::const_iterator iter = id_guid_map_.find(id); | 912 std::map<int, std::string>::const_iterator iter = id_guid_map_.find(id); |
895 if (iter == id_guid_map_.end()) { | 913 if (iter == id_guid_map_.end()) { |
896 NOTREACHED(); | 914 NOTREACHED(); |
897 return std::string(); | 915 return std::string(); |
898 } | 916 } |
899 | 917 |
900 return iter->second; | 918 return iter->second; |
901 } | 919 } |
OLD | NEW |