diff options
author | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-16 02:59:24 +0000 |
---|---|---|
committer | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-16 02:59:24 +0000 |
commit | a44e6102cd74889a4394516db97a2d7bddd1255d (patch) | |
tree | b49dd494d28f297d2ad44788d34ea66de787b7de /chrome/renderer/form_manager.cc | |
parent | 224e723f497c53daa28657b8bfb98d45b8fc1d78 (diff) | |
download | chromium_src-a44e6102cd74889a4394516db97a2d7bddd1255d.zip chromium_src-a44e6102cd74889a4394516db97a2d7bddd1255d.tar.gz chromium_src-a44e6102cd74889a4394516db97a2d7bddd1255d.tar.bz2 |
AutoFill: Skip past non-matching fields when filling out a form where the number
of FormData fields does not match the number of cached control elements.
BUG=41573
TEST=FormManager.FillForm*
Review URL: http://codereview.chromium.org/1629020
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@44748 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/form_manager.cc')
-rw-r--r-- | chrome/renderer/form_manager.cc | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/chrome/renderer/form_manager.cc b/chrome/renderer/form_manager.cc index 1feab24..144e23d 100644 --- a/chrome/renderer/form_manager.cc +++ b/chrome/renderer/form_manager.cc @@ -391,31 +391,49 @@ bool FormManager::FillForm(const FormData& form) { // one case in the wild where this happens, paypal.com signup form, the fields // are appended to the end of the form and are not visible. - for (size_t i = 0; i < form_element->control_elements.size(); ++i) { + for (size_t i = 0, j = 0; + i < form_element->control_elements.size() && j < form.fields.size(); + ++i, ++j) { + // We assume that the intersection of the fields in + // |form_element->control_elements| and |form.fields| is ordered, but it's + // possible that one or the other sets may have more fields than the other, + // so loop past non-matching fields in the set with more elements. + while (form_element->control_elements[i].nameForAutofill() != + form.fields[j].name()) { + if (form_element->control_elements.size() > form.fields.size()) + ++i; + else if (form.fields.size() > form_element->control_elements.size()) + ++j; + else + NOTREACHED(); + + continue; + } + WebFormControlElement* element = &form_element->control_elements[i]; // It's possible that nameForAutofill() is empty if the form control element // has no name or ID. In that case, iter->nameForAutofill() must also be // empty. - if (form.fields[i].name().empty()) + if (form.fields[j].name().empty()) DCHECK(element->nameForAutofill().isEmpty()); else - DCHECK_EQ(form.fields[i].name(), element->nameForAutofill()); + DCHECK_EQ(form.fields[j].name(), element->nameForAutofill()); - if (!form.fields[i].value().empty() && + if (!form.fields[j].value().empty() && element->formControlType() != WebString::fromUTF8("submit")) { if (element->formControlType() == WebString::fromUTF8("text")) { WebInputElement input_element = element->toElement<WebInputElement>(); // If the maxlength attribute contains a negative value, maxLength() // returns the default maxlength value. input_element.setValue( - form.fields[i].value().substr(0, input_element.maxLength())); + form.fields[j].value().substr(0, input_element.maxLength())); input_element.setAutofilled(true); } else if (element->formControlType() == WebString::fromUTF8("select-one")) { WebSelectElement select_element = element->toElement<WebSelectElement>(); - select_element.setValue(form.fields[i].value()); + select_element.setValue(form.fields[j].value()); } } } |