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

Side by Side Diff: chrome/browser/autofill/autofill_manager.cc

Issue 5963004: Add autofill metrics to dig into the failure case. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix test Created 9 years, 11 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/autofill/autofill_manager.h ('k') | chrome/browser/autofill/autofill_metrics.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 if (!form.user_submitted) 202 if (!form.user_submitted)
203 return; 203 return;
204 204
205 // Grab a copy of the form data. 205 // Grab a copy of the form data.
206 upload_form_structure_.reset(new FormStructure(form)); 206 upload_form_structure_.reset(new FormStructure(form));
207 207
208 // Disregard forms that we wouldn't ever autofill in the first place. 208 // Disregard forms that we wouldn't ever autofill in the first place.
209 if (!upload_form_structure_->ShouldBeParsed(true)) 209 if (!upload_form_structure_->ShouldBeParsed(true))
210 return; 210 return;
211 211
212 DeterminePossibleFieldTypesForUpload(); 212 FormStructure* cached_upload_form_structure = NULL;
213 AutoFillField* ignored;
214 if (!FindCachedFormAndField(form, form.fields.front(),
215 &cached_upload_form_structure, &ignored)) {
216 cached_upload_form_structure = NULL;
217 }
218
219 DeterminePossibleFieldTypesForUpload(cached_upload_form_structure);
213 // TODO(isherman): Consider uploading to server here rather than in 220 // TODO(isherman): Consider uploading to server here rather than in
214 // HandleSubmit(). 221 // HandleSubmit().
215 222
216 if (!upload_form_structure_->IsAutoFillable(true)) 223 if (!upload_form_structure_->IsAutoFillable(true))
217 return; 224 return;
218 225
219 HandleSubmit(); 226 HandleSubmit();
220 } 227 }
221 228
222 void AutoFillManager::OnFormsSeen(const std::vector<FormData>& forms) { 229 void AutoFillManager::OnFormsSeen(const std::vector<FormData>& forms) {
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 if (prefs->FindPreference(prefs::kFormAutofillEnabled)) { 486 if (prefs->FindPreference(prefs::kFormAutofillEnabled)) {
480 bool enabled = prefs->GetBoolean(prefs::kFormAutofillEnabled); 487 bool enabled = prefs->GetBoolean(prefs::kFormAutofillEnabled);
481 prefs->ClearPref(prefs::kFormAutofillEnabled); 488 prefs->ClearPref(prefs::kFormAutofillEnabled);
482 prefs->SetBoolean(prefs::kAutoFillEnabled, enabled); 489 prefs->SetBoolean(prefs::kAutoFillEnabled, enabled);
483 return enabled; 490 return enabled;
484 } 491 }
485 492
486 return prefs->GetBoolean(prefs::kAutoFillEnabled); 493 return prefs->GetBoolean(prefs::kAutoFillEnabled);
487 } 494 }
488 495
489 void AutoFillManager::DeterminePossibleFieldTypesForUpload() { 496 void AutoFillManager::DeterminePossibleFieldTypesForUpload(
497 const FormStructure* cached_upload_form_structure) {
490 for (size_t i = 0; i < upload_form_structure_->field_count(); i++) { 498 for (size_t i = 0; i < upload_form_structure_->field_count(); i++) {
491 const AutoFillField* field = upload_form_structure_->field(i); 499 const AutoFillField* field = upload_form_structure_->field(i);
492 FieldTypeSet field_types; 500 FieldTypeSet field_types;
493 GetPersonalDataManager()->GetPossibleFieldTypes( 501 GetPersonalDataManager()->GetPossibleFieldTypes(
494 field->value(), &field_types); 502 field->value(), &field_types);
495 DCHECK(!field_types.empty()); 503 DCHECK(!field_types.empty());
496 upload_form_structure_->set_possible_types(i, field_types); 504 upload_form_structure_->set_possible_types(i, field_types);
497 505
498 if (field->form_control_type() == ASCIIToUTF16("select-one")) { 506 if (field->form_control_type() == ASCIIToUTF16("select-one")) {
499 // TODO(isherman): <select> fields don't support |is_autofilled()|. Since 507 // TODO(isherman): <select> fields don't support |is_autofilled()|. Since
500 // this is heavily relied upon by our metrics, we just don't log anything 508 // this is heavily relied upon by our metrics, we just don't log anything
501 // for all <select> fields. Better to have less data than misleading data. 509 // for all <select> fields. Better to have less data than misleading data.
502 continue; 510 continue;
503 } 511 }
504 512
505 // Log various quality metrics. 513 // Log various quality metrics.
506 metric_logger_->Log(AutoFillMetrics::FIELD_SUBMITTED); 514 metric_logger_->Log(AutoFillMetrics::FIELD_SUBMITTED);
507 if (field_types.find(EMPTY_TYPE) == field_types.end() && 515 if (field_types.find(EMPTY_TYPE) == field_types.end() &&
508 field_types.find(UNKNOWN_TYPE) == field_types.end()) { 516 field_types.find(UNKNOWN_TYPE) == field_types.end()) {
509 if (field->is_autofilled()) 517 if (field->is_autofilled()) {
510 metric_logger_->Log(AutoFillMetrics::FIELD_AUTOFILLED); 518 metric_logger_->Log(AutoFillMetrics::FIELD_AUTOFILLED);
511 else 519 } else {
512 metric_logger_->Log(AutoFillMetrics::FIELD_AUTOFILL_FAILED); 520 metric_logger_->Log(AutoFillMetrics::FIELD_AUTOFILL_FAILED);
521
522 AutoFillFieldType heuristic_type = cached_upload_form_structure?
523 cached_upload_form_structure->field(i)->heuristic_type() :
524 UNKNOWN_TYPE;
525 if (heuristic_type == UNKNOWN_TYPE)
526 metric_logger_->Log(AutoFillMetrics::FIELD_HEURISTIC_TYPE_UNKNOWN);
527 else if (field_types.count(heuristic_type))
528 metric_logger_->Log(AutoFillMetrics::FIELD_HEURISTIC_TYPE_MATCH);
529 else
530 metric_logger_->Log(AutoFillMetrics::FIELD_HEURISTIC_TYPE_MISMATCH);
531
532 AutoFillFieldType server_type = cached_upload_form_structure?
533 cached_upload_form_structure->field(i)->server_type() :
534 NO_SERVER_DATA;
535 if (server_type == NO_SERVER_DATA)
536 metric_logger_->Log(AutoFillMetrics::FIELD_SERVER_TYPE_UNKNOWN);
537 else if (field_types.count(server_type))
538 metric_logger_->Log(AutoFillMetrics::FIELD_SERVER_TYPE_MATCH);
539 else
540 metric_logger_->Log(AutoFillMetrics::FIELD_SERVER_TYPE_MISMATCH);
541 }
542
513 543
514 // TODO(isherman): Other things we might want to log here: 544 // TODO(isherman): Other things we might want to log here:
515 // * Did the field's heuristic type match the PDM type?
516 // * Per Vadim's email, a combination of (1) whether heuristics fired, 545 // * Per Vadim's email, a combination of (1) whether heuristics fired,
517 // (2) whether the server returned something interesting, (3) whether 546 // (2) whether the server returned something interesting, (3) whether
518 // the user filled the field 547 // the user filled the field
519 // * Whether the server type matches the heursitic type 548 // * Whether the server type matches the heursitic type
520 // - Perhaps only if at least one of the types is not unknown/no data. 549 // - Perhaps only if at least one of the types is not unknown/no data.
521 } 550 }
522 } 551 }
523 } 552 }
524 553
525 void AutoFillManager::HandleSubmit() { 554 void AutoFillManager::HandleSubmit() {
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 return true; 645 return true;
617 } 646 }
618 647
619 bool AutoFillManager::FindCachedFormAndField(const FormData& form, 648 bool AutoFillManager::FindCachedFormAndField(const FormData& form,
620 const FormField& field, 649 const FormField& field,
621 FormStructure** form_structure, 650 FormStructure** form_structure,
622 AutoFillField** autofill_field) { 651 AutoFillField** autofill_field) {
623 // Find the FormStructure that corresponds to |form|. 652 // Find the FormStructure that corresponds to |form|.
624 *form_structure = NULL; 653 *form_structure = NULL;
625 for (std::vector<FormStructure*>::const_iterator iter = 654 for (std::vector<FormStructure*>::const_iterator iter =
626 form_structures_.begin(); 655 form_structures_.begin();
627 iter != form_structures_.end(); ++iter) { 656 iter != form_structures_.end(); ++iter) {
628 if (**iter == form) { 657 if (**iter == form) {
629 *form_structure = *iter; 658 *form_structure = *iter;
630 break; 659 break;
631 } 660 }
632 } 661 }
633 662
634 if (!(*form_structure)) 663 if (!(*form_structure))
635 return false; 664 return false;
636 665
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 field->max_length() == PhoneNumber::kSuffixLength) { 805 field->max_length() == PhoneNumber::kSuffixLength) {
777 number = number.substr(PhoneNumber::kSuffixOffset, 806 number = number.substr(PhoneNumber::kSuffixOffset,
778 PhoneNumber::kSuffixLength); 807 PhoneNumber::kSuffixLength);
779 field->set_value(number); 808 field->set_value(number);
780 } else { 809 } else {
781 field->set_value(number); 810 field->set_value(number);
782 } 811 }
783 } 812 }
784 813
785 void AutoFillManager::ParseForms(const std::vector<FormData>& forms) { 814 void AutoFillManager::ParseForms(const std::vector<FormData>& forms) {
786 std::vector<FormStructure *> non_queryable_forms; 815 std::vector<FormStructure*> non_queryable_forms;
787 for (std::vector<FormData>::const_iterator iter = forms.begin(); 816 for (std::vector<FormData>::const_iterator iter = forms.begin();
788 iter != forms.end(); ++iter) { 817 iter != forms.end(); ++iter) {
789 scoped_ptr<FormStructure> form_structure(new FormStructure(*iter)); 818 scoped_ptr<FormStructure> form_structure(new FormStructure(*iter));
790 if (!form_structure->ShouldBeParsed(false)) 819 if (!form_structure->ShouldBeParsed(false))
791 continue; 820 continue;
792 821
793 // Set aside forms with method GET so that they are not included in the 822 // Set aside forms with method GET so that they are not included in the
794 // query to the server. 823 // query to the server.
795 if (form_structure->ShouldBeParsed(true)) 824 if (form_structure->ShouldBeParsed(true))
796 form_structures_.push_back(form_structure.release()); 825 form_structures_.push_back(form_structure.release());
797 else 826 else
798 non_queryable_forms.push_back(form_structure.release()); 827 non_queryable_forms.push_back(form_structure.release());
799 } 828 }
800 829
801 // If none of the forms were parsed, no use querying the server. 830 // If none of the forms were parsed, no use querying the server.
802 if (!form_structures_.empty() && !disable_download_manager_requests_) { 831 if (!form_structures_.empty() && !disable_download_manager_requests_)
803 download_manager_.StartQueryRequest(form_structures_, 832 download_manager_.StartQueryRequest(form_structures_, *metric_logger_);
804 *metric_logger_);
805 }
806 833
807 for (std::vector<FormStructure *>::const_iterator iter = 834 for (std::vector<FormStructure*>::const_iterator iter =
808 non_queryable_forms.begin(); 835 non_queryable_forms.begin();
809 iter != non_queryable_forms.end(); ++iter) { 836 iter != non_queryable_forms.end(); ++iter) {
810 form_structures_.push_back(*iter); 837 form_structures_.push_back(*iter);
811 } 838 }
812 } 839 }
813 840
814 // When sending IDs (across processes) to the renderer we pack credit card and 841 // When sending IDs (across processes) to the renderer we pack credit card and
815 // profile IDs into a single integer. Credit card IDs are sent in the high 842 // profile IDs into a single integer. Credit card IDs are sent in the high
816 // word and profile IDs are sent in the low word. 843 // word and profile IDs are sent in the low word.
817 int AutoFillManager::PackGUIDs(const std::string& cc_guid, 844 int AutoFillManager::PackGUIDs(const std::string& cc_guid,
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
860 return std::string(); 887 return std::string();
861 888
862 std::map<int, std::string>::const_iterator iter = id_guid_map_.find(id); 889 std::map<int, std::string>::const_iterator iter = id_guid_map_.find(id);
863 if (iter == id_guid_map_.end()) { 890 if (iter == id_guid_map_.end()) {
864 NOTREACHED(); 891 NOTREACHED();
865 return std::string(); 892 return std::string();
866 } 893 }
867 894
868 return iter->second; 895 return iter->second;
869 } 896 }
OLDNEW
« no previous file with comments | « chrome/browser/autofill/autofill_manager.h ('k') | chrome/browser/autofill/autofill_metrics.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698