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

Side by Side Diff: components/autofill/browser/form_structure.cc

Issue 16164003: Field's server type mapping (using Autofill server response) for forms with checkable elements/pass… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments Created 7 years, 6 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
OLDNEW
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/form_structure.h" 5 #include "components/autofill/browser/form_structure.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 server_experiment_id_("no server response"), 298 server_experiment_id_("no server response"),
299 has_author_specified_types_(false), 299 has_author_specified_types_(false),
300 autocheckout_url_prefix_(autocheckout_url_prefix), 300 autocheckout_url_prefix_(autocheckout_url_prefix),
301 filled_by_autocheckout_(false) { 301 filled_by_autocheckout_(false) {
302 // Copy the form fields. 302 // Copy the form fields.
303 std::map<base::string16, size_t> unique_names; 303 std::map<base::string16, size_t> unique_names;
304 for (std::vector<FormFieldData>::const_iterator field = 304 for (std::vector<FormFieldData>::const_iterator field =
305 form.fields.begin(); 305 form.fields.begin();
306 field != form.fields.end(); field++) { 306 field != form.fields.end(); field++) {
307 307
308 // Skip checkable and password elements when Autocheckout is not enabled, 308 if (!ShouldSkipField(*field)) {
309 // else these fields will interfere with existing field signatures with
310 // Autofill servers.
311 if ((!field->is_checkable && field->form_control_type != "password") ||
312 IsAutocheckoutEnabled()) {
313 // Add all supported form fields (including with empty names) to the 309 // Add all supported form fields (including with empty names) to the
314 // signature. This is a requirement for Autofill servers. 310 // signature. This is a requirement for Autofill servers.
315 form_signature_field_names_.append("&"); 311 form_signature_field_names_.append("&");
316 form_signature_field_names_.append(UTF16ToUTF8(field->name)); 312 form_signature_field_names_.append(UTF16ToUTF8(field->name));
317 313
318 ++active_field_count_; 314 ++active_field_count_;
319 } 315 }
320 316
321 // Generate a unique name for this field by appending a counter to the name. 317 // Generate a unique name for this field by appending a counter to the name.
322 // Make sure to prepend the counter with a non-numeric digit so that we are 318 // Make sure to prepend the counter with a non-numeric digit so that we are
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 // Copy the field types into the actual form. 548 // Copy the field types into the actual form.
553 std::vector<AutofillServerFieldInfo>::iterator current_info = 549 std::vector<AutofillServerFieldInfo>::iterator current_info =
554 field_infos.begin(); 550 field_infos.begin();
555 for (std::vector<FormStructure*>::const_iterator iter = forms.begin(); 551 for (std::vector<FormStructure*>::const_iterator iter = forms.begin();
556 iter != forms.end(); ++iter) { 552 iter != forms.end(); ++iter) {
557 FormStructure* form = *iter; 553 FormStructure* form = *iter;
558 form->upload_required_ = upload_required; 554 form->upload_required_ = upload_required;
559 form->server_experiment_id_ = experiment_id; 555 form->server_experiment_id_ = experiment_id;
560 556
561 for (std::vector<AutofillField*>::iterator field = form->fields_.begin(); 557 for (std::vector<AutofillField*>::iterator field = form->fields_.begin();
562 field != form->fields_.end(); ++field, ++current_info) { 558 field != form->fields_.end(); ++field) {
559 if (form->ShouldSkipField(**field))
560 continue;
561
563 // In some cases *successful* response does not return all the fields. 562 // In some cases *successful* response does not return all the fields.
564 // Quit the update of the types then. 563 // Quit the update of the types then.
565 if (current_info == field_infos.end()) 564 if (current_info == field_infos.end())
566 break; 565 break;
567 566
568 // UNKNOWN_TYPE is reserved for use by the client. 567 // UNKNOWN_TYPE is reserved for use by the client.
569 DCHECK_NE(current_info->field_type, UNKNOWN_TYPE); 568 DCHECK_NE(current_info->field_type, UNKNOWN_TYPE);
570 569
571 AutofillFieldType heuristic_type = (*field)->type(); 570 AutofillFieldType heuristic_type = (*field)->type();
572 if (heuristic_type != UNKNOWN_TYPE) 571 if (heuristic_type != UNKNOWN_TYPE)
573 heuristics_detected_fillable_field = true; 572 heuristics_detected_fillable_field = true;
574 573
575 (*field)->set_server_type(current_info->field_type); 574 (*field)->set_server_type(current_info->field_type);
576 if (heuristic_type != (*field)->type()) 575 if (heuristic_type != (*field)->type())
577 query_response_overrode_heuristics = true; 576 query_response_overrode_heuristics = true;
578 577
579 // Copy default value into the field if available. 578 // Copy default value into the field if available.
580 if (!current_info->default_value.empty()) 579 if (!current_info->default_value.empty())
581 (*field)->set_default_value(current_info->default_value); 580 (*field)->set_default_value(current_info->default_value);
581
582 ++current_info;
582 } 583 }
583 584
584 form->UpdateAutofillCount(); 585 form->UpdateAutofillCount();
585 form->IdentifySections(false); 586 form->IdentifySections(false);
586 } 587 }
587 588
588 AutofillMetrics::ServerQueryMetric metric; 589 AutofillMetrics::ServerQueryMetric metric;
589 if (query_response_overrode_heuristics) { 590 if (query_response_overrode_heuristics) {
590 if (heuristics_detected_fillable_field) { 591 if (heuristics_detected_fillable_field) {
591 metric = AutofillMetrics::QUERY_RESPONSE_OVERRODE_LOCAL_HEURISTICS; 592 metric = AutofillMetrics::QUERY_RESPONSE_OVERRODE_LOCAL_HEURISTICS;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
650 UTF16ToUTF8(form_name_) + 651 UTF16ToUTF8(form_name_) +
651 form_signature_field_names_; 652 form_signature_field_names_;
652 653
653 return Hash64Bit(form_string); 654 return Hash64Bit(form_string);
654 } 655 }
655 656
656 bool FormStructure::IsAutocheckoutEnabled() const { 657 bool FormStructure::IsAutocheckoutEnabled() const {
657 return !autocheckout_url_prefix_.empty(); 658 return !autocheckout_url_prefix_.empty();
658 } 659 }
659 660
661 bool FormStructure::ShouldSkipField(const FormFieldData field) const {
662 return (field.is_checkable || field.form_control_type == "password") &&
663 !IsAutocheckoutEnabled();
664 }
665
660 size_t FormStructure::RequiredFillableFields() const { 666 size_t FormStructure::RequiredFillableFields() const {
661 return IsAutocheckoutEnabled() ? 0 : kRequiredAutofillFields; 667 return IsAutocheckoutEnabled() ? 0 : kRequiredAutofillFields;
662 } 668 }
663 669
664 bool FormStructure::IsAutofillable(bool require_method_post) const { 670 bool FormStructure::IsAutofillable(bool require_method_post) const {
665 if (autofill_count() < RequiredFillableFields()) 671 if (autofill_count() < RequiredFillableFields())
666 return false; 672 return false;
667 673
668 return ShouldBeParsed(require_method_post); 674 return ShouldBeParsed(require_method_post);
669 } 675 }
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
1019 return false; 1025 return false;
1020 1026
1021 // Add the child nodes for the form fields. 1027 // Add the child nodes for the form fields.
1022 for (size_t index = 0; index < field_count(); ++index) { 1028 for (size_t index = 0; index < field_count(); ++index) {
1023 const AutofillField* field = fields_[index]; 1029 const AutofillField* field = fields_[index];
1024 switch (request_type) { 1030 switch (request_type) {
1025 case FormStructure::UPLOAD: 1031 case FormStructure::UPLOAD:
1026 EncodeFieldForUpload(*field, encompassing_xml_element); 1032 EncodeFieldForUpload(*field, encompassing_xml_element);
1027 break; 1033 break;
1028 case FormStructure::QUERY: 1034 case FormStructure::QUERY:
1029 // Skip putting checkable and password fields in the request if 1035 if (ShouldSkipField(*field))
1030 // Autocheckout is not enabled.
1031 if ((field->is_checkable || field->form_control_type == "password") &&
1032 !IsAutocheckoutEnabled())
1033 continue; 1036 continue;
1034 EncodeFieldForQuery(*field, encompassing_xml_element); 1037 EncodeFieldForQuery(*field, encompassing_xml_element);
1035 break; 1038 break;
1036 case FormStructure::FIELD_ASSIGNMENTS: 1039 case FormStructure::FIELD_ASSIGNMENTS:
1037 EncodeFieldForFieldAssignments(*field, encompassing_xml_element); 1040 EncodeFieldForFieldAssignments(*field, encompassing_xml_element);
1038 break; 1041 break;
1039 } 1042 }
1040 } 1043 }
1041 return true; 1044 return true;
1042 } 1045 }
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
1210 AutofillType::FieldTypeGroup field_type_group = 1213 AutofillType::FieldTypeGroup field_type_group =
1211 AutofillType((*field)->type()).group(); 1214 AutofillType((*field)->type()).group();
1212 if (field_type_group == AutofillType::CREDIT_CARD) 1215 if (field_type_group == AutofillType::CREDIT_CARD)
1213 (*field)->set_section((*field)->section() + "-cc"); 1216 (*field)->set_section((*field)->section() + "-cc");
1214 else 1217 else
1215 (*field)->set_section((*field)->section() + "-default"); 1218 (*field)->set_section((*field)->section() + "-default");
1216 } 1219 }
1217 } 1220 }
1218 1221
1219 } // namespace autofill 1222 } // namespace autofill
OLDNEW
« no previous file with comments | « components/autofill/browser/form_structure.h ('k') | components/autofill/browser/form_structure_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698