Index: chrome/renderer/password_autocomplete_manager.cc |
diff --git a/chrome/renderer/password_autocomplete_manager.cc b/chrome/renderer/password_autocomplete_manager.cc |
index f851f9adb86e96150e0f3131c185187ee8d5b211..83e633485c52235f2c9881fee892e5a500e8e858 100644 |
--- a/chrome/renderer/password_autocomplete_manager.cc |
+++ b/chrome/renderer/password_autocomplete_manager.cc |
@@ -53,21 +53,40 @@ static bool FindFormInputElements(WebKit::WebFormElement* fe, |
for (size_t j = 0; j < data.fields.size(); j++) { |
WebKit::WebVector<WebKit::WebNode> temp_elements; |
fe->getNamedElements(data.fields[j].name(), temp_elements); |
- if (temp_elements.isEmpty()) { |
- // We didn't find a required element. This is not the right form. |
- // Make sure no input elements from a partially matched form in this |
- // iteration remain in the result set. |
- // Note: clear will remove a reference from each InputElement. |
+ |
+ // Match the first input element, if any. |
+ // |getNamedElements| may return non-input elements where the names match, |
+ // so the results are filtered for input elements. |
+ // If more than one match is made, then we have ambiguity (due to misuse |
+ // of "name" attribute) so is it considered not found. |
+ bool found_input = false; |
+ for (size_t i = 0; i < temp_elements.size(); ++i) { |
+ if (temp_elements[i].to<WebKit::WebElement>().hasTagName("input")) { |
+ // Check for a non-unique match. |
+ if (found_input) { |
+ found_input = false; |
+ break; |
+ } |
+ |
+ // This element matched, add it to our temporary result. It's possible |
+ // there are multiple matches, but for purposes of identifying the form |
+ // one suffices and if some function needs to deal with multiple |
+ // matching elements it can get at them through the FormElement*. |
+ // Note: This assignment adds a reference to the InputElement. |
+ result->input_elements[data.fields[j].name()] = |
+ temp_elements[i].to<WebKit::WebInputElement>(); |
+ found_input = true; |
+ } |
+ } |
+ |
+ // A required element was not found. This is not the right form. |
+ // Make sure no input elements from a partially matched form in this |
+ // iteration remain in the result set. |
+ // Note: clear will remove a reference from each InputElement. |
+ if (!found_input) { |
result->input_elements.clear(); |
return false; |
} |
- // This element matched, add it to our temporary result. It's possible there |
- // are multiple matches, but for purposes of identifying the form one |
- // suffices and if some function needs to deal with multiple matching |
- // elements it can get at them through the FormElement*. |
- // Note: This assignment adds a reference to the InputElement. |
- result->input_elements[data.fields[j].name()] = |
- temp_elements[0].to<WebKit::WebInputElement>(); |
} |
return true; |
} |
@@ -128,7 +147,7 @@ bool FillForm(FormElements* fe, const webkit_glue::FormData& data) { |
for (FormInputElementMap::iterator it = fe->input_elements.begin(); |
it != fe->input_elements.end(); ++it) { |
- WebKit::WebInputElement& element = it->second; |
+ WebKit::WebInputElement element = it->second; |
if (!element.value().isEmpty()) // Don't overwrite pre-filled values. |
continue; |
if (element.isPasswordField() && |