Index: components/autofill/content/renderer/form_autofill_util.cc |
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc |
index 57da2255b98710af582f052f05cbed1f4168cdb5..35b23c2a5992665d1cd97c23669ea71554befe18 100644 |
--- a/components/autofill/content/renderer/form_autofill_util.cc |
+++ b/components/autofill/content/renderer/form_autofill_util.cc |
@@ -958,6 +958,7 @@ void PreviewFormField(const FormFieldData& data, |
// [1, kMaxParseableFields]. |
bool ExtractFieldsFromControlElements( |
const WebVector<WebFormControlElement>& control_elements, |
+ const FieldValueAndPropertiesMaskMap* field_value_and_properties_map, |
ExtractMask extract_mask, |
ScopedVector<FormFieldData>* form_fields, |
std::vector<bool>* fields_extracted, |
@@ -974,7 +975,9 @@ bool ExtractFieldsFromControlElements( |
// Create a new FormFieldData, fill it out and map it to the field's name. |
FormFieldData* form_field = new FormFieldData; |
- WebFormControlElementToFormField(control_element, extract_mask, form_field); |
+ WebFormControlElementToFormField(control_element, |
+ field_value_and_properties_map, |
+ extract_mask, form_field); |
form_fields->push_back(form_field); |
(*element_map)[control_element] = form_field; |
(*fields_extracted)[i] = true; |
@@ -1061,6 +1064,7 @@ bool FormOrFieldsetsToFormData( |
const blink::WebFormControlElement* form_control_element, |
const std::vector<blink::WebElement>& fieldsets, |
const WebVector<WebFormControlElement>& control_elements, |
+ const FieldValueAndPropertiesMaskMap* field_value_and_properties_map, |
ExtractMask extract_mask, |
FormData* form, |
FormFieldData* field) { |
@@ -1082,9 +1086,9 @@ bool FormOrFieldsetsToFormData( |
// requirements and thus will be in the resulting |form|. |
std::vector<bool> fields_extracted(control_elements.size(), false); |
- if (!ExtractFieldsFromControlElements(control_elements, extract_mask, |
- &form_fields, &fields_extracted, |
- &element_map)) { |
+ if (!ExtractFieldsFromControlElements( |
+ control_elements, field_value_and_properties_map, extract_mask, |
+ &form_fields, &fields_extracted, &element_map)) { |
return false; |
} |
@@ -1155,14 +1159,16 @@ bool UnownedFormElementsAndFieldSetsToFormData( |
const std::vector<blink::WebFormControlElement>& control_elements, |
const blink::WebFormControlElement* element, |
const blink::WebDocument& document, |
+ const FieldValueAndPropertiesMaskMap* field_value_and_properties_map, |
ExtractMask extract_mask, |
FormData* form, |
FormFieldData* field) { |
form->origin = GetCanonicalOriginForDocument(document); |
form->is_form_tag = false; |
- return FormOrFieldsetsToFormData(nullptr, element, fieldsets, |
- control_elements, extract_mask, form, field); |
+ return FormOrFieldsetsToFormData( |
+ nullptr, element, fieldsets, control_elements, |
+ field_value_and_properties_map, extract_mask, form, field); |
} |
GURL StripAuthAndParams(const GURL& gurl) { |
@@ -1192,7 +1198,7 @@ ScopedLayoutPreventer::~ScopedLayoutPreventer() { |
bool ExtractFormData(const WebFormElement& form_element, FormData* data) { |
return WebFormElementToFormData( |
- form_element, WebFormControlElement(), |
+ form_element, WebFormControlElement(), nullptr, |
static_cast<form_util::ExtractMask>(form_util::EXTRACT_VALUE | |
form_util::EXTRACT_OPTION_TEXT | |
form_util::EXTRACT_OPTIONS), |
@@ -1234,8 +1240,8 @@ bool IsFormVisible(blink::WebFrame* frame, |
if (action_is_empty) { // Both actions are empty, compare all fields. |
FormData extracted_form_data; |
- WebFormElementToFormData(form, WebFormControlElement(), EXTRACT_NONE, |
- &extracted_form_data, nullptr); |
+ WebFormElementToFormData(form, WebFormControlElement(), nullptr, |
+ EXTRACT_NONE, &extracted_form_data, nullptr); |
if (form_data.SameFormAs(extracted_form_data)) { |
return true; // Form still exists. |
} |
@@ -1357,9 +1363,11 @@ std::vector<WebFormControlElement> ExtractAutofillableElementsInForm( |
return ExtractAutofillableElementsFromSet(control_elements); |
} |
-void WebFormControlElementToFormField(const WebFormControlElement& element, |
- ExtractMask extract_mask, |
- FormFieldData* field) { |
+void WebFormControlElementToFormField( |
+ const WebFormControlElement& element, |
+ const FieldValueAndPropertiesMaskMap* field_value_and_properties_map, |
+ ExtractMask extract_mask, |
+ FormFieldData* field) { |
DCHECK(field); |
DCHECK(!element.isNull()); |
CR_DEFINE_STATIC_LOCAL(WebString, kAutocomplete, ("autocomplete")); |
@@ -1387,6 +1395,13 @@ void WebFormControlElementToFormField(const WebFormControlElement& element, |
if (element.hasAttribute(kClass)) |
field->css_classes = element.getAttribute(kClass); |
+ if (field_value_and_properties_map) { |
+ FieldValueAndPropertiesMaskMap::const_iterator it = |
+ field_value_and_properties_map->find(element); |
+ if (it != field_value_and_properties_map->end()) |
+ field->properties_mask = it->second.second; |
+ } |
+ |
if (!IsAutofillableElement(element)) |
return; |
@@ -1457,6 +1472,7 @@ void WebFormControlElementToFormField(const WebFormControlElement& element, |
bool WebFormElementToFormData( |
const blink::WebFormElement& form_element, |
const blink::WebFormControlElement& form_control_element, |
+ const FieldValueAndPropertiesMaskMap* field_value_and_properties_map, |
ExtractMask extract_mask, |
FormData* form, |
FormFieldData* field) { |
@@ -1477,9 +1493,9 @@ bool WebFormElementToFormData( |
form_element.getFormControlElements(control_elements); |
std::vector<blink::WebElement> dummy_fieldset; |
- return FormOrFieldsetsToFormData(&form_element, &form_control_element, |
- dummy_fieldset, control_elements, |
- extract_mask, form, field); |
+ return FormOrFieldsetsToFormData( |
+ &form_element, &form_control_element, dummy_fieldset, control_elements, |
+ field_value_and_properties_map, extract_mask, form, field); |
} |
std::vector<WebFormControlElement> GetUnownedFormFieldElements( |
@@ -1532,8 +1548,8 @@ bool UnownedCheckoutFormElementsAndFieldSetsToFormData( |
if (!lang.empty() && |
!base::StartsWith(lang, "en", base::CompareCase::INSENSITIVE_ASCII)) { |
return UnownedFormElementsAndFieldSetsToFormData( |
- fieldsets, control_elements, element, document, extract_mask, form, |
- field); |
+ fieldsets, control_elements, element, document, nullptr, extract_mask, |
+ form, field); |
} |
// A potential problem is that this only checks document.title(), but should |
@@ -1567,8 +1583,8 @@ bool UnownedCheckoutFormElementsAndFieldSetsToFormData( |
form->is_formless_checkout = true; |
// Found a keyword: treat this as an unowned form. |
return UnownedFormElementsAndFieldSetsToFormData( |
- fieldsets, control_elements, element, document, extract_mask, form, |
- field); |
+ fieldsets, control_elements, element, document, nullptr, extract_mask, |
+ form, field); |
} |
} |
@@ -1586,8 +1602,8 @@ bool UnownedCheckoutFormElementsAndFieldSetsToFormData( |
return false; |
return UnownedFormElementsAndFieldSetsToFormData( |
- fieldsets, elements_with_autocomplete, element, document, extract_mask, |
- form, field); |
+ fieldsets, elements_with_autocomplete, element, document, nullptr, |
+ extract_mask, form, field); |
} |
bool UnownedPasswordFormElementsAndFieldSetsToFormData( |
@@ -1595,12 +1611,13 @@ bool UnownedPasswordFormElementsAndFieldSetsToFormData( |
const std::vector<blink::WebFormControlElement>& control_elements, |
const blink::WebFormControlElement* element, |
const blink::WebDocument& document, |
+ const FieldValueAndPropertiesMaskMap* field_value_and_properties_map, |
ExtractMask extract_mask, |
FormData* form, |
FormFieldData* field) { |
return UnownedFormElementsAndFieldSetsToFormData( |
- fieldsets, control_elements, element, document, extract_mask, form, |
- field); |
+ fieldsets, control_elements, element, document, |
+ field_value_and_properties_map, extract_mask, form, field); |
} |
@@ -1624,11 +1641,8 @@ bool FindFormAndFieldForFormControlElement(const WebFormControlElement& element, |
form, field); |
} |
- return WebFormElementToFormData(form_element, |
- element, |
- extract_mask, |
- form, |
- field); |
+ return WebFormElementToFormData(form_element, element, nullptr, extract_mask, |
+ form, field); |
} |
void FillForm(const FormData& form, const WebFormControlElement& element) { |