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

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: Add test code 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
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 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 labels.push_back(ASCIIToUTF16("Email:")); 153 labels.push_back(ASCIIToUTF16("Email:"));
154 names.push_back(ASCIIToUTF16("email")); 154 names.push_back(ASCIIToUTF16("email"));
155 values.push_back(ASCIIToUTF16("john@example.com")); 155 values.push_back(ASCIIToUTF16("john@example.com"));
156 156
157 ExpectLabels(html, labels, names, values); 157 ExpectLabels(html, labels, names, values);
158 } 158 }
159 159
160 typedef void (*FillFormFunction)(const FormData& form, 160 typedef void (*FillFormFunction)(const FormData& form,
161 const WebInputElement& element); 161 const WebInputElement& element);
162 162
163 typedef WebString (WebInputElement::*GetValueFunction)(void) const; 163 typedef WebString (*GetValueFunction)(WebFormControlElement element);
164 164
165 // Test FormFillxxx functions. 165 // Test FormFillxxx functions.
166 void TestFormFillFunctions(const char* html, 166 void TestFormFillFunctions(const char* html,
167 const AutofillFieldCase* field_cases, 167 const AutofillFieldCase* field_cases,
168 size_t number_of_field_cases, 168 size_t number_of_field_cases,
169 FillFormFunction fill_form_function, 169 FillFormFunction fill_form_function,
170 GetValueFunction get_value_function) { 170 GetValueFunction get_value_function) {
171 LoadHTML(html); 171 LoadHTML(html);
172 172
173 WebFrame* web_frame = GetMainFrame(); 173 WebFrame* web_frame = GetMainFrame();
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 void ValidteFilledField(const AutofillFieldCase& field_case, 227 void ValidteFilledField(const AutofillFieldCase& field_case,
228 GetValueFunction get_value_function) { 228 GetValueFunction get_value_function) {
229 SCOPED_TRACE(base::StringPrintf("Verify autofilled value for field %s", 229 SCOPED_TRACE(base::StringPrintf("Verify autofilled value for field %s",
230 field_case.name)); 230 field_case.name));
231 WebString value; 231 WebString value;
232 WebFormControlElement element = GetMainFrame()->document().getElementById( 232 WebFormControlElement element = GetMainFrame()->document().getElementById(
233 ASCIIToUTF16(field_case.name)).to<WebFormControlElement>(); 233 ASCIIToUTF16(field_case.name)).to<WebFormControlElement>();
234 if (element.formControlType() == "select-one") { 234 if (element.formControlType() == "select-one") {
235 value = element.to<WebSelectElement>().value(); 235 value = element.to<WebSelectElement>().value();
236 } else if (element.formControlType() == "textarea") { 236 } else if (element.formControlType() == "textarea") {
237 value = element.to<WebTextAreaElement>().value(); 237 value = get_value_function(element);
238 } else { 238 } else {
239 ASSERT_TRUE(element.formControlType() == "text" || 239 ASSERT_TRUE(element.formControlType() == "text" ||
240 element.formControlType() == "month"); 240 element.formControlType() == "month");
241 WebInputElement input_element = GetMainFrame()->document().getElementById( 241 value = get_value_function(element);
242 ASCIIToUTF16(field_case.name)).to<WebInputElement>();
243 value = (input_element.*get_value_function)();
244 } 242 }
245 243
246 const WebString expected_value = ASCIIToUTF16(field_case.expected_value); 244 const WebString expected_value = ASCIIToUTF16(field_case.expected_value);
247 if (expected_value.isEmpty()) 245 if (expected_value.isEmpty())
248 EXPECT_TRUE(value.isEmpty()); 246 EXPECT_TRUE(value.isEmpty());
249 else 247 else
250 EXPECT_EQ(expected_value, value); 248 EXPECT_EQ(expected_value, value);
251 249
252 EXPECT_EQ(field_case.should_be_autofilled, element.isAutofilled()); 250 EXPECT_EQ(field_case.should_be_autofilled, element.isAutofilled());
253 } 251 }
254 252
255 static void FillFormForAllFieldsWrapper(const FormData& form, 253 static void FillFormForAllFieldsWrapper(const FormData& form,
256 const WebInputElement& element) { 254 const WebInputElement& element) {
257 FillFormForAllElements(form, element.form()); 255 FillFormForAllElements(form, element.form());
258 } 256 }
259 257
260 static void FillFormIncludingNonFocusableElementsWrapper( 258 static void FillFormIncludingNonFocusableElementsWrapper(
261 const FormData& form, 259 const FormData& form,
262 const WebInputElement& element) { 260 const WebInputElement& element) {
263 FillFormIncludingNonFocusableElements(form, element.form()); 261 FillFormIncludingNonFocusableElements(form, element.form());
264 } 262 }
265 263
264 static WebString GetValueWrapper(WebFormControlElement element) {
265 WebString value;
266 if (element.formControlType() == "textarea")
267 value = element.to<WebTextAreaElement>().value();
268 else
269 value = element.to<WebInputElement>().value();
270 return value;
Ilya Sherman 2014/01/07 01:09:38 nit: No need for the local variable value, i.e. yo
ziran.sun 2014/01/07 16:40:41 Done.
271 }
272
273 static WebString GetSuggestedValueWrapper(WebFormControlElement element) {
274 WebString suggested_value;
275 if (element.formControlType() == "textarea")
276 suggested_value = element.to<WebTextAreaElement>().suggestedValue();
277 else
278 suggested_value = element.to<WebInputElement>().suggestedValue();
279 return suggested_value;
280 }
Ilya Sherman 2014/01/07 01:09:38 Likewise for this method.
ziran.sun 2014/01/07 16:40:41 Done.
281
266 private: 282 private:
267 DISALLOW_COPY_AND_ASSIGN(FormAutofillTest); 283 DISALLOW_COPY_AND_ASSIGN(FormAutofillTest);
268 }; 284 };
269 285
270 // We should be able to extract a normal text field. 286 // We should be able to extract a normal text field.
271 TEST_F(FormAutofillTest, WebFormControlElementToFormField) { 287 TEST_F(FormAutofillTest, WebFormControlElementToFormField) {
272 LoadHTML("<INPUT type=\"text\" id=\"element\" value=\"value\"/>"); 288 LoadHTML("<INPUT type=\"text\" id=\"element\" value=\"value\"/>");
273 289
274 WebFrame* frame = GetMainFrame(); 290 WebFrame* frame = GetMainFrame();
275 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 291 ASSERT_NE(static_cast<WebFrame*>(NULL), frame);
(...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after
1107 // non-empty value. 1123 // non-empty value.
1108 {"select-one", "select-nonempty", "CA", "", true, "TX", "TX"}, 1124 {"select-one", "select-nonempty", "CA", "", true, "TX", "TX"},
1109 // Regular textarea elements should be autofilled. 1125 // Regular textarea elements should be autofilled.
1110 {"textarea", "textarea", "", "", true, "some multi-\nline value", 1126 {"textarea", "textarea", "", "", true, "some multi-\nline value",
1111 "some multi-\nline value"}, 1127 "some multi-\nline value"},
1112 // Non-empty textarea elements should not be autofilled. 1128 // Non-empty textarea elements should not be autofilled.
1113 {"textarea", "textarea-nonempty", "Go\naway!", "", false, 1129 {"textarea", "textarea-nonempty", "Go\naway!", "", false,
1114 "some multi-\nline value", "Go\naway!"}, 1130 "some multi-\nline value", "Go\naway!"},
1115 }; 1131 };
1116 TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases), 1132 TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases),
1117 FillForm, &WebInputElement::value); 1133 FillForm, &GetValueWrapper);
1118 // Verify preview selection. 1134 // Verify preview selection.
1119 WebInputElement firstname = GetMainFrame()->document(). 1135 WebInputElement firstname = GetMainFrame()->document().
1120 getElementById("firstname").to<WebInputElement>(); 1136 getElementById("firstname").to<WebInputElement>();
1121 EXPECT_EQ(16, firstname.selectionStart()); 1137 EXPECT_EQ(16, firstname.selectionStart());
1122 EXPECT_EQ(16, firstname.selectionEnd()); 1138 EXPECT_EQ(16, firstname.selectionEnd());
1123 } 1139 }
1124 1140
1125 TEST_F(FormAutofillTest, FillFormIncludingNonFocusableElements) { 1141 TEST_F(FormAutofillTest, FillFormIncludingNonFocusableElements) {
1126 static const AutofillFieldCase field_cases[] = { 1142 static const AutofillFieldCase field_cases[] = {
1127 // fields: form_control_type, name, initial_value, autocomplete_attribute, 1143 // fields: form_control_type, name, initial_value, autocomplete_attribute,
(...skipping 29 matching lines...) Expand all
1157 {"select-one", "select-nonempty", "CA", "", true, "TX", "TX"}, 1173 {"select-one", "select-nonempty", "CA", "", true, "TX", "TX"},
1158 // Regular textarea elements should be autofilled. 1174 // Regular textarea elements should be autofilled.
1159 {"textarea", "textarea", "", "", true, "some multi-\nline value", 1175 {"textarea", "textarea", "", "", true, "some multi-\nline value",
1160 "some multi-\nline value"}, 1176 "some multi-\nline value"},
1161 // Nonempty textarea elements should be overridden. 1177 // Nonempty textarea elements should be overridden.
1162 {"textarea", "textarea-nonempty", "Go\naway!", "", true, 1178 {"textarea", "textarea-nonempty", "Go\naway!", "", true,
1163 "some multi-\nline value", "some multi-\nline value"}, 1179 "some multi-\nline value", "some multi-\nline value"},
1164 }; 1180 };
1165 TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases), 1181 TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases),
1166 &FillFormIncludingNonFocusableElementsWrapper, 1182 &FillFormIncludingNonFocusableElementsWrapper,
1167 &WebInputElement::value); 1183 &GetValueWrapper);
1168 } 1184 }
1169 1185
1170 TEST_F(FormAutofillTest, PreviewForm) { 1186 TEST_F(FormAutofillTest, PreviewForm) {
1171 static const char* html = 1187 static const char* html =
1172 "<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" 1188 "<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">"
1173 " <INPUT type=\"text\" id=\"firstname\"/>" 1189 " <INPUT type=\"text\" id=\"firstname\"/>"
1174 " <INPUT type=\"text\" id=\"lastname\"/>" 1190 " <INPUT type=\"text\" id=\"lastname\"/>"
1175 " <INPUT type=\"text\" id=\"notempty\" value=\"Hi\"/>" 1191 " <INPUT type=\"text\" id=\"notempty\" value=\"Hi\"/>"
1176 " <INPUT type=\"text\" autocomplete=\"off\" id=\"noautocomplete\"/>" 1192 " <INPUT type=\"text\" autocomplete=\"off\" id=\"noautocomplete\"/>"
1177 " <INPUT type=\"text\" disabled=\"disabled\" id=\"notenabled\"/>" 1193 " <INPUT type=\"text\" disabled=\"disabled\" id=\"notenabled\"/>"
1194 " <TEXTAREA id=\"textarea\"></TEXTAREA>"
1178 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1195 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
1179 "</FORM>"; 1196 "</FORM>";
Ilya Sherman 2014/01/07 01:09:38 Please update this test to use kFormHtml rather th
ziran.sun 2014/01/07 16:40:41 I think selection preview is not supported from th
Ilya Sherman 2014/01/08 04:13:47 That's true, but I think we could still have test
ziran.sun 2014/01/08 17:02:39 I've made a note on <select> fields saying that pr
ziran.sun 2014/01/08 17:02:39 Done.
1180 1197
1181 static const AutofillFieldCase field_cases[] = { 1198 static const AutofillFieldCase field_cases[] = {
1182 // Normal empty fields should be previewed. 1199 // Normal empty fields should be previewed.
1183 {"text", "firstname", "", "", true, "suggested firstname", 1200 {"text", "firstname", "", "", true, "suggested firstname",
1184 "suggested firstname"}, 1201 "suggested firstname"},
1185 {"text", "lastname", "", "", true, "suggested lastname", 1202 {"text", "lastname", "", "", true, "suggested lastname",
1186 "suggested lastname"}, 1203 "suggested lastname"},
1187 // Non empty fields should not be previewed. 1204 // Non empty fields should not be previewed.
1188 {"text", "notempty", "Hi", "", false, "filled notempty", ""}, 1205 {"text", "notempty", "Hi", "", false, "filled notempty", ""},
1189 // "noautocomplete" should not be extracted to form_data. 1206 // "noautocomplete" should not be extracted to form_data.
1190 // Disabled fields should not be previewed. 1207 // Disabled fields should not be previewed.
1191 {"text", "notenabled", "", "", false, "filled notenabled", ""}, 1208 {"text", "notenabled", "", "", false, "filled notenabled", ""},
1209 // Normal textarea elements should be previewed.
1210 {"textarea", "textarea", "", "", true, "suggested multi-\nline value",
1211 "suggested multi-\nline value"},
1192 }; 1212 };
1193 TestFormFillFunctions(html, field_cases, arraysize(field_cases), &PreviewForm, 1213 TestFormFillFunctions(html, field_cases, arraysize(field_cases), &PreviewForm,
1194 &WebInputElement::suggestedValue); 1214 &GetSuggestedValueWrapper);
1195 1215
1196 // Verify preview selection. 1216 // Verify preview selection.
1197 WebInputElement firstname = GetMainFrame()->document(). 1217 WebInputElement firstname = GetMainFrame()->document().
1198 getElementById("firstname").to<WebInputElement>(); 1218 getElementById("firstname").to<WebInputElement>();
1199 EXPECT_EQ(0, firstname.selectionStart()); 1219 EXPECT_EQ(0, firstname.selectionStart());
1200 EXPECT_EQ(19, firstname.selectionEnd()); 1220 EXPECT_EQ(19, firstname.selectionEnd());
1201 } 1221 }
1202 1222
1203 TEST_F(FormAutofillTest, Labels) { 1223 TEST_F(FormAutofillTest, Labels) {
1204 ExpectJohnSmithLabels( 1224 ExpectJohnSmithLabels(
(...skipping 1983 matching lines...) Expand 10 before | Expand all | Expand 10 after
3188 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 3208 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]);
3189 3209
3190 expected.name = ASCIIToUTF16("country"); 3210 expected.name = ASCIIToUTF16("country");
3191 expected.value = ASCIIToUTF16("AL"); 3211 expected.value = ASCIIToUTF16("AL");
3192 expected.form_control_type = "select-one"; 3212 expected.form_control_type = "select-one";
3193 expected.max_length = 0; 3213 expected.max_length = 0;
3194 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 3214 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]);
3195 } 3215 }
3196 3216
3197 } // namespace autofill 3217 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698