Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(34)

Side by Side Diff: chrome/renderer/autofill/form_autofill_browsertest.cc

Issue 112663005: Add autofill preview support for Textarea (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: minor change - use defined variable Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | components/autofill/content/renderer/form_autofill_util.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <vector> 5 #include <vector>
6 6
7 #include "base/format_macros.h" 7 #include "base/format_macros.h"
8 #include "base/metrics/field_trial.h" 8 #include "base/metrics/field_trial.h"
9 #include "base/strings/string16.h" 9 #include "base/strings/string16.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 labels.push_back(ASCIIToUTF16("Email:")); 154 labels.push_back(ASCIIToUTF16("Email:"));
155 names.push_back(ASCIIToUTF16("email")); 155 names.push_back(ASCIIToUTF16("email"));
156 values.push_back(ASCIIToUTF16("john@example.com")); 156 values.push_back(ASCIIToUTF16("john@example.com"));
157 157
158 ExpectLabels(html, labels, names, values); 158 ExpectLabels(html, labels, names, values);
159 } 159 }
160 160
161 typedef void (*FillFormFunction)(const FormData& form, 161 typedef void (*FillFormFunction)(const FormData& form,
162 const WebInputElement& element); 162 const WebInputElement& element);
163 163
164 typedef WebString (WebInputElement::*GetValueFunction)(void) const; 164 typedef WebString (*GetValueFunction)(WebFormControlElement element);
165 165
166 // Test FormFillxxx functions. 166 // Test FormFillxxx functions.
167 void TestFormFillFunctions(const char* html, 167 void TestFormFillFunctions(const char* html,
168 const AutofillFieldCase* field_cases, 168 const AutofillFieldCase* field_cases,
169 size_t number_of_field_cases, 169 size_t number_of_field_cases,
170 FillFormFunction fill_form_function, 170 FillFormFunction fill_form_function,
171 GetValueFunction get_value_function) { 171 GetValueFunction get_value_function) {
172 LoadHTML(html); 172 LoadHTML(html);
173 173
174 WebFrame* web_frame = GetMainFrame(); 174 WebFrame* web_frame = GetMainFrame();
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 void ValidteFilledField(const AutofillFieldCase& field_case, 228 void ValidteFilledField(const AutofillFieldCase& field_case,
229 GetValueFunction get_value_function) { 229 GetValueFunction get_value_function) {
230 SCOPED_TRACE(base::StringPrintf("Verify autofilled value for field %s", 230 SCOPED_TRACE(base::StringPrintf("Verify autofilled value for field %s",
231 field_case.name)); 231 field_case.name));
232 WebString value; 232 WebString value;
233 WebFormControlElement element = GetMainFrame()->document().getElementById( 233 WebFormControlElement element = GetMainFrame()->document().getElementById(
234 ASCIIToUTF16(field_case.name)).to<WebFormControlElement>(); 234 ASCIIToUTF16(field_case.name)).to<WebFormControlElement>();
235 if (element.formControlType() == "select-one") { 235 if (element.formControlType() == "select-one") {
236 value = element.to<WebSelectElement>().value(); 236 value = element.to<WebSelectElement>().value();
237 } else if (element.formControlType() == "textarea") { 237 } else if (element.formControlType() == "textarea") {
238 value = element.to<WebTextAreaElement>().value(); 238 value = get_value_function(element);
239 } else { 239 } else {
240 ASSERT_TRUE(element.formControlType() == "text" || 240 ASSERT_TRUE(element.formControlType() == "text" ||
241 element.formControlType() == "month"); 241 element.formControlType() == "month");
242 WebInputElement input_element = GetMainFrame()->document().getElementById( 242 value = get_value_function(element);
243 ASCIIToUTF16(field_case.name)).to<WebInputElement>();
244 value = (input_element.*get_value_function)();
245 } 243 }
246 244
247 const WebString expected_value = ASCIIToUTF16(field_case.expected_value); 245 const WebString expected_value = ASCIIToUTF16(field_case.expected_value);
248 if (expected_value.isEmpty()) 246 if (expected_value.isEmpty())
249 EXPECT_TRUE(value.isEmpty()); 247 EXPECT_TRUE(value.isEmpty());
250 else 248 else
251 EXPECT_EQ(expected_value, value); 249 EXPECT_EQ(expected_value, value);
252 250
253 EXPECT_EQ(field_case.should_be_autofilled, element.isAutofilled()); 251 EXPECT_EQ(field_case.should_be_autofilled, element.isAutofilled());
254 } 252 }
255 253
256 static void FillFormForAllFieldsWrapper(const FormData& form, 254 static void FillFormForAllFieldsWrapper(const FormData& form,
257 const WebInputElement& element) { 255 const WebInputElement& element) {
258 FillFormForAllElements(form, element.form()); 256 FillFormForAllElements(form, element.form());
259 } 257 }
260 258
261 static void FillFormIncludingNonFocusableElementsWrapper( 259 static void FillFormIncludingNonFocusableElementsWrapper(
262 const FormData& form, 260 const FormData& form,
263 const WebInputElement& element) { 261 const WebInputElement& element) {
264 FillFormIncludingNonFocusableElements(form, element.form()); 262 FillFormIncludingNonFocusableElements(form, element.form());
265 } 263 }
266 264
265 static WebString GetValueWrapper(WebFormControlElement element) {
266 if (element.formControlType() == "textarea")
267 return element.to<WebTextAreaElement>().value();
268
269 return element.to<WebInputElement>().value();
270 }
271
272 static WebString GetSuggestedValueWrapper(WebFormControlElement element) {
273 if (element.formControlType() == "textarea")
274 return element.to<WebTextAreaElement>().suggestedValue();
275
276 return element.to<WebInputElement>().suggestedValue();
277 }
278
267 private: 279 private:
268 DISALLOW_COPY_AND_ASSIGN(FormAutofillTest); 280 DISALLOW_COPY_AND_ASSIGN(FormAutofillTest);
269 }; 281 };
270 282
271 // We should be able to extract a normal text field. 283 // We should be able to extract a normal text field.
272 TEST_F(FormAutofillTest, WebFormControlElementToFormField) { 284 TEST_F(FormAutofillTest, WebFormControlElementToFormField) {
273 LoadHTML("<INPUT type=\"text\" id=\"element\" value=\"value\"/>"); 285 LoadHTML("<INPUT type=\"text\" id=\"element\" value=\"value\"/>");
274 286
275 WebFrame* frame = GetMainFrame(); 287 WebFrame* frame = GetMainFrame();
276 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 288 ASSERT_NE(static_cast<WebFrame*>(NULL), frame);
(...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after
1108 // non-empty value. 1120 // non-empty value.
1109 {"select-one", "select-nonempty", "CA", "", true, "TX", "TX"}, 1121 {"select-one", "select-nonempty", "CA", "", true, "TX", "TX"},
1110 // Regular textarea elements should be autofilled. 1122 // Regular textarea elements should be autofilled.
1111 {"textarea", "textarea", "", "", true, "some multi-\nline value", 1123 {"textarea", "textarea", "", "", true, "some multi-\nline value",
1112 "some multi-\nline value"}, 1124 "some multi-\nline value"},
1113 // Non-empty textarea elements should not be autofilled. 1125 // Non-empty textarea elements should not be autofilled.
1114 {"textarea", "textarea-nonempty", "Go\naway!", "", false, 1126 {"textarea", "textarea-nonempty", "Go\naway!", "", false,
1115 "some multi-\nline value", "Go\naway!"}, 1127 "some multi-\nline value", "Go\naway!"},
1116 }; 1128 };
1117 TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases), 1129 TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases),
1118 FillForm, &WebInputElement::value); 1130 FillForm, &GetValueWrapper);
1119 // Verify preview selection. 1131 // Verify preview selection.
1120 WebInputElement firstname = GetMainFrame()->document(). 1132 WebInputElement firstname = GetMainFrame()->document().
1121 getElementById("firstname").to<WebInputElement>(); 1133 getElementById("firstname").to<WebInputElement>();
1122 EXPECT_EQ(16, firstname.selectionStart()); 1134 EXPECT_EQ(16, firstname.selectionStart());
1123 EXPECT_EQ(16, firstname.selectionEnd()); 1135 EXPECT_EQ(16, firstname.selectionEnd());
1124 } 1136 }
1125 1137
1126 TEST_F(FormAutofillTest, FillFormIncludingNonFocusableElements) { 1138 TEST_F(FormAutofillTest, FillFormIncludingNonFocusableElements) {
1127 static const AutofillFieldCase field_cases[] = { 1139 static const AutofillFieldCase field_cases[] = {
1128 // fields: form_control_type, name, initial_value, autocomplete_attribute, 1140 // fields: form_control_type, name, initial_value, autocomplete_attribute,
(...skipping 29 matching lines...) Expand all
1158 {"select-one", "select-nonempty", "CA", "", true, "TX", "TX"}, 1170 {"select-one", "select-nonempty", "CA", "", true, "TX", "TX"},
1159 // Regular textarea elements should be autofilled. 1171 // Regular textarea elements should be autofilled.
1160 {"textarea", "textarea", "", "", true, "some multi-\nline value", 1172 {"textarea", "textarea", "", "", true, "some multi-\nline value",
1161 "some multi-\nline value"}, 1173 "some multi-\nline value"},
1162 // Nonempty textarea elements should be overridden. 1174 // Nonempty textarea elements should be overridden.
1163 {"textarea", "textarea-nonempty", "Go\naway!", "", true, 1175 {"textarea", "textarea-nonempty", "Go\naway!", "", true,
1164 "some multi-\nline value", "some multi-\nline value"}, 1176 "some multi-\nline value", "some multi-\nline value"},
1165 }; 1177 };
1166 TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases), 1178 TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases),
1167 &FillFormIncludingNonFocusableElementsWrapper, 1179 &FillFormIncludingNonFocusableElementsWrapper,
1168 &WebInputElement::value); 1180 &GetValueWrapper);
1169 } 1181 }
1170 1182
1171 TEST_F(FormAutofillTest, PreviewForm) { 1183 TEST_F(FormAutofillTest, PreviewForm) {
1172 static const char* html =
1173 "<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">"
1174 " <INPUT type=\"text\" id=\"firstname\"/>"
1175 " <INPUT type=\"text\" id=\"lastname\"/>"
1176 " <INPUT type=\"text\" id=\"notempty\" value=\"Hi\"/>"
1177 " <INPUT type=\"text\" autocomplete=\"off\" id=\"noautocomplete\"/>"
1178 " <INPUT type=\"text\" disabled=\"disabled\" id=\"notenabled\"/>"
1179 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
1180 "</FORM>";
1181
1182 static const AutofillFieldCase field_cases[] = { 1184 static const AutofillFieldCase field_cases[] = {
1183 // Normal empty fields should be previewed. 1185 // Normal empty fields should be previewed.
1184 {"text", "firstname", "", "", true, "suggested firstname", 1186 {"text", "firstname", "", "", true, "suggested firstname",
1185 "suggested firstname"}, 1187 "suggested firstname"},
1186 {"text", "lastname", "", "", true, "suggested lastname", 1188 {"text", "lastname", "", "", true, "suggested lastname",
1187 "suggested lastname"}, 1189 "suggested lastname"},
1190 // Hidden fields should not be extracted to form_data.
1188 // Non empty fields should not be previewed. 1191 // Non empty fields should not be previewed.
1189 {"text", "notempty", "Hi", "", false, "filled notempty", ""}, 1192 {"text", "notempty", "Hi", "", false, "suggested notempty", ""},
1190 // "noautocomplete" should not be extracted to form_data. 1193 // "noautocomplete" should not be extracted to form_data.
1191 // Disabled fields should not be previewed. 1194 // Disabled fields should not be previewed.
1192 {"text", "notenabled", "", "", false, "filled notenabled", ""}, 1195 {"text", "notenabled", "", "", false, "suggested notenabled", ""},
1196 // Readonly fields should not be previewed.
1197 {"text", "readonly", "", "", false, "suggested readonly", ""},
1198 // Fields with "visibility: hidden" should not be previewed.
1199 {"text", "invisible", "", "", false, "suggested invisible",
1200 ""},
1201 // Fields with "display:none" should not previewed.
1202 {"text", "displaynone", "", "", false, "suggested displaynone",
1203 ""},
1204 // Regular <input type="month"> should not be previewed.
1205 {"month", "month", "", "", false, "2017-11", ""},
1206 // Non-empty <input type="month"> should not be previewed.
1207 {"month", "month-nonempty", "2011-12", "", false, "2017-11", ""},
1208 // Regular select fields preview is not yet supported
1209 {"select-one", "select", "", "", false, "TX", ""},
1210 // Select fields preview is not yet supported
1211 {"select-one", "select-nonempty", "CA", "", false, "TX", "CA"},
1212 // Normal textarea elements should be previewed.
1213 {"textarea", "textarea", "", "", true, "suggested multi-\nline value",
1214 "suggested multi-\nline value"},
1215 // Nonempty textarea elements should not be previewed.
1216 {"textarea", "textarea-nonempty", "Go\naway!", "", false,
1217 "suggested multi-\nline value", ""},
1193 }; 1218 };
1194 TestFormFillFunctions(html, field_cases, arraysize(field_cases), &PreviewForm, 1219 TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases),
1195 &WebInputElement::suggestedValue); 1220 &PreviewForm, &GetSuggestedValueWrapper);
1196 1221
1197 // Verify preview selection. 1222 // Verify preview selection.
1198 WebInputElement firstname = GetMainFrame()->document(). 1223 WebInputElement firstname = GetMainFrame()->document().
1199 getElementById("firstname").to<WebInputElement>(); 1224 getElementById("firstname").to<WebInputElement>();
1200 EXPECT_EQ(0, firstname.selectionStart()); 1225 EXPECT_EQ(0, firstname.selectionStart());
1201 EXPECT_EQ(19, firstname.selectionEnd()); 1226 EXPECT_EQ(19, firstname.selectionEnd());
1202 } 1227 }
1203 1228
1204 TEST_F(FormAutofillTest, Labels) { 1229 TEST_F(FormAutofillTest, Labels) {
1205 ExpectJohnSmithLabels( 1230 ExpectJohnSmithLabels(
(...skipping 1983 matching lines...) Expand 10 before | Expand all | Expand 10 after
3189 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 3214 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]);
3190 3215
3191 expected.name = ASCIIToUTF16("country"); 3216 expected.name = ASCIIToUTF16("country");
3192 expected.value = ASCIIToUTF16("AL"); 3217 expected.value = ASCIIToUTF16("AL");
3193 expected.form_control_type = "select-one"; 3218 expected.form_control_type = "select-one";
3194 expected.max_length = 0; 3219 expected.max_length = 0;
3195 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 3220 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]);
3196 } 3221 }
3197 3222
3198 } // namespace autofill 3223 } // namespace autofill
OLDNEW
« no previous file with comments | « no previous file | components/autofill/content/renderer/form_autofill_util.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698