Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/content/renderer/password_autofill_agent.h" | 5 #include "components/autofill/content/renderer/password_autofill_agent.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 54 // necessary form elements. To avoid having to look these up again when we want | 54 // necessary form elements. To avoid having to look these up again when we want |
| 55 // to fill the form, the FindFormElements function stores the pointers | 55 // to fill the form, the FindFormElements function stores the pointers |
| 56 // in a FormElements* result, referenced to ensure they are safe to use. | 56 // in a FormElements* result, referenced to ensure they are safe to use. |
| 57 struct FormElements { | 57 struct FormElements { |
| 58 blink::WebFormElement form_element; | 58 blink::WebFormElement form_element; |
| 59 FormInputElementMap input_elements; | 59 FormInputElementMap input_elements; |
| 60 }; | 60 }; |
| 61 | 61 |
| 62 typedef std::vector<FormElements*> FormElementsList; | 62 typedef std::vector<FormElements*> FormElementsList; |
| 63 | 63 |
| 64 // Helper to search the given form element for the specified input elements | 64 // Utility function to find the unique entry of the |form_element| for the |
| 65 // in |data|, and add results to |result|. | 65 // specified input |field|. On successful find, adds it to |result| and returns |
| 66 static bool FindFormInputElements(blink::WebFormElement* fe, | 66 // |true|. Otherwise clears the references from each |HTMLInputElement| from |
| 67 const FormData& data, | 67 // |result| and returns |false|. |
| 68 FormElements* result) { | 68 bool FindFormInputElement(blink::WebFormElement* form_element, |
| 69 const FormFieldData& field, | |
| 70 FormElements* result) { | |
| 71 blink::WebVector<blink::WebNode> temp_elements; | |
| 72 form_element->getNamedElements(field.name, temp_elements); | |
| 73 | |
| 74 // Match the first input element, if any. | |
| 75 // |getNamedElements| may return non-input elements where the names match, | |
| 76 // so the results are filtered for input elements. | |
| 77 // If more than one match is made, then we have ambiguity (due to misuse | |
| 78 // of "name" attribute) so is it considered not found. | |
| 79 bool found_input = false; | |
| 80 for (size_t i = 0; i < temp_elements.size(); ++i) { | |
| 81 if (temp_elements[i].to<blink::WebElement>().hasHTMLTagName("input")) { | |
| 82 // Check for a non-unique match. | |
| 83 if (found_input) { | |
| 84 found_input = false; | |
| 85 break; | |
| 86 } | |
| 87 | |
| 88 // Only fill saved passwords into password fields and usernames into | |
| 89 // text fields. | |
| 90 blink::WebInputElement input_element = | |
| 91 temp_elements[i].to<blink::WebInputElement>(); | |
| 92 if (input_element.isPasswordField() != | |
| 93 (field.form_control_type == "password")) | |
| 94 continue; | |
| 95 | |
| 96 // This element matched, add it to our temporary result. It's possible | |
| 97 // there are multiple matches, but for purposes of identifying the form | |
| 98 // one suffices and if some function needs to deal with multiple | |
| 99 // matching elements it can get at them through the FormElement*. | |
| 100 // Note: This assignment adds a reference to the InputElement. | |
| 101 result->input_elements[field.name] = input_element; | |
| 102 found_input = true; | |
| 103 } | |
| 104 } | |
| 105 | |
| 106 // A required element was not found. This is not the right form. | |
| 107 // Make sure no input elements from a partially matched form in this | |
| 108 // iteration remain in the result set. | |
| 109 // Note: clear will remove a reference from each InputElement. | |
| 110 if (!found_input) { | |
| 111 result->input_elements.clear(); | |
| 112 return false; | |
| 113 } | |
| 114 | |
| 115 return true; | |
| 116 } | |
| 117 | |
| 118 // Helper to search the given form element for the specified input elements in | |
| 119 // |data|, and add results to |result|. | |
| 120 bool FindFormInputElements(blink::WebFormElement* form_element, | |
| 121 const FormData& data, | |
| 122 FormElements* result) { | |
| 69 const bool username_is_present = !data.fields[0].name.empty(); | 123 const bool username_is_present = !data.fields[0].name.empty(); |
| 70 | 124 |
| 71 // Loop through the list of elements we need to find on the form in order to | 125 // Loop through the list of elements we need to find on the form in order to |
| 72 // autofill it. If we don't find any one of them, abort processing this | 126 // autofill it. If we don't find any one of them, abort processing this |
| 73 // form; it can't be the right one. | 127 // form; it can't be the right one. |
| 74 // First field is the username, skip it if not present. | 128 // First field is the username, skip it if not present. |
| 75 for (size_t j = (username_is_present ? 0 : 1); j < data.fields.size(); ++j) { | 129 for (size_t j = (username_is_present ? 0 : 1); j < data.fields.size(); ++j) { |
| 76 blink::WebVector<blink::WebNode> temp_elements; | 130 if (!FindFormInputElement(form_element, data.fields[j], result)) { |
|
vabr (Chromium)
2014/11/06 14:23:35
optional nit: In Chromium code, one-line if-statem
Pritam Nikam
2014/11/06 14:53:58
Done.
| |
| 77 fe->getNamedElements(data.fields[j].name, temp_elements); | |
| 78 | |
| 79 // Match the first input element, if any. | |
| 80 // |getNamedElements| may return non-input elements where the names match, | |
| 81 // so the results are filtered for input elements. | |
| 82 // If more than one match is made, then we have ambiguity (due to misuse | |
| 83 // of "name" attribute) so is it considered not found. | |
| 84 bool found_input = false; | |
| 85 for (size_t i = 0; i < temp_elements.size(); ++i) { | |
| 86 if (temp_elements[i].to<blink::WebElement>().hasHTMLTagName("input")) { | |
| 87 // Check for a non-unique match. | |
| 88 if (found_input) { | |
| 89 found_input = false; | |
| 90 break; | |
| 91 } | |
| 92 | |
| 93 // Only fill saved passwords into password fields and usernames into | |
| 94 // text fields. | |
| 95 blink::WebInputElement input_element = | |
| 96 temp_elements[i].to<blink::WebInputElement>(); | |
| 97 if (input_element.isPasswordField() != | |
| 98 (data.fields[j].form_control_type == "password")) | |
| 99 continue; | |
| 100 | |
| 101 // This element matched, add it to our temporary result. It's possible | |
| 102 // there are multiple matches, but for purposes of identifying the form | |
| 103 // one suffices and if some function needs to deal with multiple | |
| 104 // matching elements it can get at them through the FormElement*. | |
| 105 // Note: This assignment adds a reference to the InputElement. | |
| 106 result->input_elements[data.fields[j].name] = input_element; | |
| 107 found_input = true; | |
| 108 } | |
| 109 } | |
| 110 | |
| 111 // A required element was not found. This is not the right form. | |
| 112 // Make sure no input elements from a partially matched form in this | |
| 113 // iteration remain in the result set. | |
| 114 // Note: clear will remove a reference from each InputElement. | |
| 115 if (!found_input) { | |
| 116 result->input_elements.clear(); | |
| 117 return false; | 131 return false; |
| 118 } | 132 } |
| 119 } | 133 } |
| 134 | |
| 120 return true; | 135 return true; |
| 121 } | 136 } |
| 122 | 137 |
| 123 // Helper to locate form elements identified by |data|. | 138 // Helper to locate form elements identified by |data|. |
| 124 void FindFormElements(blink::WebView* view, | 139 void FindFormElements(blink::WebView* view, |
| 125 const FormData& data, | 140 const FormData& data, |
| 126 FormElementsList* results) { | 141 FormElementsList* results) { |
| 127 DCHECK(view); | 142 DCHECK(view); |
| 128 DCHECK(results); | 143 DCHECK(results); |
| 129 blink::WebFrame* main_frame = view->mainFrame(); | 144 blink::WebFrame* main_frame = view->mainFrame(); |
| (...skipping 1094 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1224 scoped_ptr<PasswordForm> password_form(CreatePasswordForm(form)); | 1239 scoped_ptr<PasswordForm> password_form(CreatePasswordForm(form)); |
| 1225 if (!password_form || (restriction == RESTRICTION_NON_EMPTY_PASSWORD && | 1240 if (!password_form || (restriction == RESTRICTION_NON_EMPTY_PASSWORD && |
| 1226 password_form->password_value.empty() && | 1241 password_form->password_value.empty() && |
| 1227 password_form->new_password_value.empty())) { | 1242 password_form->new_password_value.empty())) { |
| 1228 return; | 1243 return; |
| 1229 } | 1244 } |
| 1230 provisionally_saved_forms_[frame].reset(password_form.release()); | 1245 provisionally_saved_forms_[frame].reset(password_form.release()); |
| 1231 } | 1246 } |
| 1232 | 1247 |
| 1233 } // namespace autofill | 1248 } // namespace autofill |
| OLD | NEW |