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 3 // found in the LICENSE file. 4 5 #include <vector> 6 7 #include "base/format_macros.h" 8 #include "base/metrics/field_trial.h" 9 #include "base/strings/string16.h" 10 #include "base/strings/string_util.h" 11 #include "base/strings/stringprintf.h" 12 #include "base/strings/utf_string_conversions.h" 13 #include "chrome/test/base/chrome_render_view_test.h" 14 #include "components/autofill/content/renderer/form_autofill_util.h" 15 #include "components/autofill/content/renderer/form_cache.h" 16 #include "components/autofill/core/common/form_data.h" 17 #include "components/autofill/core/common/web_element_descriptor.h" 18 #include "components/variations/entropy_provider.h" 19 #include "testing/gtest/include/gtest/gtest.h" 20 #include "third_party/WebKit/public/platform/WebString.h" 21 #include "third_party/WebKit/public/platform/WebVector.h" 22 #include "third_party/WebKit/public/web/WebDocument.h" 23 #include "third_party/WebKit/public/web/WebElement.h" 24 #include "third_party/WebKit/public/web/WebFormControlElement.h" 25 #include "third_party/WebKit/public/web/WebFormElement.h" 26 #include "third_party/WebKit/public/web/WebInputElement.h" 27 #include "third_party/WebKit/public/web/WebNode.h" 28 #include "third_party/WebKit/public/web/WebSelectElement.h" 29 #include "third_party/WebKit/public/web/WebTextAreaElement.h" 30 31 using blink::WebDocument; 32 using blink::WebElement; 33 using blink::WebFormControlElement; 34 using blink::WebFormElement; 35 using blink::WebFrame; 36 using blink::WebInputElement; 37 using blink::WebNode; 38 using blink::WebSelectElement; 39 using blink::WebString; 40 using blink::WebTextAreaElement; 41 using blink::WebVector; 42 43 namespace { 44 45 struct AutofillFieldCase { 46 const char* const form_control_type; 47 const char* const name; 48 const char* const initial_value; 49 const char* const autocomplete_attribute; // The autocomplete attribute of 50 // the element. 51 bool should_be_autofilled; // Whether the filed should be autofilled. 52 const char* const autofill_value; // The value being used to fill the field. 53 const char* const expected_value; // The expected value after Autofill 54 // or Preview. 55 }; 56 57 static const char kFormHtml[] = 58 "<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" 59 " <INPUT type=\"text\" id=\"firstname\"/>" 60 " <INPUT type=\"text\" id=\"lastname\"/>" 61 " <INPUT type=\"hidden\" id=\"imhidden\"/>" 62 " <INPUT type=\"text\" id=\"notempty\" value=\"Hi\"/>" 63 " <INPUT type=\"text\" autocomplete=\"off\" id=\"noautocomplete\"/>" 64 " <INPUT type=\"text\" disabled=\"disabled\" id=\"notenabled\"/>" 65 " <INPUT type=\"text\" readonly id=\"readonly\"/>" 66 " <INPUT type=\"text\" style=\"visibility: hidden\"" 67 " id=\"invisible\"/>" 68 " <INPUT type=\"text\" style=\"display: none\" id=\"displaynone\"/>" 69 " <INPUT type=\"month\" id=\"month\"/>" 70 " <INPUT type=\"month\" id=\"month-nonempty\" value=\"2011-12\"/>" 71 " <SELECT id=\"select\">" 72 " <OPTION></OPTION>" 73 " <OPTION value=\"CA\">California</OPTION>" 74 " <OPTION value=\"TX\">Texas</OPTION>" 75 " </SELECT>" 76 " <SELECT id=\"select-nonempty\">" 77 " <OPTION value=\"CA\" selected>California</OPTION>" 78 " <OPTION value=\"TX\">Texas</OPTION>" 79 " </SELECT>" 80 " <TEXTAREA id=\"textarea\"></TEXTAREA>" 81 " <TEXTAREA id=\"textarea-nonempty\">Go away!</TEXTAREA>" 82 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 83 "</FORM>"; 84 85 } // namespace 86 87 namespace autofill { 88 89 class FormAutofillTest : public ChromeRenderViewTest { 90 public: 91 FormAutofillTest() : ChromeRenderViewTest() {} 92 virtual ~FormAutofillTest() {} 93 94 void ExpectLabels(const char* html, 95 const std::vector<base::string16>& labels, 96 const std::vector<base::string16>& names, 97 const std::vector<base::string16>& values) { 98 std::vector<std::string> control_types(labels.size(), "text"); 99 ExpectLabelsAndTypes(html, labels, names, values, control_types); 100 } 101 102 void ExpectLabelsAndTypes(const char* html, 103 const std::vector<base::string16>& labels, 104 const std::vector<base::string16>& names, 105 const std::vector<base::string16>& values, 106 const std::vector<std::string>& control_types) { 107 ASSERT_EQ(labels.size(), names.size()); 108 ASSERT_EQ(labels.size(), values.size()); 109 ASSERT_EQ(labels.size(), control_types.size()); 110 111 LoadHTML(html); 112 113 WebFrame* web_frame = GetMainFrame(); 114 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 115 116 FormCache form_cache; 117 std::vector<FormData> forms; 118 form_cache.ExtractForms(*web_frame, &forms); 119 ASSERT_EQ(1U, forms.size()); 120 121 const FormData& form = forms[0]; 122 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 123 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 124 EXPECT_EQ(GURL("http://cnn.com"), form.action); 125 126 const std::vector<FormFieldData>& fields = form.fields; 127 ASSERT_EQ(labels.size(), fields.size()); 128 for (size_t i = 0; i < labels.size(); ++i) { 129 int max_length = control_types[i] == "text" ? 130 WebInputElement::defaultMaxLength() : 0; 131 FormFieldData expected; 132 expected.label = labels[i]; 133 expected.name = names[i]; 134 expected.value = values[i]; 135 expected.form_control_type = control_types[i]; 136 expected.max_length = max_length; 137 SCOPED_TRACE(base::StringPrintf("i: %" PRIuS, i)); 138 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[i]); 139 } 140 } 141 142 void ExpectJohnSmithLabels(const char* html) { 143 std::vector<base::string16> labels, names, values; 144 145 labels.push_back(ASCIIToUTF16("First name:")); 146 names.push_back(ASCIIToUTF16("firstname")); 147 values.push_back(ASCIIToUTF16("John")); 148 149 labels.push_back(ASCIIToUTF16("Last name:")); 150 names.push_back(ASCIIToUTF16("lastname")); 151 values.push_back(ASCIIToUTF16("Smith")); 152 153 labels.push_back(ASCIIToUTF16("Email:")); 154 names.push_back(ASCIIToUTF16("email")); 155 values.push_back(ASCIIToUTF16("john (at) example.com")); 156 157 ExpectLabels(html, labels, names, values); 158 } 159 160 typedef void (*FillFormFunction)(const FormData& form, 161 const WebInputElement& element); 162 163 typedef WebString (WebInputElement::*GetValueFunction)(void) const; 164 165 // Test FormFillxxx functions. 166 void TestFormFillFunctions(const char* html, 167 const AutofillFieldCase* field_cases, 168 size_t number_of_field_cases, 169 FillFormFunction fill_form_function, 170 GetValueFunction get_value_function) { 171 LoadHTML(html); 172 173 WebFrame* web_frame = GetMainFrame(); 174 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 175 176 FormCache form_cache; 177 std::vector<FormData> forms; 178 form_cache.ExtractForms(*web_frame, &forms); 179 ASSERT_EQ(1U, forms.size()); 180 181 // Get the input element we want to find. 182 WebElement element = web_frame->document().getElementById("firstname"); 183 WebInputElement input_element = element.to<WebInputElement>(); 184 185 // Find the form that contains the input element. 186 FormData form_data; 187 FormFieldData field; 188 EXPECT_TRUE( 189 FindFormAndFieldForInputElement(input_element, 190 &form_data, 191 &field, 192 autofill::REQUIRE_AUTOCOMPLETE)); 193 EXPECT_EQ(ASCIIToUTF16("TestForm"), form_data.name); 194 EXPECT_EQ(GURL(web_frame->document().url()), form_data.origin); 195 EXPECT_EQ(GURL("http://buh.com"), form_data.action); 196 197 const std::vector<FormFieldData>& fields = form_data.fields; 198 ASSERT_EQ(number_of_field_cases, fields.size()); 199 200 FormFieldData expected; 201 // Verify field's initial value. 202 for (size_t i = 0; i < number_of_field_cases; ++i) { 203 SCOPED_TRACE(base::StringPrintf("Verify initial value for field %s", 204 field_cases[i].name)); 205 expected.form_control_type = field_cases[i].form_control_type; 206 expected.max_length = 207 expected.form_control_type == "text" ? 208 WebInputElement::defaultMaxLength() : 0; 209 expected.name = ASCIIToUTF16(field_cases[i].name); 210 expected.value = ASCIIToUTF16(field_cases[i].initial_value); 211 expected.autocomplete_attribute = field_cases[i].autocomplete_attribute; 212 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[i]); 213 // Fill the form_data for the field. 214 form_data.fields[i].value = ASCIIToUTF16(field_cases[i].autofill_value); 215 } 216 217 // Autofill the form using the given fill form function. 218 fill_form_function(form_data, input_element); 219 220 // Validate Autofill or Preview results. 221 for (size_t i = 0; i < number_of_field_cases; ++i) { 222 ValidteFilledField(field_cases[i], get_value_function); 223 } 224 } 225 226 // Validate an Autofilled field. 227 void ValidteFilledField(const AutofillFieldCase& field_case, 228 GetValueFunction get_value_function) { 229 SCOPED_TRACE(base::StringPrintf("Verify autofilled value for field %s", 230 field_case.name)); 231 WebString value; 232 WebFormControlElement element = GetMainFrame()->document().getElementById( 233 ASCIIToUTF16(field_case.name)).to<WebFormControlElement>(); 234 if (element.formControlType() == "select-one") { 235 value = element.to<WebSelectElement>().value(); 236 } else if (element.formControlType() == "textarea") { 237 value = element.to<WebTextAreaElement>().value(); 238 } else { 239 ASSERT_TRUE(element.formControlType() == "text" || 240 element.formControlType() == "month"); 241 WebInputElement input_element = GetMainFrame()->document().getElementById( 242 ASCIIToUTF16(field_case.name)).to<WebInputElement>(); 243 value = (input_element.*get_value_function)(); 244 } 245 246 const WebString expected_value = ASCIIToUTF16(field_case.expected_value); 247 if (expected_value.isEmpty()) 248 EXPECT_TRUE(value.isEmpty()); 249 else 250 EXPECT_EQ(expected_value, value); 251 252 EXPECT_EQ(field_case.should_be_autofilled, element.isAutofilled()); 253 } 254 255 static void FillFormForAllFieldsWrapper(const FormData& form, 256 const WebInputElement& element) { 257 FillFormForAllElements(form, element.form()); 258 } 259 260 static void FillFormIncludingNonFocusableElementsWrapper( 261 const FormData& form, 262 const WebInputElement& element) { 263 FillFormIncludingNonFocusableElements(form, element.form()); 264 } 265 266 private: 267 DISALLOW_COPY_AND_ASSIGN(FormAutofillTest); 268 }; 269 270 // We should be able to extract a normal text field. 271 TEST_F(FormAutofillTest, WebFormControlElementToFormField) { 272 LoadHTML("<INPUT type=\"text\" id=\"element\" value=\"value\"/>"); 273 274 WebFrame* frame = GetMainFrame(); 275 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 276 277 WebElement web_element = frame->document().getElementById("element"); 278 WebFormControlElement element = web_element.to<WebFormControlElement>(); 279 FormFieldData result1; 280 WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, &result1); 281 282 FormFieldData expected; 283 expected.form_control_type = "text"; 284 expected.max_length = WebInputElement::defaultMaxLength(); 285 286 expected.name = ASCIIToUTF16("element"); 287 expected.value = base::string16(); 288 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result1); 289 290 FormFieldData result2; 291 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result2); 292 293 expected.name = ASCIIToUTF16("element"); 294 expected.value = ASCIIToUTF16("value"); 295 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result2); 296 } 297 298 // We should be able to extract a text field with autocomplete="off". 299 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldAutocompleteOff) { 300 LoadHTML("<INPUT type=\"text\" id=\"element\" value=\"value\"" 301 " autocomplete=\"off\"/>"); 302 303 WebFrame* frame = GetMainFrame(); 304 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 305 306 WebElement web_element = frame->document().getElementById("element"); 307 WebFormControlElement element = web_element.to<WebFormControlElement>(); 308 FormFieldData result; 309 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 310 311 FormFieldData expected; 312 expected.name = ASCIIToUTF16("element"); 313 expected.value = ASCIIToUTF16("value"); 314 expected.form_control_type = "text"; 315 expected.autocomplete_attribute = "off"; 316 expected.max_length = WebInputElement::defaultMaxLength(); 317 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 318 } 319 320 // We should be able to extract a text field with maxlength specified. 321 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldMaxLength) { 322 LoadHTML("<INPUT type=\"text\" id=\"element\" value=\"value\"" 323 " maxlength=\"5\"/>"); 324 325 WebFrame* frame = GetMainFrame(); 326 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 327 328 WebElement web_element = frame->document().getElementById("element"); 329 WebFormControlElement element = web_element.to<WebFormControlElement>(); 330 FormFieldData result; 331 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 332 333 FormFieldData expected; 334 expected.name = ASCIIToUTF16("element"); 335 expected.value = ASCIIToUTF16("value"); 336 expected.form_control_type = "text"; 337 expected.max_length = 5; 338 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 339 } 340 341 // We should be able to extract a text field that has been autofilled. 342 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldAutofilled) { 343 LoadHTML("<INPUT type=\"text\" id=\"element\" value=\"value\"/>"); 344 345 WebFrame* frame = GetMainFrame(); 346 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 347 348 WebElement web_element = frame->document().getElementById("element"); 349 WebInputElement element = web_element.to<WebInputElement>(); 350 element.setAutofilled(true); 351 FormFieldData result; 352 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 353 354 FormFieldData expected; 355 expected.name = ASCIIToUTF16("element"); 356 expected.value = ASCIIToUTF16("value"); 357 expected.form_control_type = "text"; 358 expected.max_length = WebInputElement::defaultMaxLength(); 359 expected.is_autofilled = true; 360 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 361 } 362 363 // We should be able to extract a radio or a checkbox field that has been 364 // autofilled. 365 TEST_F(FormAutofillTest, WebFormControlElementToClickableFormField) { 366 LoadHTML("<INPUT type=\"checkbox\" id=\"checkbox\" value=\"mail\" checked/>" 367 "<INPUT type=\"radio\" id=\"radio\" value=\"male\"/>"); 368 369 WebFrame* frame = GetMainFrame(); 370 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 371 372 WebElement web_element = frame->document().getElementById("checkbox"); 373 WebInputElement element = web_element.to<WebInputElement>(); 374 element.setAutofilled(true); 375 FormFieldData result; 376 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 377 378 FormFieldData expected; 379 expected.name = ASCIIToUTF16("checkbox"); 380 expected.value = ASCIIToUTF16("mail"); 381 expected.form_control_type = "checkbox"; 382 expected.is_autofilled = true; 383 expected.is_checkable = true; 384 expected.is_checked = true; 385 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 386 387 web_element = frame->document().getElementById("radio"); 388 element = web_element.to<WebInputElement>(); 389 element.setAutofilled(true); 390 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 391 expected.name = ASCIIToUTF16("radio"); 392 expected.value = ASCIIToUTF16("male"); 393 expected.form_control_type = "radio"; 394 expected.is_autofilled = true; 395 expected.is_checkable = true; 396 expected.is_checked = false; 397 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 398 } 399 400 // We should be able to extract a <select> field. 401 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldSelect) { 402 LoadHTML("<SELECT id=\"element\"/>" 403 " <OPTION value=\"CA\">California</OPTION>" 404 " <OPTION value=\"TX\">Texas</OPTION>" 405 "</SELECT>"); 406 407 WebFrame* frame = GetMainFrame(); 408 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 409 410 WebElement web_element = frame->document().getElementById("element"); 411 WebFormControlElement element = web_element.to<WebFormControlElement>(); 412 FormFieldData result1; 413 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result1); 414 415 FormFieldData expected; 416 expected.name = ASCIIToUTF16("element"); 417 expected.max_length = 0; 418 expected.form_control_type = "select-one"; 419 420 expected.value = ASCIIToUTF16("CA"); 421 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result1); 422 423 FormFieldData result2; 424 WebFormControlElementToFormField( 425 element, 426 static_cast<autofill::ExtractMask>(autofill::EXTRACT_VALUE | 427 autofill::EXTRACT_OPTION_TEXT), 428 &result2); 429 expected.value = ASCIIToUTF16("California"); 430 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result2); 431 432 FormFieldData result3; 433 WebFormControlElementToFormField(element, autofill::EXTRACT_OPTIONS, 434 &result3); 435 expected.value = base::string16(); 436 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result3); 437 438 ASSERT_EQ(2U, result3.option_values.size()); 439 ASSERT_EQ(2U, result3.option_contents.size()); 440 EXPECT_EQ(ASCIIToUTF16("CA"), result3.option_values[0]); 441 EXPECT_EQ(ASCIIToUTF16("California"), result3.option_contents[0]); 442 EXPECT_EQ(ASCIIToUTF16("TX"), result3.option_values[1]); 443 EXPECT_EQ(ASCIIToUTF16("Texas"), result3.option_contents[1]); 444 } 445 446 // We should be able to extract a <textarea> field. 447 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldTextArea) { 448 LoadHTML("<TEXTAREA id=\"element\">" 449 "This element's value " 450 "spans multiple lines." 451 "</TEXTAREA>"); 452 453 WebFrame* frame = GetMainFrame(); 454 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 455 456 WebElement web_element = frame->document().getElementById("element"); 457 WebFormControlElement element = web_element.to<WebFormControlElement>(); 458 FormFieldData result_sans_value; 459 WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, 460 &result_sans_value); 461 462 FormFieldData expected; 463 expected.name = ASCIIToUTF16("element"); 464 expected.max_length = 0; 465 expected.form_control_type = "textarea"; 466 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_sans_value); 467 468 FormFieldData result_with_value; 469 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, 470 &result_with_value); 471 expected.value = ASCIIToUTF16("This element's value\n" 472 "spans multiple lines."); 473 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_with_value); 474 } 475 476 // We should be able to extract an <input type="month"> field. 477 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldMonthInput) { 478 LoadHTML("<INPUT type=\"month\" id=\"element\" value=\"2011-12\">"); 479 480 WebFrame* frame = GetMainFrame(); 481 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 482 483 WebElement web_element = frame->document().getElementById("element"); 484 WebFormControlElement element = web_element.to<WebFormControlElement>(); 485 FormFieldData result_sans_value; 486 WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, 487 &result_sans_value); 488 489 FormFieldData expected; 490 expected.name = ASCIIToUTF16("element"); 491 expected.max_length = 0; 492 expected.form_control_type = "month"; 493 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_sans_value); 494 495 FormFieldData result_with_value; 496 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, 497 &result_with_value); 498 expected.value = ASCIIToUTF16("2011-12"); 499 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_with_value); 500 } 501 502 // We should not extract the value for non-text and non-select fields. 503 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldInvalidType) { 504 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 505 " <INPUT type=\"hidden\" id=\"hidden\" value=\"apple\"/>" 506 " <INPUT type=\"submit\" id=\"submit\" value=\"Send\"/>" 507 "</FORM>"); 508 509 WebFrame* frame = GetMainFrame(); 510 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 511 512 WebElement web_element = frame->document().getElementById("hidden"); 513 WebFormControlElement element = web_element.to<WebFormControlElement>(); 514 FormFieldData result; 515 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 516 517 FormFieldData expected; 518 expected.max_length = 0; 519 520 expected.name = ASCIIToUTF16("hidden"); 521 expected.form_control_type = "hidden"; 522 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 523 524 web_element = frame->document().getElementById("submit"); 525 element = web_element.to<WebFormControlElement>(); 526 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 527 expected.name = ASCIIToUTF16("submit"); 528 expected.form_control_type = "submit"; 529 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 530 } 531 532 // We should be able to extract password fields. 533 TEST_F(FormAutofillTest, WebFormControlElementToPasswordFormField) { 534 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 535 " <INPUT type=\"password\" id=\"password\" value=\"secret\"/>" 536 "</FORM>"); 537 538 WebFrame* frame = GetMainFrame(); 539 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 540 541 WebElement web_element = frame->document().getElementById("password"); 542 WebFormControlElement element = web_element.to<WebFormControlElement>(); 543 FormFieldData result; 544 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 545 546 FormFieldData expected; 547 expected.max_length = WebInputElement::defaultMaxLength(); 548 expected.name = ASCIIToUTF16("password"); 549 expected.form_control_type = "password"; 550 expected.value = ASCIIToUTF16("secret"); 551 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 552 } 553 554 // We should be able to extract the autocompletetype attribute. 555 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldAutocompletetype) { 556 std::string html = 557 "<INPUT type=\"text\" id=\"absent\"/>" 558 "<INPUT type=\"text\" id=\"empty\" autocomplete=\"\"/>" 559 "<INPUT type=\"text\" id=\"off\" autocomplete=\"off\"/>" 560 "<INPUT type=\"text\" id=\"regular\" autocomplete=\"email\"/>" 561 "<INPUT type=\"text\" id=\"multi-valued\" " 562 " autocomplete=\"billing email\"/>" 563 "<INPUT type=\"text\" id=\"experimental\" x-autocompletetype=\"email\"/>" 564 "<INPUT type=\"month\" id=\"month\" autocomplete=\"cc-exp\"/>" 565 "<SELECT id=\"select\" autocomplete=\"state\"/>" 566 " <OPTION value=\"CA\">California</OPTION>" 567 " <OPTION value=\"TX\">Texas</OPTION>" 568 "</SELECT>" 569 "<TEXTAREA id=\"textarea\" autocomplete=\"street-address\">" 570 " Some multi-" 571 " lined value" 572 "</TEXTAREA>"; 573 html += 574 "<INPUT type=\"text\" id=\"malicious\" autocomplete=\"" + 575 std::string(10000, 'x') + "\"/>"; 576 LoadHTML(html.c_str()); 577 578 WebFrame* frame = GetMainFrame(); 579 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 580 581 struct TestCase { 582 const std::string element_id; 583 const std::string form_control_type; 584 const std::string autocomplete_attribute; 585 }; 586 TestCase test_cases[] = { 587 // An absent attribute is equivalent to an empty one. 588 { "absent", "text", "" }, 589 // Make sure there are no issues parsing an empty attribute. 590 { "empty", "text", "" }, 591 // Make sure there are no issues parsing an attribute value that isn't a 592 // type hint. 593 { "off", "text", "off" }, 594 // Common case: exactly one type specified. 595 { "regular", "text", "email" }, 596 // Verify that we correctly extract multiple tokens as well. 597 { "multi-valued", "text", "billing email" }, 598 // Verify that <input type="month"> fields are supported. 599 { "month", "month", "cc-exp" }, 600 // We previously extracted this data from the experimental 601 // 'x-autocompletetype' attribute. Now that the field type hints are part 602 // of the spec under the autocomplete attribute, we no longer support the 603 // experimental version. 604 { "experimental", "text", "" }, 605 // <select> elements should behave no differently from text fields here. 606 { "select", "select-one", "state" }, 607 // <textarea> elements should also behave no differently from text fields. 608 { "textarea", "textarea", "street-address" }, 609 // Very long attribute values should be replaced by a default string, to 610 // prevent malicious websites from DOSing the browser process. 611 { "malicious", "text", "x-max-data-length-exceeded" }, 612 }; 613 614 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { 615 WebElement web_element = frame->document().getElementById( 616 ASCIIToUTF16(test_cases[i].element_id)); 617 WebFormControlElement element = web_element.to<WebFormControlElement>(); 618 FormFieldData result; 619 WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, &result); 620 621 FormFieldData expected; 622 expected.name = ASCIIToUTF16(test_cases[i].element_id); 623 expected.form_control_type = test_cases[i].form_control_type; 624 expected.autocomplete_attribute = test_cases[i].autocomplete_attribute; 625 if (test_cases[i].form_control_type == "text") 626 expected.max_length = WebInputElement::defaultMaxLength(); 627 else 628 expected.max_length = 0; 629 630 SCOPED_TRACE(test_cases[i].element_id); 631 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 632 } 633 } 634 635 TEST_F(FormAutofillTest, WebFormElementToFormData) { 636 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 637 " <LABEL for=\"firstname\">First name:</LABEL>" 638 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 639 " <LABEL for=\"lastname\">Last name:</LABEL>" 640 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 641 " <LABEL for=\"street-address\">Address:</LABEL>" 642 " <TEXTAREA id=\"street-address\">" 643 "123 Fantasy Ln. " 644 "Apt. 42" 645 "</TEXTAREA>" 646 " <LABEL for=\"state\">State:</LABEL>" 647 " <SELECT id=\"state\"/>" 648 " <OPTION value=\"CA\">California</OPTION>" 649 " <OPTION value=\"TX\">Texas</OPTION>" 650 " </SELECT>" 651 " <LABEL for=\"password\">Password:</LABEL>" 652 " <INPUT type=\"password\" id=\"password\" value=\"secret\"/>" 653 " <LABEL for=\"month\">Card expiration:</LABEL>" 654 " <INPUT type=\"month\" id=\"month\" value=\"2011-12\"/>" 655 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 656 // The below inputs should be ignored 657 " <LABEL for=\"notvisible\">Hidden:</LABEL>" 658 " <INPUT type=\"hidden\" id=\"notvisible\" value=\"apple\"/>" 659 "</FORM>"); 660 661 WebFrame* frame = GetMainFrame(); 662 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 663 664 WebVector<WebFormElement> forms; 665 frame->document().forms(forms); 666 ASSERT_EQ(1U, forms.size()); 667 668 WebElement element = frame->document().getElementById("firstname"); 669 WebInputElement input_element = element.to<WebInputElement>(); 670 671 FormData form; 672 FormFieldData field; 673 EXPECT_TRUE(WebFormElementToFormData(forms[0], 674 input_element, 675 autofill::REQUIRE_NONE, 676 autofill::EXTRACT_VALUE, 677 &form, 678 &field)); 679 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 680 EXPECT_EQ(GURL(frame->document().url()), form.origin); 681 EXPECT_EQ(GURL("http://cnn.com"), form.action); 682 683 const std::vector<FormFieldData>& fields = form.fields; 684 ASSERT_EQ(6U, fields.size()); 685 686 FormFieldData expected; 687 expected.name = ASCIIToUTF16("firstname"); 688 expected.value = ASCIIToUTF16("John"); 689 expected.label = ASCIIToUTF16("First name:"); 690 expected.form_control_type = "text"; 691 expected.max_length = WebInputElement::defaultMaxLength(); 692 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 693 694 expected.name = ASCIIToUTF16("lastname"); 695 expected.value = ASCIIToUTF16("Smith"); 696 expected.label = ASCIIToUTF16("Last name:"); 697 expected.form_control_type = "text"; 698 expected.max_length = WebInputElement::defaultMaxLength(); 699 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 700 701 expected.name = ASCIIToUTF16("street-address"); 702 expected.value = ASCIIToUTF16("123 Fantasy Ln.\nApt. 42"); 703 expected.label = ASCIIToUTF16("Address:"); 704 expected.form_control_type = "textarea"; 705 expected.max_length = 0; 706 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 707 708 expected.name = ASCIIToUTF16("state"); 709 expected.value = ASCIIToUTF16("CA"); 710 expected.label = ASCIIToUTF16("State:"); 711 expected.form_control_type = "select-one"; 712 expected.max_length = 0; 713 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); 714 715 expected.name = ASCIIToUTF16("password"); 716 expected.value = ASCIIToUTF16("secret"); 717 expected.label = ASCIIToUTF16("Password:"); 718 expected.form_control_type = "password"; 719 expected.max_length = WebInputElement::defaultMaxLength(); 720 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[4]); 721 722 expected.name = ASCIIToUTF16("month"); 723 expected.value = ASCIIToUTF16("2011-12"); 724 expected.label = ASCIIToUTF16("Card expiration:"); 725 expected.form_control_type = "month"; 726 expected.max_length = 0; 727 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[5]); 728 } 729 730 // We should not be able to serialize a form with too many fillable fields. 731 TEST_F(FormAutofillTest, WebFormElementToFormDataTooManyFields) { 732 std::string html = 733 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"; 734 for (size_t i = 0; i < (autofill::kMaxParseableFields + 1); ++i) { 735 html += "<INPUT type=\"text\"/>"; 736 } 737 html += "</FORM>"; 738 LoadHTML(html.c_str()); 739 740 WebFrame* frame = GetMainFrame(); 741 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 742 743 WebVector<WebFormElement> forms; 744 frame->document().forms(forms); 745 ASSERT_EQ(1U, forms.size()); 746 747 WebElement element = frame->document().getElementById("firstname"); 748 WebInputElement input_element = element.to<WebInputElement>(); 749 750 FormData form; 751 FormFieldData field; 752 EXPECT_FALSE(WebFormElementToFormData(forms[0], 753 input_element, 754 autofill::REQUIRE_NONE, 755 autofill::EXTRACT_VALUE, 756 &form, 757 &field)); 758 } 759 760 TEST_F(FormAutofillTest, ExtractForms) { 761 ExpectJohnSmithLabels( 762 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 763 " First name: <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 764 " Last name: <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 765 " Email: <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 766 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 767 "</FORM>"); 768 } 769 770 TEST_F(FormAutofillTest, ExtractMultipleForms) { 771 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 772 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 773 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 774 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 775 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 776 "</FORM>" 777 "<FORM name=\"TestForm2\" action=\"http://zoo.com\" method=\"post\">" 778 " <INPUT type=\"text\" id=\"firstname\" value=\"Jack\"/>" 779 " <INPUT type=\"text\" id=\"lastname\" value=\"Adams\"/>" 780 " <INPUT type=\"text\" id=\"email\" value=\"jack (at) example.com\"/>" 781 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 782 "</FORM>"); 783 784 WebFrame* web_frame = GetMainFrame(); 785 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 786 787 FormCache form_cache; 788 std::vector<FormData> forms; 789 form_cache.ExtractForms(*web_frame, &forms); 790 ASSERT_EQ(2U, forms.size()); 791 792 // First form. 793 const FormData& form = forms[0]; 794 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 795 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 796 EXPECT_EQ(GURL("http://cnn.com"), form.action); 797 798 const std::vector<FormFieldData>& fields = form.fields; 799 ASSERT_EQ(3U, fields.size()); 800 801 FormFieldData expected; 802 expected.form_control_type = "text"; 803 expected.max_length = WebInputElement::defaultMaxLength(); 804 805 expected.name = ASCIIToUTF16("firstname"); 806 expected.value = ASCIIToUTF16("John"); 807 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 808 809 expected.name = ASCIIToUTF16("lastname"); 810 expected.value = ASCIIToUTF16("Smith"); 811 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 812 813 expected.name = ASCIIToUTF16("email"); 814 expected.value = ASCIIToUTF16("john (at) example.com"); 815 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 816 817 // Second form. 818 const FormData& form2 = forms[1]; 819 EXPECT_EQ(ASCIIToUTF16("TestForm2"), form2.name); 820 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 821 EXPECT_EQ(GURL("http://zoo.com"), form2.action); 822 823 const std::vector<FormFieldData>& fields2 = form2.fields; 824 ASSERT_EQ(3U, fields2.size()); 825 826 expected.name = ASCIIToUTF16("firstname"); 827 expected.value = ASCIIToUTF16("Jack"); 828 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); 829 830 expected.name = ASCIIToUTF16("lastname"); 831 expected.value = ASCIIToUTF16("Adams"); 832 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); 833 834 expected.name = ASCIIToUTF16("email"); 835 expected.value = ASCIIToUTF16("jack (at) example.com"); 836 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 837 } 838 839 // We should not extract a form if it has too few fillable fields. 840 TEST_F(FormAutofillTest, ExtractFormsTooFewFields) { 841 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 842 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 843 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 844 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 845 "</FORM>"); 846 847 WebFrame* web_frame = GetMainFrame(); 848 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 849 850 FormCache form_cache; 851 std::vector<FormData> forms; 852 form_cache.ExtractForms(*web_frame, &forms); 853 EXPECT_EQ(0U, forms.size()); 854 } 855 856 // We should not report additional forms for empty forms. 857 TEST_F(FormAutofillTest, ExtractFormsSkippedForms) { 858 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 859 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 860 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 861 "</FORM>"); 862 863 WebFrame* web_frame = GetMainFrame(); 864 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 865 866 FormCache form_cache; 867 std::vector<FormData> forms; 868 bool has_skipped_forms = form_cache.ExtractFormsAndFormElements(*web_frame, 869 3, 870 &forms, 871 NULL); 872 EXPECT_EQ(0U, forms.size()); 873 EXPECT_TRUE(has_skipped_forms); 874 } 875 876 // We should not report additional forms for empty forms. 877 TEST_F(FormAutofillTest, ExtractFormsNoFields) { 878 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 879 "</FORM>"); 880 881 WebFrame* web_frame = GetMainFrame(); 882 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 883 884 FormCache form_cache; 885 std::vector<FormData> forms; 886 bool has_skipped_forms = form_cache.ExtractFormsAndFormElements(*web_frame, 887 3, 888 &forms, 889 NULL); 890 EXPECT_EQ(0U, forms.size()); 891 EXPECT_FALSE(has_skipped_forms); 892 } 893 894 // We should not extract a form if it has too few fillable fields. 895 // Make sure radio and checkbox fields don't count. 896 TEST_F(FormAutofillTest, ExtractFormsTooFewFieldsSkipsCheckable) { 897 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 898 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 899 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 900 " <INPUT type=\"radio\" id=\"a_radio\" value=\"0\"/>" 901 " <INPUT type=\"checkbox\" id=\"a_check\" value=\"1\"/>" 902 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 903 "</FORM>"); 904 905 WebFrame* web_frame = GetMainFrame(); 906 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 907 908 FormCache form_cache; 909 std::vector<FormData> forms; 910 form_cache.ExtractForms(*web_frame, &forms); 911 EXPECT_EQ(0U, forms.size()); 912 } 913 914 TEST_F(FormAutofillTest, WebFormElementToFormDataAutocomplete) { 915 { 916 // Form is not auto-completable due to autocomplete=off. 917 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\"" 918 " autocomplete=off>" 919 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 920 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 921 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 922 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 923 "</FORM>"); 924 925 WebFrame* web_frame = GetMainFrame(); 926 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 927 928 WebVector<WebFormElement> web_forms; 929 web_frame->document().forms(web_forms); 930 ASSERT_EQ(1U, web_forms.size()); 931 WebFormElement web_form = web_forms[0]; 932 933 FormData form; 934 EXPECT_TRUE(WebFormElementToFormData( 935 web_form, WebFormControlElement(), autofill::REQUIRE_NONE, 936 autofill::EXTRACT_NONE, &form, NULL)); 937 EXPECT_FALSE(WebFormElementToFormData( 938 web_form, WebFormControlElement(), autofill::REQUIRE_AUTOCOMPLETE, 939 autofill::EXTRACT_NONE, &form, NULL)); 940 } 941 942 { 943 // The firstname element is not auto-completable due to autocomplete=off. 944 LoadHTML("<FORM name=\"TestForm\" action=\"http://abc.com\" " 945 " method=\"post\">" 946 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"" 947 " autocomplete=off>" 948 " <INPUT type=\"text\" id=\"middlename\" value=\"Jack\"/>" 949 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 950 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 951 " <INPUT type=\"submit\" name=\"reply\" value=\"Send\"/>" 952 "</FORM>"); 953 954 WebFrame* web_frame = GetMainFrame(); 955 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 956 957 WebVector<WebFormElement> web_forms; 958 web_frame->document().forms(web_forms); 959 ASSERT_EQ(1U, web_forms.size()); 960 WebFormElement web_form = web_forms[0]; 961 962 FormData form; 963 EXPECT_TRUE(WebFormElementToFormData( 964 web_form, WebFormControlElement(), autofill::REQUIRE_AUTOCOMPLETE, 965 autofill::EXTRACT_VALUE, &form, NULL)); 966 967 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 968 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 969 EXPECT_EQ(GURL("http://abc.com"), form.action); 970 971 const std::vector<FormFieldData>& fields = form.fields; 972 ASSERT_EQ(3U, fields.size()); 973 974 FormFieldData expected; 975 expected.form_control_type = "text"; 976 expected.max_length = WebInputElement::defaultMaxLength(); 977 978 expected.name = ASCIIToUTF16("middlename"); 979 expected.value = ASCIIToUTF16("Jack"); 980 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 981 982 expected.name = ASCIIToUTF16("lastname"); 983 expected.value = ASCIIToUTF16("Smith"); 984 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 985 986 expected.name = ASCIIToUTF16("email"); 987 expected.value = ASCIIToUTF16("john (at) example.com"); 988 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 989 } 990 } 991 992 TEST_F(FormAutofillTest, FindForm) { 993 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" 994 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 995 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 996 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"" 997 "autocomplete=\"off\" />" 998 " <INPUT type=\"text\" id=\"phone\" value=\"1.800.555.1234\"/>" 999 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1000 "</FORM>"); 1001 1002 WebFrame* web_frame = GetMainFrame(); 1003 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 1004 1005 FormCache form_cache; 1006 std::vector<FormData> forms; 1007 form_cache.ExtractForms(*web_frame, &forms); 1008 ASSERT_EQ(1U, forms.size()); 1009 1010 // Get the input element we want to find. 1011 WebElement element = web_frame->document().getElementById("firstname"); 1012 WebInputElement input_element = element.to<WebInputElement>(); 1013 1014 // Find the form and verify it's the correct form. 1015 FormData form; 1016 FormFieldData field; 1017 EXPECT_TRUE(FindFormAndFieldForInputElement(input_element, &form, &field, 1018 autofill::REQUIRE_NONE)); 1019 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 1020 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 1021 EXPECT_EQ(GURL("http://buh.com"), form.action); 1022 1023 const std::vector<FormFieldData>& fields = form.fields; 1024 ASSERT_EQ(4U, fields.size()); 1025 1026 FormFieldData expected; 1027 expected.form_control_type = "text"; 1028 expected.max_length = WebInputElement::defaultMaxLength(); 1029 1030 expected.name = ASCIIToUTF16("firstname"); 1031 expected.value = ASCIIToUTF16("John"); 1032 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 1033 EXPECT_FORM_FIELD_DATA_EQUALS(expected, field); 1034 1035 expected.name = ASCIIToUTF16("lastname"); 1036 expected.value = ASCIIToUTF16("Smith"); 1037 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 1038 1039 expected.name = ASCIIToUTF16("email"); 1040 expected.value = ASCIIToUTF16("john (at) example.com"); 1041 expected.autocomplete_attribute = "off"; 1042 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 1043 expected.autocomplete_attribute = std::string(); // reset 1044 1045 expected.name = ASCIIToUTF16("phone"); 1046 expected.value = ASCIIToUTF16("1.800.555.1234"); 1047 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); 1048 1049 // Try again, but require autocomplete. 1050 FormData form2; 1051 FormFieldData field2; 1052 EXPECT_TRUE(FindFormAndFieldForInputElement(input_element, &form2, &field2, 1053 autofill::REQUIRE_AUTOCOMPLETE)); 1054 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); 1055 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 1056 EXPECT_EQ(GURL("http://buh.com"), form2.action); 1057 1058 const std::vector<FormFieldData>& fields2 = form2.fields; 1059 ASSERT_EQ(3U, fields2.size()); 1060 1061 expected.form_control_type = "text"; 1062 expected.max_length = WebInputElement::defaultMaxLength(); 1063 1064 expected.name = ASCIIToUTF16("firstname"); 1065 expected.value = ASCIIToUTF16("John"); 1066 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); 1067 EXPECT_FORM_FIELD_DATA_EQUALS(expected, field); 1068 1069 expected.name = ASCIIToUTF16("lastname"); 1070 expected.value = ASCIIToUTF16("Smith"); 1071 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); 1072 1073 expected.name = ASCIIToUTF16("phone"); 1074 expected.value = ASCIIToUTF16("1.800.555.1234"); 1075 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 1076 } 1077 1078 // Test regular FillForm function. 1079 TEST_F(FormAutofillTest, FillForm) { 1080 static const AutofillFieldCase field_cases[] = { 1081 // fields: form_control_type, name, initial_value, autocomplete_attribute, 1082 // should_be_autofilled, autofill_value, expected_value 1083 1084 // Regular empty fields (firstname & lastname) should be autofilled. 1085 {"text", "firstname", "", "", true, "filled firstname", 1086 "filled firstname"}, 1087 {"text", "lastname", "", "", true, "filled lastname", "filled lastname"}, 1088 // hidden fields should not be extracted to form_data. 1089 // Non empty fields should not be autofilled. 1090 {"text", "notempty", "Hi", "", false, "filled notempty", "Hi"}, 1091 // "noautocomplete" should not be extracted to form_data. 1092 // Disabled fields should not be autofilled. 1093 {"text", "notenabled", "", "", false, "filled notenabled", ""}, 1094 // Readonly fields should not be autofilled. 1095 {"text", "readonly", "", "", false, "filled readonly", ""}, 1096 // Fields with "visibility: hidden" should not be autofilled. 1097 {"text", "invisible", "", "", false, "filled invisible", ""}, 1098 // Fields with "display:none" should not be autofilled. 1099 {"text", "displaynone", "", "", false, "filled displaynone", ""}, 1100 // Regular <input type="month"> should be autofilled. 1101 {"month", "month", "", "", true, "2017-11", "2017-11"}, 1102 // Non-empty <input type="month"> should not be autofilled. 1103 {"month", "month-nonempty", "2011-12", "", false, "2017-11", "2011-12"}, 1104 // Regular select fields should be autofilled. 1105 {"select-one", "select", "", "", true, "TX", "TX"}, 1106 // Select fields should be autofilled even if they already have a 1107 // non-empty value. 1108 {"select-one", "select-nonempty", "CA", "", true, "TX", "TX"}, 1109 // Regular textarea elements should be autofilled. 1110 {"textarea", "textarea", "", "", true, "some multi-\nline value", 1111 "some multi-\nline value"}, 1112 // Non-empty textarea elements should not be autofilled. 1113 {"textarea", "textarea-nonempty", "Go\naway!", "", false, 1114 "some multi-\nline value", "Go\naway!"}, 1115 }; 1116 TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases), 1117 FillForm, &WebInputElement::value); 1118 // Verify preview selection. 1119 WebInputElement firstname = GetMainFrame()->document(). 1120 getElementById("firstname").to<WebInputElement>(); 1121 EXPECT_EQ(16, firstname.selectionStart()); 1122 EXPECT_EQ(16, firstname.selectionEnd()); 1123 } 1124 1125 TEST_F(FormAutofillTest, FillFormIncludingNonFocusableElements) { 1126 static const AutofillFieldCase field_cases[] = { 1127 // fields: form_control_type, name, initial_value, autocomplete_attribute, 1128 // should_be_autofilled, autofill_value, expected_value 1129 1130 // Regular empty fields (firstname & lastname) should be autofilled. 1131 {"text", "firstname", "", "", true, "filled firstname", 1132 "filled firstname"}, 1133 {"text", "lastname", "", "", true, "filled lastname", "filled lastname"}, 1134 // hidden fields should not be extracted to form_data. 1135 // Non empty fields should be overriden. 1136 {"text", "notempty", "Hi", "", true, "filled notempty", 1137 "filled notempty"}, 1138 // "noautocomplete" should not be extracted to form_data. 1139 // Disabled fields should not be autofilled. 1140 {"text", "notenabled", "", "", false, "filled notenabled", ""}, 1141 // Readonly fields should not be autofilled. 1142 {"text", "readonly", "", "", false, "filled readonly", ""}, 1143 // Fields with "visibility: hidden" should also be autofilled. 1144 {"text", "invisible", "", "", true, "filled invisible", 1145 "filled invisible"}, 1146 // Fields with "display:none" should also be autofilled. 1147 {"text", "displaynone", "", "", true, "filled displaynone", 1148 "filled displaynone"}, 1149 // Regular <input type="month"> should be autofilled. 1150 {"month", "month", "", "", true, "2017-11", "2017-11"}, 1151 // Non-empty <input type="month"> should be overridden. 1152 {"month", "month-nonempty", "2011-12", "", true, "2017-11", "2017-11"}, 1153 // Regular select fields should be autofilled. 1154 {"select-one", "select", "", "", true, "TX", "TX"}, 1155 // Select fields should be autofilled even if they already have a 1156 // non-empty value. 1157 {"select-one", "select-nonempty", "CA", "", true, "TX", "TX"}, 1158 // Regular textarea elements should be autofilled. 1159 {"textarea", "textarea", "", "", true, "some multi-\nline value", 1160 "some multi-\nline value"}, 1161 // Nonempty textarea elements should be overridden. 1162 {"textarea", "textarea-nonempty", "Go\naway!", "", true, 1163 "some multi-\nline value", "some multi-\nline value"}, 1164 }; 1165 TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases), 1166 &FillFormIncludingNonFocusableElementsWrapper, 1167 &WebInputElement::value); 1168 } 1169 1170 TEST_F(FormAutofillTest, PreviewForm) { 1171 static const char* html = 1172 "<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" 1173 " <INPUT type=\"text\" id=\"firstname\"/>" 1174 " <INPUT type=\"text\" id=\"lastname\"/>" 1175 " <INPUT type=\"text\" id=\"notempty\" value=\"Hi\"/>" 1176 " <INPUT type=\"text\" autocomplete=\"off\" id=\"noautocomplete\"/>" 1177 " <INPUT type=\"text\" disabled=\"disabled\" id=\"notenabled\"/>" 1178 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1179 "</FORM>"; 1180 1181 static const AutofillFieldCase field_cases[] = { 1182 // Normal empty fields should be previewed. 1183 {"text", "firstname", "", "", true, "suggested firstname", 1184 "suggested firstname"}, 1185 {"text", "lastname", "", "", true, "suggested lastname", 1186 "suggested lastname"}, 1187 // Non empty fields should not be previewed. 1188 {"text", "notempty", "Hi", "", false, "filled notempty", ""}, 1189 // "noautocomplete" should not be extracted to form_data. 1190 // Disabled fields should not be previewed. 1191 {"text", "notenabled", "", "", false, "filled notenabled", ""}, 1192 }; 1193 TestFormFillFunctions(html, field_cases, arraysize(field_cases), &PreviewForm, 1194 &WebInputElement::suggestedValue); 1195 1196 // Verify preview selection. 1197 WebInputElement firstname = GetMainFrame()->document(). 1198 getElementById("firstname").to<WebInputElement>(); 1199 EXPECT_EQ(0, firstname.selectionStart()); 1200 EXPECT_EQ(19, firstname.selectionEnd()); 1201 } 1202 1203 TEST_F(FormAutofillTest, Labels) { 1204 ExpectJohnSmithLabels( 1205 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1206 " <LABEL for=\"firstname\"> First name: </LABEL>" 1207 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 1208 " <LABEL for=\"lastname\"> Last name: </LABEL>" 1209 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 1210 " <LABEL for=\"email\"> Email: </LABEL>" 1211 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 1212 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1213 "</FORM>"); 1214 } 1215 1216 TEST_F(FormAutofillTest, LabelsWithSpans) { 1217 ExpectJohnSmithLabels( 1218 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1219 " <LABEL for=\"firstname\"><span>First name: </span></LABEL>" 1220 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 1221 " <LABEL for=\"lastname\"><span>Last name: </span></LABEL>" 1222 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 1223 " <LABEL for=\"email\"><span>Email: </span></LABEL>" 1224 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 1225 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1226 "</FORM>"); 1227 } 1228 1229 // This test is different from FormAutofillTest.Labels in that the label 1230 // elements for= attribute is set to the name of the form control element it is 1231 // a label for instead of the id of the form control element. This is invalid 1232 // because the for= attribute must be set to the id of the form control element; 1233 // however, current label parsing code will extract the text from the previous 1234 // label element and apply it to the following input field. 1235 TEST_F(FormAutofillTest, InvalidLabels) { 1236 ExpectJohnSmithLabels( 1237 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1238 " <LABEL for=\"firstname\"> First name: </LABEL>" 1239 " <INPUT type=\"text\" name=\"firstname\" value=\"John\"/>" 1240 " <LABEL for=\"lastname\"> Last name: </LABEL>" 1241 " <INPUT type=\"text\" name=\"lastname\" value=\"Smith\"/>" 1242 " <LABEL for=\"email\"> Email: </LABEL>" 1243 " <INPUT type=\"text\" name=\"email\" value=\"john (at) example.com\"/>" 1244 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1245 "</FORM>"); 1246 } 1247 1248 // This test has three form control elements, only one of which has a label 1249 // element associated with it. 1250 TEST_F(FormAutofillTest, OneLabelElement) { 1251 ExpectJohnSmithLabels( 1252 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1253 " First name:" 1254 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 1255 " <LABEL for=\"lastname\">Last name: </LABEL>" 1256 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 1257 " Email:" 1258 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 1259 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1260 "</FORM>"); 1261 } 1262 1263 TEST_F(FormAutofillTest, LabelsInferredFromText) { 1264 ExpectJohnSmithLabels( 1265 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1266 " First name:" 1267 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 1268 " Last name:" 1269 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 1270 " Email:" 1271 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 1272 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1273 "</FORM>"); 1274 } 1275 1276 TEST_F(FormAutofillTest, LabelsInferredFromParagraph) { 1277 ExpectJohnSmithLabels( 1278 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1279 " <P>First name:</P><INPUT type=\"text\" " 1280 " id=\"firstname\" value=\"John\"/>" 1281 " <P>Last name:</P>" 1282 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 1283 " <P>Email:</P>" 1284 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 1285 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1286 "</FORM>"); 1287 } 1288 1289 TEST_F(FormAutofillTest, LabelsInferredFromBold) { 1290 ExpectJohnSmithLabels( 1291 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1292 " <B>First name:</B><INPUT type=\"text\" " 1293 " id=\"firstname\" value=\"John\"/>" 1294 " <B>Last name:</B>" 1295 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 1296 " <B>Email:</B>" 1297 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 1298 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1299 "</FORM>"); 1300 } 1301 1302 TEST_F(FormAutofillTest, LabelsInferredPriorToImgOrBr) { 1303 ExpectJohnSmithLabels( 1304 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1305 " First name:<IMG/><INPUT type=\"text\" " 1306 " id=\"firstname\" value=\"John\"/>" 1307 " Last name:<IMG/>" 1308 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 1309 " Email:<BR/>" 1310 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 1311 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1312 "</FORM>"); 1313 } 1314 1315 TEST_F(FormAutofillTest, LabelsInferredFromTableCell) { 1316 ExpectJohnSmithLabels( 1317 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1318 "<TABLE>" 1319 " <TR>" 1320 " <TD>First name:</TD>" 1321 " <TD><INPUT type=\"text\" id=\"firstname\" value=\"John\"/></TD>" 1322 " </TR>" 1323 " <TR>" 1324 " <TD>Last name:</TD>" 1325 " <TD><INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/></TD>" 1326 " </TR>" 1327 " <TR>" 1328 " <TD>Email:</TD>" 1329 " <TD><INPUT type=\"text\" id=\"email\"" 1330 " value=\"john (at) example.com\"/></TD>" 1331 " </TR>" 1332 " <TR>" 1333 " <TD></TD>" 1334 " <TD>" 1335 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1336 " </TD>" 1337 " </TR>" 1338 "</TABLE>" 1339 "</FORM>"); 1340 } 1341 1342 TEST_F(FormAutofillTest, LabelsInferredFromTableCellTH) { 1343 ExpectJohnSmithLabels( 1344 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1345 "<TABLE>" 1346 " <TR>" 1347 " <TH>First name:</TH>" 1348 " <TD><INPUT type=\"text\" id=\"firstname\" value=\"John\"/></TD>" 1349 " </TR>" 1350 " <TR>" 1351 " <TH>Last name:</TH>" 1352 " <TD><INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/></TD>" 1353 " </TR>" 1354 " <TR>" 1355 " <TH>Email:</TH>" 1356 " <TD><INPUT type=\"text\" id=\"email\"" 1357 " value=\"john (at) example.com\"/></TD>" 1358 " </TR>" 1359 " <TR>" 1360 " <TD></TD>" 1361 " <TD>" 1362 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1363 " </TD>" 1364 " </TR>" 1365 "</TABLE>" 1366 "</FORM>"); 1367 } 1368 1369 TEST_F(FormAutofillTest, LabelsInferredFromTableCellNested) { 1370 std::vector<base::string16> labels, names, values; 1371 1372 labels.push_back(ASCIIToUTF16("First name: Bogus")); 1373 names.push_back(ASCIIToUTF16("firstname")); 1374 values.push_back(ASCIIToUTF16("John")); 1375 1376 labels.push_back(ASCIIToUTF16("Last name:")); 1377 names.push_back(ASCIIToUTF16("lastname")); 1378 values.push_back(ASCIIToUTF16("Smith")); 1379 1380 labels.push_back(ASCIIToUTF16("Email:")); 1381 names.push_back(ASCIIToUTF16("email")); 1382 values.push_back(ASCIIToUTF16("john (at) example.com")); 1383 1384 ExpectLabels( 1385 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1386 "<TABLE>" 1387 " <TR>" 1388 " <TD>" 1389 " <FONT>" 1390 " First name:" 1391 " </FONT>" 1392 " <FONT>" 1393 " Bogus" 1394 " </FONT>" 1395 " </TD>" 1396 " <TD>" 1397 " <FONT>" 1398 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 1399 " </FONT>" 1400 " </TD>" 1401 " </TR>" 1402 " <TR>" 1403 " <TD>" 1404 " <FONT>" 1405 " Last name:" 1406 " </FONT>" 1407 " </TD>" 1408 " <TD>" 1409 " <FONT>" 1410 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 1411 " </FONT>" 1412 " </TD>" 1413 " </TR>" 1414 " <TR>" 1415 " <TD>" 1416 " <FONT>" 1417 " Email:" 1418 " </FONT>" 1419 " </TD>" 1420 " <TD>" 1421 " <FONT>" 1422 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 1423 " </FONT>" 1424 " </TD>" 1425 " </TR>" 1426 " <TR>" 1427 " <TD></TD>" 1428 " <TD>" 1429 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1430 " </TD>" 1431 " </TR>" 1432 "</TABLE>" 1433 "</FORM>", 1434 labels, names, values); 1435 } 1436 1437 TEST_F(FormAutofillTest, LabelsInferredFromTableEmptyTDs) { 1438 std::vector<base::string16> labels, names, values; 1439 1440 labels.push_back(ASCIIToUTF16("* First Name")); 1441 names.push_back(ASCIIToUTF16("firstname")); 1442 values.push_back(ASCIIToUTF16("John")); 1443 1444 labels.push_back(ASCIIToUTF16("* Last Name")); 1445 names.push_back(ASCIIToUTF16("lastname")); 1446 values.push_back(ASCIIToUTF16("Smith")); 1447 1448 labels.push_back(ASCIIToUTF16("* Email")); 1449 names.push_back(ASCIIToUTF16("email")); 1450 values.push_back(ASCIIToUTF16("john (at) example.com")); 1451 1452 ExpectLabels( 1453 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1454 "<TABLE>" 1455 " <TR>" 1456 " <TD>" 1457 " <SPAN>*</SPAN>" 1458 " <B>First Name</B>" 1459 " </TD>" 1460 " <TD></TD>" 1461 " <TD>" 1462 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 1463 " </TD>" 1464 " </TR>" 1465 " <TR>" 1466 " <TD>" 1467 " <SPAN>*</SPAN>" 1468 " <B>Last Name</B>" 1469 " </TD>" 1470 " <TD></TD>" 1471 " <TD>" 1472 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 1473 " </TD>" 1474 " </TR>" 1475 " <TR>" 1476 " <TD>" 1477 " <SPAN>*</SPAN>" 1478 " <B>Email</B>" 1479 " </TD>" 1480 " <TD></TD>" 1481 " <TD>" 1482 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 1483 " </TD>" 1484 " </TR>" 1485 " <TR>" 1486 " <TD></TD>" 1487 " <TD>" 1488 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1489 " </TD>" 1490 " </TR>" 1491 "</TABLE>" 1492 "</FORM>", 1493 labels, names, values); 1494 } 1495 1496 TEST_F(FormAutofillTest, LabelsInferredFromPreviousTD) { 1497 std::vector<base::string16> labels, names, values; 1498 1499 labels.push_back(ASCIIToUTF16("* First Name")); 1500 names.push_back(ASCIIToUTF16("firstname")); 1501 values.push_back(ASCIIToUTF16("John")); 1502 1503 labels.push_back(ASCIIToUTF16("* Last Name")); 1504 names.push_back(ASCIIToUTF16("lastname")); 1505 values.push_back(ASCIIToUTF16("Smith")); 1506 1507 labels.push_back(ASCIIToUTF16("* Email")); 1508 names.push_back(ASCIIToUTF16("email")); 1509 values.push_back(ASCIIToUTF16("john (at) example.com")); 1510 1511 ExpectLabels( 1512 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1513 "<TABLE>" 1514 " <TR>" 1515 " <TD>* First Name</TD>" 1516 " <TD>" 1517 " Bogus" 1518 " <INPUT type=\"hidden\"/>" 1519 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 1520 " </TD>" 1521 " </TR>" 1522 " <TR>" 1523 " <TD>* Last Name</TD>" 1524 " <TD>" 1525 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 1526 " </TD>" 1527 " </TR>" 1528 " <TR>" 1529 " <TD>* Email</TD>" 1530 " <TD>" 1531 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 1532 " </TD>" 1533 " </TR>" 1534 " <TR>" 1535 " <TD></TD>" 1536 " <TD>" 1537 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1538 " </TD>" 1539 " </TR>" 1540 "</TABLE>" 1541 "</FORM>", 1542 labels, names, values); 1543 } 1544 1545 // <script>, <noscript> and <option> tags are excluded when the labels are 1546 // inferred. 1547 // Also <!-- comment --> is excluded. 1548 TEST_F(FormAutofillTest, LabelsInferredFromTableWithSpecialElements) { 1549 std::vector<base::string16> labels, names, values; 1550 std::vector<std::string> control_types; 1551 1552 labels.push_back(ASCIIToUTF16("* First Name")); 1553 names.push_back(ASCIIToUTF16("firstname")); 1554 values.push_back(ASCIIToUTF16("John")); 1555 control_types.push_back("text"); 1556 1557 labels.push_back(ASCIIToUTF16("* Middle Name")); 1558 names.push_back(ASCIIToUTF16("middlename")); 1559 values.push_back(ASCIIToUTF16("Joe")); 1560 control_types.push_back("text"); 1561 1562 labels.push_back(ASCIIToUTF16("* Last Name")); 1563 names.push_back(ASCIIToUTF16("lastname")); 1564 values.push_back(ASCIIToUTF16("Smith")); 1565 control_types.push_back("text"); 1566 1567 labels.push_back(ASCIIToUTF16("* Country")); 1568 names.push_back(ASCIIToUTF16("country")); 1569 values.push_back(ASCIIToUTF16("US")); 1570 control_types.push_back("select-one"); 1571 1572 labels.push_back(ASCIIToUTF16("* Email")); 1573 names.push_back(ASCIIToUTF16("email")); 1574 values.push_back(ASCIIToUTF16("john (at) example.com")); 1575 control_types.push_back("text"); 1576 1577 ExpectLabelsAndTypes( 1578 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1579 "<TABLE>" 1580 " <TR>" 1581 " <TD>" 1582 " <SPAN>*</SPAN>" 1583 " <B>First Name</B>" 1584 " </TD>" 1585 " <TD>" 1586 " <SCRIPT> <!-- function test() { alert('ignored as label'); } -->" 1587 " </SCRIPT>" 1588 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 1589 " </TD>" 1590 " </TR>" 1591 " <TR>" 1592 " <TD>" 1593 " <SPAN>*</SPAN>" 1594 " <B>Middle Name</B>" 1595 " </TD>" 1596 " <TD>" 1597 " <NOSCRIPT>" 1598 " <P>Bad</P>" 1599 " </NOSCRIPT>" 1600 " <INPUT type=\"text\" id=\"middlename\" value=\"Joe\"/>" 1601 " </TD>" 1602 " </TR>" 1603 " <TR>" 1604 " <TD>" 1605 " <SPAN>*</SPAN>" 1606 " <B>Last Name</B>" 1607 " </TD>" 1608 " <TD>" 1609 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 1610 " </TD>" 1611 " </TR>" 1612 " <TR>" 1613 " <TD>" 1614 " <SPAN>*</SPAN>" 1615 " <B>Country</B>" 1616 " </TD>" 1617 " <TD>" 1618 " <SELECT id=\"country\">" 1619 " <OPTION VALUE=\"US\">The value should be ignored as label." 1620 " </OPTION>" 1621 " <OPTION VALUE=\"JP\">JAPAN</OPTION>" 1622 " </SELECT>" 1623 " </TD>" 1624 " </TR>" 1625 " <TR>" 1626 " <TD>" 1627 " <SPAN>*</SPAN>" 1628 " <B>Email</B>" 1629 " </TD>" 1630 " <TD>" 1631 " <!-- This comment should be ignored as inferred label.-->" 1632 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 1633 " </TD>" 1634 " </TR>" 1635 " <TR>" 1636 " <TD></TD>" 1637 " <TD>" 1638 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1639 " </TD>" 1640 " </TR>" 1641 "</TABLE>" 1642 "</FORM>", 1643 labels, names, values, control_types); 1644 } 1645 1646 TEST_F(FormAutofillTest, LabelsInferredFromTableLabels) { 1647 ExpectJohnSmithLabels( 1648 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1649 "<TABLE>" 1650 " <TR>" 1651 " <TD>" 1652 " <LABEL>First name:</LABEL>" 1653 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 1654 " </TD>" 1655 " </TR>" 1656 " <TR>" 1657 " <TD>" 1658 " <LABEL>Last name:</LABEL>" 1659 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 1660 " </TD>" 1661 " </TR>" 1662 " <TR>" 1663 " <TD>" 1664 " <LABEL>Email:</LABEL>" 1665 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 1666 " </TD>" 1667 " </TR>" 1668 "</TABLE>" 1669 "<INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1670 "</FORM>"); 1671 } 1672 1673 TEST_F(FormAutofillTest, LabelsInferredFromTableTDInterveningElements) { 1674 ExpectJohnSmithLabels( 1675 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1676 "<TABLE>" 1677 " <TR>" 1678 " <TD>" 1679 " First name:" 1680 " <BR>" 1681 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 1682 " </TD>" 1683 " </TR>" 1684 " <TR>" 1685 " <TD>" 1686 " Last name:" 1687 " <BR>" 1688 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 1689 " </TD>" 1690 " </TR>" 1691 " <TR>" 1692 " <TD>" 1693 " Email:" 1694 " <BR>" 1695 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 1696 " </TD>" 1697 " </TR>" 1698 "</TABLE>" 1699 "<INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1700 "</FORM>"); 1701 } 1702 1703 // Verify that we correctly infer labels when the label text spans multiple 1704 // adjacent HTML elements, not separated by whitespace. 1705 TEST_F(FormAutofillTest, LabelsInferredFromTableAdjacentElements) { 1706 std::vector<base::string16> labels, names, values; 1707 1708 labels.push_back(ASCIIToUTF16("*First Name")); 1709 names.push_back(ASCIIToUTF16("firstname")); 1710 values.push_back(ASCIIToUTF16("John")); 1711 1712 labels.push_back(ASCIIToUTF16("*Last Name")); 1713 names.push_back(ASCIIToUTF16("lastname")); 1714 values.push_back(ASCIIToUTF16("Smith")); 1715 1716 labels.push_back(ASCIIToUTF16("*Email")); 1717 names.push_back(ASCIIToUTF16("email")); 1718 values.push_back(ASCIIToUTF16("john (at) example.com")); 1719 1720 ExpectLabels( 1721 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1722 "<TABLE>" 1723 " <TR>" 1724 " <TD>" 1725 " <SPAN>*</SPAN><B>First Name</B>" 1726 " </TD>" 1727 " <TD>" 1728 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 1729 " </TD>" 1730 " </TR>" 1731 " <TR>" 1732 " <TD>" 1733 " <SPAN>*</SPAN><B>Last Name</B>" 1734 " </TD>" 1735 " <TD>" 1736 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 1737 " </TD>" 1738 " </TR>" 1739 " <TR>" 1740 " <TD>" 1741 " <SPAN>*</SPAN><B>Email</B>" 1742 " </TD>" 1743 " <TD>" 1744 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 1745 " </TD>" 1746 " </TR>" 1747 " <TR>" 1748 " <TD>" 1749 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1750 " </TD>" 1751 " </TR>" 1752 "</TABLE>" 1753 "</FORM>", 1754 labels, names, values); 1755 } 1756 1757 // Verify that we correctly infer labels when the label text resides in the 1758 // previous row. 1759 TEST_F(FormAutofillTest, LabelsInferredFromTableRow) { 1760 std::vector<base::string16> labels, names, values; 1761 1762 labels.push_back(ASCIIToUTF16("*First Name *Last Name *Email")); 1763 names.push_back(ASCIIToUTF16("firstname")); 1764 values.push_back(ASCIIToUTF16("John")); 1765 1766 labels.push_back(ASCIIToUTF16("*First Name *Last Name *Email")); 1767 names.push_back(ASCIIToUTF16("lastname")); 1768 values.push_back(ASCIIToUTF16("Smith")); 1769 1770 labels.push_back(ASCIIToUTF16("*First Name *Last Name *Email")); 1771 names.push_back(ASCIIToUTF16("email")); 1772 values.push_back(ASCIIToUTF16("john (at) example.com")); 1773 1774 ExpectLabels( 1775 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1776 "<TABLE>" 1777 " <TR>" 1778 " <TD>*First Name</TD>" 1779 " <TD>*Last Name</TD>" 1780 " <TD>*Email</TD>" 1781 " </TR>" 1782 " <TR>" 1783 " <TD>" 1784 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 1785 " </TD>" 1786 " <TD>" 1787 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 1788 " </TD>" 1789 " <TD>" 1790 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 1791 " </TD>" 1792 " </TR>" 1793 " <TR>" 1794 " <TD>" 1795 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1796 " </TD>" 1797 " </TR>" 1798 "</TABLE>", 1799 labels, names, values); 1800 } 1801 1802 // Verify that we correctly infer labels when enclosed within a list item. 1803 TEST_F(FormAutofillTest, LabelsInferredFromListItem) { 1804 std::vector<base::string16> labels, names, values; 1805 1806 labels.push_back(ASCIIToUTF16("* Home Phone")); 1807 names.push_back(ASCIIToUTF16("areacode")); 1808 values.push_back(ASCIIToUTF16("415")); 1809 1810 labels.push_back(ASCIIToUTF16("* Home Phone")); 1811 names.push_back(ASCIIToUTF16("prefix")); 1812 values.push_back(ASCIIToUTF16("555")); 1813 1814 labels.push_back(ASCIIToUTF16("* Home Phone")); 1815 names.push_back(ASCIIToUTF16("suffix")); 1816 values.push_back(ASCIIToUTF16("1212")); 1817 1818 ExpectLabels( 1819 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1820 "<DIV>" 1821 " <LI>" 1822 " <SPAN>Bogus</SPAN>" 1823 " </LI>" 1824 " <LI>" 1825 " <LABEL><EM>*</EM> Home Phone</LABEL>" 1826 " <INPUT type=\"text\" id=\"areacode\" value=\"415\"/>" 1827 " <INPUT type=\"text\" id=\"prefix\" value=\"555\"/>" 1828 " <INPUT type=\"text\" id=\"suffix\" value=\"1212\"/>" 1829 " </LI>" 1830 " <LI>" 1831 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1832 " </LI>" 1833 "</DIV>" 1834 "</FORM>", 1835 labels, names, values); 1836 } 1837 1838 TEST_F(FormAutofillTest, LabelsInferredFromDefinitionList) { 1839 std::vector<base::string16> labels, names, values; 1840 1841 labels.push_back(ASCIIToUTF16("* First name: Bogus")); 1842 names.push_back(ASCIIToUTF16("firstname")); 1843 values.push_back(ASCIIToUTF16("John")); 1844 1845 labels.push_back(ASCIIToUTF16("Last name:")); 1846 names.push_back(ASCIIToUTF16("lastname")); 1847 values.push_back(ASCIIToUTF16("Smith")); 1848 1849 labels.push_back(ASCIIToUTF16("Email:")); 1850 names.push_back(ASCIIToUTF16("email")); 1851 values.push_back(ASCIIToUTF16("john (at) example.com")); 1852 1853 ExpectLabels( 1854 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1855 "<DL>" 1856 " <DT>" 1857 " <SPAN>" 1858 " *" 1859 " </SPAN>" 1860 " <SPAN>" 1861 " First name:" 1862 " </SPAN>" 1863 " <SPAN>" 1864 " Bogus" 1865 " </SPAN>" 1866 " </DT>" 1867 " <DD>" 1868 " <FONT>" 1869 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 1870 " </FONT>" 1871 " </DD>" 1872 " <DT>" 1873 " <SPAN>" 1874 " Last name:" 1875 " </SPAN>" 1876 " </DT>" 1877 " <DD>" 1878 " <FONT>" 1879 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 1880 " </FONT>" 1881 " </DD>" 1882 " <DT>" 1883 " <SPAN>" 1884 " Email:" 1885 " </SPAN>" 1886 " </DT>" 1887 " <DD>" 1888 " <FONT>" 1889 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 1890 " </FONT>" 1891 " </DD>" 1892 " <DT></DT>" 1893 " <DD>" 1894 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1895 " </DD>" 1896 "</DL>" 1897 "</FORM>", 1898 labels, names, values); 1899 } 1900 1901 TEST_F(FormAutofillTest, LabelsInferredWithSameName) { 1902 std::vector<base::string16> labels, names, values; 1903 1904 labels.push_back(ASCIIToUTF16("Address Line 1:")); 1905 names.push_back(ASCIIToUTF16("Address")); 1906 values.push_back(base::string16()); 1907 1908 labels.push_back(ASCIIToUTF16("Address Line 2:")); 1909 names.push_back(ASCIIToUTF16("Address")); 1910 values.push_back(base::string16()); 1911 1912 labels.push_back(ASCIIToUTF16("Address Line 3:")); 1913 names.push_back(ASCIIToUTF16("Address")); 1914 values.push_back(base::string16()); 1915 1916 ExpectLabels( 1917 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1918 " Address Line 1:" 1919 " <INPUT type=\"text\" name=\"Address\"/>" 1920 " Address Line 2:" 1921 " <INPUT type=\"text\" name=\"Address\"/>" 1922 " Address Line 3:" 1923 " <INPUT type=\"text\" name=\"Address\"/>" 1924 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 1925 "</FORM>", 1926 labels, names, values); 1927 } 1928 1929 TEST_F(FormAutofillTest, LabelsInferredWithImageTags) { 1930 std::vector<base::string16> labels, names, values; 1931 1932 labels.push_back(ASCIIToUTF16("Phone:")); 1933 names.push_back(ASCIIToUTF16("dayphone1")); 1934 values.push_back(base::string16()); 1935 1936 labels.push_back(ASCIIToUTF16("-")); 1937 names.push_back(ASCIIToUTF16("dayphone2")); 1938 values.push_back(base::string16()); 1939 1940 labels.push_back(ASCIIToUTF16("-")); 1941 names.push_back(ASCIIToUTF16("dayphone3")); 1942 values.push_back(base::string16()); 1943 1944 labels.push_back(ASCIIToUTF16("ext.:")); 1945 names.push_back(ASCIIToUTF16("dayphone4")); 1946 values.push_back(base::string16()); 1947 1948 labels.push_back(base::string16()); 1949 names.push_back(ASCIIToUTF16("dummy")); 1950 values.push_back(base::string16()); 1951 1952 ExpectLabels( 1953 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1954 " Phone:" 1955 " <input type=\"text\" name=\"dayphone1\">" 1956 " <img/>" 1957 " -" 1958 " <img/>" 1959 " <input type=\"text\" name=\"dayphone2\">" 1960 " <img/>" 1961 " -" 1962 " <img/>" 1963 " <input type=\"text\" name=\"dayphone3\">" 1964 " ext.:" 1965 " <input type=\"text\" name=\"dayphone4\">" 1966 " <input type=\"text\" name=\"dummy\">" 1967 " <input type=\"submit\" name=\"reply-send\" value=\"Send\">" 1968 "</FORM>", 1969 labels, names, values); 1970 } 1971 1972 TEST_F(FormAutofillTest, LabelsInferredFromDivTable) { 1973 ExpectJohnSmithLabels( 1974 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1975 "<DIV>First name:<BR>" 1976 " <SPAN>" 1977 " <INPUT type=\"text\" name=\"firstname\" value=\"John\">" 1978 " </SPAN>" 1979 "</DIV>" 1980 "<DIV>Last name:<BR>" 1981 " <SPAN>" 1982 " <INPUT type=\"text\" name=\"lastname\" value=\"Smith\">" 1983 " </SPAN>" 1984 "</DIV>" 1985 "<DIV>Email:<BR>" 1986 " <SPAN>" 1987 " <INPUT type=\"text\" name=\"email\" value=\"john (at) example.com\">" 1988 " </SPAN>" 1989 "</DIV>" 1990 "<input type=\"submit\" name=\"reply-send\" value=\"Send\">" 1991 "</FORM>"); 1992 } 1993 1994 TEST_F(FormAutofillTest, LabelsInferredFromDivSiblingTable) { 1995 ExpectJohnSmithLabels( 1996 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 1997 "<DIV>First name:</DIV>" 1998 "<DIV>" 1999 " <SPAN>" 2000 " <INPUT type=\"text\" name=\"firstname\" value=\"John\">" 2001 " </SPAN>" 2002 "</DIV>" 2003 "<DIV>Last name:</DIV>" 2004 "<DIV>" 2005 " <SPAN>" 2006 " <INPUT type=\"text\" name=\"lastname\" value=\"Smith\">" 2007 " </SPAN>" 2008 "</DIV>" 2009 "<DIV>Email:</DIV>" 2010 "<DIV>" 2011 " <SPAN>" 2012 " <INPUT type=\"text\" name=\"email\" value=\"john (at) example.com\">" 2013 " </SPAN>" 2014 "</DIV>" 2015 "<input type=\"submit\" name=\"reply-send\" value=\"Send\">" 2016 "</FORM>"); 2017 } 2018 2019 TEST_F(FormAutofillTest, LabelsInferredFromDefinitionListRatherThanDivTable) { 2020 ExpectJohnSmithLabels( 2021 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 2022 "<DIV>This is not a label.<BR>" 2023 "<DL>" 2024 " <DT>" 2025 " <SPAN>" 2026 " First name:" 2027 " </SPAN>" 2028 " </DT>" 2029 " <DD>" 2030 " <FONT>" 2031 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 2032 " </FONT>" 2033 " </DD>" 2034 " <DT>" 2035 " <SPAN>" 2036 " Last name:" 2037 " </SPAN>" 2038 " </DT>" 2039 " <DD>" 2040 " <FONT>" 2041 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 2042 " </FONT>" 2043 " </DD>" 2044 " <DT>" 2045 " <SPAN>" 2046 " Email:" 2047 " </SPAN>" 2048 " </DT>" 2049 " <DD>" 2050 " <FONT>" 2051 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 2052 " </FONT>" 2053 " </DD>" 2054 " <DT></DT>" 2055 " <DD>" 2056 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 2057 " </DD>" 2058 "</DL>" 2059 "</DIV>" 2060 "</FORM>"); 2061 } 2062 2063 TEST_F(FormAutofillTest, FillFormMaxLength) { 2064 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" 2065 " <INPUT type=\"text\" id=\"firstname\" maxlength=\"5\"/>" 2066 " <INPUT type=\"text\" id=\"lastname\" maxlength=\"7\"/>" 2067 " <INPUT type=\"text\" id=\"email\" maxlength=\"9\"/>" 2068 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 2069 "</FORM>"); 2070 2071 WebFrame* web_frame = GetMainFrame(); 2072 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 2073 2074 FormCache form_cache; 2075 std::vector<FormData> forms; 2076 form_cache.ExtractForms(*web_frame, &forms); 2077 ASSERT_EQ(1U, forms.size()); 2078 2079 // Get the input element we want to find. 2080 WebElement element = web_frame->document().getElementById("firstname"); 2081 WebInputElement input_element = element.to<WebInputElement>(); 2082 2083 // Find the form that contains the input element. 2084 FormData form; 2085 FormFieldData field; 2086 EXPECT_TRUE(FindFormAndFieldForInputElement(input_element, &form, &field, 2087 autofill::REQUIRE_NONE)); 2088 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 2089 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 2090 EXPECT_EQ(GURL("http://buh.com"), form.action); 2091 2092 const std::vector<FormFieldData>& fields = form.fields; 2093 ASSERT_EQ(3U, fields.size()); 2094 2095 FormFieldData expected; 2096 expected.form_control_type = "text"; 2097 2098 expected.name = ASCIIToUTF16("firstname"); 2099 expected.max_length = 5; 2100 expected.is_autofilled = false; 2101 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 2102 2103 expected.name = ASCIIToUTF16("lastname"); 2104 expected.max_length = 7; 2105 expected.is_autofilled = false; 2106 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 2107 2108 expected.name = ASCIIToUTF16("email"); 2109 expected.max_length = 9; 2110 expected.is_autofilled = false; 2111 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 2112 2113 // Fill the form. 2114 form.fields[0].value = ASCIIToUTF16("Brother"); 2115 form.fields[1].value = ASCIIToUTF16("Jonathan"); 2116 form.fields[2].value = ASCIIToUTF16("brotherj (at) example.com"); 2117 FillForm(form, input_element); 2118 2119 // Find the newly-filled form that contains the input element. 2120 FormData form2; 2121 FormFieldData field2; 2122 EXPECT_TRUE(FindFormAndFieldForInputElement(input_element, &form2, &field2, 2123 autofill::REQUIRE_NONE)); 2124 2125 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); 2126 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 2127 EXPECT_EQ(GURL("http://buh.com"), form2.action); 2128 2129 const std::vector<FormFieldData>& fields2 = form2.fields; 2130 ASSERT_EQ(3U, fields2.size()); 2131 2132 expected.form_control_type = "text"; 2133 2134 expected.name = ASCIIToUTF16("firstname"); 2135 expected.value = ASCIIToUTF16("Broth"); 2136 expected.max_length = 5; 2137 expected.is_autofilled = true; 2138 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); 2139 2140 expected.name = ASCIIToUTF16("lastname"); 2141 expected.value = ASCIIToUTF16("Jonatha"); 2142 expected.max_length = 7; 2143 expected.is_autofilled = true; 2144 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); 2145 2146 expected.name = ASCIIToUTF16("email"); 2147 expected.value = ASCIIToUTF16("brotherj@"); 2148 expected.max_length = 9; 2149 expected.is_autofilled = true; 2150 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 2151 } 2152 2153 // This test uses negative values of the maxlength attribute for input elements. 2154 // In this case, the maxlength of the input elements is set to the default 2155 // maxlength (defined in WebKit.) 2156 TEST_F(FormAutofillTest, FillFormNegativeMaxLength) { 2157 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" 2158 " <INPUT type=\"text\" id=\"firstname\" maxlength=\"-1\"/>" 2159 " <INPUT type=\"text\" id=\"lastname\" maxlength=\"-10\"/>" 2160 " <INPUT type=\"text\" id=\"email\" maxlength=\"-13\"/>" 2161 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 2162 "</FORM>"); 2163 2164 WebFrame* web_frame = GetMainFrame(); 2165 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 2166 2167 FormCache form_cache; 2168 std::vector<FormData> forms; 2169 form_cache.ExtractForms(*web_frame, &forms); 2170 ASSERT_EQ(1U, forms.size()); 2171 2172 // Get the input element we want to find. 2173 WebElement element = web_frame->document().getElementById("firstname"); 2174 WebInputElement input_element = element.to<WebInputElement>(); 2175 2176 // Find the form that contains the input element. 2177 FormData form; 2178 FormFieldData field; 2179 EXPECT_TRUE(FindFormAndFieldForInputElement(input_element, &form, &field, 2180 autofill::REQUIRE_NONE)); 2181 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 2182 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 2183 EXPECT_EQ(GURL("http://buh.com"), form.action); 2184 2185 const std::vector<FormFieldData>& fields = form.fields; 2186 ASSERT_EQ(3U, fields.size()); 2187 2188 FormFieldData expected; 2189 expected.form_control_type = "text"; 2190 expected.max_length = WebInputElement::defaultMaxLength(); 2191 2192 expected.name = ASCIIToUTF16("firstname"); 2193 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 2194 2195 expected.name = ASCIIToUTF16("lastname"); 2196 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 2197 2198 expected.name = ASCIIToUTF16("email"); 2199 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 2200 2201 // Fill the form. 2202 form.fields[0].value = ASCIIToUTF16("Brother"); 2203 form.fields[1].value = ASCIIToUTF16("Jonathan"); 2204 form.fields[2].value = ASCIIToUTF16("brotherj (at) example.com"); 2205 FillForm(form, input_element); 2206 2207 // Find the newly-filled form that contains the input element. 2208 FormData form2; 2209 FormFieldData field2; 2210 EXPECT_TRUE(FindFormAndFieldForInputElement(input_element, &form2, &field2, 2211 autofill::REQUIRE_NONE)); 2212 2213 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); 2214 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 2215 EXPECT_EQ(GURL("http://buh.com"), form2.action); 2216 2217 const std::vector<FormFieldData>& fields2 = form2.fields; 2218 ASSERT_EQ(3U, fields2.size()); 2219 2220 expected.name = ASCIIToUTF16("firstname"); 2221 expected.value = ASCIIToUTF16("Brother"); 2222 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 2223 2224 expected.name = ASCIIToUTF16("lastname"); 2225 expected.value = ASCIIToUTF16("Jonathan"); 2226 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 2227 2228 expected.name = ASCIIToUTF16("email"); 2229 expected.value = ASCIIToUTF16("brotherj (at) example.com"); 2230 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 2231 } 2232 2233 TEST_F(FormAutofillTest, FillFormEmptyName) { 2234 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" 2235 " <INPUT type=\"text\" id=\"firstname\"/>" 2236 " <INPUT type=\"text\" id=\"lastname\"/>" 2237 " <INPUT type=\"text\" id=\"email\"/>" 2238 " <INPUT type=\"submit\" value=\"Send\"/>" 2239 "</FORM>"); 2240 2241 WebFrame* web_frame = GetMainFrame(); 2242 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 2243 2244 FormCache form_cache; 2245 std::vector<FormData> forms; 2246 form_cache.ExtractForms(*web_frame, &forms); 2247 ASSERT_EQ(1U, forms.size()); 2248 2249 // Get the input element we want to find. 2250 WebElement element = web_frame->document().getElementById("firstname"); 2251 WebInputElement input_element = element.to<WebInputElement>(); 2252 2253 // Find the form that contains the input element. 2254 FormData form; 2255 FormFieldData field; 2256 EXPECT_TRUE(FindFormAndFieldForInputElement(input_element, &form, &field, 2257 autofill::REQUIRE_NONE)); 2258 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 2259 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 2260 EXPECT_EQ(GURL("http://buh.com"), form.action); 2261 2262 const std::vector<FormFieldData>& fields = form.fields; 2263 ASSERT_EQ(3U, fields.size()); 2264 2265 FormFieldData expected; 2266 expected.form_control_type = "text"; 2267 expected.max_length = WebInputElement::defaultMaxLength(); 2268 2269 expected.name = ASCIIToUTF16("firstname"); 2270 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 2271 2272 expected.name = ASCIIToUTF16("lastname"); 2273 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 2274 2275 expected.name = ASCIIToUTF16("email"); 2276 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 2277 2278 // Fill the form. 2279 form.fields[0].value = ASCIIToUTF16("Wyatt"); 2280 form.fields[1].value = ASCIIToUTF16("Earp"); 2281 form.fields[2].value = ASCIIToUTF16("wyatt (at) example.com"); 2282 FillForm(form, input_element); 2283 2284 // Find the newly-filled form that contains the input element. 2285 FormData form2; 2286 FormFieldData field2; 2287 EXPECT_TRUE(FindFormAndFieldForInputElement(input_element, &form2, &field2, 2288 autofill::REQUIRE_NONE)); 2289 2290 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); 2291 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 2292 EXPECT_EQ(GURL("http://buh.com"), form2.action); 2293 2294 const std::vector<FormFieldData>& fields2 = form2.fields; 2295 ASSERT_EQ(3U, fields2.size()); 2296 2297 expected.form_control_type = "text"; 2298 expected.max_length = WebInputElement::defaultMaxLength(); 2299 2300 expected.name = ASCIIToUTF16("firstname"); 2301 expected.value = ASCIIToUTF16("Wyatt"); 2302 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 2303 2304 expected.name = ASCIIToUTF16("lastname"); 2305 expected.value = ASCIIToUTF16("Earp"); 2306 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 2307 2308 expected.name = ASCIIToUTF16("email"); 2309 expected.value = ASCIIToUTF16("wyatt (at) example.com"); 2310 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 2311 } 2312 2313 TEST_F(FormAutofillTest, FillFormEmptyFormNames) { 2314 LoadHTML("<FORM action=\"http://buh.com\" method=\"post\">" 2315 " <INPUT type=\"text\" id=\"firstname\"/>" 2316 " <INPUT type=\"text\" id=\"middlename\"/>" 2317 " <INPUT type=\"text\" id=\"lastname\"/>" 2318 " <INPUT type=\"submit\" value=\"Send\"/>" 2319 "</FORM>" 2320 "<FORM action=\"http://abc.com\" method=\"post\">" 2321 " <INPUT type=\"text\" id=\"apple\"/>" 2322 " <INPUT type=\"text\" id=\"banana\"/>" 2323 " <INPUT type=\"text\" id=\"cantelope\"/>" 2324 " <INPUT type=\"submit\" value=\"Send\"/>" 2325 "</FORM>"); 2326 2327 WebFrame* web_frame = GetMainFrame(); 2328 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 2329 2330 FormCache form_cache; 2331 std::vector<FormData> forms; 2332 form_cache.ExtractForms(*web_frame, &forms); 2333 ASSERT_EQ(2U, forms.size()); 2334 2335 // Get the input element we want to find. 2336 WebElement element = web_frame->document().getElementById("apple"); 2337 WebInputElement input_element = element.to<WebInputElement>(); 2338 2339 // Find the form that contains the input element. 2340 FormData form; 2341 FormFieldData field; 2342 EXPECT_TRUE(FindFormAndFieldForInputElement(input_element, &form, &field, 2343 autofill::REQUIRE_NONE)); 2344 EXPECT_EQ(base::string16(), form.name); 2345 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 2346 EXPECT_EQ(GURL("http://abc.com"), form.action); 2347 2348 const std::vector<FormFieldData>& fields = form.fields; 2349 ASSERT_EQ(3U, fields.size()); 2350 2351 FormFieldData expected; 2352 expected.form_control_type = "text"; 2353 expected.max_length = WebInputElement::defaultMaxLength(); 2354 2355 expected.name = ASCIIToUTF16("apple"); 2356 expected.is_autofilled = false; 2357 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 2358 2359 expected.name = ASCIIToUTF16("banana"); 2360 expected.is_autofilled = false; 2361 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 2362 2363 expected.name = ASCIIToUTF16("cantelope"); 2364 expected.is_autofilled = false; 2365 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 2366 2367 // Fill the form. 2368 form.fields[0].value = ASCIIToUTF16("Red"); 2369 form.fields[1].value = ASCIIToUTF16("Yellow"); 2370 form.fields[2].value = ASCIIToUTF16("Also Yellow"); 2371 FillForm(form, input_element); 2372 2373 // Find the newly-filled form that contains the input element. 2374 FormData form2; 2375 FormFieldData field2; 2376 EXPECT_TRUE(FindFormAndFieldForInputElement(input_element, &form2, &field2, 2377 autofill::REQUIRE_NONE)); 2378 2379 EXPECT_EQ(base::string16(), form2.name); 2380 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 2381 EXPECT_EQ(GURL("http://abc.com"), form2.action); 2382 2383 const std::vector<FormFieldData>& fields2 = form2.fields; 2384 ASSERT_EQ(3U, fields2.size()); 2385 2386 expected.name = ASCIIToUTF16("apple"); 2387 expected.value = ASCIIToUTF16("Red"); 2388 expected.is_autofilled = true; 2389 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); 2390 2391 expected.name = ASCIIToUTF16("banana"); 2392 expected.value = ASCIIToUTF16("Yellow"); 2393 expected.is_autofilled = true; 2394 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); 2395 2396 expected.name = ASCIIToUTF16("cantelope"); 2397 expected.value = ASCIIToUTF16("Also Yellow"); 2398 expected.is_autofilled = true; 2399 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 2400 } 2401 2402 TEST_F(FormAutofillTest, ThreePartPhone) { 2403 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 2404 " Phone:" 2405 " <input type=\"text\" name=\"dayphone1\">" 2406 " -" 2407 " <input type=\"text\" name=\"dayphone2\">" 2408 " -" 2409 " <input type=\"text\" name=\"dayphone3\">" 2410 " ext.:" 2411 " <input type=\"text\" name=\"dayphone4\">" 2412 " <input type=\"submit\" name=\"reply-send\" value=\"Send\">" 2413 "</FORM>"); 2414 2415 2416 WebFrame* frame = GetMainFrame(); 2417 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 2418 2419 WebVector<WebFormElement> forms; 2420 frame->document().forms(forms); 2421 ASSERT_EQ(1U, forms.size()); 2422 2423 FormData form; 2424 EXPECT_TRUE(WebFormElementToFormData(forms[0], 2425 WebFormControlElement(), 2426 autofill::REQUIRE_NONE, 2427 autofill::EXTRACT_VALUE, 2428 &form, 2429 NULL)); 2430 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 2431 EXPECT_EQ(GURL(frame->document().url()), form.origin); 2432 EXPECT_EQ(GURL("http://cnn.com"), form.action); 2433 2434 const std::vector<FormFieldData>& fields = form.fields; 2435 ASSERT_EQ(4U, fields.size()); 2436 2437 FormFieldData expected; 2438 expected.form_control_type = "text"; 2439 expected.max_length = WebInputElement::defaultMaxLength(); 2440 2441 expected.label = ASCIIToUTF16("Phone:"); 2442 expected.name = ASCIIToUTF16("dayphone1"); 2443 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 2444 2445 expected.label = ASCIIToUTF16("-"); 2446 expected.name = ASCIIToUTF16("dayphone2"); 2447 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 2448 2449 expected.label = ASCIIToUTF16("-"); 2450 expected.name = ASCIIToUTF16("dayphone3"); 2451 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 2452 2453 expected.label = ASCIIToUTF16("ext.:"); 2454 expected.name = ASCIIToUTF16("dayphone4"); 2455 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); 2456 } 2457 2458 2459 TEST_F(FormAutofillTest, MaxLengthFields) { 2460 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 2461 " Phone:" 2462 " <input type=\"text\" maxlength=\"3\" name=\"dayphone1\">" 2463 " -" 2464 " <input type=\"text\" maxlength=\"3\" name=\"dayphone2\">" 2465 " -" 2466 " <input type=\"text\" maxlength=\"4\" size=\"5\"" 2467 " name=\"dayphone3\">" 2468 " ext.:" 2469 " <input type=\"text\" maxlength=\"5\" name=\"dayphone4\">" 2470 " <input type=\"text\" name=\"default1\">" 2471 " <input type=\"text\" maxlength=\"-1\" name=\"invalid1\">" 2472 " <input type=\"submit\" name=\"reply-send\" value=\"Send\">" 2473 "</FORM>"); 2474 2475 WebFrame* frame = GetMainFrame(); 2476 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 2477 2478 WebVector<WebFormElement> forms; 2479 frame->document().forms(forms); 2480 ASSERT_EQ(1U, forms.size()); 2481 2482 FormData form; 2483 EXPECT_TRUE(WebFormElementToFormData(forms[0], 2484 WebFormControlElement(), 2485 autofill::REQUIRE_NONE, 2486 autofill::EXTRACT_VALUE, 2487 &form, 2488 NULL)); 2489 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 2490 EXPECT_EQ(GURL(frame->document().url()), form.origin); 2491 EXPECT_EQ(GURL("http://cnn.com"), form.action); 2492 2493 const std::vector<FormFieldData>& fields = form.fields; 2494 ASSERT_EQ(6U, fields.size()); 2495 2496 FormFieldData expected; 2497 expected.form_control_type = "text"; 2498 2499 expected.label = ASCIIToUTF16("Phone:"); 2500 expected.name = ASCIIToUTF16("dayphone1"); 2501 expected.max_length = 3; 2502 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 2503 2504 expected.label = ASCIIToUTF16("-"); 2505 expected.name = ASCIIToUTF16("dayphone2"); 2506 expected.max_length = 3; 2507 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 2508 2509 expected.label = ASCIIToUTF16("-"); 2510 expected.name = ASCIIToUTF16("dayphone3"); 2511 expected.max_length = 4; 2512 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 2513 2514 expected.label = ASCIIToUTF16("ext.:"); 2515 expected.name = ASCIIToUTF16("dayphone4"); 2516 expected.max_length = 5; 2517 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); 2518 2519 // When unspecified |size|, default is returned. 2520 expected.label = base::string16(); 2521 expected.name = ASCIIToUTF16("default1"); 2522 expected.max_length = WebInputElement::defaultMaxLength(); 2523 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[4]); 2524 2525 // When invalid |size|, default is returned. 2526 expected.label = base::string16(); 2527 expected.name = ASCIIToUTF16("invalid1"); 2528 expected.max_length = WebInputElement::defaultMaxLength(); 2529 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[5]); 2530 } 2531 2532 // This test re-creates the experience of typing in a field then selecting a 2533 // profile from the Autofill suggestions popup. The field that is being typed 2534 // into should be filled even though it's not technically empty. 2535 TEST_F(FormAutofillTest, FillFormNonEmptyField) { 2536 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" 2537 " <INPUT type=\"text\" id=\"firstname\"/>" 2538 " <INPUT type=\"text\" id=\"lastname\"/>" 2539 " <INPUT type=\"text\" id=\"email\"/>" 2540 " <INPUT type=\"submit\" value=\"Send\"/>" 2541 "</FORM>"); 2542 2543 WebFrame* web_frame = GetMainFrame(); 2544 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 2545 2546 FormCache form_cache; 2547 std::vector<FormData> forms; 2548 form_cache.ExtractForms(*web_frame, &forms); 2549 ASSERT_EQ(1U, forms.size()); 2550 2551 // Get the input element we want to find. 2552 WebElement element = web_frame->document().getElementById("firstname"); 2553 WebInputElement input_element = element.to<WebInputElement>(); 2554 2555 // Simulate typing by modifying the field value. 2556 input_element.setValue(ASCIIToUTF16("Wy")); 2557 2558 // Find the form that contains the input element. 2559 FormData form; 2560 FormFieldData field; 2561 EXPECT_TRUE(FindFormAndFieldForInputElement(input_element, &form, &field, 2562 autofill::REQUIRE_NONE)); 2563 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 2564 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 2565 EXPECT_EQ(GURL("http://buh.com"), form.action); 2566 2567 const std::vector<FormFieldData>& fields = form.fields; 2568 ASSERT_EQ(3U, fields.size()); 2569 2570 FormFieldData expected; 2571 expected.form_control_type = "text"; 2572 expected.max_length = WebInputElement::defaultMaxLength(); 2573 2574 expected.name = ASCIIToUTF16("firstname"); 2575 expected.value = ASCIIToUTF16("Wy"); 2576 expected.is_autofilled = false; 2577 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 2578 2579 expected.name = ASCIIToUTF16("lastname"); 2580 expected.value = base::string16(); 2581 expected.is_autofilled = false; 2582 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 2583 2584 expected.name = ASCIIToUTF16("email"); 2585 expected.value = base::string16(); 2586 expected.is_autofilled = false; 2587 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 2588 2589 // Preview the form and verify that the cursor position has been updated. 2590 form.fields[0].value = ASCIIToUTF16("Wyatt"); 2591 form.fields[1].value = ASCIIToUTF16("Earp"); 2592 form.fields[2].value = ASCIIToUTF16("wyatt (at) example.com"); 2593 PreviewForm(form, input_element); 2594 EXPECT_EQ(2, input_element.selectionStart()); 2595 EXPECT_EQ(5, input_element.selectionEnd()); 2596 2597 // Fill the form. 2598 FillForm(form, input_element); 2599 2600 // Find the newly-filled form that contains the input element. 2601 FormData form2; 2602 FormFieldData field2; 2603 EXPECT_TRUE(FindFormAndFieldForInputElement(input_element, &form2, &field2, 2604 autofill::REQUIRE_NONE)); 2605 2606 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); 2607 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 2608 EXPECT_EQ(GURL("http://buh.com"), form2.action); 2609 2610 const std::vector<FormFieldData>& fields2 = form2.fields; 2611 ASSERT_EQ(3U, fields2.size()); 2612 2613 expected.name = ASCIIToUTF16("firstname"); 2614 expected.value = ASCIIToUTF16("Wyatt"); 2615 expected.is_autofilled = true; 2616 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); 2617 2618 expected.name = ASCIIToUTF16("lastname"); 2619 expected.value = ASCIIToUTF16("Earp"); 2620 expected.is_autofilled = true; 2621 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); 2622 2623 expected.name = ASCIIToUTF16("email"); 2624 expected.value = ASCIIToUTF16("wyatt (at) example.com"); 2625 expected.is_autofilled = true; 2626 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 2627 2628 // Verify that the cursor position has been updated. 2629 EXPECT_EQ(5, input_element.selectionStart()); 2630 EXPECT_EQ(5, input_element.selectionEnd()); 2631 } 2632 2633 TEST_F(FormAutofillTest, ClearFormWithNode) { 2634 LoadHTML( 2635 "<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" 2636 " <INPUT type=\"text\" id=\"firstname\" value=\"Wyatt\"/>" 2637 " <INPUT type=\"text\" id=\"lastname\" value=\"Earp\"/>" 2638 " <INPUT type=\"text\" autocomplete=\"off\" id=\"noAC\" value=\"one\"/>" 2639 " <INPUT type=\"text\" id=\"notenabled\" disabled=\"disabled\">" 2640 " <INPUT type=\"month\" id=\"month\" value=\"2012-11\">" 2641 " <INPUT type=\"month\" id=\"month-disabled\" value=\"2012-11\"" 2642 " disabled=\"disabled\">" 2643 " <TEXTAREA id=\"textarea\">Apple.</TEXTAREA>" 2644 " <TEXTAREA id=\"textarea-disabled\" disabled=\"disabled\">" 2645 " Banana!" 2646 " </TEXTAREA>" 2647 " <TEXTAREA id=\"textarea-noAC\" autocomplete=\"off\">Carrot?</TEXTAREA>" 2648 " <INPUT type=\"submit\" value=\"Send\"/>" 2649 "</FORM>"); 2650 2651 WebFrame* web_frame = GetMainFrame(); 2652 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 2653 2654 FormCache form_cache; 2655 std::vector<FormData> forms; 2656 form_cache.ExtractForms(*web_frame, &forms); 2657 ASSERT_EQ(1U, forms.size()); 2658 2659 // Set the auto-filled attribute on the firstname element. 2660 WebInputElement firstname = 2661 web_frame->document().getElementById("firstname").to<WebInputElement>(); 2662 firstname.setAutofilled(true); 2663 2664 // Set the value of the disabled text input element. 2665 WebInputElement notenabled = 2666 web_frame->document().getElementById("notenabled").to<WebInputElement>(); 2667 notenabled.setValue(WebString::fromUTF8("no clear")); 2668 2669 // Clear the form. 2670 EXPECT_TRUE(form_cache.ClearFormWithElement(firstname)); 2671 2672 // Verify that the auto-filled attribute has been turned off. 2673 EXPECT_FALSE(firstname.isAutofilled()); 2674 2675 // Verify the form is cleared. 2676 FormData form2; 2677 FormFieldData field2; 2678 EXPECT_TRUE(FindFormAndFieldForInputElement(firstname, &form2, &field2, 2679 autofill::REQUIRE_NONE)); 2680 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); 2681 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 2682 EXPECT_EQ(GURL("http://buh.com"), form2.action); 2683 2684 const std::vector<FormFieldData>& fields2 = form2.fields; 2685 ASSERT_EQ(9U, fields2.size()); 2686 2687 FormFieldData expected; 2688 expected.form_control_type = "text"; 2689 expected.max_length = WebInputElement::defaultMaxLength(); 2690 2691 expected.name = ASCIIToUTF16("firstname"); 2692 expected.value = base::string16(); 2693 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); 2694 2695 expected.name = ASCIIToUTF16("lastname"); 2696 expected.value = base::string16(); 2697 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); 2698 2699 expected.name = ASCIIToUTF16("noAC"); 2700 expected.value = base::string16(); 2701 expected.autocomplete_attribute = "off"; 2702 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 2703 expected.autocomplete_attribute = std::string(); // reset 2704 2705 expected.name = ASCIIToUTF16("notenabled"); 2706 expected.value = ASCIIToUTF16("no clear"); 2707 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[3]); 2708 2709 expected.form_control_type = "month"; 2710 expected.max_length = 0; 2711 expected.name = ASCIIToUTF16("month"); 2712 expected.value = base::string16(); 2713 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[4]); 2714 2715 expected.name = ASCIIToUTF16("month-disabled"); 2716 expected.value = ASCIIToUTF16("2012-11"); 2717 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[5]); 2718 2719 expected.form_control_type = "textarea"; 2720 expected.name = ASCIIToUTF16("textarea"); 2721 expected.value = base::string16(); 2722 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[6]); 2723 2724 expected.name = ASCIIToUTF16("textarea-disabled"); 2725 expected.value = ASCIIToUTF16(" Banana! "); 2726 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[7]); 2727 2728 expected.name = ASCIIToUTF16("textarea-noAC"); 2729 expected.value = base::string16(); 2730 expected.autocomplete_attribute = "off"; 2731 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[8]); 2732 expected.autocomplete_attribute = std::string(); // reset 2733 2734 // Verify that the cursor position has been updated. 2735 EXPECT_EQ(0, firstname.selectionStart()); 2736 EXPECT_EQ(0, firstname.selectionEnd()); 2737 } 2738 2739 TEST_F(FormAutofillTest, ClearFormWithNodeContainingSelectOne) { 2740 LoadHTML( 2741 "<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" 2742 " <INPUT type=\"text\" id=\"firstname\" value=\"Wyatt\"/>" 2743 " <INPUT type=\"text\" id=\"lastname\" value=\"Earp\"/>" 2744 " <SELECT id=\"state\" name=\"state\">" 2745 " <OPTION selected>?</OPTION>" 2746 " <OPTION>AA</OPTION>" 2747 " <OPTION>AE</OPTION>" 2748 " <OPTION>AK</OPTION>" 2749 " </SELECT>" 2750 " <INPUT type=\"submit\" value=\"Send\"/>" 2751 "</FORM>"); 2752 2753 WebFrame* web_frame = GetMainFrame(); 2754 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 2755 2756 FormCache form_cache; 2757 std::vector<FormData> forms; 2758 form_cache.ExtractForms(*web_frame, &forms); 2759 ASSERT_EQ(1U, forms.size()); 2760 2761 // Set the auto-filled attribute on the firstname element. 2762 WebInputElement firstname = 2763 web_frame->document().getElementById("firstname").to<WebInputElement>(); 2764 firstname.setAutofilled(true); 2765 2766 // Set the value of the select-one. 2767 WebSelectElement select_element = 2768 web_frame->document().getElementById("state").to<WebSelectElement>(); 2769 select_element.setValue(WebString::fromUTF8("AK")); 2770 2771 // Clear the form. 2772 EXPECT_TRUE(form_cache.ClearFormWithElement(firstname)); 2773 2774 // Verify that the auto-filled attribute has been turned off. 2775 EXPECT_FALSE(firstname.isAutofilled()); 2776 2777 // Verify the form is cleared. 2778 FormData form2; 2779 FormFieldData field2; 2780 EXPECT_TRUE(FindFormAndFieldForInputElement(firstname, &form2, &field2, 2781 autofill::REQUIRE_NONE)); 2782 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); 2783 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 2784 EXPECT_EQ(GURL("http://buh.com"), form2.action); 2785 2786 const std::vector<FormFieldData>& fields2 = form2.fields; 2787 ASSERT_EQ(3U, fields2.size()); 2788 2789 FormFieldData expected; 2790 2791 expected.name = ASCIIToUTF16("firstname"); 2792 expected.value = base::string16(); 2793 expected.form_control_type = "text"; 2794 expected.max_length = WebInputElement::defaultMaxLength(); 2795 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); 2796 2797 expected.name = ASCIIToUTF16("lastname"); 2798 expected.value = base::string16(); 2799 expected.form_control_type = "text"; 2800 expected.max_length = WebInputElement::defaultMaxLength(); 2801 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); 2802 2803 expected.name = ASCIIToUTF16("state"); 2804 expected.value = ASCIIToUTF16("?"); 2805 expected.form_control_type = "select-one"; 2806 expected.max_length = 0; 2807 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 2808 2809 // Verify that the cursor position has been updated. 2810 EXPECT_EQ(0, firstname.selectionStart()); 2811 EXPECT_EQ(0, firstname.selectionEnd()); 2812 } 2813 2814 TEST_F(FormAutofillTest, ClearPreviewedFormWithElement) { 2815 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" 2816 " <INPUT type=\"text\" id=\"firstname\" value=\"Wyatt\"/>" 2817 " <INPUT type=\"text\" id=\"lastname\"/>" 2818 " <INPUT type=\"text\" id=\"email\"/>" 2819 " <INPUT type=\"email\" id=\"email2\"/>" 2820 " <INPUT type=\"tel\" id=\"phone\"/>" 2821 " <INPUT type=\"submit\" value=\"Send\"/>" 2822 "</FORM>"); 2823 2824 WebFrame* web_frame = GetMainFrame(); 2825 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 2826 2827 FormCache form_cache; 2828 std::vector<FormData> forms; 2829 form_cache.ExtractForms(*web_frame, &forms); 2830 ASSERT_EQ(1U, forms.size()); 2831 2832 // Set the auto-filled attribute. 2833 WebInputElement firstname = 2834 web_frame->document().getElementById("firstname").to<WebInputElement>(); 2835 firstname.setAutofilled(true); 2836 WebInputElement lastname = 2837 web_frame->document().getElementById("lastname").to<WebInputElement>(); 2838 lastname.setAutofilled(true); 2839 WebInputElement email = 2840 web_frame->document().getElementById("email").to<WebInputElement>(); 2841 email.setAutofilled(true); 2842 WebInputElement email2 = 2843 web_frame->document().getElementById("email2").to<WebInputElement>(); 2844 email2.setAutofilled(true); 2845 WebInputElement phone = 2846 web_frame->document().getElementById("phone").to<WebInputElement>(); 2847 phone.setAutofilled(true); 2848 2849 // Set the suggested values on two of the elements. 2850 lastname.setSuggestedValue(ASCIIToUTF16("Earp")); 2851 email.setSuggestedValue(ASCIIToUTF16("wyatt (at) earp.com")); 2852 email2.setSuggestedValue(ASCIIToUTF16("wyatt (at) earp.com")); 2853 phone.setSuggestedValue(ASCIIToUTF16("650-777-9999")); 2854 2855 // Clear the previewed fields. 2856 EXPECT_TRUE(ClearPreviewedFormWithElement(lastname, false)); 2857 2858 // Fields with empty suggestions suggestions are not modified. 2859 EXPECT_EQ(ASCIIToUTF16("Wyatt"), firstname.value()); 2860 EXPECT_TRUE(firstname.suggestedValue().isEmpty()); 2861 EXPECT_TRUE(firstname.isAutofilled()); 2862 2863 // Verify the previewed fields are cleared. 2864 EXPECT_TRUE(lastname.value().isEmpty()); 2865 EXPECT_TRUE(lastname.suggestedValue().isEmpty()); 2866 EXPECT_FALSE(lastname.isAutofilled()); 2867 EXPECT_TRUE(email.value().isEmpty()); 2868 EXPECT_TRUE(email.suggestedValue().isEmpty()); 2869 EXPECT_FALSE(email.isAutofilled()); 2870 EXPECT_TRUE(email2.value().isEmpty()); 2871 EXPECT_TRUE(email2.suggestedValue().isEmpty()); 2872 EXPECT_FALSE(email2.isAutofilled()); 2873 EXPECT_TRUE(phone.value().isEmpty()); 2874 EXPECT_TRUE(phone.suggestedValue().isEmpty()); 2875 EXPECT_FALSE(phone.isAutofilled()); 2876 2877 // Verify that the cursor position has been updated. 2878 EXPECT_EQ(0, lastname.selectionStart()); 2879 EXPECT_EQ(0, lastname.selectionEnd()); 2880 } 2881 2882 TEST_F(FormAutofillTest, ClearPreviewedFormWithNonEmptyInitiatingNode) { 2883 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" 2884 " <INPUT type=\"text\" id=\"firstname\" value=\"W\"/>" 2885 " <INPUT type=\"text\" id=\"lastname\"/>" 2886 " <INPUT type=\"text\" id=\"email\"/>" 2887 " <INPUT type=\"email\" id=\"email2\"/>" 2888 " <INPUT type=\"tel\" id=\"phone\"/>" 2889 " <INPUT type=\"submit\" value=\"Send\"/>" 2890 "</FORM>"); 2891 2892 WebFrame* web_frame = GetMainFrame(); 2893 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 2894 2895 FormCache form_cache; 2896 std::vector<FormData> forms; 2897 form_cache.ExtractForms(*web_frame, &forms); 2898 ASSERT_EQ(1U, forms.size()); 2899 2900 // Set the auto-filled attribute. 2901 WebInputElement firstname = 2902 web_frame->document().getElementById("firstname").to<WebInputElement>(); 2903 firstname.setAutofilled(true); 2904 WebInputElement lastname = 2905 web_frame->document().getElementById("lastname").to<WebInputElement>(); 2906 lastname.setAutofilled(true); 2907 WebInputElement email = 2908 web_frame->document().getElementById("email").to<WebInputElement>(); 2909 email.setAutofilled(true); 2910 WebInputElement email2 = 2911 web_frame->document().getElementById("email2").to<WebInputElement>(); 2912 email2.setAutofilled(true); 2913 WebInputElement phone = 2914 web_frame->document().getElementById("phone").to<WebInputElement>(); 2915 phone.setAutofilled(true); 2916 2917 2918 // Set the suggested values on all of the elements. 2919 firstname.setSuggestedValue(ASCIIToUTF16("Wyatt")); 2920 lastname.setSuggestedValue(ASCIIToUTF16("Earp")); 2921 email.setSuggestedValue(ASCIIToUTF16("wyatt (at) earp.com")); 2922 email2.setSuggestedValue(ASCIIToUTF16("wyatt (at) earp.com")); 2923 phone.setSuggestedValue(ASCIIToUTF16("650-777-9999")); 2924 2925 // Clear the previewed fields. 2926 EXPECT_TRUE(ClearPreviewedFormWithElement(firstname, false)); 2927 2928 // Fields with non-empty values are restored. 2929 EXPECT_EQ(ASCIIToUTF16("W"), firstname.value()); 2930 EXPECT_TRUE(firstname.suggestedValue().isEmpty()); 2931 EXPECT_FALSE(firstname.isAutofilled()); 2932 EXPECT_EQ(1, firstname.selectionStart()); 2933 EXPECT_EQ(1, firstname.selectionEnd()); 2934 2935 // Verify the previewed fields are cleared. 2936 EXPECT_TRUE(lastname.value().isEmpty()); 2937 EXPECT_TRUE(lastname.suggestedValue().isEmpty()); 2938 EXPECT_FALSE(lastname.isAutofilled()); 2939 EXPECT_TRUE(email.value().isEmpty()); 2940 EXPECT_TRUE(email.suggestedValue().isEmpty()); 2941 EXPECT_FALSE(email.isAutofilled()); 2942 EXPECT_TRUE(email2.value().isEmpty()); 2943 EXPECT_TRUE(email2.suggestedValue().isEmpty()); 2944 EXPECT_FALSE(email2.isAutofilled()); 2945 EXPECT_TRUE(phone.value().isEmpty()); 2946 EXPECT_TRUE(phone.suggestedValue().isEmpty()); 2947 EXPECT_FALSE(phone.isAutofilled()); 2948 } 2949 2950 TEST_F(FormAutofillTest, ClearPreviewedFormWithAutofilledInitiatingNode) { 2951 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" 2952 " <INPUT type=\"text\" id=\"firstname\" value=\"W\"/>" 2953 " <INPUT type=\"text\" id=\"lastname\"/>" 2954 " <INPUT type=\"text\" id=\"email\"/>" 2955 " <INPUT type=\"email\" id=\"email2\"/>" 2956 " <INPUT type=\"tel\" id=\"phone\"/>" 2957 " <INPUT type=\"submit\" value=\"Send\"/>" 2958 "</FORM>"); 2959 2960 WebFrame* web_frame = GetMainFrame(); 2961 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 2962 2963 FormCache form_cache; 2964 std::vector<FormData> forms; 2965 form_cache.ExtractForms(*web_frame, &forms); 2966 ASSERT_EQ(1U, forms.size()); 2967 2968 // Set the auto-filled attribute. 2969 WebInputElement firstname = 2970 web_frame->document().getElementById("firstname").to<WebInputElement>(); 2971 firstname.setAutofilled(true); 2972 WebInputElement lastname = 2973 web_frame->document().getElementById("lastname").to<WebInputElement>(); 2974 lastname.setAutofilled(true); 2975 WebInputElement email = 2976 web_frame->document().getElementById("email").to<WebInputElement>(); 2977 email.setAutofilled(true); 2978 WebInputElement email2 = 2979 web_frame->document().getElementById("email2").to<WebInputElement>(); 2980 email2.setAutofilled(true); 2981 WebInputElement phone = 2982 web_frame->document().getElementById("phone").to<WebInputElement>(); 2983 phone.setAutofilled(true); 2984 2985 // Set the suggested values on all of the elements. 2986 firstname.setSuggestedValue(ASCIIToUTF16("Wyatt")); 2987 lastname.setSuggestedValue(ASCIIToUTF16("Earp")); 2988 email.setSuggestedValue(ASCIIToUTF16("wyatt (at) earp.com")); 2989 email2.setSuggestedValue(ASCIIToUTF16("wyatt (at) earp.com")); 2990 phone.setSuggestedValue(ASCIIToUTF16("650-777-9999")); 2991 2992 // Clear the previewed fields. 2993 EXPECT_TRUE(ClearPreviewedFormWithElement(firstname, true)); 2994 2995 // Fields with non-empty values are restored. 2996 EXPECT_EQ(ASCIIToUTF16("W"), firstname.value()); 2997 EXPECT_TRUE(firstname.suggestedValue().isEmpty()); 2998 EXPECT_TRUE(firstname.isAutofilled()); 2999 EXPECT_EQ(1, firstname.selectionStart()); 3000 EXPECT_EQ(1, firstname.selectionEnd()); 3001 3002 // Verify the previewed fields are cleared. 3003 EXPECT_TRUE(lastname.value().isEmpty()); 3004 EXPECT_TRUE(lastname.suggestedValue().isEmpty()); 3005 EXPECT_FALSE(lastname.isAutofilled()); 3006 EXPECT_TRUE(email.value().isEmpty()); 3007 EXPECT_TRUE(email.suggestedValue().isEmpty()); 3008 EXPECT_FALSE(email.isAutofilled()); 3009 EXPECT_TRUE(email2.value().isEmpty()); 3010 EXPECT_TRUE(email2.suggestedValue().isEmpty()); 3011 EXPECT_FALSE(email2.isAutofilled()); 3012 EXPECT_TRUE(phone.value().isEmpty()); 3013 EXPECT_TRUE(phone.suggestedValue().isEmpty()); 3014 EXPECT_FALSE(phone.isAutofilled()); 3015 } 3016 3017 TEST_F(FormAutofillTest, FormWithNodeIsAutofilled) { 3018 LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" 3019 " <INPUT type=\"text\" id=\"firstname\" value=\"Wyatt\"/>" 3020 " <INPUT type=\"text\" id=\"lastname\"/>" 3021 " <INPUT type=\"text\" id=\"email\"/>" 3022 " <INPUT type=\"email\" id=\"email2\"/>" 3023 " <INPUT type=\"tel\" id=\"phone\"/>" 3024 " <INPUT type=\"submit\" value=\"Send\"/>" 3025 "</FORM>"); 3026 3027 WebFrame* web_frame = GetMainFrame(); 3028 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 3029 3030 FormCache form_cache; 3031 std::vector<FormData> forms; 3032 form_cache.ExtractForms(*web_frame, &forms); 3033 ASSERT_EQ(1U, forms.size()); 3034 3035 WebInputElement firstname = 3036 web_frame->document().getElementById("firstname").to<WebInputElement>(); 3037 3038 // Auto-filled attribute not set yet. 3039 EXPECT_FALSE(FormWithElementIsAutofilled(firstname)); 3040 3041 // Set the auto-filled attribute. 3042 firstname.setAutofilled(true); 3043 3044 EXPECT_TRUE(FormWithElementIsAutofilled(firstname)); 3045 } 3046 3047 // If we have multiple labels per id, the labels concatenated into label string. 3048 TEST_F(FormAutofillTest, MultipleLabelsPerElement) { 3049 std::vector<base::string16> labels, names, values; 3050 3051 labels.push_back(ASCIIToUTF16("First Name:")); 3052 names.push_back(ASCIIToUTF16("firstname")); 3053 values.push_back(ASCIIToUTF16("John")); 3054 3055 labels.push_back(ASCIIToUTF16("Last Name:")); 3056 names.push_back(ASCIIToUTF16("lastname")); 3057 values.push_back(ASCIIToUTF16("Smith")); 3058 3059 labels.push_back(ASCIIToUTF16("Email: xxx (at) yyy.com")); 3060 names.push_back(ASCIIToUTF16("email")); 3061 values.push_back(ASCIIToUTF16("john (at) example.com")); 3062 3063 ExpectLabels( 3064 "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 3065 " <LABEL for=\"firstname\"> First Name: </LABEL>" 3066 " <LABEL for=\"firstname\"></LABEL>" 3067 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 3068 " <LABEL for=\"lastname\"></LABEL>" 3069 " <LABEL for=\"lastname\"> Last Name: </LABEL>" 3070 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 3071 " <LABEL for=\"email\"> Email: </LABEL>" 3072 " <LABEL for=\"email\"> xxx (at) yyy.com </LABEL>" 3073 " <INPUT type=\"text\" id=\"email\" value=\"john (at) example.com\"/>" 3074 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 3075 "</FORM>", 3076 labels, names, values); 3077 } 3078 3079 TEST_F(FormAutofillTest, ClickElement) { 3080 LoadHTML("<BUTTON id=\"link\">Button</BUTTON>" 3081 "<BUTTON name=\"button\">Button</BUTTON>"); 3082 WebFrame* frame = GetMainFrame(); 3083 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 3084 3085 // Successful retrieval by id. 3086 autofill::WebElementDescriptor clicker; 3087 clicker.retrieval_method = autofill::WebElementDescriptor::ID; 3088 clicker.descriptor = "link"; 3089 EXPECT_TRUE(ClickElement(frame->document(), clicker)); 3090 3091 // Successful retrieval by css selector. 3092 clicker.retrieval_method = autofill::WebElementDescriptor::CSS_SELECTOR; 3093 clicker.descriptor = "button[name=\"button\"]"; 3094 EXPECT_TRUE(ClickElement(frame->document(), clicker)); 3095 3096 // Unsuccessful retrieval due to invalid CSS selector. 3097 clicker.descriptor = "^*&"; 3098 EXPECT_FALSE(ClickElement(frame->document(), clicker)); 3099 3100 // Unsuccessful retrieval because element does not exist. 3101 clicker.descriptor = "#junk"; 3102 EXPECT_FALSE(ClickElement(frame->document(), clicker)); 3103 } 3104 3105 TEST_F(FormAutofillTest, SelectOneAsText) { 3106 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" 3107 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" 3108 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" 3109 " <SELECT id=\"country\">" 3110 " <OPTION value=\"AF\">Afghanistan</OPTION>" 3111 " <OPTION value=\"AL\">Albania</OPTION>" 3112 " <OPTION value=\"DZ\">Algeria</OPTION>" 3113 " </SELECT>" 3114 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" 3115 "</FORM>"); 3116 3117 WebFrame* frame = GetMainFrame(); 3118 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 3119 3120 // Set the value of the select-one. 3121 WebSelectElement select_element = 3122 frame->document().getElementById("country").to<WebSelectElement>(); 3123 select_element.setValue(WebString::fromUTF8("AL")); 3124 3125 WebVector<WebFormElement> forms; 3126 frame->document().forms(forms); 3127 ASSERT_EQ(1U, forms.size()); 3128 3129 FormData form; 3130 3131 // Extract the country select-one value as text. 3132 EXPECT_TRUE(WebFormElementToFormData( 3133 forms[0], WebFormControlElement(), autofill::REQUIRE_NONE, 3134 static_cast<autofill::ExtractMask>( 3135 autofill::EXTRACT_VALUE | autofill::EXTRACT_OPTION_TEXT), 3136 &form, NULL)); 3137 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 3138 EXPECT_EQ(GURL(frame->document().url()), form.origin); 3139 EXPECT_EQ(GURL("http://cnn.com"), form.action); 3140 3141 const std::vector<FormFieldData>& fields = form.fields; 3142 ASSERT_EQ(3U, fields.size()); 3143 3144 FormFieldData expected; 3145 3146 expected.name = ASCIIToUTF16("firstname"); 3147 expected.value = ASCIIToUTF16("John"); 3148 expected.form_control_type = "text"; 3149 expected.max_length = WebInputElement::defaultMaxLength(); 3150 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 3151 3152 expected.name = ASCIIToUTF16("lastname"); 3153 expected.value = ASCIIToUTF16("Smith"); 3154 expected.form_control_type = "text"; 3155 expected.max_length = WebInputElement::defaultMaxLength(); 3156 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 3157 3158 expected.name = ASCIIToUTF16("country"); 3159 expected.value = ASCIIToUTF16("Albania"); 3160 expected.form_control_type = "select-one"; 3161 expected.max_length = 0; 3162 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 3163 3164 form.fields.clear(); 3165 // Extract the country select-one value as value. 3166 EXPECT_TRUE(WebFormElementToFormData(forms[0], 3167 WebFormControlElement(), 3168 autofill::REQUIRE_NONE, 3169 autofill::EXTRACT_VALUE, 3170 &form, 3171 NULL)); 3172 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 3173 EXPECT_EQ(GURL(frame->document().url()), form.origin); 3174 EXPECT_EQ(GURL("http://cnn.com"), form.action); 3175 3176 ASSERT_EQ(3U, fields.size()); 3177 3178 expected.name = ASCIIToUTF16("firstname"); 3179 expected.value = ASCIIToUTF16("John"); 3180 expected.form_control_type = "text"; 3181 expected.max_length = WebInputElement::defaultMaxLength(); 3182 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 3183 3184 expected.name = ASCIIToUTF16("lastname"); 3185 expected.value = ASCIIToUTF16("Smith"); 3186 expected.form_control_type = "text"; 3187 expected.max_length = WebInputElement::defaultMaxLength(); 3188 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 3189 3190 expected.name = ASCIIToUTF16("country"); 3191 expected.value = ASCIIToUTF16("AL"); 3192 expected.form_control_type = "select-one"; 3193 expected.max_length = 0; 3194 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 3195 } 3196 3197 } // namespace autofill 3198