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/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 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 // Skip checkable and password elements when Autocheckout is not enabled, |
309 // else these fields will interfere with existing field signatures with | 309 // else these fields will interfere with existing field signatures with |
310 // Autofill servers. | 310 // Autofill servers. |
Evan Stade
2013/05/28 19:24:07
I don't think the comment above each call to Shoul
Raman Kakilate
2013/05/28 20:38:44
Done.
| |
311 if ((!field->is_checkable && field->form_control_type != "password") || | 311 if (!ShouldSkipField(*field)) { |
312 IsAutocheckoutEnabled()) { | |
313 // Add all supported form fields (including with empty names) to the | 312 // Add all supported form fields (including with empty names) to the |
314 // signature. This is a requirement for Autofill servers. | 313 // signature. This is a requirement for Autofill servers. |
315 form_signature_field_names_.append("&"); | 314 form_signature_field_names_.append("&"); |
316 form_signature_field_names_.append(UTF16ToUTF8(field->name)); | 315 form_signature_field_names_.append(UTF16ToUTF8(field->name)); |
317 | 316 |
318 ++active_field_count_; | 317 ++active_field_count_; |
319 } | 318 } |
320 | 319 |
321 // Generate a unique name for this field by appending a counter to the name. | 320 // 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 | 321 // 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 Loading... | |
552 // Copy the field types into the actual form. | 551 // Copy the field types into the actual form. |
553 std::vector<AutofillServerFieldInfo>::iterator current_info = | 552 std::vector<AutofillServerFieldInfo>::iterator current_info = |
554 field_infos.begin(); | 553 field_infos.begin(); |
555 for (std::vector<FormStructure*>::const_iterator iter = forms.begin(); | 554 for (std::vector<FormStructure*>::const_iterator iter = forms.begin(); |
556 iter != forms.end(); ++iter) { | 555 iter != forms.end(); ++iter) { |
557 FormStructure* form = *iter; | 556 FormStructure* form = *iter; |
558 form->upload_required_ = upload_required; | 557 form->upload_required_ = upload_required; |
559 form->server_experiment_id_ = experiment_id; | 558 form->server_experiment_id_ = experiment_id; |
560 | 559 |
561 for (std::vector<AutofillField*>::iterator field = form->fields_.begin(); | 560 for (std::vector<AutofillField*>::iterator field = form->fields_.begin(); |
562 field != form->fields_.end(); ++field, ++current_info) { | 561 field != form->fields_.end(); ++field) { |
562 // Skip putting checkable and password fields in the request if | |
563 // Autocheckout is not enabled. | |
564 if (form->ShouldSkipField(**field)) | |
565 continue; | |
566 | |
563 // In some cases *successful* response does not return all the fields. | 567 // In some cases *successful* response does not return all the fields. |
564 // Quit the update of the types then. | 568 // Quit the update of the types then. |
565 if (current_info == field_infos.end()) | 569 if (current_info == field_infos.end()) |
566 break; | 570 break; |
567 | 571 |
568 // UNKNOWN_TYPE is reserved for use by the client. | 572 // UNKNOWN_TYPE is reserved for use by the client. |
569 DCHECK_NE(current_info->field_type, UNKNOWN_TYPE); | 573 DCHECK_NE(current_info->field_type, UNKNOWN_TYPE); |
570 | 574 |
571 AutofillFieldType heuristic_type = (*field)->type(); | 575 AutofillFieldType heuristic_type = (*field)->type(); |
572 if (heuristic_type != UNKNOWN_TYPE) | 576 if (heuristic_type != UNKNOWN_TYPE) |
573 heuristics_detected_fillable_field = true; | 577 heuristics_detected_fillable_field = true; |
574 | 578 |
575 (*field)->set_server_type(current_info->field_type); | 579 (*field)->set_server_type(current_info->field_type); |
576 if (heuristic_type != (*field)->type()) | 580 if (heuristic_type != (*field)->type()) |
577 query_response_overrode_heuristics = true; | 581 query_response_overrode_heuristics = true; |
578 | 582 |
579 // Copy default value into the field if available. | 583 // Copy default value into the field if available. |
580 if (!current_info->default_value.empty()) | 584 if (!current_info->default_value.empty()) |
581 (*field)->set_default_value(current_info->default_value); | 585 (*field)->set_default_value(current_info->default_value); |
586 | |
587 ++current_info; | |
582 } | 588 } |
583 | 589 |
584 form->UpdateAutofillCount(); | 590 form->UpdateAutofillCount(); |
585 form->IdentifySections(false); | 591 form->IdentifySections(false); |
586 } | 592 } |
587 | 593 |
588 AutofillMetrics::ServerQueryMetric metric; | 594 AutofillMetrics::ServerQueryMetric metric; |
589 if (query_response_overrode_heuristics) { | 595 if (query_response_overrode_heuristics) { |
590 if (heuristics_detected_fillable_field) { | 596 if (heuristics_detected_fillable_field) { |
591 metric = AutofillMetrics::QUERY_RESPONSE_OVERRODE_LOCAL_HEURISTICS; | 597 metric = AutofillMetrics::QUERY_RESPONSE_OVERRODE_LOCAL_HEURISTICS; |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
650 UTF16ToUTF8(form_name_) + | 656 UTF16ToUTF8(form_name_) + |
651 form_signature_field_names_; | 657 form_signature_field_names_; |
652 | 658 |
653 return Hash64Bit(form_string); | 659 return Hash64Bit(form_string); |
654 } | 660 } |
655 | 661 |
656 bool FormStructure::IsAutocheckoutEnabled() const { | 662 bool FormStructure::IsAutocheckoutEnabled() const { |
657 return !autocheckout_url_prefix_.empty(); | 663 return !autocheckout_url_prefix_.empty(); |
658 } | 664 } |
659 | 665 |
666 bool FormStructure::ShouldSkipField(const FormFieldData field) const { | |
667 return ((field.is_checkable || field.form_control_type == "password") && | |
Evan Stade
2013/05/28 19:24:07
nit: no need for outer parens
Raman Kakilate
2013/05/28 20:38:44
Done.
| |
668 !IsAutocheckoutEnabled()); | |
669 } | |
670 | |
660 size_t FormStructure::RequiredFillableFields() const { | 671 size_t FormStructure::RequiredFillableFields() const { |
661 return IsAutocheckoutEnabled() ? 0 : kRequiredAutofillFields; | 672 return IsAutocheckoutEnabled() ? 0 : kRequiredAutofillFields; |
662 } | 673 } |
663 | 674 |
664 bool FormStructure::IsAutofillable(bool require_method_post) const { | 675 bool FormStructure::IsAutofillable(bool require_method_post) const { |
665 if (autofill_count() < RequiredFillableFields()) | 676 if (autofill_count() < RequiredFillableFields()) |
666 return false; | 677 return false; |
667 | 678 |
668 return ShouldBeParsed(require_method_post); | 679 return ShouldBeParsed(require_method_post); |
669 } | 680 } |
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1021 // Add the child nodes for the form fields. | 1032 // Add the child nodes for the form fields. |
1022 for (size_t index = 0; index < field_count(); ++index) { | 1033 for (size_t index = 0; index < field_count(); ++index) { |
1023 const AutofillField* field = fields_[index]; | 1034 const AutofillField* field = fields_[index]; |
1024 switch (request_type) { | 1035 switch (request_type) { |
1025 case FormStructure::UPLOAD: | 1036 case FormStructure::UPLOAD: |
1026 EncodeFieldForUpload(*field, encompassing_xml_element); | 1037 EncodeFieldForUpload(*field, encompassing_xml_element); |
1027 break; | 1038 break; |
1028 case FormStructure::QUERY: | 1039 case FormStructure::QUERY: |
1029 // Skip putting checkable and password fields in the request if | 1040 // Skip putting checkable and password fields in the request if |
1030 // Autocheckout is not enabled. | 1041 // Autocheckout is not enabled. |
1031 if ((field->is_checkable || field->form_control_type == "password") && | 1042 if (ShouldSkipField(*field)) |
1032 !IsAutocheckoutEnabled()) | |
1033 continue; | 1043 continue; |
1034 EncodeFieldForQuery(*field, encompassing_xml_element); | 1044 EncodeFieldForQuery(*field, encompassing_xml_element); |
1035 break; | 1045 break; |
1036 case FormStructure::FIELD_ASSIGNMENTS: | 1046 case FormStructure::FIELD_ASSIGNMENTS: |
1037 EncodeFieldForFieldAssignments(*field, encompassing_xml_element); | 1047 EncodeFieldForFieldAssignments(*field, encompassing_xml_element); |
1038 break; | 1048 break; |
1039 } | 1049 } |
1040 } | 1050 } |
1041 return true; | 1051 return true; |
1042 } | 1052 } |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1210 AutofillType::FieldTypeGroup field_type_group = | 1220 AutofillType::FieldTypeGroup field_type_group = |
1211 AutofillType((*field)->type()).group(); | 1221 AutofillType((*field)->type()).group(); |
1212 if (field_type_group == AutofillType::CREDIT_CARD) | 1222 if (field_type_group == AutofillType::CREDIT_CARD) |
1213 (*field)->set_section((*field)->section() + "-cc"); | 1223 (*field)->set_section((*field)->section() + "-cc"); |
1214 else | 1224 else |
1215 (*field)->set_section((*field)->section() + "-default"); | 1225 (*field)->set_section((*field)->section() + "-default"); |
1216 } | 1226 } |
1217 } | 1227 } |
1218 | 1228 |
1219 } // namespace autofill | 1229 } // namespace autofill |
OLD | NEW |