OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/format_macros.h" | 7 #include "base/format_macros.h" |
8 #include "base/strings/string16.h" | 8 #include "base/strings/string16.h" |
9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 const char* const name; | 50 const char* const name; |
51 const char* const initial_value; | 51 const char* const initial_value; |
52 const char* const autocomplete_attribute; // The autocomplete attribute of | 52 const char* const autocomplete_attribute; // The autocomplete attribute of |
53 // the element. | 53 // the element. |
54 bool should_be_autofilled; // Whether the filed should be autofilled. | 54 bool should_be_autofilled; // Whether the filed should be autofilled. |
55 const char* const autofill_value; // The value being used to fill the field. | 55 const char* const autofill_value; // The value being used to fill the field. |
56 const char* const expected_value; // The expected value after Autofill | 56 const char* const expected_value; // The expected value after Autofill |
57 // or Preview. | 57 // or Preview. |
58 }; | 58 }; |
59 | 59 |
60 static const char kFormHtml[] = | 60 const char kFormHtml[] = |
61 "<FORM name='TestForm' action='http://buh.com' method='post'>" | 61 "<FORM name='TestForm' action='http://buh.com' method='post'>" |
62 " <INPUT type='text' id='firstname'/>" | 62 " <INPUT type='text' id='firstname'/>" |
63 " <INPUT type='text' id='lastname'/>" | 63 " <INPUT type='text' id='lastname'/>" |
64 " <INPUT type='hidden' id='imhidden'/>" | 64 " <INPUT type='hidden' id='imhidden'/>" |
65 " <INPUT type='text' id='notempty' value='Hi'/>" | 65 " <INPUT type='text' id='notempty' value='Hi'/>" |
66 " <INPUT type='text' autocomplete='off' id='noautocomplete'/>" | 66 " <INPUT type='text' autocomplete='off' id='noautocomplete'/>" |
67 " <INPUT type='text' disabled='disabled' id='notenabled'/>" | 67 " <INPUT type='text' disabled='disabled' id='notenabled'/>" |
68 " <INPUT type='text' readonly id='readonly'/>" | 68 " <INPUT type='text' readonly id='readonly'/>" |
69 " <INPUT type='text' style='visibility: hidden'" | 69 " <INPUT type='text' style='visibility: hidden'" |
70 " id='invisible'/>" | 70 " id='invisible'/>" |
(...skipping 11 matching lines...) Expand all Loading... |
82 " </SELECT>" | 82 " </SELECT>" |
83 " <SELECT id='select-unchanged'>" | 83 " <SELECT id='select-unchanged'>" |
84 " <OPTION value='CA' selected>California</OPTION>" | 84 " <OPTION value='CA' selected>California</OPTION>" |
85 " <OPTION value='TX'>Texas</OPTION>" | 85 " <OPTION value='TX'>Texas</OPTION>" |
86 " </SELECT>" | 86 " </SELECT>" |
87 " <TEXTAREA id='textarea'></TEXTAREA>" | 87 " <TEXTAREA id='textarea'></TEXTAREA>" |
88 " <TEXTAREA id='textarea-nonempty'>Go away!</TEXTAREA>" | 88 " <TEXTAREA id='textarea-nonempty'>Go away!</TEXTAREA>" |
89 " <INPUT type='submit' name='reply-send' value='Send'/>" | 89 " <INPUT type='submit' name='reply-send' value='Send'/>" |
90 "</FORM>"; | 90 "</FORM>"; |
91 | 91 |
| 92 const char kUnownedFormHtml[] = |
| 93 "<INPUT type='text' id='firstname'/>" |
| 94 "<INPUT type='text' id='lastname'/>" |
| 95 "<INPUT type='hidden' id='imhidden'/>" |
| 96 "<INPUT type='text' id='notempty' value='Hi'/>" |
| 97 "<INPUT type='text' autocomplete='off' id='noautocomplete'/>" |
| 98 "<INPUT type='text' disabled='disabled' id='notenabled'/>" |
| 99 "<INPUT type='text' readonly id='readonly'/>" |
| 100 "<INPUT type='text' style='visibility: hidden'" |
| 101 " id='invisible'/>" |
| 102 "<INPUT type='text' style='display: none' id='displaynone'/>" |
| 103 "<INPUT type='month' id='month'/>" |
| 104 "<INPUT type='month' id='month-nonempty' value='2011-12'/>" |
| 105 "<SELECT id='select'>" |
| 106 " <OPTION></OPTION>" |
| 107 " <OPTION value='CA'>California</OPTION>" |
| 108 " <OPTION value='TX'>Texas</OPTION>" |
| 109 "</SELECT>" |
| 110 "<SELECT id='select-nonempty'>" |
| 111 " <OPTION value='CA' selected>California</OPTION>" |
| 112 " <OPTION value='TX'>Texas</OPTION>" |
| 113 "</SELECT>" |
| 114 "<SELECT id='select-unchanged'>" |
| 115 " <OPTION value='CA' selected>California</OPTION>" |
| 116 " <OPTION value='TX'>Texas</OPTION>" |
| 117 "</SELECT>" |
| 118 "<TEXTAREA id='textarea'></TEXTAREA>" |
| 119 "<TEXTAREA id='textarea-nonempty'>Go away!</TEXTAREA>" |
| 120 "<INPUT type='submit' name='reply-send' value='Send'/>"; |
| 121 |
92 std::string RetrievalMethodToString( | 122 std::string RetrievalMethodToString( |
93 const WebElementDescriptor::RetrievalMethod& method) { | 123 const WebElementDescriptor::RetrievalMethod& method) { |
94 switch (method) { | 124 switch (method) { |
95 case WebElementDescriptor::CSS_SELECTOR: | 125 case WebElementDescriptor::CSS_SELECTOR: |
96 return "CSS_SELECTOR"; | 126 return "CSS_SELECTOR"; |
97 case WebElementDescriptor::ID: | 127 case WebElementDescriptor::ID: |
98 return "ID"; | 128 return "ID"; |
99 case WebElementDescriptor::NONE: | 129 case WebElementDescriptor::NONE: |
100 return "NONE"; | 130 return "NONE"; |
101 } | 131 } |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 values.push_back(ASCIIToUTF16("john@example.com")); | 236 values.push_back(ASCIIToUTF16("john@example.com")); |
207 | 237 |
208 ExpectLabels(html, labels, names, values); | 238 ExpectLabels(html, labels, names, values); |
209 } | 239 } |
210 | 240 |
211 typedef void (*FillFormFunction)(const FormData& form, | 241 typedef void (*FillFormFunction)(const FormData& form, |
212 const WebFormControlElement& element); | 242 const WebFormControlElement& element); |
213 | 243 |
214 typedef WebString (*GetValueFunction)(WebFormControlElement element); | 244 typedef WebString (*GetValueFunction)(WebFormControlElement element); |
215 | 245 |
| 246 bool FindFormAndField(WebFrame* web_frame, |
| 247 const blink::WebFormControlElement& element, |
| 248 bool unowned, |
| 249 RequirementsMask requirement_mask, |
| 250 FormData* form, |
| 251 FormFieldData* field) { |
| 252 if (!unowned) { |
| 253 return FindFormAndFieldForFormControlElement(element, |
| 254 form, |
| 255 field, |
| 256 requirement_mask); |
| 257 } |
| 258 |
| 259 WebDocument document = web_frame->document(); |
| 260 std::vector<WebElement> fieldsets; |
| 261 std::vector<WebFormControlElement> control_elements = |
| 262 GetUnownedAutofillableFormFieldElements(document.all(), &fieldsets); |
| 263 ExtractMask extract_mask = |
| 264 static_cast<ExtractMask>(EXTRACT_VALUE | EXTRACT_OPTIONS); |
| 265 return UnownedFormElementsAndFieldSetsToFormData(fieldsets, |
| 266 control_elements, |
| 267 &element, |
| 268 document.url(), |
| 269 requirement_mask, |
| 270 extract_mask, |
| 271 form, |
| 272 field); |
| 273 } |
| 274 |
216 // Test FormFillxxx functions. | 275 // Test FormFillxxx functions. |
217 void TestFormFillFunctions(const char* html, | 276 void TestFormFillFunctions(const char* html, |
| 277 bool unowned, |
218 const AutofillFieldCase* field_cases, | 278 const AutofillFieldCase* field_cases, |
219 size_t number_of_field_cases, | 279 size_t number_of_field_cases, |
220 FillFormFunction fill_form_function, | 280 FillFormFunction fill_form_function, |
221 GetValueFunction get_value_function) { | 281 GetValueFunction get_value_function) { |
222 LoadHTML(html); | 282 LoadHTML(html); |
223 | 283 |
224 WebFrame* web_frame = GetMainFrame(); | 284 WebFrame* web_frame = GetMainFrame(); |
225 ASSERT_NE(nullptr, web_frame); | 285 ASSERT_NE(nullptr, web_frame); |
226 | 286 |
227 FormCache form_cache; | 287 FormCache form_cache; |
228 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); | 288 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); |
229 ASSERT_EQ(1U, forms.size()); | 289 ASSERT_EQ(1U, forms.size()); |
230 | 290 |
231 // Get the input element we want to find. | 291 // Get the input element we want to find. |
232 WebInputElement input_element = GetInputElementById("firstname"); | 292 WebInputElement input_element = GetInputElementById("firstname"); |
233 | 293 |
234 // Find the form that contains the input element. | 294 // Find the form that contains the input element. |
235 FormData form_data; | 295 FormData form_data; |
236 FormFieldData field; | 296 FormFieldData field; |
237 EXPECT_TRUE(FindFormAndFieldForFormControlElement( | 297 EXPECT_TRUE(FindFormAndField( |
238 input_element, &form_data, &field, autofill::REQUIRE_NONE)); | 298 web_frame, input_element, unowned, REQUIRE_NONE, &form_data, &field)); |
239 EXPECT_EQ(ASCIIToUTF16("TestForm"), form_data.name); | 299 if (!unowned) { |
240 EXPECT_EQ(GURL(web_frame->document().url()), form_data.origin); | 300 EXPECT_EQ(ASCIIToUTF16("TestForm"), form_data.name); |
241 EXPECT_EQ(GURL("http://buh.com"), form_data.action); | 301 EXPECT_EQ(GURL("http://buh.com"), form_data.action); |
| 302 } |
242 | 303 |
243 const std::vector<FormFieldData>& fields = form_data.fields; | 304 const std::vector<FormFieldData>& fields = form_data.fields; |
244 ASSERT_EQ(number_of_field_cases, fields.size()); | 305 ASSERT_EQ(number_of_field_cases, fields.size()); |
245 | 306 |
246 FormFieldData expected; | 307 FormFieldData expected; |
247 // Verify field's initial value. | 308 // Verify field's initial value. |
248 for (size_t i = 0; i < number_of_field_cases; ++i) { | 309 for (size_t i = 0; i < number_of_field_cases; ++i) { |
249 SCOPED_TRACE(base::StringPrintf("Verify initial value for field %s", | 310 SCOPED_TRACE(base::StringPrintf("Verify initial value for field %s", |
250 field_cases[i].name)); | 311 field_cases[i].name)); |
251 expected.form_control_type = field_cases[i].form_control_type; | 312 expected.form_control_type = field_cases[i].form_control_type; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 WebFormControlElement GetFormControlElementById(const WebString& id) { | 361 WebFormControlElement GetFormControlElementById(const WebString& id) { |
301 return GetMainFrame()->document().getElementById( | 362 return GetMainFrame()->document().getElementById( |
302 id).to<WebFormControlElement>(); | 363 id).to<WebFormControlElement>(); |
303 } | 364 } |
304 | 365 |
305 WebInputElement GetInputElementById(const WebString& id) { | 366 WebInputElement GetInputElementById(const WebString& id) { |
306 return GetMainFrame()->document().getElementById( | 367 return GetMainFrame()->document().getElementById( |
307 id).to<WebInputElement>(); | 368 id).to<WebInputElement>(); |
308 } | 369 } |
309 | 370 |
| 371 void TestFillForm(const char* html, bool unowned) { |
| 372 static const AutofillFieldCase field_cases[] = { |
| 373 // fields: form_control_type, name, initial_value, autocomplete_attribute, |
| 374 // should_be_autofilled, autofill_value, expected_value |
| 375 |
| 376 // Regular empty fields (firstname & lastname) should be autofilled. |
| 377 {"text", |
| 378 "firstname", |
| 379 "", |
| 380 "", |
| 381 true, |
| 382 "filled firstname", |
| 383 "filled firstname"}, |
| 384 {"text", "lastname", "", "", true, "filled lastname", "filled lastname"}, |
| 385 // hidden fields should not be extracted to form_data. |
| 386 // Non empty fields should not be autofilled. |
| 387 {"text", "notempty", "Hi", "", false, "filled notempty", "Hi"}, |
| 388 {"text", |
| 389 "noautocomplete", |
| 390 "", |
| 391 "off", |
| 392 true, |
| 393 "filled noautocomplete", |
| 394 "filled noautocomplete"}, |
| 395 // Disabled fields should not be autofilled. |
| 396 {"text", "notenabled", "", "", false, "filled notenabled", ""}, |
| 397 // Readonly fields should not be autofilled. |
| 398 {"text", "readonly", "", "", false, "filled readonly", ""}, |
| 399 // Fields with "visibility: hidden" should not be autofilled. |
| 400 {"text", "invisible", "", "", false, "filled invisible", ""}, |
| 401 // Fields with "display:none" should not be autofilled. |
| 402 {"text", "displaynone", "", "", false, "filled displaynone", ""}, |
| 403 // Regular <input type="month"> should be autofilled. |
| 404 {"month", "month", "", "", true, "2017-11", "2017-11"}, |
| 405 // Non-empty <input type="month"> should not be autofilled. |
| 406 {"month", "month-nonempty", "2011-12", "", false, "2017-11", "2011-12"}, |
| 407 // Regular select fields should be autofilled. |
| 408 {"select-one", "select", "", "", true, "TX", "TX"}, |
| 409 // Select fields should be autofilled even if they already have a |
| 410 // non-empty value. |
| 411 {"select-one", "select-nonempty", "CA", "", true, "TX", "TX"}, |
| 412 // Select fields should not be autofilled if no new value is passed from |
| 413 // autofill profile. The existing value should not be overriden. |
| 414 {"select-one", "select-unchanged", "CA", "", false, "CA", "CA"}, |
| 415 // Regular textarea elements should be autofilled. |
| 416 {"textarea", |
| 417 "textarea", |
| 418 "", |
| 419 "", |
| 420 true, |
| 421 "some multi-\nline value", |
| 422 "some multi-\nline value"}, |
| 423 // Non-empty textarea elements should not be autofilled. |
| 424 {"textarea", |
| 425 "textarea-nonempty", |
| 426 "Go\naway!", |
| 427 "", |
| 428 false, |
| 429 "some multi-\nline value", |
| 430 "Go\naway!"}, |
| 431 }; |
| 432 TestFormFillFunctions(html, unowned, field_cases, arraysize(field_cases), |
| 433 FillForm, &GetValueWrapper); |
| 434 // Verify preview selection. |
| 435 WebInputElement firstname = GetInputElementById("firstname"); |
| 436 EXPECT_EQ(16, firstname.selectionStart()); |
| 437 EXPECT_EQ(16, firstname.selectionEnd()); |
| 438 } |
| 439 |
| 440 void TestPreviewForm(const char* html, bool unowned) { |
| 441 static const AutofillFieldCase field_cases[] = { |
| 442 // Normal empty fields should be previewed. |
| 443 {"text", |
| 444 "firstname", |
| 445 "", |
| 446 "", |
| 447 true, |
| 448 "suggested firstname", |
| 449 "suggested firstname"}, |
| 450 {"text", |
| 451 "lastname", |
| 452 "", |
| 453 "", |
| 454 true, |
| 455 "suggested lastname", |
| 456 "suggested lastname"}, |
| 457 // Hidden fields should not be extracted to form_data. |
| 458 // Non empty fields should not be previewed. |
| 459 {"text", "notempty", "Hi", "", false, "suggested notempty", ""}, |
| 460 {"text", |
| 461 "noautocomplete", |
| 462 "", |
| 463 "off", |
| 464 true, |
| 465 "filled noautocomplete", |
| 466 "filled noautocomplete"}, |
| 467 // Disabled fields should not be previewed. |
| 468 {"text", "notenabled", "", "", false, "suggested notenabled", ""}, |
| 469 // Readonly fields should not be previewed. |
| 470 {"text", "readonly", "", "", false, "suggested readonly", ""}, |
| 471 // Fields with "visibility: hidden" should not be previewed. |
| 472 {"text", "invisible", "", "", false, "suggested invisible", ""}, |
| 473 // Fields with "display:none" should not previewed. |
| 474 {"text", "displaynone", "", "", false, "suggested displaynone", ""}, |
| 475 // Regular <input type="month"> should be previewed. |
| 476 {"month", "month", "", "", true, "2017-11", "2017-11"}, |
| 477 // Non-empty <input type="month"> should not be previewed. |
| 478 {"month", "month-nonempty", "2011-12", "", false, "2017-11", ""}, |
| 479 // Regular select fields should be previewed. |
| 480 {"select-one", "select", "", "", true, "TX", "TX"}, |
| 481 // Select fields should be previewed even if they already have a |
| 482 // non-empty value. |
| 483 {"select-one", "select-nonempty", "CA", "", true, "TX", "TX"}, |
| 484 // Select fields should not be previewed if no suggestion is passed from |
| 485 // autofill profile. |
| 486 {"select-one", "select-unchanged", "CA", "", false, "", ""}, |
| 487 // Normal textarea elements should be previewed. |
| 488 {"textarea", |
| 489 "textarea", |
| 490 "", |
| 491 "", |
| 492 true, |
| 493 "suggested multi-\nline value", |
| 494 "suggested multi-\nline value"}, |
| 495 // Nonempty textarea elements should not be previewed. |
| 496 {"textarea", |
| 497 "textarea-nonempty", |
| 498 "Go\naway!", |
| 499 "", |
| 500 false, |
| 501 "suggested multi-\nline value", |
| 502 ""}, |
| 503 }; |
| 504 TestFormFillFunctions(html, unowned, field_cases, arraysize(field_cases), |
| 505 &PreviewForm, &GetSuggestedValueWrapper); |
| 506 |
| 507 // Verify preview selection. |
| 508 WebInputElement firstname = GetInputElementById("firstname"); |
| 509 EXPECT_EQ(0, firstname.selectionStart()); |
| 510 EXPECT_EQ(19, firstname.selectionEnd()); |
| 511 } |
| 512 |
| 513 void TestFindFormForInputElement(const char* html, bool unowned) { |
| 514 LoadHTML(html); |
| 515 WebFrame* web_frame = GetMainFrame(); |
| 516 ASSERT_NE(nullptr, web_frame); |
| 517 |
| 518 FormCache form_cache; |
| 519 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); |
| 520 ASSERT_EQ(1U, forms.size()); |
| 521 |
| 522 // Get the input element we want to find. |
| 523 WebInputElement input_element = GetInputElementById("firstname"); |
| 524 |
| 525 // Find the form and verify it's the correct form. |
| 526 FormData form; |
| 527 FormFieldData field; |
| 528 EXPECT_TRUE(FindFormAndField(web_frame, input_element, unowned, |
| 529 REQUIRE_NONE, &form, &field)); |
| 530 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); |
| 531 if (!unowned) { |
| 532 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); |
| 533 EXPECT_EQ(GURL("http://buh.com"), form.action); |
| 534 } |
| 535 |
| 536 const std::vector<FormFieldData>& fields = form.fields; |
| 537 ASSERT_EQ(4U, fields.size()); |
| 538 |
| 539 FormFieldData expected; |
| 540 expected.form_control_type = "text"; |
| 541 expected.max_length = WebInputElement::defaultMaxLength(); |
| 542 |
| 543 expected.name = ASCIIToUTF16("firstname"); |
| 544 expected.value = ASCIIToUTF16("John"); |
| 545 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); |
| 546 EXPECT_FORM_FIELD_DATA_EQUALS(expected, field); |
| 547 |
| 548 expected.name = ASCIIToUTF16("lastname"); |
| 549 expected.value = ASCIIToUTF16("Smith"); |
| 550 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); |
| 551 |
| 552 expected.name = ASCIIToUTF16("email"); |
| 553 expected.value = ASCIIToUTF16("john@example.com"); |
| 554 expected.autocomplete_attribute = "off"; |
| 555 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); |
| 556 expected.autocomplete_attribute.clear(); |
| 557 |
| 558 expected.name = ASCIIToUTF16("phone"); |
| 559 expected.value = ASCIIToUTF16("1.800.555.1234"); |
| 560 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); |
| 561 |
| 562 // Try again, but require autocomplete. |
| 563 FormData form2; |
| 564 FormFieldData field2; |
| 565 EXPECT_TRUE(FindFormAndField(web_frame, input_element, unowned, |
| 566 REQUIRE_AUTOCOMPLETE, &form2, &field2)); |
| 567 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); |
| 568 if (!unowned) { |
| 569 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); |
| 570 EXPECT_EQ(GURL("http://buh.com"), form2.action); |
| 571 } |
| 572 |
| 573 const std::vector<FormFieldData>& fields2 = form2.fields; |
| 574 ASSERT_EQ(3U, fields2.size()); |
| 575 |
| 576 expected.form_control_type = "text"; |
| 577 expected.max_length = WebInputElement::defaultMaxLength(); |
| 578 |
| 579 expected.name = ASCIIToUTF16("firstname"); |
| 580 expected.value = ASCIIToUTF16("John"); |
| 581 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); |
| 582 EXPECT_FORM_FIELD_DATA_EQUALS(expected, field); |
| 583 |
| 584 expected.name = ASCIIToUTF16("lastname"); |
| 585 expected.value = ASCIIToUTF16("Smith"); |
| 586 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); |
| 587 |
| 588 expected.name = ASCIIToUTF16("phone"); |
| 589 expected.value = ASCIIToUTF16("1.800.555.1234"); |
| 590 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); |
| 591 } |
| 592 |
| 593 void TestFindFormForTextAreaElement(const char* html, bool unowned) { |
| 594 LoadHTML(html); |
| 595 WebFrame* web_frame = GetMainFrame(); |
| 596 ASSERT_NE(nullptr, web_frame); |
| 597 |
| 598 FormCache form_cache; |
| 599 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); |
| 600 ASSERT_EQ(1U, forms.size()); |
| 601 |
| 602 // Get the textarea element we want to find. |
| 603 WebElement element = web_frame->document().getElementById("street-address"); |
| 604 WebTextAreaElement textarea_element = element.to<WebTextAreaElement>(); |
| 605 |
| 606 // Find the form and verify it's the correct form. |
| 607 FormData form; |
| 608 FormFieldData field; |
| 609 EXPECT_TRUE(FindFormAndField(web_frame, textarea_element, unowned, |
| 610 REQUIRE_NONE, &form, &field)); |
| 611 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); |
| 612 if (!unowned) { |
| 613 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); |
| 614 EXPECT_EQ(GURL("http://buh.com"), form.action); |
| 615 } |
| 616 |
| 617 const std::vector<FormFieldData>& fields = form.fields; |
| 618 ASSERT_EQ(4U, fields.size()); |
| 619 |
| 620 FormFieldData expected; |
| 621 |
| 622 expected.name = ASCIIToUTF16("firstname"); |
| 623 expected.value = ASCIIToUTF16("John"); |
| 624 expected.form_control_type = "text"; |
| 625 expected.max_length = WebInputElement::defaultMaxLength(); |
| 626 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); |
| 627 |
| 628 expected.name = ASCIIToUTF16("lastname"); |
| 629 expected.value = ASCIIToUTF16("Smith"); |
| 630 expected.form_control_type = "text"; |
| 631 expected.max_length = WebInputElement::defaultMaxLength(); |
| 632 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); |
| 633 |
| 634 expected.name = ASCIIToUTF16("email"); |
| 635 expected.value = ASCIIToUTF16("john@example.com"); |
| 636 expected.autocomplete_attribute = "off"; |
| 637 expected.form_control_type = "text"; |
| 638 expected.max_length = WebInputElement::defaultMaxLength(); |
| 639 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); |
| 640 expected.autocomplete_attribute.clear(); |
| 641 |
| 642 expected.name = ASCIIToUTF16("street-address"); |
| 643 expected.value = ASCIIToUTF16("123 Fantasy Ln.\nApt. 42"); |
| 644 expected.form_control_type = "textarea"; |
| 645 expected.max_length = 0; |
| 646 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); |
| 647 EXPECT_FORM_FIELD_DATA_EQUALS(expected, field); |
| 648 |
| 649 // Try again, but require autocomplete. |
| 650 FormData form2; |
| 651 FormFieldData field2; |
| 652 EXPECT_TRUE(FindFormAndField(web_frame, textarea_element, unowned, |
| 653 REQUIRE_AUTOCOMPLETE, &form2, &field2)); |
| 654 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); |
| 655 if (!unowned) { |
| 656 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); |
| 657 EXPECT_EQ(GURL("http://buh.com"), form2.action); |
| 658 } |
| 659 |
| 660 const std::vector<FormFieldData>& fields2 = form2.fields; |
| 661 ASSERT_EQ(3U, fields2.size()); |
| 662 |
| 663 expected.name = ASCIIToUTF16("firstname"); |
| 664 expected.value = ASCIIToUTF16("John"); |
| 665 expected.form_control_type = "text"; |
| 666 expected.max_length = WebInputElement::defaultMaxLength(); |
| 667 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); |
| 668 |
| 669 expected.name = ASCIIToUTF16("lastname"); |
| 670 expected.value = ASCIIToUTF16("Smith"); |
| 671 expected.form_control_type = "text"; |
| 672 expected.max_length = WebInputElement::defaultMaxLength(); |
| 673 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); |
| 674 |
| 675 expected.name = ASCIIToUTF16("street-address"); |
| 676 expected.value = ASCIIToUTF16("123 Fantasy Ln.\nApt. 42"); |
| 677 expected.form_control_type = "textarea"; |
| 678 expected.max_length = 0; |
| 679 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); |
| 680 EXPECT_FORM_FIELD_DATA_EQUALS(expected, field); |
| 681 } |
| 682 |
| 683 void TestFillFormMaxLength(const char* html, bool unowned) { |
| 684 LoadHTML(html); |
| 685 WebFrame* web_frame = GetMainFrame(); |
| 686 ASSERT_NE(nullptr, web_frame); |
| 687 |
| 688 FormCache form_cache; |
| 689 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); |
| 690 ASSERT_EQ(1U, forms.size()); |
| 691 |
| 692 // Get the input element we want to find. |
| 693 WebInputElement input_element = GetInputElementById("firstname"); |
| 694 |
| 695 // Find the form that contains the input element. |
| 696 FormData form; |
| 697 FormFieldData field; |
| 698 EXPECT_TRUE(FindFormAndField(web_frame, input_element, unowned, |
| 699 REQUIRE_NONE, &form, &field)); |
| 700 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); |
| 701 if (!unowned) { |
| 702 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); |
| 703 EXPECT_EQ(GURL("http://buh.com"), form.action); |
| 704 } |
| 705 |
| 706 const std::vector<FormFieldData>& fields = form.fields; |
| 707 ASSERT_EQ(3U, fields.size()); |
| 708 |
| 709 FormFieldData expected; |
| 710 expected.form_control_type = "text"; |
| 711 |
| 712 expected.name = ASCIIToUTF16("firstname"); |
| 713 expected.max_length = 5; |
| 714 expected.is_autofilled = false; |
| 715 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); |
| 716 |
| 717 expected.name = ASCIIToUTF16("lastname"); |
| 718 expected.max_length = 7; |
| 719 expected.is_autofilled = false; |
| 720 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); |
| 721 |
| 722 expected.name = ASCIIToUTF16("email"); |
| 723 expected.max_length = 9; |
| 724 expected.is_autofilled = false; |
| 725 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); |
| 726 |
| 727 // Fill the form. |
| 728 form.fields[0].value = ASCIIToUTF16("Brother"); |
| 729 form.fields[1].value = ASCIIToUTF16("Jonathan"); |
| 730 form.fields[2].value = ASCIIToUTF16("brotherj@example.com"); |
| 731 form.fields[0].is_autofilled = true; |
| 732 form.fields[1].is_autofilled = true; |
| 733 form.fields[2].is_autofilled = true; |
| 734 FillForm(form, input_element); |
| 735 |
| 736 // Find the newly-filled form that contains the input element. |
| 737 FormData form2; |
| 738 FormFieldData field2; |
| 739 EXPECT_TRUE(FindFormAndField(web_frame, input_element, unowned, |
| 740 REQUIRE_NONE, &form2, &field2)); |
| 741 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); |
| 742 if (!unowned) { |
| 743 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); |
| 744 EXPECT_EQ(GURL("http://buh.com"), form2.action); |
| 745 } |
| 746 |
| 747 const std::vector<FormFieldData>& fields2 = form2.fields; |
| 748 ASSERT_EQ(3U, fields2.size()); |
| 749 |
| 750 expected.form_control_type = "text"; |
| 751 |
| 752 expected.name = ASCIIToUTF16("firstname"); |
| 753 expected.value = ASCIIToUTF16("Broth"); |
| 754 expected.max_length = 5; |
| 755 expected.is_autofilled = true; |
| 756 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); |
| 757 |
| 758 expected.name = ASCIIToUTF16("lastname"); |
| 759 expected.value = ASCIIToUTF16("Jonatha"); |
| 760 expected.max_length = 7; |
| 761 expected.is_autofilled = true; |
| 762 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); |
| 763 |
| 764 expected.name = ASCIIToUTF16("email"); |
| 765 expected.value = ASCIIToUTF16("brotherj@"); |
| 766 expected.max_length = 9; |
| 767 expected.is_autofilled = true; |
| 768 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); |
| 769 } |
| 770 |
| 771 void TestFillFormNegativeMaxLength(const char* html, bool unowned) { |
| 772 LoadHTML(html); |
| 773 WebFrame* web_frame = GetMainFrame(); |
| 774 ASSERT_NE(nullptr, web_frame); |
| 775 |
| 776 FormCache form_cache; |
| 777 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); |
| 778 ASSERT_EQ(1U, forms.size()); |
| 779 |
| 780 // Get the input element we want to find. |
| 781 WebInputElement input_element = GetInputElementById("firstname"); |
| 782 |
| 783 // Find the form that contains the input element. |
| 784 FormData form; |
| 785 FormFieldData field; |
| 786 EXPECT_TRUE(FindFormAndField(web_frame, input_element, unowned, |
| 787 REQUIRE_NONE, &form, &field)); |
| 788 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); |
| 789 if (!unowned) { |
| 790 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); |
| 791 EXPECT_EQ(GURL("http://buh.com"), form.action); |
| 792 } |
| 793 |
| 794 const std::vector<FormFieldData>& fields = form.fields; |
| 795 ASSERT_EQ(3U, fields.size()); |
| 796 |
| 797 FormFieldData expected; |
| 798 expected.form_control_type = "text"; |
| 799 expected.max_length = WebInputElement::defaultMaxLength(); |
| 800 |
| 801 expected.name = ASCIIToUTF16("firstname"); |
| 802 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); |
| 803 |
| 804 expected.name = ASCIIToUTF16("lastname"); |
| 805 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); |
| 806 |
| 807 expected.name = ASCIIToUTF16("email"); |
| 808 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); |
| 809 |
| 810 // Fill the form. |
| 811 form.fields[0].value = ASCIIToUTF16("Brother"); |
| 812 form.fields[1].value = ASCIIToUTF16("Jonathan"); |
| 813 form.fields[2].value = ASCIIToUTF16("brotherj@example.com"); |
| 814 FillForm(form, input_element); |
| 815 |
| 816 // Find the newly-filled form that contains the input element. |
| 817 FormData form2; |
| 818 FormFieldData field2; |
| 819 EXPECT_TRUE(FindFormAndField(web_frame, input_element, unowned, |
| 820 REQUIRE_NONE, &form2, &field2)); |
| 821 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); |
| 822 if (!unowned) { |
| 823 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); |
| 824 EXPECT_EQ(GURL("http://buh.com"), form2.action); |
| 825 } |
| 826 |
| 827 const std::vector<FormFieldData>& fields2 = form2.fields; |
| 828 ASSERT_EQ(3U, fields2.size()); |
| 829 |
| 830 expected.name = ASCIIToUTF16("firstname"); |
| 831 expected.value = ASCIIToUTF16("Brother"); |
| 832 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); |
| 833 |
| 834 expected.name = ASCIIToUTF16("lastname"); |
| 835 expected.value = ASCIIToUTF16("Jonathan"); |
| 836 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); |
| 837 |
| 838 expected.name = ASCIIToUTF16("email"); |
| 839 expected.value = ASCIIToUTF16("brotherj@example.com"); |
| 840 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); |
| 841 } |
| 842 |
| 843 void TestFillFormEmptyName(const char* html, bool unowned) { |
| 844 LoadHTML(html); |
| 845 WebFrame* web_frame = GetMainFrame(); |
| 846 ASSERT_NE(nullptr, web_frame); |
| 847 |
| 848 FormCache form_cache; |
| 849 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); |
| 850 ASSERT_EQ(1U, forms.size()); |
| 851 |
| 852 // Get the input element we want to find. |
| 853 WebInputElement input_element = GetInputElementById("firstname"); |
| 854 |
| 855 // Find the form that contains the input element. |
| 856 FormData form; |
| 857 FormFieldData field; |
| 858 EXPECT_TRUE(FindFormAndField(web_frame, input_element, unowned, |
| 859 REQUIRE_NONE, &form, &field)); |
| 860 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); |
| 861 if (!unowned) { |
| 862 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); |
| 863 EXPECT_EQ(GURL("http://buh.com"), form.action); |
| 864 } |
| 865 |
| 866 const std::vector<FormFieldData>& fields = form.fields; |
| 867 ASSERT_EQ(3U, fields.size()); |
| 868 |
| 869 FormFieldData expected; |
| 870 expected.form_control_type = "text"; |
| 871 expected.max_length = WebInputElement::defaultMaxLength(); |
| 872 |
| 873 expected.name = ASCIIToUTF16("firstname"); |
| 874 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); |
| 875 |
| 876 expected.name = ASCIIToUTF16("lastname"); |
| 877 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); |
| 878 |
| 879 expected.name = ASCIIToUTF16("email"); |
| 880 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); |
| 881 |
| 882 // Fill the form. |
| 883 form.fields[0].value = ASCIIToUTF16("Wyatt"); |
| 884 form.fields[1].value = ASCIIToUTF16("Earp"); |
| 885 form.fields[2].value = ASCIIToUTF16("wyatt@example.com"); |
| 886 FillForm(form, input_element); |
| 887 |
| 888 // Find the newly-filled form that contains the input element. |
| 889 FormData form2; |
| 890 FormFieldData field2; |
| 891 EXPECT_TRUE(FindFormAndField(web_frame, input_element, unowned, |
| 892 REQUIRE_NONE, &form2, &field2)); |
| 893 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); |
| 894 if (!unowned) { |
| 895 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); |
| 896 EXPECT_EQ(GURL("http://buh.com"), form2.action); |
| 897 } |
| 898 |
| 899 const std::vector<FormFieldData>& fields2 = form2.fields; |
| 900 ASSERT_EQ(3U, fields2.size()); |
| 901 |
| 902 expected.form_control_type = "text"; |
| 903 expected.max_length = WebInputElement::defaultMaxLength(); |
| 904 |
| 905 expected.name = ASCIIToUTF16("firstname"); |
| 906 expected.value = ASCIIToUTF16("Wyatt"); |
| 907 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); |
| 908 |
| 909 expected.name = ASCIIToUTF16("lastname"); |
| 910 expected.value = ASCIIToUTF16("Earp"); |
| 911 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); |
| 912 |
| 913 expected.name = ASCIIToUTF16("email"); |
| 914 expected.value = ASCIIToUTF16("wyatt@example.com"); |
| 915 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); |
| 916 } |
| 917 |
| 918 void TestFillFormEmptyFormNames(const char* html, bool unowned) { |
| 919 LoadHTML(html); |
| 920 WebFrame* web_frame = GetMainFrame(); |
| 921 ASSERT_NE(nullptr, web_frame); |
| 922 |
| 923 FormCache form_cache; |
| 924 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); |
| 925 const size_t expected_size = unowned ? 1 : 2; |
| 926 ASSERT_EQ(expected_size, forms.size()); |
| 927 |
| 928 // Get the input element we want to find. |
| 929 WebInputElement input_element = GetInputElementById("apple"); |
| 930 |
| 931 // Find the form that contains the input element. |
| 932 FormData form; |
| 933 FormFieldData field; |
| 934 EXPECT_TRUE(FindFormAndField(web_frame, input_element, unowned, |
| 935 REQUIRE_NONE, &form, &field)); |
| 936 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); |
| 937 if (!unowned) { |
| 938 EXPECT_TRUE(form.name.empty()); |
| 939 EXPECT_EQ(GURL("http://abc.com"), form.action); |
| 940 } |
| 941 |
| 942 const std::vector<FormFieldData>& fields = form.fields; |
| 943 const size_t unowned_offset = unowned ? 3 : 0; |
| 944 ASSERT_EQ(unowned_offset + 3, fields.size()); |
| 945 |
| 946 FormFieldData expected; |
| 947 expected.form_control_type = "text"; |
| 948 expected.max_length = WebInputElement::defaultMaxLength(); |
| 949 |
| 950 expected.name = ASCIIToUTF16("apple"); |
| 951 expected.is_autofilled = false; |
| 952 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[unowned_offset]); |
| 953 |
| 954 expected.name = ASCIIToUTF16("banana"); |
| 955 expected.is_autofilled = false; |
| 956 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[unowned_offset + 1]); |
| 957 |
| 958 expected.name = ASCIIToUTF16("cantelope"); |
| 959 expected.is_autofilled = false; |
| 960 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[unowned_offset + 2]); |
| 961 |
| 962 // Fill the form. |
| 963 form.fields[unowned_offset + 0].value = ASCIIToUTF16("Red"); |
| 964 form.fields[unowned_offset + 1].value = ASCIIToUTF16("Yellow"); |
| 965 form.fields[unowned_offset + 2].value = ASCIIToUTF16("Also Yellow"); |
| 966 form.fields[unowned_offset + 0].is_autofilled = true; |
| 967 form.fields[unowned_offset + 1].is_autofilled = true; |
| 968 form.fields[unowned_offset + 2].is_autofilled = true; |
| 969 FillForm(form, input_element); |
| 970 |
| 971 // Find the newly-filled form that contains the input element. |
| 972 FormData form2; |
| 973 FormFieldData field2; |
| 974 EXPECT_TRUE(FindFormAndField(web_frame, input_element, unowned, |
| 975 REQUIRE_NONE, &form2, &field2)); |
| 976 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); |
| 977 if (!unowned) { |
| 978 EXPECT_TRUE(form2.name.empty()); |
| 979 EXPECT_EQ(GURL("http://abc.com"), form2.action); |
| 980 } |
| 981 |
| 982 const std::vector<FormFieldData>& fields2 = form2.fields; |
| 983 ASSERT_EQ(unowned_offset + 3, fields2.size()); |
| 984 |
| 985 expected.name = ASCIIToUTF16("apple"); |
| 986 expected.value = ASCIIToUTF16("Red"); |
| 987 expected.is_autofilled = true; |
| 988 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[unowned_offset + 0]); |
| 989 |
| 990 expected.name = ASCIIToUTF16("banana"); |
| 991 expected.value = ASCIIToUTF16("Yellow"); |
| 992 expected.is_autofilled = true; |
| 993 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[unowned_offset + 1]); |
| 994 |
| 995 expected.name = ASCIIToUTF16("cantelope"); |
| 996 expected.value = ASCIIToUTF16("Also Yellow"); |
| 997 expected.is_autofilled = true; |
| 998 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[unowned_offset + 2]); |
| 999 } |
| 1000 |
| 1001 void TestFillFormNonEmptyField(const char* html, bool unowned) { |
| 1002 LoadHTML(html); |
| 1003 WebFrame* web_frame = GetMainFrame(); |
| 1004 ASSERT_NE(nullptr, web_frame); |
| 1005 |
| 1006 FormCache form_cache; |
| 1007 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); |
| 1008 ASSERT_EQ(1U, forms.size()); |
| 1009 |
| 1010 // Get the input element we want to find. |
| 1011 WebInputElement input_element = GetInputElementById("firstname"); |
| 1012 |
| 1013 // Simulate typing by modifying the field value. |
| 1014 input_element.setValue(ASCIIToUTF16("Wy")); |
| 1015 |
| 1016 // Find the form that contains the input element. |
| 1017 FormData form; |
| 1018 FormFieldData field; |
| 1019 EXPECT_TRUE(FindFormAndField(web_frame, input_element, unowned, |
| 1020 REQUIRE_NONE, &form, &field)); |
| 1021 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); |
| 1022 if (!unowned) { |
| 1023 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); |
| 1024 EXPECT_EQ(GURL("http://buh.com"), form.action); |
| 1025 } |
| 1026 |
| 1027 const std::vector<FormFieldData>& fields = form.fields; |
| 1028 ASSERT_EQ(3U, fields.size()); |
| 1029 |
| 1030 FormFieldData expected; |
| 1031 expected.form_control_type = "text"; |
| 1032 expected.max_length = WebInputElement::defaultMaxLength(); |
| 1033 |
| 1034 expected.name = ASCIIToUTF16("firstname"); |
| 1035 expected.value = ASCIIToUTF16("Wy"); |
| 1036 expected.is_autofilled = false; |
| 1037 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); |
| 1038 |
| 1039 expected.name = ASCIIToUTF16("lastname"); |
| 1040 expected.value.clear(); |
| 1041 expected.is_autofilled = false; |
| 1042 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); |
| 1043 |
| 1044 expected.name = ASCIIToUTF16("email"); |
| 1045 expected.value.clear(); |
| 1046 expected.is_autofilled = false; |
| 1047 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); |
| 1048 |
| 1049 // Preview the form and verify that the cursor position has been updated. |
| 1050 form.fields[0].value = ASCIIToUTF16("Wyatt"); |
| 1051 form.fields[1].value = ASCIIToUTF16("Earp"); |
| 1052 form.fields[2].value = ASCIIToUTF16("wyatt@example.com"); |
| 1053 form.fields[0].is_autofilled = true; |
| 1054 form.fields[1].is_autofilled = true; |
| 1055 form.fields[2].is_autofilled = true; |
| 1056 PreviewForm(form, input_element); |
| 1057 EXPECT_EQ(2, input_element.selectionStart()); |
| 1058 EXPECT_EQ(5, input_element.selectionEnd()); |
| 1059 |
| 1060 // Fill the form. |
| 1061 FillForm(form, input_element); |
| 1062 |
| 1063 // Find the newly-filled form that contains the input element. |
| 1064 FormData form2; |
| 1065 FormFieldData field2; |
| 1066 EXPECT_TRUE(FindFormAndField(web_frame, input_element, unowned, |
| 1067 REQUIRE_NONE, &form2, &field2)); |
| 1068 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); |
| 1069 if (!unowned) { |
| 1070 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); |
| 1071 EXPECT_EQ(GURL("http://buh.com"), form2.action); |
| 1072 } |
| 1073 |
| 1074 const std::vector<FormFieldData>& fields2 = form2.fields; |
| 1075 ASSERT_EQ(3U, fields2.size()); |
| 1076 |
| 1077 expected.name = ASCIIToUTF16("firstname"); |
| 1078 expected.value = ASCIIToUTF16("Wyatt"); |
| 1079 expected.is_autofilled = true; |
| 1080 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); |
| 1081 |
| 1082 expected.name = ASCIIToUTF16("lastname"); |
| 1083 expected.value = ASCIIToUTF16("Earp"); |
| 1084 expected.is_autofilled = true; |
| 1085 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); |
| 1086 |
| 1087 expected.name = ASCIIToUTF16("email"); |
| 1088 expected.value = ASCIIToUTF16("wyatt@example.com"); |
| 1089 expected.is_autofilled = true; |
| 1090 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); |
| 1091 |
| 1092 // Verify that the cursor position has been updated. |
| 1093 EXPECT_EQ(5, input_element.selectionStart()); |
| 1094 EXPECT_EQ(5, input_element.selectionEnd()); |
| 1095 } |
| 1096 |
| 1097 void TestClearFormWithNode(const char* html, bool unowned) { |
| 1098 LoadHTML(html); |
| 1099 WebFrame* web_frame = GetMainFrame(); |
| 1100 ASSERT_NE(nullptr, web_frame); |
| 1101 |
| 1102 FormCache form_cache; |
| 1103 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); |
| 1104 ASSERT_EQ(1U, forms.size()); |
| 1105 |
| 1106 // Set the auto-filled attribute. |
| 1107 WebInputElement firstname = GetInputElementById("firstname"); |
| 1108 firstname.setAutofilled(true); |
| 1109 WebInputElement lastname = GetInputElementById("lastname"); |
| 1110 lastname.setAutofilled(true); |
| 1111 WebInputElement month = GetInputElementById("month"); |
| 1112 month.setAutofilled(true); |
| 1113 WebInputElement textarea = GetInputElementById("textarea"); |
| 1114 textarea.setAutofilled(true); |
| 1115 |
| 1116 // Set the value of the disabled text input element. |
| 1117 WebInputElement notenabled = GetInputElementById("notenabled"); |
| 1118 notenabled.setValue(WebString::fromUTF8("no clear")); |
| 1119 |
| 1120 // Clear the form. |
| 1121 EXPECT_TRUE(form_cache.ClearFormWithElement(firstname)); |
| 1122 |
| 1123 // Verify that the auto-filled attribute has been turned off. |
| 1124 EXPECT_FALSE(firstname.isAutofilled()); |
| 1125 |
| 1126 // Verify the form is cleared. |
| 1127 FormData form; |
| 1128 FormFieldData field; |
| 1129 EXPECT_TRUE(FindFormAndField(web_frame, firstname, unowned, REQUIRE_NONE, |
| 1130 &form, &field)); |
| 1131 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); |
| 1132 if (!unowned) { |
| 1133 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); |
| 1134 EXPECT_EQ(GURL("http://buh.com"), form.action); |
| 1135 } |
| 1136 |
| 1137 const std::vector<FormFieldData>& fields = form.fields; |
| 1138 ASSERT_EQ(9U, fields.size()); |
| 1139 |
| 1140 FormFieldData expected; |
| 1141 expected.form_control_type = "text"; |
| 1142 expected.max_length = WebInputElement::defaultMaxLength(); |
| 1143 |
| 1144 expected.name = ASCIIToUTF16("firstname"); |
| 1145 expected.value.clear(); |
| 1146 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); |
| 1147 |
| 1148 expected.name = ASCIIToUTF16("lastname"); |
| 1149 expected.value.clear(); |
| 1150 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); |
| 1151 |
| 1152 expected.name = ASCIIToUTF16("noAC"); |
| 1153 expected.value = ASCIIToUTF16("one"); |
| 1154 expected.autocomplete_attribute = "off"; |
| 1155 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); |
| 1156 expected.autocomplete_attribute.clear(); |
| 1157 |
| 1158 expected.name = ASCIIToUTF16("notenabled"); |
| 1159 expected.value = ASCIIToUTF16("no clear"); |
| 1160 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); |
| 1161 |
| 1162 expected.form_control_type = "month"; |
| 1163 expected.max_length = 0; |
| 1164 expected.name = ASCIIToUTF16("month"); |
| 1165 expected.value.clear(); |
| 1166 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[4]); |
| 1167 |
| 1168 expected.name = ASCIIToUTF16("month-disabled"); |
| 1169 expected.value = ASCIIToUTF16("2012-11"); |
| 1170 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[5]); |
| 1171 |
| 1172 expected.form_control_type = "textarea"; |
| 1173 expected.name = ASCIIToUTF16("textarea"); |
| 1174 expected.value.clear(); |
| 1175 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[6]); |
| 1176 |
| 1177 expected.name = ASCIIToUTF16("textarea-disabled"); |
| 1178 expected.value = ASCIIToUTF16(" Banana! "); |
| 1179 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[7]); |
| 1180 |
| 1181 expected.name = ASCIIToUTF16("textarea-noAC"); |
| 1182 expected.value = ASCIIToUTF16("Carrot?"); |
| 1183 expected.autocomplete_attribute = "off"; |
| 1184 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[8]); |
| 1185 expected.autocomplete_attribute.clear(); |
| 1186 |
| 1187 // Verify that the cursor position has been updated. |
| 1188 EXPECT_EQ(0, firstname.selectionStart()); |
| 1189 EXPECT_EQ(0, firstname.selectionEnd()); |
| 1190 } |
| 1191 |
| 1192 void TestClearFormWithNodeContainingSelectOne(const char* html, |
| 1193 bool unowned) { |
| 1194 LoadHTML(html); |
| 1195 WebFrame* web_frame = GetMainFrame(); |
| 1196 ASSERT_NE(nullptr, web_frame); |
| 1197 |
| 1198 FormCache form_cache; |
| 1199 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); |
| 1200 ASSERT_EQ(1U, forms.size()); |
| 1201 |
| 1202 // Set the auto-filled attribute. |
| 1203 WebInputElement firstname = GetInputElementById("firstname"); |
| 1204 firstname.setAutofilled(true); |
| 1205 WebInputElement lastname = GetInputElementById("lastname"); |
| 1206 lastname.setAutofilled(true); |
| 1207 |
| 1208 // Set the value and auto-filled attribute of the state element. |
| 1209 WebSelectElement state = |
| 1210 web_frame->document().getElementById("state").to<WebSelectElement>(); |
| 1211 state.setValue(WebString::fromUTF8("AK")); |
| 1212 state.setAutofilled(true); |
| 1213 |
| 1214 // Clear the form. |
| 1215 EXPECT_TRUE(form_cache.ClearFormWithElement(firstname)); |
| 1216 |
| 1217 // Verify that the auto-filled attribute has been turned off. |
| 1218 EXPECT_FALSE(firstname.isAutofilled()); |
| 1219 |
| 1220 // Verify the form is cleared. |
| 1221 FormData form; |
| 1222 FormFieldData field; |
| 1223 EXPECT_TRUE(FindFormAndField(web_frame, firstname, unowned, REQUIRE_NONE, |
| 1224 &form, &field)); |
| 1225 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); |
| 1226 if (!unowned) { |
| 1227 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); |
| 1228 EXPECT_EQ(GURL("http://buh.com"), form.action); |
| 1229 } |
| 1230 |
| 1231 const std::vector<FormFieldData>& fields = form.fields; |
| 1232 ASSERT_EQ(3U, fields.size()); |
| 1233 |
| 1234 FormFieldData expected; |
| 1235 |
| 1236 expected.name = ASCIIToUTF16("firstname"); |
| 1237 expected.value.clear(); |
| 1238 expected.form_control_type = "text"; |
| 1239 expected.max_length = WebInputElement::defaultMaxLength(); |
| 1240 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); |
| 1241 |
| 1242 expected.name = ASCIIToUTF16("lastname"); |
| 1243 expected.value.clear(); |
| 1244 expected.form_control_type = "text"; |
| 1245 expected.max_length = WebInputElement::defaultMaxLength(); |
| 1246 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); |
| 1247 |
| 1248 expected.name = ASCIIToUTF16("state"); |
| 1249 expected.value = ASCIIToUTF16("?"); |
| 1250 expected.form_control_type = "select-one"; |
| 1251 expected.max_length = 0; |
| 1252 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); |
| 1253 |
| 1254 // Verify that the cursor position has been updated. |
| 1255 EXPECT_EQ(0, firstname.selectionStart()); |
| 1256 EXPECT_EQ(0, firstname.selectionEnd()); |
| 1257 } |
| 1258 |
| 1259 void TestClearPreviewedFormWithElement(const char* html) { |
| 1260 LoadHTML(html); |
| 1261 WebFrame* web_frame = GetMainFrame(); |
| 1262 ASSERT_NE(nullptr, web_frame); |
| 1263 |
| 1264 FormCache form_cache; |
| 1265 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); |
| 1266 ASSERT_EQ(1U, forms.size()); |
| 1267 |
| 1268 // Set the auto-filled attribute. |
| 1269 WebInputElement firstname = GetInputElementById("firstname"); |
| 1270 firstname.setAutofilled(true); |
| 1271 WebInputElement lastname = GetInputElementById("lastname"); |
| 1272 lastname.setAutofilled(true); |
| 1273 WebInputElement email = GetInputElementById("email"); |
| 1274 email.setAutofilled(true); |
| 1275 WebInputElement email2 = GetInputElementById("email2"); |
| 1276 email2.setAutofilled(true); |
| 1277 WebInputElement phone = GetInputElementById("phone"); |
| 1278 phone.setAutofilled(true); |
| 1279 |
| 1280 // Set the suggested values on two of the elements. |
| 1281 lastname.setSuggestedValue(ASCIIToUTF16("Earp")); |
| 1282 email.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); |
| 1283 email2.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); |
| 1284 phone.setSuggestedValue(ASCIIToUTF16("650-777-9999")); |
| 1285 |
| 1286 // Clear the previewed fields. |
| 1287 EXPECT_TRUE(ClearPreviewedFormWithElement(lastname, false)); |
| 1288 |
| 1289 // Fields with empty suggestions suggestions are not modified. |
| 1290 EXPECT_EQ(ASCIIToUTF16("Wyatt"), firstname.value()); |
| 1291 EXPECT_TRUE(firstname.suggestedValue().isEmpty()); |
| 1292 EXPECT_TRUE(firstname.isAutofilled()); |
| 1293 |
| 1294 // Verify the previewed fields are cleared. |
| 1295 EXPECT_TRUE(lastname.value().isEmpty()); |
| 1296 EXPECT_TRUE(lastname.suggestedValue().isEmpty()); |
| 1297 EXPECT_FALSE(lastname.isAutofilled()); |
| 1298 EXPECT_TRUE(email.value().isEmpty()); |
| 1299 EXPECT_TRUE(email.suggestedValue().isEmpty()); |
| 1300 EXPECT_FALSE(email.isAutofilled()); |
| 1301 EXPECT_TRUE(email2.value().isEmpty()); |
| 1302 EXPECT_TRUE(email2.suggestedValue().isEmpty()); |
| 1303 EXPECT_FALSE(email2.isAutofilled()); |
| 1304 EXPECT_TRUE(phone.value().isEmpty()); |
| 1305 EXPECT_TRUE(phone.suggestedValue().isEmpty()); |
| 1306 EXPECT_FALSE(phone.isAutofilled()); |
| 1307 |
| 1308 // Verify that the cursor position has been updated. |
| 1309 EXPECT_EQ(0, lastname.selectionStart()); |
| 1310 EXPECT_EQ(0, lastname.selectionEnd()); |
| 1311 } |
| 1312 |
| 1313 void TestClearPreviewedFormWithNonEmptyInitiatingNode(const char* html) { |
| 1314 LoadHTML(html); |
| 1315 WebFrame* web_frame = GetMainFrame(); |
| 1316 ASSERT_NE(nullptr, web_frame); |
| 1317 |
| 1318 FormCache form_cache; |
| 1319 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); |
| 1320 ASSERT_EQ(1U, forms.size()); |
| 1321 |
| 1322 // Set the auto-filled attribute. |
| 1323 WebInputElement firstname = GetInputElementById("firstname"); |
| 1324 firstname.setAutofilled(true); |
| 1325 WebInputElement lastname = GetInputElementById("lastname"); |
| 1326 lastname.setAutofilled(true); |
| 1327 WebInputElement email = GetInputElementById("email"); |
| 1328 email.setAutofilled(true); |
| 1329 WebInputElement email2 = GetInputElementById("email2"); |
| 1330 email2.setAutofilled(true); |
| 1331 WebInputElement phone = GetInputElementById("phone"); |
| 1332 phone.setAutofilled(true); |
| 1333 |
| 1334 |
| 1335 // Set the suggested values on all of the elements. |
| 1336 firstname.setSuggestedValue(ASCIIToUTF16("Wyatt")); |
| 1337 lastname.setSuggestedValue(ASCIIToUTF16("Earp")); |
| 1338 email.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); |
| 1339 email2.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); |
| 1340 phone.setSuggestedValue(ASCIIToUTF16("650-777-9999")); |
| 1341 |
| 1342 // Clear the previewed fields. |
| 1343 EXPECT_TRUE(ClearPreviewedFormWithElement(firstname, false)); |
| 1344 |
| 1345 // Fields with non-empty values are restored. |
| 1346 EXPECT_EQ(ASCIIToUTF16("W"), firstname.value()); |
| 1347 EXPECT_TRUE(firstname.suggestedValue().isEmpty()); |
| 1348 EXPECT_FALSE(firstname.isAutofilled()); |
| 1349 EXPECT_EQ(1, firstname.selectionStart()); |
| 1350 EXPECT_EQ(1, firstname.selectionEnd()); |
| 1351 |
| 1352 // Verify the previewed fields are cleared. |
| 1353 EXPECT_TRUE(lastname.value().isEmpty()); |
| 1354 EXPECT_TRUE(lastname.suggestedValue().isEmpty()); |
| 1355 EXPECT_FALSE(lastname.isAutofilled()); |
| 1356 EXPECT_TRUE(email.value().isEmpty()); |
| 1357 EXPECT_TRUE(email.suggestedValue().isEmpty()); |
| 1358 EXPECT_FALSE(email.isAutofilled()); |
| 1359 EXPECT_TRUE(email2.value().isEmpty()); |
| 1360 EXPECT_TRUE(email2.suggestedValue().isEmpty()); |
| 1361 EXPECT_FALSE(email2.isAutofilled()); |
| 1362 EXPECT_TRUE(phone.value().isEmpty()); |
| 1363 EXPECT_TRUE(phone.suggestedValue().isEmpty()); |
| 1364 EXPECT_FALSE(phone.isAutofilled()); |
| 1365 } |
| 1366 |
| 1367 void TestClearPreviewedFormWithAutofilledInitiatingNode(const char* html) { |
| 1368 LoadHTML(html); |
| 1369 WebFrame* web_frame = GetMainFrame(); |
| 1370 ASSERT_NE(nullptr, web_frame); |
| 1371 |
| 1372 FormCache form_cache; |
| 1373 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); |
| 1374 ASSERT_EQ(1U, forms.size()); |
| 1375 |
| 1376 // Set the auto-filled attribute. |
| 1377 WebInputElement firstname = GetInputElementById("firstname"); |
| 1378 firstname.setAutofilled(true); |
| 1379 WebInputElement lastname = GetInputElementById("lastname"); |
| 1380 lastname.setAutofilled(true); |
| 1381 WebInputElement email = GetInputElementById("email"); |
| 1382 email.setAutofilled(true); |
| 1383 WebInputElement email2 = GetInputElementById("email2"); |
| 1384 email2.setAutofilled(true); |
| 1385 WebInputElement phone = GetInputElementById("phone"); |
| 1386 phone.setAutofilled(true); |
| 1387 |
| 1388 // Set the suggested values on all of the elements. |
| 1389 firstname.setSuggestedValue(ASCIIToUTF16("Wyatt")); |
| 1390 lastname.setSuggestedValue(ASCIIToUTF16("Earp")); |
| 1391 email.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); |
| 1392 email2.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); |
| 1393 phone.setSuggestedValue(ASCIIToUTF16("650-777-9999")); |
| 1394 |
| 1395 // Clear the previewed fields. |
| 1396 EXPECT_TRUE(ClearPreviewedFormWithElement(firstname, true)); |
| 1397 |
| 1398 // Fields with non-empty values are restored. |
| 1399 EXPECT_EQ(ASCIIToUTF16("W"), firstname.value()); |
| 1400 EXPECT_TRUE(firstname.suggestedValue().isEmpty()); |
| 1401 EXPECT_TRUE(firstname.isAutofilled()); |
| 1402 EXPECT_EQ(1, firstname.selectionStart()); |
| 1403 EXPECT_EQ(1, firstname.selectionEnd()); |
| 1404 |
| 1405 // Verify the previewed fields are cleared. |
| 1406 EXPECT_TRUE(lastname.value().isEmpty()); |
| 1407 EXPECT_TRUE(lastname.suggestedValue().isEmpty()); |
| 1408 EXPECT_FALSE(lastname.isAutofilled()); |
| 1409 EXPECT_TRUE(email.value().isEmpty()); |
| 1410 EXPECT_TRUE(email.suggestedValue().isEmpty()); |
| 1411 EXPECT_FALSE(email.isAutofilled()); |
| 1412 EXPECT_TRUE(email2.value().isEmpty()); |
| 1413 EXPECT_TRUE(email2.suggestedValue().isEmpty()); |
| 1414 EXPECT_FALSE(email2.isAutofilled()); |
| 1415 EXPECT_TRUE(phone.value().isEmpty()); |
| 1416 EXPECT_TRUE(phone.suggestedValue().isEmpty()); |
| 1417 EXPECT_FALSE(phone.isAutofilled()); |
| 1418 } |
| 1419 |
| 1420 void TestClearOnlyAutofilledFields(const char* html) { |
| 1421 LoadHTML(html); |
| 1422 |
| 1423 WebFrame* web_frame = GetMainFrame(); |
| 1424 ASSERT_NE(nullptr, web_frame); |
| 1425 |
| 1426 FormCache form_cache; |
| 1427 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); |
| 1428 ASSERT_EQ(1U, forms.size()); |
| 1429 |
| 1430 // Set the autofilled attribute. |
| 1431 WebInputElement firstname = GetInputElementById("firstname"); |
| 1432 firstname.setAutofilled(false); |
| 1433 WebInputElement lastname = GetInputElementById("lastname"); |
| 1434 lastname.setAutofilled(true); |
| 1435 WebInputElement email = GetInputElementById("email"); |
| 1436 email.setAutofilled(true); |
| 1437 WebInputElement phone = GetInputElementById("phone"); |
| 1438 phone.setAutofilled(true); |
| 1439 |
| 1440 // Clear the fields. |
| 1441 EXPECT_TRUE(form_cache.ClearFormWithElement(firstname)); |
| 1442 |
| 1443 // Verify only autofilled fields are cleared. |
| 1444 EXPECT_EQ(ASCIIToUTF16("Wyatt"), firstname.value()); |
| 1445 EXPECT_TRUE(firstname.suggestedValue().isEmpty()); |
| 1446 EXPECT_FALSE(firstname.isAutofilled()); |
| 1447 EXPECT_TRUE(lastname.value().isEmpty()); |
| 1448 EXPECT_TRUE(lastname.suggestedValue().isEmpty()); |
| 1449 EXPECT_FALSE(lastname.isAutofilled()); |
| 1450 EXPECT_TRUE(email.value().isEmpty()); |
| 1451 EXPECT_TRUE(email.suggestedValue().isEmpty()); |
| 1452 EXPECT_FALSE(email.isAutofilled()); |
| 1453 EXPECT_TRUE(phone.value().isEmpty()); |
| 1454 EXPECT_TRUE(phone.suggestedValue().isEmpty()); |
| 1455 EXPECT_FALSE(phone.isAutofilled()); |
| 1456 } |
| 1457 |
310 static void FillFormIncludingNonFocusableElementsWrapper( | 1458 static void FillFormIncludingNonFocusableElementsWrapper( |
311 const FormData& form, | 1459 const FormData& form, |
312 const WebFormControlElement& element) { | 1460 const WebFormControlElement& element) { |
313 FillFormIncludingNonFocusableElements(form, element.form()); | 1461 FillFormIncludingNonFocusableElements(form, element.form()); |
314 } | 1462 } |
315 | 1463 |
316 static WebString GetValueWrapper(WebFormControlElement element) { | 1464 static WebString GetValueWrapper(WebFormControlElement element) { |
317 if (element.formControlType() == "textarea") | 1465 if (element.formControlType() == "textarea") |
318 return element.to<WebTextAreaElement>().value(); | 1466 return element.to<WebTextAreaElement>().value(); |
319 | 1467 |
(...skipping 19 matching lines...) Expand all Loading... |
339 | 1487 |
340 // We should be able to extract a normal text field. | 1488 // We should be able to extract a normal text field. |
341 TEST_F(FormAutofillTest, WebFormControlElementToFormField) { | 1489 TEST_F(FormAutofillTest, WebFormControlElementToFormField) { |
342 LoadHTML("<INPUT type='text' id='element' value='value'/>"); | 1490 LoadHTML("<INPUT type='text' id='element' value='value'/>"); |
343 | 1491 |
344 WebFrame* frame = GetMainFrame(); | 1492 WebFrame* frame = GetMainFrame(); |
345 ASSERT_NE(nullptr, frame); | 1493 ASSERT_NE(nullptr, frame); |
346 | 1494 |
347 WebFormControlElement element = GetFormControlElementById("element"); | 1495 WebFormControlElement element = GetFormControlElementById("element"); |
348 FormFieldData result1; | 1496 FormFieldData result1; |
349 WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, &result1); | 1497 WebFormControlElementToFormField(element, EXTRACT_NONE, &result1); |
350 | 1498 |
351 FormFieldData expected; | 1499 FormFieldData expected; |
352 expected.form_control_type = "text"; | 1500 expected.form_control_type = "text"; |
353 expected.max_length = WebInputElement::defaultMaxLength(); | 1501 expected.max_length = WebInputElement::defaultMaxLength(); |
354 | 1502 |
355 expected.name = ASCIIToUTF16("element"); | 1503 expected.name = ASCIIToUTF16("element"); |
356 expected.value = base::string16(); | 1504 expected.value.clear(); |
357 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result1); | 1505 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result1); |
358 | 1506 |
359 FormFieldData result2; | 1507 FormFieldData result2; |
360 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result2); | 1508 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result2); |
361 | 1509 |
362 expected.name = ASCIIToUTF16("element"); | 1510 expected.name = ASCIIToUTF16("element"); |
363 expected.value = ASCIIToUTF16("value"); | 1511 expected.value = ASCIIToUTF16("value"); |
364 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result2); | 1512 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result2); |
365 } | 1513 } |
366 | 1514 |
367 // We should be able to extract a text field with autocomplete="off". | 1515 // We should be able to extract a text field with autocomplete="off". |
368 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldAutocompleteOff) { | 1516 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldAutocompleteOff) { |
369 LoadHTML("<INPUT type='text' id='element' value='value'" | 1517 LoadHTML("<INPUT type='text' id='element' value='value'" |
370 " autocomplete='off'/>"); | 1518 " autocomplete='off'/>"); |
371 | 1519 |
372 WebFrame* frame = GetMainFrame(); | 1520 WebFrame* frame = GetMainFrame(); |
373 ASSERT_NE(nullptr, frame); | 1521 ASSERT_NE(nullptr, frame); |
374 | 1522 |
375 WebFormControlElement element = GetFormControlElementById("element"); | 1523 WebFormControlElement element = GetFormControlElementById("element"); |
376 FormFieldData result; | 1524 FormFieldData result; |
377 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); | 1525 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result); |
378 | 1526 |
379 FormFieldData expected; | 1527 FormFieldData expected; |
380 expected.name = ASCIIToUTF16("element"); | 1528 expected.name = ASCIIToUTF16("element"); |
381 expected.value = ASCIIToUTF16("value"); | 1529 expected.value = ASCIIToUTF16("value"); |
382 expected.form_control_type = "text"; | 1530 expected.form_control_type = "text"; |
383 expected.autocomplete_attribute = "off"; | 1531 expected.autocomplete_attribute = "off"; |
384 expected.max_length = WebInputElement::defaultMaxLength(); | 1532 expected.max_length = WebInputElement::defaultMaxLength(); |
385 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); | 1533 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); |
386 } | 1534 } |
387 | 1535 |
388 // We should be able to extract a text field with maxlength specified. | 1536 // We should be able to extract a text field with maxlength specified. |
389 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldMaxLength) { | 1537 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldMaxLength) { |
390 LoadHTML("<INPUT type='text' id='element' value='value'" | 1538 LoadHTML("<INPUT type='text' id='element' value='value'" |
391 " maxlength='5'/>"); | 1539 " maxlength='5'/>"); |
392 | 1540 |
393 WebFrame* frame = GetMainFrame(); | 1541 WebFrame* frame = GetMainFrame(); |
394 ASSERT_NE(nullptr, frame); | 1542 ASSERT_NE(nullptr, frame); |
395 | 1543 |
396 WebFormControlElement element = GetFormControlElementById("element"); | 1544 WebFormControlElement element = GetFormControlElementById("element"); |
397 FormFieldData result; | 1545 FormFieldData result; |
398 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); | 1546 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result); |
399 | 1547 |
400 FormFieldData expected; | 1548 FormFieldData expected; |
401 expected.name = ASCIIToUTF16("element"); | 1549 expected.name = ASCIIToUTF16("element"); |
402 expected.value = ASCIIToUTF16("value"); | 1550 expected.value = ASCIIToUTF16("value"); |
403 expected.form_control_type = "text"; | 1551 expected.form_control_type = "text"; |
404 expected.max_length = 5; | 1552 expected.max_length = 5; |
405 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); | 1553 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); |
406 } | 1554 } |
407 | 1555 |
408 // We should be able to extract a text field that has been autofilled. | 1556 // We should be able to extract a text field that has been autofilled. |
409 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldAutofilled) { | 1557 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldAutofilled) { |
410 LoadHTML("<INPUT type='text' id='element' value='value'/>"); | 1558 LoadHTML("<INPUT type='text' id='element' value='value'/>"); |
411 | 1559 |
412 WebFrame* frame = GetMainFrame(); | 1560 WebFrame* frame = GetMainFrame(); |
413 ASSERT_NE(nullptr, frame); | 1561 ASSERT_NE(nullptr, frame); |
414 | 1562 |
415 WebInputElement element = GetInputElementById("element"); | 1563 WebInputElement element = GetInputElementById("element"); |
416 element.setAutofilled(true); | 1564 element.setAutofilled(true); |
417 FormFieldData result; | 1565 FormFieldData result; |
418 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); | 1566 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result); |
419 | 1567 |
420 FormFieldData expected; | 1568 FormFieldData expected; |
421 expected.name = ASCIIToUTF16("element"); | 1569 expected.name = ASCIIToUTF16("element"); |
422 expected.value = ASCIIToUTF16("value"); | 1570 expected.value = ASCIIToUTF16("value"); |
423 expected.form_control_type = "text"; | 1571 expected.form_control_type = "text"; |
424 expected.max_length = WebInputElement::defaultMaxLength(); | 1572 expected.max_length = WebInputElement::defaultMaxLength(); |
425 expected.is_autofilled = true; | 1573 expected.is_autofilled = true; |
426 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); | 1574 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); |
427 } | 1575 } |
428 | 1576 |
429 // We should be able to extract a radio or a checkbox field that has been | 1577 // We should be able to extract a radio or a checkbox field that has been |
430 // autofilled. | 1578 // autofilled. |
431 TEST_F(FormAutofillTest, WebFormControlElementToClickableFormField) { | 1579 TEST_F(FormAutofillTest, WebFormControlElementToClickableFormField) { |
432 LoadHTML("<INPUT type='checkbox' id='checkbox' value='mail' checked/>" | 1580 LoadHTML("<INPUT type='checkbox' id='checkbox' value='mail' checked/>" |
433 "<INPUT type='radio' id='radio' value='male'/>"); | 1581 "<INPUT type='radio' id='radio' value='male'/>"); |
434 | 1582 |
435 WebFrame* frame = GetMainFrame(); | 1583 WebFrame* frame = GetMainFrame(); |
436 ASSERT_NE(nullptr, frame); | 1584 ASSERT_NE(nullptr, frame); |
437 | 1585 |
438 WebInputElement element = GetInputElementById("checkbox"); | 1586 WebInputElement element = GetInputElementById("checkbox"); |
439 element.setAutofilled(true); | 1587 element.setAutofilled(true); |
440 FormFieldData result; | 1588 FormFieldData result; |
441 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); | 1589 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result); |
442 | 1590 |
443 FormFieldData expected; | 1591 FormFieldData expected; |
444 expected.name = ASCIIToUTF16("checkbox"); | 1592 expected.name = ASCIIToUTF16("checkbox"); |
445 expected.value = ASCIIToUTF16("mail"); | 1593 expected.value = ASCIIToUTF16("mail"); |
446 expected.form_control_type = "checkbox"; | 1594 expected.form_control_type = "checkbox"; |
447 expected.is_autofilled = true; | 1595 expected.is_autofilled = true; |
448 expected.is_checkable = true; | 1596 expected.is_checkable = true; |
449 expected.is_checked = true; | 1597 expected.is_checked = true; |
450 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); | 1598 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); |
451 | 1599 |
452 element = GetInputElementById("radio"); | 1600 element = GetInputElementById("radio"); |
453 element.setAutofilled(true); | 1601 element.setAutofilled(true); |
454 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); | 1602 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result); |
455 expected.name = ASCIIToUTF16("radio"); | 1603 expected.name = ASCIIToUTF16("radio"); |
456 expected.value = ASCIIToUTF16("male"); | 1604 expected.value = ASCIIToUTF16("male"); |
457 expected.form_control_type = "radio"; | 1605 expected.form_control_type = "radio"; |
458 expected.is_autofilled = true; | 1606 expected.is_autofilled = true; |
459 expected.is_checkable = true; | 1607 expected.is_checkable = true; |
460 expected.is_checked = false; | 1608 expected.is_checked = false; |
461 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); | 1609 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); |
462 } | 1610 } |
463 | 1611 |
464 // We should be able to extract a <select> field. | 1612 // We should be able to extract a <select> field. |
465 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldSelect) { | 1613 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldSelect) { |
466 LoadHTML("<SELECT id='element'/>" | 1614 LoadHTML("<SELECT id='element'/>" |
467 " <OPTION value='CA'>California</OPTION>" | 1615 " <OPTION value='CA'>California</OPTION>" |
468 " <OPTION value='TX'>Texas</OPTION>" | 1616 " <OPTION value='TX'>Texas</OPTION>" |
469 "</SELECT>"); | 1617 "</SELECT>"); |
470 | 1618 |
471 WebFrame* frame = GetMainFrame(); | 1619 WebFrame* frame = GetMainFrame(); |
472 ASSERT_NE(nullptr, frame); | 1620 ASSERT_NE(nullptr, frame); |
473 | 1621 |
474 WebFormControlElement element = GetFormControlElementById("element"); | 1622 WebFormControlElement element = GetFormControlElementById("element"); |
475 FormFieldData result1; | 1623 FormFieldData result1; |
476 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result1); | 1624 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result1); |
477 | 1625 |
478 FormFieldData expected; | 1626 FormFieldData expected; |
479 expected.name = ASCIIToUTF16("element"); | 1627 expected.name = ASCIIToUTF16("element"); |
480 expected.max_length = 0; | 1628 expected.max_length = 0; |
481 expected.form_control_type = "select-one"; | 1629 expected.form_control_type = "select-one"; |
482 | 1630 |
483 expected.value = ASCIIToUTF16("CA"); | 1631 expected.value = ASCIIToUTF16("CA"); |
484 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result1); | 1632 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result1); |
485 | 1633 |
486 FormFieldData result2; | 1634 FormFieldData result2; |
487 WebFormControlElementToFormField( | 1635 WebFormControlElementToFormField( |
488 element, | 1636 element, |
489 static_cast<autofill::ExtractMask>(autofill::EXTRACT_VALUE | | 1637 static_cast<ExtractMask>(EXTRACT_VALUE | EXTRACT_OPTION_TEXT), |
490 autofill::EXTRACT_OPTION_TEXT), | |
491 &result2); | 1638 &result2); |
492 expected.value = ASCIIToUTF16("California"); | 1639 expected.value = ASCIIToUTF16("California"); |
493 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result2); | 1640 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result2); |
494 | 1641 |
495 FormFieldData result3; | 1642 FormFieldData result3; |
496 WebFormControlElementToFormField(element, autofill::EXTRACT_OPTIONS, | 1643 WebFormControlElementToFormField(element, EXTRACT_OPTIONS, &result3); |
497 &result3); | 1644 expected.value.clear(); |
498 expected.value = base::string16(); | |
499 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result3); | 1645 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result3); |
500 | 1646 |
501 ASSERT_EQ(2U, result3.option_values.size()); | 1647 ASSERT_EQ(2U, result3.option_values.size()); |
502 ASSERT_EQ(2U, result3.option_contents.size()); | 1648 ASSERT_EQ(2U, result3.option_contents.size()); |
503 EXPECT_EQ(ASCIIToUTF16("CA"), result3.option_values[0]); | 1649 EXPECT_EQ(ASCIIToUTF16("CA"), result3.option_values[0]); |
504 EXPECT_EQ(ASCIIToUTF16("California"), result3.option_contents[0]); | 1650 EXPECT_EQ(ASCIIToUTF16("California"), result3.option_contents[0]); |
505 EXPECT_EQ(ASCIIToUTF16("TX"), result3.option_values[1]); | 1651 EXPECT_EQ(ASCIIToUTF16("TX"), result3.option_values[1]); |
506 EXPECT_EQ(ASCIIToUTF16("Texas"), result3.option_contents[1]); | 1652 EXPECT_EQ(ASCIIToUTF16("Texas"), result3.option_contents[1]); |
507 } | 1653 } |
508 | 1654 |
509 // When faced with <select> field with *many* options, we should trim them to a | 1655 // When faced with <select> field with *many* options, we should trim them to a |
510 // reasonable number. | 1656 // reasonable number. |
511 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldLongSelect) { | 1657 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldLongSelect) { |
512 std::string html = "<SELECT id='element'/>"; | 1658 std::string html = "<SELECT id='element'/>"; |
513 for (size_t i = 0; i < 2 * kMaxListSize; ++i) { | 1659 for (size_t i = 0; i < 2 * kMaxListSize; ++i) { |
514 html += base::StringPrintf("<OPTION value='%" PRIuS "'>" | 1660 html += base::StringPrintf("<OPTION value='%" PRIuS "'>" |
515 "%" PRIuS "</OPTION>", i, i); | 1661 "%" PRIuS "</OPTION>", i, i); |
516 } | 1662 } |
517 html += "</SELECT>"; | 1663 html += "</SELECT>"; |
518 LoadHTML(html.c_str()); | 1664 LoadHTML(html.c_str()); |
519 | 1665 |
520 WebFrame* frame = GetMainFrame(); | 1666 WebFrame* frame = GetMainFrame(); |
521 ASSERT_TRUE(frame); | 1667 ASSERT_TRUE(frame); |
522 | 1668 |
523 WebFormControlElement element = GetFormControlElementById("element"); | 1669 WebFormControlElement element = GetFormControlElementById("element"); |
524 FormFieldData result; | 1670 FormFieldData result; |
525 WebFormControlElementToFormField(element, autofill::EXTRACT_OPTIONS, &result); | 1671 WebFormControlElementToFormField(element, EXTRACT_OPTIONS, &result); |
526 | 1672 |
527 EXPECT_TRUE(result.option_values.empty()); | 1673 EXPECT_TRUE(result.option_values.empty()); |
528 EXPECT_TRUE(result.option_contents.empty()); | 1674 EXPECT_TRUE(result.option_contents.empty()); |
529 } | 1675 } |
530 | 1676 |
531 // We should be able to extract a <textarea> field. | 1677 // We should be able to extract a <textarea> field. |
532 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldTextArea) { | 1678 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldTextArea) { |
533 LoadHTML("<TEXTAREA id='element'>" | 1679 LoadHTML("<TEXTAREA id='element'>" |
534 "This element's value " | 1680 "This element's value " |
535 "spans multiple lines." | 1681 "spans multiple lines." |
536 "</TEXTAREA>"); | 1682 "</TEXTAREA>"); |
537 | 1683 |
538 WebFrame* frame = GetMainFrame(); | 1684 WebFrame* frame = GetMainFrame(); |
539 ASSERT_NE(nullptr, frame); | 1685 ASSERT_NE(nullptr, frame); |
540 | 1686 |
541 WebFormControlElement element = GetFormControlElementById("element"); | 1687 WebFormControlElement element = GetFormControlElementById("element"); |
542 FormFieldData result_sans_value; | 1688 FormFieldData result_sans_value; |
543 WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, | 1689 WebFormControlElementToFormField(element, EXTRACT_NONE, &result_sans_value); |
544 &result_sans_value); | |
545 | 1690 |
546 FormFieldData expected; | 1691 FormFieldData expected; |
547 expected.name = ASCIIToUTF16("element"); | 1692 expected.name = ASCIIToUTF16("element"); |
548 expected.max_length = 0; | 1693 expected.max_length = 0; |
549 expected.form_control_type = "textarea"; | 1694 expected.form_control_type = "textarea"; |
550 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_sans_value); | 1695 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_sans_value); |
551 | 1696 |
552 FormFieldData result_with_value; | 1697 FormFieldData result_with_value; |
553 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, | 1698 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result_with_value); |
554 &result_with_value); | |
555 expected.value = ASCIIToUTF16("This element's value\n" | 1699 expected.value = ASCIIToUTF16("This element's value\n" |
556 "spans multiple lines."); | 1700 "spans multiple lines."); |
557 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_with_value); | 1701 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_with_value); |
558 } | 1702 } |
559 | 1703 |
560 // We should be able to extract an <input type="month"> field. | 1704 // We should be able to extract an <input type="month"> field. |
561 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldMonthInput) { | 1705 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldMonthInput) { |
562 LoadHTML("<INPUT type='month' id='element' value='2011-12'>"); | 1706 LoadHTML("<INPUT type='month' id='element' value='2011-12'>"); |
563 | 1707 |
564 WebFrame* frame = GetMainFrame(); | 1708 WebFrame* frame = GetMainFrame(); |
565 ASSERT_NE(nullptr, frame); | 1709 ASSERT_NE(nullptr, frame); |
566 | 1710 |
567 WebFormControlElement element = GetFormControlElementById("element"); | 1711 WebFormControlElement element = GetFormControlElementById("element"); |
568 FormFieldData result_sans_value; | 1712 FormFieldData result_sans_value; |
569 WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, | 1713 WebFormControlElementToFormField(element, EXTRACT_NONE, &result_sans_value); |
570 &result_sans_value); | |
571 | 1714 |
572 FormFieldData expected; | 1715 FormFieldData expected; |
573 expected.name = ASCIIToUTF16("element"); | 1716 expected.name = ASCIIToUTF16("element"); |
574 expected.max_length = 0; | 1717 expected.max_length = 0; |
575 expected.form_control_type = "month"; | 1718 expected.form_control_type = "month"; |
576 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_sans_value); | 1719 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_sans_value); |
577 | 1720 |
578 FormFieldData result_with_value; | 1721 FormFieldData result_with_value; |
579 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, | 1722 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result_with_value); |
580 &result_with_value); | |
581 expected.value = ASCIIToUTF16("2011-12"); | 1723 expected.value = ASCIIToUTF16("2011-12"); |
582 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_with_value); | 1724 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_with_value); |
583 } | 1725 } |
584 | 1726 |
585 // We should not extract the value for non-text and non-select fields. | 1727 // We should not extract the value for non-text and non-select fields. |
586 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldInvalidType) { | 1728 TEST_F(FormAutofillTest, WebFormControlElementToFormFieldInvalidType) { |
587 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" | 1729 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" |
588 " <INPUT type='hidden' id='hidden' value='apple'/>" | 1730 " <INPUT type='hidden' id='hidden' value='apple'/>" |
589 " <INPUT type='submit' id='submit' value='Send'/>" | 1731 " <INPUT type='submit' id='submit' value='Send'/>" |
590 "</FORM>"); | 1732 "</FORM>"); |
591 | 1733 |
592 WebFrame* frame = GetMainFrame(); | 1734 WebFrame* frame = GetMainFrame(); |
593 ASSERT_NE(nullptr, frame); | 1735 ASSERT_NE(nullptr, frame); |
594 | 1736 |
595 WebFormControlElement element = GetFormControlElementById("hidden"); | 1737 WebFormControlElement element = GetFormControlElementById("hidden"); |
596 FormFieldData result; | 1738 FormFieldData result; |
597 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); | 1739 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result); |
598 | 1740 |
599 FormFieldData expected; | 1741 FormFieldData expected; |
600 expected.max_length = 0; | 1742 expected.max_length = 0; |
601 | 1743 |
602 expected.name = ASCIIToUTF16("hidden"); | 1744 expected.name = ASCIIToUTF16("hidden"); |
603 expected.form_control_type = "hidden"; | 1745 expected.form_control_type = "hidden"; |
604 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); | 1746 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); |
605 | 1747 |
606 element = GetFormControlElementById("submit"); | 1748 element = GetFormControlElementById("submit"); |
607 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); | 1749 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result); |
608 expected.name = ASCIIToUTF16("submit"); | 1750 expected.name = ASCIIToUTF16("submit"); |
609 expected.form_control_type = "submit"; | 1751 expected.form_control_type = "submit"; |
610 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); | 1752 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); |
611 } | 1753 } |
612 | 1754 |
613 // We should be able to extract password fields. | 1755 // We should be able to extract password fields. |
614 TEST_F(FormAutofillTest, WebFormControlElementToPasswordFormField) { | 1756 TEST_F(FormAutofillTest, WebFormControlElementToPasswordFormField) { |
615 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" | 1757 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" |
616 " <INPUT type='password' id='password' value='secret'/>" | 1758 " <INPUT type='password' id='password' value='secret'/>" |
617 "</FORM>"); | 1759 "</FORM>"); |
618 | 1760 |
619 WebFrame* frame = GetMainFrame(); | 1761 WebFrame* frame = GetMainFrame(); |
620 ASSERT_NE(nullptr, frame); | 1762 ASSERT_NE(nullptr, frame); |
621 | 1763 |
622 WebFormControlElement element = GetFormControlElementById("password"); | 1764 WebFormControlElement element = GetFormControlElementById("password"); |
623 FormFieldData result; | 1765 FormFieldData result; |
624 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); | 1766 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result); |
625 | 1767 |
626 FormFieldData expected; | 1768 FormFieldData expected; |
627 expected.max_length = WebInputElement::defaultMaxLength(); | 1769 expected.max_length = WebInputElement::defaultMaxLength(); |
628 expected.name = ASCIIToUTF16("password"); | 1770 expected.name = ASCIIToUTF16("password"); |
629 expected.form_control_type = "password"; | 1771 expected.form_control_type = "password"; |
630 expected.value = ASCIIToUTF16("secret"); | 1772 expected.value = ASCIIToUTF16("secret"); |
631 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); | 1773 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); |
632 } | 1774 } |
633 | 1775 |
634 // We should be able to extract the autocompletetype attribute. | 1776 // We should be able to extract the autocompletetype attribute. |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
689 // Very long attribute values should be replaced by a default string, to | 1831 // Very long attribute values should be replaced by a default string, to |
690 // prevent malicious websites from DOSing the browser process. | 1832 // prevent malicious websites from DOSing the browser process. |
691 { "malicious", "text", "x-max-data-length-exceeded" }, | 1833 { "malicious", "text", "x-max-data-length-exceeded" }, |
692 }; | 1834 }; |
693 | 1835 |
694 WebDocument document = frame->document(); | 1836 WebDocument document = frame->document(); |
695 for (size_t i = 0; i < arraysize(test_cases); ++i) { | 1837 for (size_t i = 0; i < arraysize(test_cases); ++i) { |
696 WebFormControlElement element = | 1838 WebFormControlElement element = |
697 GetFormControlElementById(ASCIIToUTF16(test_cases[i].element_id)); | 1839 GetFormControlElementById(ASCIIToUTF16(test_cases[i].element_id)); |
698 FormFieldData result; | 1840 FormFieldData result; |
699 WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, &result); | 1841 WebFormControlElementToFormField(element, EXTRACT_NONE, &result); |
700 | 1842 |
701 FormFieldData expected; | 1843 FormFieldData expected; |
702 expected.name = ASCIIToUTF16(test_cases[i].element_id); | 1844 expected.name = ASCIIToUTF16(test_cases[i].element_id); |
703 expected.form_control_type = test_cases[i].form_control_type; | 1845 expected.form_control_type = test_cases[i].form_control_type; |
704 expected.autocomplete_attribute = test_cases[i].autocomplete_attribute; | 1846 expected.autocomplete_attribute = test_cases[i].autocomplete_attribute; |
705 if (test_cases[i].form_control_type == "text") | 1847 if (test_cases[i].form_control_type == "text") |
706 expected.max_length = WebInputElement::defaultMaxLength(); | 1848 expected.max_length = WebInputElement::defaultMaxLength(); |
707 else | 1849 else |
708 expected.max_length = 0; | 1850 expected.max_length = 0; |
709 | 1851 |
710 SCOPED_TRACE(test_cases[i].element_id); | 1852 SCOPED_TRACE(test_cases[i].element_id); |
711 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); | 1853 EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); |
712 } | 1854 } |
713 } | 1855 } |
714 | 1856 |
715 TEST_F(FormAutofillTest, DetectTextDirectionFromDirectStyle) { | 1857 TEST_F(FormAutofillTest, DetectTextDirectionFromDirectStyle) { |
716 LoadHTML("<STYLE>input{direction:rtl}</STYLE>" | 1858 LoadHTML("<STYLE>input{direction:rtl}</STYLE>" |
717 "<FORM>" | 1859 "<FORM>" |
718 " <INPUT type='text' id='element'>" | 1860 " <INPUT type='text' id='element'>" |
719 "</FORM>"); | 1861 "</FORM>"); |
720 | 1862 |
721 WebFrame* frame = GetMainFrame(); | 1863 WebFrame* frame = GetMainFrame(); |
722 ASSERT_NE(nullptr, frame); | 1864 ASSERT_NE(nullptr, frame); |
723 | 1865 |
724 WebFormControlElement element = GetFormControlElementById("element"); | 1866 WebFormControlElement element = GetFormControlElementById("element"); |
725 | 1867 |
726 FormFieldData result; | 1868 FormFieldData result; |
727 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); | 1869 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result); |
728 EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction); | 1870 EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction); |
729 } | 1871 } |
730 | 1872 |
731 TEST_F(FormAutofillTest, DetectTextDirectionFromDirectDIRAttribute) { | 1873 TEST_F(FormAutofillTest, DetectTextDirectionFromDirectDIRAttribute) { |
732 LoadHTML("<FORM>" | 1874 LoadHTML("<FORM>" |
733 " <INPUT dir='rtl' type='text' id='element'/>" | 1875 " <INPUT dir='rtl' type='text' id='element'/>" |
734 "</FORM>"); | 1876 "</FORM>"); |
735 | 1877 |
736 WebFrame* frame = GetMainFrame(); | 1878 WebFrame* frame = GetMainFrame(); |
737 ASSERT_NE(nullptr, frame); | 1879 ASSERT_NE(nullptr, frame); |
738 | 1880 |
739 WebFormControlElement element = GetFormControlElementById("element"); | 1881 WebFormControlElement element = GetFormControlElementById("element"); |
740 | 1882 |
741 FormFieldData result; | 1883 FormFieldData result; |
742 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); | 1884 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result); |
743 EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction); | 1885 EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction); |
744 } | 1886 } |
745 | 1887 |
746 TEST_F(FormAutofillTest, DetectTextDirectionFromParentStyle) { | 1888 TEST_F(FormAutofillTest, DetectTextDirectionFromParentStyle) { |
747 LoadHTML("<STYLE>form{direction:rtl}</STYLE>" | 1889 LoadHTML("<STYLE>form{direction:rtl}</STYLE>" |
748 "<FORM>" | 1890 "<FORM>" |
749 " <INPUT type='text' id='element'/>" | 1891 " <INPUT type='text' id='element'/>" |
750 "</FORM>"); | 1892 "</FORM>"); |
751 | 1893 |
752 WebFrame* frame = GetMainFrame(); | 1894 WebFrame* frame = GetMainFrame(); |
753 ASSERT_NE(nullptr, frame); | 1895 ASSERT_NE(nullptr, frame); |
754 | 1896 |
755 WebFormControlElement element = GetFormControlElementById("element"); | 1897 WebFormControlElement element = GetFormControlElementById("element"); |
756 | 1898 |
757 FormFieldData result; | 1899 FormFieldData result; |
758 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); | 1900 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result); |
759 EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction); | 1901 EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction); |
760 } | 1902 } |
761 | 1903 |
762 TEST_F(FormAutofillTest, DetectTextDirectionFromParentDIRAttribute) { | 1904 TEST_F(FormAutofillTest, DetectTextDirectionFromParentDIRAttribute) { |
763 LoadHTML("<FORM dir='rtl'>" | 1905 LoadHTML("<FORM dir='rtl'>" |
764 " <INPUT type='text' id='element'/>" | 1906 " <INPUT type='text' id='element'/>" |
765 "</FORM>"); | 1907 "</FORM>"); |
766 | 1908 |
767 WebFrame* frame = GetMainFrame(); | 1909 WebFrame* frame = GetMainFrame(); |
768 ASSERT_NE(nullptr, frame); | 1910 ASSERT_NE(nullptr, frame); |
769 | 1911 |
770 WebFormControlElement element = GetFormControlElementById("element"); | 1912 WebFormControlElement element = GetFormControlElementById("element"); |
771 | 1913 |
772 FormFieldData result; | 1914 FormFieldData result; |
773 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); | 1915 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result); |
774 EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction); | 1916 EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction); |
775 } | 1917 } |
776 | 1918 |
777 TEST_F(FormAutofillTest, DetectTextDirectionWhenStyleAndDIRAttributMixed) { | 1919 TEST_F(FormAutofillTest, DetectTextDirectionWhenStyleAndDIRAttributMixed) { |
778 LoadHTML("<STYLE>input{direction:ltr}</STYLE>" | 1920 LoadHTML("<STYLE>input{direction:ltr}</STYLE>" |
779 "<FORM dir='rtl'>" | 1921 "<FORM dir='rtl'>" |
780 " <INPUT type='text' id='element'/>" | 1922 " <INPUT type='text' id='element'/>" |
781 "</FORM>"); | 1923 "</FORM>"); |
782 | 1924 |
783 WebFrame* frame = GetMainFrame(); | 1925 WebFrame* frame = GetMainFrame(); |
784 ASSERT_NE(nullptr, frame); | 1926 ASSERT_NE(nullptr, frame); |
785 | 1927 |
786 WebFormControlElement element = GetFormControlElementById("element"); | 1928 WebFormControlElement element = GetFormControlElementById("element"); |
787 | 1929 |
788 FormFieldData result; | 1930 FormFieldData result; |
789 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); | 1931 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result); |
790 EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, result.text_direction); | 1932 EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, result.text_direction); |
791 } | 1933 } |
792 | 1934 |
793 TEST_F(FormAutofillTest, | 1935 TEST_F(FormAutofillTest, |
794 DetectTextDirectionWhenParentHasBothDIRAttributeAndStyle) { | 1936 DetectTextDirectionWhenParentHasBothDIRAttributeAndStyle) { |
795 LoadHTML("<STYLE>form{direction:ltr}</STYLE>" | 1937 LoadHTML("<STYLE>form{direction:ltr}</STYLE>" |
796 "<FORM dir='rtl'>" | 1938 "<FORM dir='rtl'>" |
797 " <INPUT type='text' id='element'/>" | 1939 " <INPUT type='text' id='element'/>" |
798 "</FORM>"); | 1940 "</FORM>"); |
799 | 1941 |
800 WebFrame* frame = GetMainFrame(); | 1942 WebFrame* frame = GetMainFrame(); |
801 ASSERT_NE(nullptr, frame); | 1943 ASSERT_NE(nullptr, frame); |
802 | 1944 |
803 WebFormControlElement element = GetFormControlElementById("element"); | 1945 WebFormControlElement element = GetFormControlElementById("element"); |
804 | 1946 |
805 FormFieldData result; | 1947 FormFieldData result; |
806 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); | 1948 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result); |
807 EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, result.text_direction); | 1949 EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, result.text_direction); |
808 } | 1950 } |
809 | 1951 |
810 TEST_F(FormAutofillTest, DetectTextDirectionWhenAncestorHasInlineStyle) { | 1952 TEST_F(FormAutofillTest, DetectTextDirectionWhenAncestorHasInlineStyle) { |
811 LoadHTML("<FORM style='direction:ltr'>" | 1953 LoadHTML("<FORM style='direction:ltr'>" |
812 " <SPAN dir='rtl'>" | 1954 " <SPAN dir='rtl'>" |
813 " <INPUT type='text' id='element'/>" | 1955 " <INPUT type='text' id='element'/>" |
814 " </SPAN>" | 1956 " </SPAN>" |
815 "</FORM>"); | 1957 "</FORM>"); |
816 | 1958 |
817 WebFrame* frame = GetMainFrame(); | 1959 WebFrame* frame = GetMainFrame(); |
818 ASSERT_NE(nullptr, frame); | 1960 ASSERT_NE(nullptr, frame); |
819 | 1961 |
820 WebFormControlElement element = GetFormControlElementById("element"); | 1962 WebFormControlElement element = GetFormControlElementById("element"); |
821 | 1963 |
822 FormFieldData result; | 1964 FormFieldData result; |
823 WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); | 1965 WebFormControlElementToFormField(element, EXTRACT_VALUE, &result); |
824 EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction); | 1966 EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction); |
825 } | 1967 } |
826 | 1968 |
827 TEST_F(FormAutofillTest, WebFormElementToFormData) { | 1969 TEST_F(FormAutofillTest, WebFormElementToFormData) { |
828 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" | 1970 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" |
829 " <LABEL for='firstname'>First name:</LABEL>" | 1971 " <LABEL for='firstname'>First name:</LABEL>" |
830 " <INPUT type='text' id='firstname' value='John'/>" | 1972 " <INPUT type='text' id='firstname' value='John'/>" |
831 " <LABEL for='lastname'>Last name:</LABEL>" | 1973 " <LABEL for='lastname'>Last name:</LABEL>" |
832 " <INPUT type='text' id='lastname' value='Smith'/>" | 1974 " <INPUT type='text' id='lastname' value='Smith'/>" |
833 " <LABEL for='street-address'>Address:</LABEL>" | 1975 " <LABEL for='street-address'>Address:</LABEL>" |
(...skipping 22 matching lines...) Expand all Loading... |
856 WebVector<WebFormElement> forms; | 1998 WebVector<WebFormElement> forms; |
857 frame->document().forms(forms); | 1999 frame->document().forms(forms); |
858 ASSERT_EQ(1U, forms.size()); | 2000 ASSERT_EQ(1U, forms.size()); |
859 | 2001 |
860 WebInputElement input_element = GetInputElementById("firstname"); | 2002 WebInputElement input_element = GetInputElementById("firstname"); |
861 | 2003 |
862 FormData form; | 2004 FormData form; |
863 FormFieldData field; | 2005 FormFieldData field; |
864 EXPECT_TRUE(WebFormElementToFormData(forms[0], | 2006 EXPECT_TRUE(WebFormElementToFormData(forms[0], |
865 input_element, | 2007 input_element, |
866 autofill::REQUIRE_NONE, | 2008 REQUIRE_NONE, |
867 autofill::EXTRACT_VALUE, | 2009 EXTRACT_VALUE, |
868 &form, | 2010 &form, |
869 &field)); | 2011 &field)); |
870 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | 2012 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); |
871 EXPECT_EQ(GURL(frame->document().url()), form.origin); | 2013 EXPECT_EQ(GURL(frame->document().url()), form.origin); |
872 EXPECT_EQ(GURL("http://cnn.com"), form.action); | 2014 EXPECT_EQ(GURL("http://cnn.com"), form.action); |
873 | 2015 |
874 const std::vector<FormFieldData>& fields = form.fields; | 2016 const std::vector<FormFieldData>& fields = form.fields; |
875 ASSERT_EQ(6U, fields.size()); | 2017 ASSERT_EQ(6U, fields.size()); |
876 | 2018 |
877 FormFieldData expected; | 2019 FormFieldData expected; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
915 expected.label = ASCIIToUTF16("Card expiration:"); | 2057 expected.label = ASCIIToUTF16("Card expiration:"); |
916 expected.form_control_type = "month"; | 2058 expected.form_control_type = "month"; |
917 expected.max_length = 0; | 2059 expected.max_length = 0; |
918 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[5]); | 2060 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[5]); |
919 } | 2061 } |
920 | 2062 |
921 // We should not be able to serialize a form with too many fillable fields. | 2063 // We should not be able to serialize a form with too many fillable fields. |
922 TEST_F(FormAutofillTest, WebFormElementToFormDataTooManyFields) { | 2064 TEST_F(FormAutofillTest, WebFormElementToFormDataTooManyFields) { |
923 std::string html = | 2065 std::string html = |
924 "<FORM name='TestForm' action='http://cnn.com' method='post'>"; | 2066 "<FORM name='TestForm' action='http://cnn.com' method='post'>"; |
925 for (size_t i = 0; i < (autofill::kMaxParseableFields + 1); ++i) { | 2067 for (size_t i = 0; i < (kMaxParseableFields + 1); ++i) { |
926 html += "<INPUT type='text'/>"; | 2068 html += "<INPUT type='text'/>"; |
927 } | 2069 } |
928 html += "</FORM>"; | 2070 html += "</FORM>"; |
929 LoadHTML(html.c_str()); | 2071 LoadHTML(html.c_str()); |
930 | 2072 |
931 WebFrame* frame = GetMainFrame(); | 2073 WebFrame* frame = GetMainFrame(); |
932 ASSERT_NE(nullptr, frame); | 2074 ASSERT_NE(nullptr, frame); |
933 | 2075 |
934 WebVector<WebFormElement> forms; | 2076 WebVector<WebFormElement> forms; |
935 frame->document().forms(forms); | 2077 frame->document().forms(forms); |
936 ASSERT_EQ(1U, forms.size()); | 2078 ASSERT_EQ(1U, forms.size()); |
937 | 2079 |
938 WebInputElement input_element = GetInputElementById("firstname"); | 2080 WebInputElement input_element = GetInputElementById("firstname"); |
939 | 2081 |
940 FormData form; | 2082 FormData form; |
941 FormFieldData field; | 2083 FormFieldData field; |
942 EXPECT_FALSE(WebFormElementToFormData(forms[0], | 2084 EXPECT_FALSE(WebFormElementToFormData(forms[0], |
943 input_element, | 2085 input_element, |
944 autofill::REQUIRE_NONE, | 2086 REQUIRE_NONE, |
945 autofill::EXTRACT_VALUE, | 2087 EXTRACT_VALUE, |
946 &form, | 2088 &form, |
947 &field)); | 2089 &field)); |
948 } | 2090 } |
949 | 2091 |
950 TEST_F(FormAutofillTest, ExtractForms) { | 2092 TEST_F(FormAutofillTest, ExtractForms) { |
951 ExpectJohnSmithLabels( | 2093 ExpectJohnSmithLabels( |
952 "<FORM name='TestForm' action='http://cnn.com' method='post'>" | 2094 "<FORM name='TestForm' action='http://cnn.com' method='post'>" |
953 " First name: <INPUT type='text' id='firstname' value='John'/>" | 2095 " First name: <INPUT type='text' id='firstname' value='John'/>" |
954 " Last name: <INPUT type='text' id='lastname' value='Smith'/>" | 2096 " Last name: <INPUT type='text' id='lastname' value='Smith'/>" |
955 " Email: <INPUT type='text' id='email' value='john@example.com'/>" | 2097 " Email: <INPUT type='text' id='email' value='john@example.com'/>" |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1203 WebFrame* web_frame = GetMainFrame(); | 2345 WebFrame* web_frame = GetMainFrame(); |
1204 ASSERT_NE(nullptr, web_frame); | 2346 ASSERT_NE(nullptr, web_frame); |
1205 | 2347 |
1206 WebVector<WebFormElement> web_forms; | 2348 WebVector<WebFormElement> web_forms; |
1207 web_frame->document().forms(web_forms); | 2349 web_frame->document().forms(web_forms); |
1208 ASSERT_EQ(1U, web_forms.size()); | 2350 ASSERT_EQ(1U, web_forms.size()); |
1209 WebFormElement web_form = web_forms[0]; | 2351 WebFormElement web_form = web_forms[0]; |
1210 | 2352 |
1211 FormData form; | 2353 FormData form; |
1212 EXPECT_TRUE(WebFormElementToFormData( | 2354 EXPECT_TRUE(WebFormElementToFormData( |
1213 web_form, WebFormControlElement(), autofill::REQUIRE_NONE, | 2355 web_form, WebFormControlElement(), REQUIRE_NONE, EXTRACT_NONE, &form, |
1214 autofill::EXTRACT_NONE, &form, NULL)); | 2356 nullptr)); |
1215 EXPECT_FALSE(WebFormElementToFormData( | 2357 EXPECT_FALSE(WebFormElementToFormData( |
1216 web_form, WebFormControlElement(), autofill::REQUIRE_AUTOCOMPLETE, | 2358 web_form, WebFormControlElement(), REQUIRE_AUTOCOMPLETE, EXTRACT_NONE, |
1217 autofill::EXTRACT_NONE, &form, NULL)); | 2359 &form, nullptr)); |
1218 } | 2360 } |
1219 | 2361 |
1220 { | 2362 { |
1221 // The firstname element is not auto-completable due to autocomplete=off. | 2363 // The firstname element is not auto-completable due to autocomplete=off. |
1222 LoadHTML("<FORM name='TestForm' action='http://abc.com' " | 2364 LoadHTML("<FORM name='TestForm' action='http://abc.com' " |
1223 " method='post'>" | 2365 " method='post'>" |
1224 " <INPUT type='text' id='firstname' value='John'" | 2366 " <INPUT type='text' id='firstname' value='John'" |
1225 " autocomplete=off>" | 2367 " autocomplete=off>" |
1226 " <INPUT type='text' id='middlename' value='Jack'/>" | 2368 " <INPUT type='text' id='middlename' value='Jack'/>" |
1227 " <INPUT type='text' id='lastname' value='Smith'/>" | 2369 " <INPUT type='text' id='lastname' value='Smith'/>" |
1228 " <INPUT type='text' id='email' value='john@example.com'/>" | 2370 " <INPUT type='text' id='email' value='john@example.com'/>" |
1229 " <INPUT type='submit' name='reply' value='Send'/>" | 2371 " <INPUT type='submit' name='reply' value='Send'/>" |
1230 "</FORM>"); | 2372 "</FORM>"); |
1231 | 2373 |
1232 WebFrame* web_frame = GetMainFrame(); | 2374 WebFrame* web_frame = GetMainFrame(); |
1233 ASSERT_NE(nullptr, web_frame); | 2375 ASSERT_NE(nullptr, web_frame); |
1234 | 2376 |
1235 WebVector<WebFormElement> web_forms; | 2377 WebVector<WebFormElement> web_forms; |
1236 web_frame->document().forms(web_forms); | 2378 web_frame->document().forms(web_forms); |
1237 ASSERT_EQ(1U, web_forms.size()); | 2379 ASSERT_EQ(1U, web_forms.size()); |
1238 WebFormElement web_form = web_forms[0]; | 2380 WebFormElement web_form = web_forms[0]; |
1239 | 2381 |
1240 FormData form; | 2382 FormData form; |
1241 EXPECT_TRUE(WebFormElementToFormData( | 2383 EXPECT_TRUE(WebFormElementToFormData( |
1242 web_form, WebFormControlElement(), autofill::REQUIRE_AUTOCOMPLETE, | 2384 web_form, WebFormControlElement(), REQUIRE_AUTOCOMPLETE, EXTRACT_VALUE, |
1243 autofill::EXTRACT_VALUE, &form, NULL)); | 2385 &form, nullptr)); |
1244 | 2386 |
1245 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | 2387 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); |
1246 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); | 2388 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); |
1247 EXPECT_EQ(GURL("http://abc.com"), form.action); | 2389 EXPECT_EQ(GURL("http://abc.com"), form.action); |
1248 | 2390 |
1249 const std::vector<FormFieldData>& fields = form.fields; | 2391 const std::vector<FormFieldData>& fields = form.fields; |
1250 ASSERT_EQ(3U, fields.size()); | 2392 ASSERT_EQ(3U, fields.size()); |
1251 | 2393 |
1252 FormFieldData expected; | 2394 FormFieldData expected; |
1253 expected.form_control_type = "text"; | 2395 expected.form_control_type = "text"; |
1254 expected.max_length = WebInputElement::defaultMaxLength(); | 2396 expected.max_length = WebInputElement::defaultMaxLength(); |
1255 | 2397 |
1256 expected.name = ASCIIToUTF16("middlename"); | 2398 expected.name = ASCIIToUTF16("middlename"); |
1257 expected.value = ASCIIToUTF16("Jack"); | 2399 expected.value = ASCIIToUTF16("Jack"); |
1258 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); | 2400 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); |
1259 | 2401 |
1260 expected.name = ASCIIToUTF16("lastname"); | 2402 expected.name = ASCIIToUTF16("lastname"); |
1261 expected.value = ASCIIToUTF16("Smith"); | 2403 expected.value = ASCIIToUTF16("Smith"); |
1262 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); | 2404 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); |
1263 | 2405 |
1264 expected.name = ASCIIToUTF16("email"); | 2406 expected.name = ASCIIToUTF16("email"); |
1265 expected.value = ASCIIToUTF16("john@example.com"); | 2407 expected.value = ASCIIToUTF16("john@example.com"); |
1266 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); | 2408 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); |
1267 } | 2409 } |
1268 } | 2410 } |
1269 | 2411 |
1270 TEST_F(FormAutofillTest, FindFormForInputElement) { | 2412 TEST_F(FormAutofillTest, FindFormForInputElement) { |
1271 LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" | 2413 TestFindFormForInputElement( |
1272 " <INPUT type='text' id='firstname' value='John'/>" | 2414 "<FORM name='TestForm' action='http://buh.com' method='post'>" |
1273 " <INPUT type='text' id='lastname' value='Smith'/>" | 2415 " <INPUT type='text' id='firstname' value='John'/>" |
1274 " <INPUT type='text' id='email' value='john@example.com'" | 2416 " <INPUT type='text' id='lastname' value='Smith'/>" |
1275 "autocomplete='off' />" | 2417 " <INPUT type='text' id='email' value='john@example.com'" |
1276 " <INPUT type='text' id='phone' value='1.800.555.1234'/>" | 2418 "autocomplete='off' />" |
1277 " <INPUT type='submit' name='reply-send' value='Send'/>" | 2419 " <INPUT type='text' id='phone' value='1.800.555.1234'/>" |
1278 "</FORM>"); | 2420 " <INPUT type='submit' name='reply-send' value='Send'/>" |
| 2421 "</FORM>", |
| 2422 false); |
| 2423 } |
1279 | 2424 |
1280 WebFrame* web_frame = GetMainFrame(); | 2425 TEST_F(FormAutofillTest, FindFormForInputElementForUnownedForm) { |
1281 ASSERT_NE(nullptr, web_frame); | 2426 TestFindFormForInputElement( |
1282 | 2427 "<INPUT type='text' id='firstname' value='John'/>" |
1283 FormCache form_cache; | 2428 "<INPUT type='text' id='lastname' value='Smith'/>" |
1284 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); | 2429 "<INPUT type='text' id='email' value='john@example.com'" |
1285 ASSERT_EQ(1U, forms.size()); | 2430 "autocomplete='off' />" |
1286 | 2431 "<INPUT type='text' id='phone' value='1.800.555.1234'/>" |
1287 // Get the input element we want to find. | 2432 "<INPUT type='submit' name='reply-send' value='Send'/>", |
1288 WebInputElement input_element = GetInputElementById("firstname"); | 2433 true); |
1289 | |
1290 // Find the form and verify it's the correct form. | |
1291 FormData form; | |
1292 FormFieldData field; | |
1293 EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, | |
1294 &form, | |
1295 &field, | |
1296 autofill::REQUIRE_NONE)); | |
1297 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
1298 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); | |
1299 EXPECT_EQ(GURL("http://buh.com"), form.action); | |
1300 | |
1301 const std::vector<FormFieldData>& fields = form.fields; | |
1302 ASSERT_EQ(4U, fields.size()); | |
1303 | |
1304 FormFieldData expected; | |
1305 expected.form_control_type = "text"; | |
1306 expected.max_length = WebInputElement::defaultMaxLength(); | |
1307 | |
1308 expected.name = ASCIIToUTF16("firstname"); | |
1309 expected.value = ASCIIToUTF16("John"); | |
1310 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); | |
1311 EXPECT_FORM_FIELD_DATA_EQUALS(expected, field); | |
1312 | |
1313 expected.name = ASCIIToUTF16("lastname"); | |
1314 expected.value = ASCIIToUTF16("Smith"); | |
1315 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); | |
1316 | |
1317 expected.name = ASCIIToUTF16("email"); | |
1318 expected.value = ASCIIToUTF16("john@example.com"); | |
1319 expected.autocomplete_attribute = "off"; | |
1320 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); | |
1321 expected.autocomplete_attribute = std::string(); // reset | |
1322 | |
1323 expected.name = ASCIIToUTF16("phone"); | |
1324 expected.value = ASCIIToUTF16("1.800.555.1234"); | |
1325 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); | |
1326 | |
1327 // Try again, but require autocomplete. | |
1328 FormData form2; | |
1329 FormFieldData field2; | |
1330 EXPECT_TRUE(FindFormAndFieldForFormControlElement( | |
1331 input_element, | |
1332 &form2, | |
1333 &field2, | |
1334 autofill::REQUIRE_AUTOCOMPLETE)); | |
1335 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); | |
1336 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); | |
1337 EXPECT_EQ(GURL("http://buh.com"), form2.action); | |
1338 | |
1339 const std::vector<FormFieldData>& fields2 = form2.fields; | |
1340 ASSERT_EQ(3U, fields2.size()); | |
1341 | |
1342 expected.form_control_type = "text"; | |
1343 expected.max_length = WebInputElement::defaultMaxLength(); | |
1344 | |
1345 expected.name = ASCIIToUTF16("firstname"); | |
1346 expected.value = ASCIIToUTF16("John"); | |
1347 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); | |
1348 EXPECT_FORM_FIELD_DATA_EQUALS(expected, field); | |
1349 | |
1350 expected.name = ASCIIToUTF16("lastname"); | |
1351 expected.value = ASCIIToUTF16("Smith"); | |
1352 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); | |
1353 | |
1354 expected.name = ASCIIToUTF16("phone"); | |
1355 expected.value = ASCIIToUTF16("1.800.555.1234"); | |
1356 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); | |
1357 } | 2434 } |
1358 | 2435 |
1359 TEST_F(FormAutofillTest, FindFormForTextAreaElement) { | 2436 TEST_F(FormAutofillTest, FindFormForTextAreaElement) { |
1360 LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" | 2437 TestFindFormForTextAreaElement( |
1361 " <INPUT type='text' id='firstname' value='John'/>" | 2438 "<FORM name='TestForm' action='http://buh.com' method='post'>" |
1362 " <INPUT type='text' id='lastname' value='Smith'/>" | 2439 " <INPUT type='text' id='firstname' value='John'/>" |
1363 " <INPUT type='text' id='email' value='john@example.com'" | 2440 " <INPUT type='text' id='lastname' value='Smith'/>" |
1364 "autocomplete='off' />" | 2441 " <INPUT type='text' id='email' value='john@example.com'" |
1365 " <TEXTAREA id='street-address'>" | 2442 "autocomplete='off' />" |
1366 "123 Fantasy Ln. " | 2443 " <TEXTAREA id='street-address'>" |
1367 "Apt. 42" | 2444 "123 Fantasy Ln. " |
1368 "</TEXTAREA>" | 2445 "Apt. 42" |
1369 " <INPUT type='submit' name='reply-send' value='Send'/>" | 2446 "</TEXTAREA>" |
1370 "</FORM>"); | 2447 " <INPUT type='submit' name='reply-send' value='Send'/>" |
| 2448 "</FORM>", |
| 2449 false); |
| 2450 } |
1371 | 2451 |
1372 WebFrame* web_frame = GetMainFrame(); | 2452 TEST_F(FormAutofillTest, FindFormForTextAreaElementForUnownedForm) { |
1373 ASSERT_NE(nullptr, web_frame); | 2453 TestFindFormForTextAreaElement( |
1374 | 2454 "<INPUT type='text' id='firstname' value='John'/>" |
1375 FormCache form_cache; | 2455 "<INPUT type='text' id='lastname' value='Smith'/>" |
1376 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); | 2456 "<INPUT type='text' id='email' value='john@example.com'" |
1377 ASSERT_EQ(1U, forms.size()); | 2457 "autocomplete='off' />" |
1378 | 2458 "<TEXTAREA id='street-address'>" |
1379 // Get the textarea element we want to find. | 2459 "123 Fantasy Ln. " |
1380 WebElement element = web_frame->document().getElementById("street-address"); | 2460 "Apt. 42" |
1381 WebTextAreaElement textarea_element = element.to<WebTextAreaElement>(); | 2461 "</TEXTAREA>" |
1382 | 2462 "<INPUT type='submit' name='reply-send' value='Send'/>", |
1383 // Find the form and verify it's the correct form. | 2463 true); |
1384 FormData form; | |
1385 FormFieldData field; | |
1386 EXPECT_TRUE(FindFormAndFieldForFormControlElement(textarea_element, | |
1387 &form, | |
1388 &field, | |
1389 autofill::REQUIRE_NONE)); | |
1390 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
1391 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); | |
1392 EXPECT_EQ(GURL("http://buh.com"), form.action); | |
1393 | |
1394 const std::vector<FormFieldData>& fields = form.fields; | |
1395 ASSERT_EQ(4U, fields.size()); | |
1396 | |
1397 FormFieldData expected; | |
1398 | |
1399 expected.name = ASCIIToUTF16("firstname"); | |
1400 expected.value = ASCIIToUTF16("John"); | |
1401 expected.form_control_type = "text"; | |
1402 expected.max_length = WebInputElement::defaultMaxLength(); | |
1403 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); | |
1404 | |
1405 expected.name = ASCIIToUTF16("lastname"); | |
1406 expected.value = ASCIIToUTF16("Smith"); | |
1407 expected.form_control_type = "text"; | |
1408 expected.max_length = WebInputElement::defaultMaxLength(); | |
1409 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); | |
1410 | |
1411 expected.name = ASCIIToUTF16("email"); | |
1412 expected.value = ASCIIToUTF16("john@example.com"); | |
1413 expected.autocomplete_attribute = "off"; | |
1414 expected.form_control_type = "text"; | |
1415 expected.max_length = WebInputElement::defaultMaxLength(); | |
1416 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); | |
1417 expected.autocomplete_attribute = std::string(); // reset | |
1418 | |
1419 expected.name = ASCIIToUTF16("street-address"); | |
1420 expected.value = ASCIIToUTF16("123 Fantasy Ln.\nApt. 42"); | |
1421 expected.form_control_type = "textarea"; | |
1422 expected.max_length = 0; | |
1423 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); | |
1424 EXPECT_FORM_FIELD_DATA_EQUALS(expected, field); | |
1425 | |
1426 // Try again, but require autocomplete. | |
1427 FormData form2; | |
1428 FormFieldData field2; | |
1429 EXPECT_TRUE(FindFormAndFieldForFormControlElement( | |
1430 textarea_element, | |
1431 &form2, | |
1432 &field2, | |
1433 autofill::REQUIRE_AUTOCOMPLETE)); | |
1434 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); | |
1435 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); | |
1436 EXPECT_EQ(GURL("http://buh.com"), form2.action); | |
1437 | |
1438 const std::vector<FormFieldData>& fields2 = form2.fields; | |
1439 ASSERT_EQ(3U, fields2.size()); | |
1440 | |
1441 expected.name = ASCIIToUTF16("firstname"); | |
1442 expected.value = ASCIIToUTF16("John"); | |
1443 expected.form_control_type = "text"; | |
1444 expected.max_length = WebInputElement::defaultMaxLength(); | |
1445 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); | |
1446 | |
1447 expected.name = ASCIIToUTF16("lastname"); | |
1448 expected.value = ASCIIToUTF16("Smith"); | |
1449 expected.form_control_type = "text"; | |
1450 expected.max_length = WebInputElement::defaultMaxLength(); | |
1451 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); | |
1452 | |
1453 expected.name = ASCIIToUTF16("street-address"); | |
1454 expected.value = ASCIIToUTF16("123 Fantasy Ln.\nApt. 42"); | |
1455 expected.form_control_type = "textarea"; | |
1456 expected.max_length = 0; | |
1457 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); | |
1458 EXPECT_FORM_FIELD_DATA_EQUALS(expected, field); | |
1459 } | 2464 } |
1460 | 2465 |
1461 // Test regular FillForm function. | 2466 // Test regular FillForm function. |
1462 TEST_F(FormAutofillTest, FillForm) { | 2467 TEST_F(FormAutofillTest, FillForm) { |
1463 static const AutofillFieldCase field_cases[] = { | 2468 TestFillForm(kFormHtml, false); |
1464 // fields: form_control_type, name, initial_value, autocomplete_attribute, | 2469 } |
1465 // should_be_autofilled, autofill_value, expected_value | |
1466 | 2470 |
1467 // Regular empty fields (firstname & lastname) should be autofilled. | 2471 TEST_F(FormAutofillTest, FillFormForUnownedForm) { |
1468 {"text", | 2472 TestFillForm(kUnownedFormHtml, true); |
1469 "firstname", | |
1470 "", | |
1471 "", | |
1472 true, | |
1473 "filled firstname", | |
1474 "filled firstname"}, | |
1475 {"text", "lastname", "", "", true, "filled lastname", "filled lastname"}, | |
1476 // hidden fields should not be extracted to form_data. | |
1477 // Non empty fields should not be autofilled. | |
1478 {"text", "notempty", "Hi", "", false, "filled notempty", "Hi"}, | |
1479 {"text", | |
1480 "noautocomplete", | |
1481 "", | |
1482 "off", | |
1483 true, | |
1484 "filled noautocomplete", | |
1485 "filled noautocomplete"}, | |
1486 // Disabled fields should not be autofilled. | |
1487 {"text", "notenabled", "", "", false, "filled notenabled", ""}, | |
1488 // Readonly fields should not be autofilled. | |
1489 {"text", "readonly", "", "", false, "filled readonly", ""}, | |
1490 // Fields with "visibility: hidden" should not be autofilled. | |
1491 {"text", "invisible", "", "", false, "filled invisible", ""}, | |
1492 // Fields with "display:none" should not be autofilled. | |
1493 {"text", "displaynone", "", "", false, "filled displaynone", ""}, | |
1494 // Regular <input type="month"> should be autofilled. | |
1495 {"month", "month", "", "", true, "2017-11", "2017-11"}, | |
1496 // Non-empty <input type="month"> should not be autofilled. | |
1497 {"month", "month-nonempty", "2011-12", "", false, "2017-11", "2011-12"}, | |
1498 // Regular select fields should be autofilled. | |
1499 {"select-one", "select", "", "", true, "TX", "TX"}, | |
1500 // Select fields should be autofilled even if they already have a | |
1501 // non-empty value. | |
1502 {"select-one", "select-nonempty", "CA", "", true, "TX", "TX"}, | |
1503 // Select fields should not be autofilled if no new value is passed from | |
1504 // autofill profile. The existing value should not be overriden. | |
1505 {"select-one", "select-unchanged", "CA", "", false, "CA", "CA"}, | |
1506 // Regular textarea elements should be autofilled. | |
1507 {"textarea", | |
1508 "textarea", | |
1509 "", | |
1510 "", | |
1511 true, | |
1512 "some multi-\nline value", | |
1513 "some multi-\nline value"}, | |
1514 // Non-empty textarea elements should not be autofilled. | |
1515 {"textarea", | |
1516 "textarea-nonempty", | |
1517 "Go\naway!", | |
1518 "", | |
1519 false, | |
1520 "some multi-\nline value", | |
1521 "Go\naway!"}, | |
1522 }; | |
1523 TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases), | |
1524 FillForm, &GetValueWrapper); | |
1525 // Verify preview selection. | |
1526 WebInputElement firstname = GetInputElementById("firstname"); | |
1527 EXPECT_EQ(16, firstname.selectionStart()); | |
1528 EXPECT_EQ(16, firstname.selectionEnd()); | |
1529 } | 2473 } |
1530 | 2474 |
1531 TEST_F(FormAutofillTest, FillFormIncludingNonFocusableElements) { | 2475 TEST_F(FormAutofillTest, FillFormIncludingNonFocusableElements) { |
1532 static const AutofillFieldCase field_cases[] = { | 2476 static const AutofillFieldCase field_cases[] = { |
1533 // fields: form_control_type, name, initial_value, autocomplete_attribute, | 2477 // fields: form_control_type, name, initial_value, autocomplete_attribute, |
1534 // should_be_autofilled, autofill_value, expected_value | 2478 // should_be_autofilled, autofill_value, expected_value |
1535 | 2479 |
1536 // Regular empty fields (firstname & lastname) should be autofilled. | 2480 // Regular empty fields (firstname & lastname) should be autofilled. |
1537 {"text", | 2481 {"text", |
1538 "firstname", | 2482 "firstname", |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1600 "some multi-\nline value"}, | 2544 "some multi-\nline value"}, |
1601 // Nonempty textarea elements should be overridden. | 2545 // Nonempty textarea elements should be overridden. |
1602 {"textarea", | 2546 {"textarea", |
1603 "textarea-nonempty", | 2547 "textarea-nonempty", |
1604 "Go\naway!", | 2548 "Go\naway!", |
1605 "", | 2549 "", |
1606 true, | 2550 true, |
1607 "some multi-\nline value", | 2551 "some multi-\nline value", |
1608 "some multi-\nline value"}, | 2552 "some multi-\nline value"}, |
1609 }; | 2553 }; |
1610 TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases), | 2554 TestFormFillFunctions(kFormHtml, false, field_cases, arraysize(field_cases), |
1611 &FillFormIncludingNonFocusableElementsWrapper, | 2555 &FillFormIncludingNonFocusableElementsWrapper, |
1612 &GetValueWrapper); | 2556 &GetValueWrapper); |
1613 } | 2557 } |
1614 | 2558 |
1615 TEST_F(FormAutofillTest, PreviewForm) { | 2559 TEST_F(FormAutofillTest, PreviewForm) { |
1616 static const AutofillFieldCase field_cases[] = { | 2560 TestPreviewForm(kFormHtml, false); |
1617 // Normal empty fields should be previewed. | 2561 } |
1618 {"text", | |
1619 "firstname", | |
1620 "", | |
1621 "", | |
1622 true, | |
1623 "suggested firstname", | |
1624 "suggested firstname"}, | |
1625 {"text", | |
1626 "lastname", | |
1627 "", | |
1628 "", | |
1629 true, | |
1630 "suggested lastname", | |
1631 "suggested lastname"}, | |
1632 // Hidden fields should not be extracted to form_data. | |
1633 // Non empty fields should not be previewed. | |
1634 {"text", "notempty", "Hi", "", false, "suggested notempty", ""}, | |
1635 {"text", | |
1636 "noautocomplete", | |
1637 "", | |
1638 "off", | |
1639 true, | |
1640 "filled noautocomplete", | |
1641 "filled noautocomplete"}, | |
1642 // Disabled fields should not be previewed. | |
1643 {"text", "notenabled", "", "", false, "suggested notenabled", ""}, | |
1644 // Readonly fields should not be previewed. | |
1645 {"text", "readonly", "", "", false, "suggested readonly", ""}, | |
1646 // Fields with "visibility: hidden" should not be previewed. | |
1647 {"text", "invisible", "", "", false, "suggested invisible", ""}, | |
1648 // Fields with "display:none" should not previewed. | |
1649 {"text", "displaynone", "", "", false, "suggested displaynone", ""}, | |
1650 // Regular <input type="month"> should be previewed. | |
1651 {"month", "month", "", "", true, "2017-11", "2017-11"}, | |
1652 // Non-empty <input type="month"> should not be previewed. | |
1653 {"month", "month-nonempty", "2011-12", "", false, "2017-11", ""}, | |
1654 // Regular select fields should be previewed. | |
1655 {"select-one", "select", "", "", true, "TX", "TX"}, | |
1656 // Select fields should be previewed even if they already have a | |
1657 // non-empty value. | |
1658 {"select-one", "select-nonempty", "CA", "", true, "TX", "TX"}, | |
1659 // Select fields should not be previewed if no suggestion is passed from | |
1660 // autofill profile. | |
1661 {"select-one", "select-unchanged", "CA", "", false, "", ""}, | |
1662 // Normal textarea elements should be previewed. | |
1663 {"textarea", | |
1664 "textarea", | |
1665 "", | |
1666 "", | |
1667 true, | |
1668 "suggested multi-\nline value", | |
1669 "suggested multi-\nline value"}, | |
1670 // Nonempty textarea elements should not be previewed. | |
1671 {"textarea", | |
1672 "textarea-nonempty", | |
1673 "Go\naway!", | |
1674 "", | |
1675 false, | |
1676 "suggested multi-\nline value", | |
1677 ""}, | |
1678 }; | |
1679 TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases), | |
1680 &PreviewForm, &GetSuggestedValueWrapper); | |
1681 | 2562 |
1682 // Verify preview selection. | 2563 TEST_F(FormAutofillTest, PreviewFormForUnownedForm) { |
1683 WebInputElement firstname = GetInputElementById("firstname"); | 2564 TestPreviewForm(kUnownedFormHtml, true); |
1684 EXPECT_EQ(0, firstname.selectionStart()); | |
1685 EXPECT_EQ(19, firstname.selectionEnd()); | |
1686 } | 2565 } |
1687 | 2566 |
1688 TEST_F(FormAutofillTest, Labels) { | 2567 TEST_F(FormAutofillTest, Labels) { |
1689 ExpectJohnSmithLabels( | 2568 ExpectJohnSmithLabels( |
1690 "<FORM name='TestForm' action='http://cnn.com' method='post'>" | 2569 "<FORM name='TestForm' action='http://cnn.com' method='post'>" |
1691 " <LABEL for='firstname'> First name: </LABEL>" | 2570 " <LABEL for='firstname'> First name: </LABEL>" |
1692 " <INPUT type='text' id='firstname' value='John'/>" | 2571 " <INPUT type='text' id='firstname' value='John'/>" |
1693 " <LABEL for='lastname'> Last name: </LABEL>" | 2572 " <LABEL for='lastname'> Last name: </LABEL>" |
1694 " <INPUT type='text' id='lastname' value='Smith'/>" | 2573 " <INPUT type='text' id='lastname' value='Smith'/>" |
1695 " <LABEL for='email'> Email: </LABEL>" | 2574 " <LABEL for='email'> Email: </LABEL>" |
(...skipping 843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2539 " <DT></DT>" | 3418 " <DT></DT>" |
2540 " <DD>" | 3419 " <DD>" |
2541 " <INPUT type='submit' name='reply-send' value='Send'/>" | 3420 " <INPUT type='submit' name='reply-send' value='Send'/>" |
2542 " </DD>" | 3421 " </DD>" |
2543 "</DL>" | 3422 "</DL>" |
2544 "</DIV>" | 3423 "</DIV>" |
2545 "</FORM>"); | 3424 "</FORM>"); |
2546 } | 3425 } |
2547 | 3426 |
2548 TEST_F(FormAutofillTest, FillFormMaxLength) { | 3427 TEST_F(FormAutofillTest, FillFormMaxLength) { |
2549 LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" | 3428 TestFillFormMaxLength( |
2550 " <INPUT type='text' id='firstname' maxlength='5'/>" | 3429 "<FORM name='TestForm' action='http://buh.com' method='post'>" |
2551 " <INPUT type='text' id='lastname' maxlength='7'/>" | 3430 " <INPUT type='text' id='firstname' maxlength='5'/>" |
2552 " <INPUT type='text' id='email' maxlength='9'/>" | 3431 " <INPUT type='text' id='lastname' maxlength='7'/>" |
2553 " <INPUT type='submit' name='reply-send' value='Send'/>" | 3432 " <INPUT type='text' id='email' maxlength='9'/>" |
2554 "</FORM>"); | 3433 " <INPUT type='submit' name='reply-send' value='Send'/>" |
| 3434 "</FORM>", |
| 3435 false); |
| 3436 } |
2555 | 3437 |
2556 WebFrame* web_frame = GetMainFrame(); | 3438 TEST_F(FormAutofillTest, FillFormMaxLengthForUnownedForm) { |
2557 ASSERT_NE(nullptr, web_frame); | 3439 TestFillFormMaxLength( |
2558 | 3440 "<INPUT type='text' id='firstname' maxlength='5'/>" |
2559 FormCache form_cache; | 3441 "<INPUT type='text' id='lastname' maxlength='7'/>" |
2560 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); | 3442 "<INPUT type='text' id='email' maxlength='9'/>" |
2561 ASSERT_EQ(1U, forms.size()); | 3443 "<INPUT type='submit' name='reply-send' value='Send'/>", |
2562 | 3444 true); |
2563 // Get the input element we want to find. | |
2564 WebInputElement input_element = GetInputElementById("firstname"); | |
2565 | |
2566 // Find the form that contains the input element. | |
2567 FormData form; | |
2568 FormFieldData field; | |
2569 EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, | |
2570 &form, | |
2571 &field, | |
2572 autofill::REQUIRE_NONE)); | |
2573 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
2574 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); | |
2575 EXPECT_EQ(GURL("http://buh.com"), form.action); | |
2576 | |
2577 const std::vector<FormFieldData>& fields = form.fields; | |
2578 ASSERT_EQ(3U, fields.size()); | |
2579 | |
2580 FormFieldData expected; | |
2581 expected.form_control_type = "text"; | |
2582 | |
2583 expected.name = ASCIIToUTF16("firstname"); | |
2584 expected.max_length = 5; | |
2585 expected.is_autofilled = false; | |
2586 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); | |
2587 | |
2588 expected.name = ASCIIToUTF16("lastname"); | |
2589 expected.max_length = 7; | |
2590 expected.is_autofilled = false; | |
2591 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); | |
2592 | |
2593 expected.name = ASCIIToUTF16("email"); | |
2594 expected.max_length = 9; | |
2595 expected.is_autofilled = false; | |
2596 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); | |
2597 | |
2598 // Fill the form. | |
2599 form.fields[0].value = ASCIIToUTF16("Brother"); | |
2600 form.fields[1].value = ASCIIToUTF16("Jonathan"); | |
2601 form.fields[2].value = ASCIIToUTF16("brotherj@example.com"); | |
2602 form.fields[0].is_autofilled = true; | |
2603 form.fields[1].is_autofilled = true; | |
2604 form.fields[2].is_autofilled = true; | |
2605 FillForm(form, input_element); | |
2606 | |
2607 // Find the newly-filled form that contains the input element. | |
2608 FormData form2; | |
2609 FormFieldData field2; | |
2610 EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, | |
2611 &form2, | |
2612 &field2, | |
2613 autofill::REQUIRE_NONE)); | |
2614 | |
2615 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); | |
2616 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); | |
2617 EXPECT_EQ(GURL("http://buh.com"), form2.action); | |
2618 | |
2619 const std::vector<FormFieldData>& fields2 = form2.fields; | |
2620 ASSERT_EQ(3U, fields2.size()); | |
2621 | |
2622 expected.form_control_type = "text"; | |
2623 | |
2624 expected.name = ASCIIToUTF16("firstname"); | |
2625 expected.value = ASCIIToUTF16("Broth"); | |
2626 expected.max_length = 5; | |
2627 expected.is_autofilled = true; | |
2628 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); | |
2629 | |
2630 expected.name = ASCIIToUTF16("lastname"); | |
2631 expected.value = ASCIIToUTF16("Jonatha"); | |
2632 expected.max_length = 7; | |
2633 expected.is_autofilled = true; | |
2634 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); | |
2635 | |
2636 expected.name = ASCIIToUTF16("email"); | |
2637 expected.value = ASCIIToUTF16("brotherj@"); | |
2638 expected.max_length = 9; | |
2639 expected.is_autofilled = true; | |
2640 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); | |
2641 } | 3445 } |
2642 | 3446 |
2643 // This test uses negative values of the maxlength attribute for input elements. | 3447 // This test uses negative values of the maxlength attribute for input elements. |
2644 // In this case, the maxlength of the input elements is set to the default | 3448 // In this case, the maxlength of the input elements is set to the default |
2645 // maxlength (defined in WebKit.) | 3449 // maxlength (defined in WebKit.) |
2646 TEST_F(FormAutofillTest, FillFormNegativeMaxLength) { | 3450 TEST_F(FormAutofillTest, FillFormNegativeMaxLength) { |
2647 LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" | 3451 TestFillFormNegativeMaxLength( |
2648 " <INPUT type='text' id='firstname' maxlength='-1'/>" | 3452 "<FORM name='TestForm' action='http://buh.com' method='post'>" |
2649 " <INPUT type='text' id='lastname' maxlength='-10'/>" | 3453 " <INPUT type='text' id='firstname' maxlength='-1'/>" |
2650 " <INPUT type='text' id='email' maxlength='-13'/>" | 3454 " <INPUT type='text' id='lastname' maxlength='-10'/>" |
2651 " <INPUT type='submit' name='reply-send' value='Send'/>" | 3455 " <INPUT type='text' id='email' maxlength='-13'/>" |
2652 "</FORM>"); | 3456 " <INPUT type='submit' name='reply-send' value='Send'/>" |
| 3457 "</FORM>", |
| 3458 false); |
| 3459 } |
2653 | 3460 |
2654 WebFrame* web_frame = GetMainFrame(); | 3461 TEST_F(FormAutofillTest, FillFormNegativeMaxLengthForUnownedForm) { |
2655 ASSERT_NE(nullptr, web_frame); | 3462 TestFillFormNegativeMaxLength( |
2656 | 3463 "<INPUT type='text' id='firstname' maxlength='-1'/>" |
2657 FormCache form_cache; | 3464 "<INPUT type='text' id='lastname' maxlength='-10'/>" |
2658 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); | 3465 "<INPUT type='text' id='email' maxlength='-13'/>" |
2659 ASSERT_EQ(1U, forms.size()); | 3466 "<INPUT type='submit' name='reply-send' value='Send'/>", |
2660 | 3467 true); |
2661 // Get the input element we want to find. | |
2662 WebInputElement input_element = GetInputElementById("firstname"); | |
2663 | |
2664 // Find the form that contains the input element. | |
2665 FormData form; | |
2666 FormFieldData field; | |
2667 EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, | |
2668 &form, | |
2669 &field, | |
2670 autofill::REQUIRE_NONE)); | |
2671 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
2672 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); | |
2673 EXPECT_EQ(GURL("http://buh.com"), form.action); | |
2674 | |
2675 const std::vector<FormFieldData>& fields = form.fields; | |
2676 ASSERT_EQ(3U, fields.size()); | |
2677 | |
2678 FormFieldData expected; | |
2679 expected.form_control_type = "text"; | |
2680 expected.max_length = WebInputElement::defaultMaxLength(); | |
2681 | |
2682 expected.name = ASCIIToUTF16("firstname"); | |
2683 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); | |
2684 | |
2685 expected.name = ASCIIToUTF16("lastname"); | |
2686 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); | |
2687 | |
2688 expected.name = ASCIIToUTF16("email"); | |
2689 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); | |
2690 | |
2691 // Fill the form. | |
2692 form.fields[0].value = ASCIIToUTF16("Brother"); | |
2693 form.fields[1].value = ASCIIToUTF16("Jonathan"); | |
2694 form.fields[2].value = ASCIIToUTF16("brotherj@example.com"); | |
2695 FillForm(form, input_element); | |
2696 | |
2697 // Find the newly-filled form that contains the input element. | |
2698 FormData form2; | |
2699 FormFieldData field2; | |
2700 EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, | |
2701 &form2, | |
2702 &field2, | |
2703 autofill::REQUIRE_NONE)); | |
2704 | |
2705 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); | |
2706 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); | |
2707 EXPECT_EQ(GURL("http://buh.com"), form2.action); | |
2708 | |
2709 const std::vector<FormFieldData>& fields2 = form2.fields; | |
2710 ASSERT_EQ(3U, fields2.size()); | |
2711 | |
2712 expected.name = ASCIIToUTF16("firstname"); | |
2713 expected.value = ASCIIToUTF16("Brother"); | |
2714 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); | |
2715 | |
2716 expected.name = ASCIIToUTF16("lastname"); | |
2717 expected.value = ASCIIToUTF16("Jonathan"); | |
2718 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); | |
2719 | |
2720 expected.name = ASCIIToUTF16("email"); | |
2721 expected.value = ASCIIToUTF16("brotherj@example.com"); | |
2722 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); | |
2723 } | 3468 } |
2724 | 3469 |
2725 TEST_F(FormAutofillTest, FillFormEmptyName) { | 3470 TEST_F(FormAutofillTest, FillFormEmptyName) { |
2726 LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" | 3471 TestFillFormEmptyName( |
2727 " <INPUT type='text' id='firstname'/>" | 3472 "<FORM name='TestForm' action='http://buh.com' method='post'>" |
2728 " <INPUT type='text' id='lastname'/>" | 3473 " <INPUT type='text' id='firstname'/>" |
2729 " <INPUT type='text' id='email'/>" | 3474 " <INPUT type='text' id='lastname'/>" |
2730 " <INPUT type='submit' value='Send'/>" | 3475 " <INPUT type='text' id='email'/>" |
2731 "</FORM>"); | 3476 " <INPUT type='submit' value='Send'/>" |
| 3477 "</FORM>", |
| 3478 false); |
| 3479 } |
2732 | 3480 |
2733 WebFrame* web_frame = GetMainFrame(); | 3481 TEST_F(FormAutofillTest, FillFormEmptyNameForUnownedForm) { |
2734 ASSERT_NE(nullptr, web_frame); | 3482 TestFillFormEmptyName( |
2735 | 3483 "<INPUT type='text' id='firstname'/>" |
2736 FormCache form_cache; | 3484 "<INPUT type='text' id='lastname'/>" |
2737 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); | 3485 "<INPUT type='text' id='email'/>" |
2738 ASSERT_EQ(1U, forms.size()); | 3486 "<INPUT type='submit' value='Send'/>", |
2739 | 3487 true); |
2740 // Get the input element we want to find. | |
2741 WebInputElement input_element = GetInputElementById("firstname"); | |
2742 | |
2743 // Find the form that contains the input element. | |
2744 FormData form; | |
2745 FormFieldData field; | |
2746 EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, | |
2747 &form, | |
2748 &field, | |
2749 autofill::REQUIRE_NONE)); | |
2750 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
2751 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); | |
2752 EXPECT_EQ(GURL("http://buh.com"), form.action); | |
2753 | |
2754 const std::vector<FormFieldData>& fields = form.fields; | |
2755 ASSERT_EQ(3U, fields.size()); | |
2756 | |
2757 FormFieldData expected; | |
2758 expected.form_control_type = "text"; | |
2759 expected.max_length = WebInputElement::defaultMaxLength(); | |
2760 | |
2761 expected.name = ASCIIToUTF16("firstname"); | |
2762 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); | |
2763 | |
2764 expected.name = ASCIIToUTF16("lastname"); | |
2765 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); | |
2766 | |
2767 expected.name = ASCIIToUTF16("email"); | |
2768 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); | |
2769 | |
2770 // Fill the form. | |
2771 form.fields[0].value = ASCIIToUTF16("Wyatt"); | |
2772 form.fields[1].value = ASCIIToUTF16("Earp"); | |
2773 form.fields[2].value = ASCIIToUTF16("wyatt@example.com"); | |
2774 FillForm(form, input_element); | |
2775 | |
2776 // Find the newly-filled form that contains the input element. | |
2777 FormData form2; | |
2778 FormFieldData field2; | |
2779 EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, | |
2780 &form2, | |
2781 &field2, | |
2782 autofill::REQUIRE_NONE)); | |
2783 | |
2784 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); | |
2785 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); | |
2786 EXPECT_EQ(GURL("http://buh.com"), form2.action); | |
2787 | |
2788 const std::vector<FormFieldData>& fields2 = form2.fields; | |
2789 ASSERT_EQ(3U, fields2.size()); | |
2790 | |
2791 expected.form_control_type = "text"; | |
2792 expected.max_length = WebInputElement::defaultMaxLength(); | |
2793 | |
2794 expected.name = ASCIIToUTF16("firstname"); | |
2795 expected.value = ASCIIToUTF16("Wyatt"); | |
2796 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); | |
2797 | |
2798 expected.name = ASCIIToUTF16("lastname"); | |
2799 expected.value = ASCIIToUTF16("Earp"); | |
2800 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); | |
2801 | |
2802 expected.name = ASCIIToUTF16("email"); | |
2803 expected.value = ASCIIToUTF16("wyatt@example.com"); | |
2804 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); | |
2805 } | 3488 } |
2806 | 3489 |
2807 TEST_F(FormAutofillTest, FillFormEmptyFormNames) { | 3490 TEST_F(FormAutofillTest, FillFormEmptyFormNames) { |
2808 LoadHTML("<FORM action='http://buh.com' method='post'>" | 3491 TestFillFormEmptyFormNames( |
2809 " <INPUT type='text' id='firstname'/>" | 3492 "<FORM action='http://buh.com' method='post'>" |
2810 " <INPUT type='text' id='middlename'/>" | 3493 " <INPUT type='text' id='firstname'/>" |
2811 " <INPUT type='text' id='lastname'/>" | 3494 " <INPUT type='text' id='middlename'/>" |
2812 " <INPUT type='submit' value='Send'/>" | 3495 " <INPUT type='text' id='lastname'/>" |
2813 "</FORM>" | 3496 " <INPUT type='submit' value='Send'/>" |
2814 "<FORM action='http://abc.com' method='post'>" | 3497 "</FORM>" |
2815 " <INPUT type='text' id='apple'/>" | 3498 "<FORM action='http://abc.com' method='post'>" |
2816 " <INPUT type='text' id='banana'/>" | 3499 " <INPUT type='text' id='apple'/>" |
2817 " <INPUT type='text' id='cantelope'/>" | 3500 " <INPUT type='text' id='banana'/>" |
2818 " <INPUT type='submit' value='Send'/>" | 3501 " <INPUT type='text' id='cantelope'/>" |
2819 "</FORM>"); | 3502 " <INPUT type='submit' value='Send'/>" |
| 3503 "</FORM>", |
| 3504 false); |
| 3505 } |
2820 | 3506 |
2821 WebFrame* web_frame = GetMainFrame(); | 3507 TEST_F(FormAutofillTest, FillFormEmptyFormNamesForUnownedForm) { |
2822 ASSERT_NE(nullptr, web_frame); | 3508 TestFillFormEmptyFormNames( |
2823 | 3509 "<INPUT type='text' id='firstname'/>" |
2824 FormCache form_cache; | 3510 "<INPUT type='text' id='middlename'/>" |
2825 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); | 3511 "<INPUT type='text' id='lastname'/>" |
2826 ASSERT_EQ(2U, forms.size()); | 3512 "<INPUT type='text' id='apple'/>" |
2827 | 3513 "<INPUT type='text' id='banana'/>" |
2828 // Get the input element we want to find. | 3514 "<INPUT type='text' id='cantelope'/>" |
2829 WebInputElement input_element = GetInputElementById("apple"); | 3515 "<INPUT type='submit' value='Send'/>", |
2830 | 3516 true); |
2831 // Find the form that contains the input element. | |
2832 FormData form; | |
2833 FormFieldData field; | |
2834 EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, | |
2835 &form, | |
2836 &field, | |
2837 autofill::REQUIRE_NONE)); | |
2838 EXPECT_EQ(base::string16(), form.name); | |
2839 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); | |
2840 EXPECT_EQ(GURL("http://abc.com"), form.action); | |
2841 | |
2842 const std::vector<FormFieldData>& fields = form.fields; | |
2843 ASSERT_EQ(3U, fields.size()); | |
2844 | |
2845 FormFieldData expected; | |
2846 expected.form_control_type = "text"; | |
2847 expected.max_length = WebInputElement::defaultMaxLength(); | |
2848 | |
2849 expected.name = ASCIIToUTF16("apple"); | |
2850 expected.is_autofilled = false; | |
2851 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); | |
2852 | |
2853 expected.name = ASCIIToUTF16("banana"); | |
2854 expected.is_autofilled = false; | |
2855 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); | |
2856 | |
2857 expected.name = ASCIIToUTF16("cantelope"); | |
2858 expected.is_autofilled = false; | |
2859 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); | |
2860 | |
2861 // Fill the form. | |
2862 form.fields[0].value = ASCIIToUTF16("Red"); | |
2863 form.fields[1].value = ASCIIToUTF16("Yellow"); | |
2864 form.fields[2].value = ASCIIToUTF16("Also Yellow"); | |
2865 form.fields[0].is_autofilled = true; | |
2866 form.fields[1].is_autofilled = true; | |
2867 form.fields[2].is_autofilled = true; | |
2868 FillForm(form, input_element); | |
2869 | |
2870 // Find the newly-filled form that contains the input element. | |
2871 FormData form2; | |
2872 FormFieldData field2; | |
2873 EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, | |
2874 &form2, | |
2875 &field2, | |
2876 autofill::REQUIRE_NONE)); | |
2877 | |
2878 EXPECT_EQ(base::string16(), form2.name); | |
2879 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); | |
2880 EXPECT_EQ(GURL("http://abc.com"), form2.action); | |
2881 | |
2882 const std::vector<FormFieldData>& fields2 = form2.fields; | |
2883 ASSERT_EQ(3U, fields2.size()); | |
2884 | |
2885 expected.name = ASCIIToUTF16("apple"); | |
2886 expected.value = ASCIIToUTF16("Red"); | |
2887 expected.is_autofilled = true; | |
2888 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); | |
2889 | |
2890 expected.name = ASCIIToUTF16("banana"); | |
2891 expected.value = ASCIIToUTF16("Yellow"); | |
2892 expected.is_autofilled = true; | |
2893 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); | |
2894 | |
2895 expected.name = ASCIIToUTF16("cantelope"); | |
2896 expected.value = ASCIIToUTF16("Also Yellow"); | |
2897 expected.is_autofilled = true; | |
2898 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); | |
2899 } | 3517 } |
2900 | 3518 |
2901 TEST_F(FormAutofillTest, ThreePartPhone) { | 3519 TEST_F(FormAutofillTest, ThreePartPhone) { |
2902 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" | 3520 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" |
2903 " Phone:" | 3521 " Phone:" |
2904 " <input type='text' name='dayphone1'>" | 3522 " <input type='text' name='dayphone1'>" |
2905 " -" | 3523 " -" |
2906 " <input type='text' name='dayphone2'>" | 3524 " <input type='text' name='dayphone2'>" |
2907 " -" | 3525 " -" |
2908 " <input type='text' name='dayphone3'>" | 3526 " <input type='text' name='dayphone3'>" |
2909 " ext.:" | 3527 " ext.:" |
2910 " <input type='text' name='dayphone4'>" | 3528 " <input type='text' name='dayphone4'>" |
2911 " <input type='submit' name='reply-send' value='Send'>" | 3529 " <input type='submit' name='reply-send' value='Send'>" |
2912 "</FORM>"); | 3530 "</FORM>"); |
2913 | 3531 |
2914 | 3532 |
2915 WebFrame* frame = GetMainFrame(); | 3533 WebFrame* frame = GetMainFrame(); |
2916 ASSERT_NE(nullptr, frame); | 3534 ASSERT_NE(nullptr, frame); |
2917 | 3535 |
2918 WebVector<WebFormElement> forms; | 3536 WebVector<WebFormElement> forms; |
2919 frame->document().forms(forms); | 3537 frame->document().forms(forms); |
2920 ASSERT_EQ(1U, forms.size()); | 3538 ASSERT_EQ(1U, forms.size()); |
2921 | 3539 |
2922 FormData form; | 3540 FormData form; |
2923 EXPECT_TRUE(WebFormElementToFormData(forms[0], | 3541 EXPECT_TRUE(WebFormElementToFormData(forms[0], |
2924 WebFormControlElement(), | 3542 WebFormControlElement(), |
2925 autofill::REQUIRE_NONE, | 3543 REQUIRE_NONE, |
2926 autofill::EXTRACT_VALUE, | 3544 EXTRACT_VALUE, |
2927 &form, | 3545 &form, |
2928 NULL)); | 3546 nullptr)); |
2929 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | 3547 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); |
2930 EXPECT_EQ(GURL(frame->document().url()), form.origin); | 3548 EXPECT_EQ(GURL(frame->document().url()), form.origin); |
2931 EXPECT_EQ(GURL("http://cnn.com"), form.action); | 3549 EXPECT_EQ(GURL("http://cnn.com"), form.action); |
2932 | 3550 |
2933 const std::vector<FormFieldData>& fields = form.fields; | 3551 const std::vector<FormFieldData>& fields = form.fields; |
2934 ASSERT_EQ(4U, fields.size()); | 3552 ASSERT_EQ(4U, fields.size()); |
2935 | 3553 |
2936 FormFieldData expected; | 3554 FormFieldData expected; |
2937 expected.form_control_type = "text"; | 3555 expected.form_control_type = "text"; |
2938 expected.max_length = WebInputElement::defaultMaxLength(); | 3556 expected.max_length = WebInputElement::defaultMaxLength(); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2974 WebFrame* frame = GetMainFrame(); | 3592 WebFrame* frame = GetMainFrame(); |
2975 ASSERT_NE(nullptr, frame); | 3593 ASSERT_NE(nullptr, frame); |
2976 | 3594 |
2977 WebVector<WebFormElement> forms; | 3595 WebVector<WebFormElement> forms; |
2978 frame->document().forms(forms); | 3596 frame->document().forms(forms); |
2979 ASSERT_EQ(1U, forms.size()); | 3597 ASSERT_EQ(1U, forms.size()); |
2980 | 3598 |
2981 FormData form; | 3599 FormData form; |
2982 EXPECT_TRUE(WebFormElementToFormData(forms[0], | 3600 EXPECT_TRUE(WebFormElementToFormData(forms[0], |
2983 WebFormControlElement(), | 3601 WebFormControlElement(), |
2984 autofill::REQUIRE_NONE, | 3602 REQUIRE_NONE, |
2985 autofill::EXTRACT_VALUE, | 3603 EXTRACT_VALUE, |
2986 &form, | 3604 &form, |
2987 NULL)); | 3605 nullptr)); |
2988 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | 3606 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); |
2989 EXPECT_EQ(GURL(frame->document().url()), form.origin); | 3607 EXPECT_EQ(GURL(frame->document().url()), form.origin); |
2990 EXPECT_EQ(GURL("http://cnn.com"), form.action); | 3608 EXPECT_EQ(GURL("http://cnn.com"), form.action); |
2991 | 3609 |
2992 const std::vector<FormFieldData>& fields = form.fields; | 3610 const std::vector<FormFieldData>& fields = form.fields; |
2993 ASSERT_EQ(6U, fields.size()); | 3611 ASSERT_EQ(6U, fields.size()); |
2994 | 3612 |
2995 FormFieldData expected; | 3613 FormFieldData expected; |
2996 expected.form_control_type = "text"; | 3614 expected.form_control_type = "text"; |
2997 | 3615 |
(...skipping 11 matching lines...) Expand all Loading... |
3009 expected.name = ASCIIToUTF16("dayphone3"); | 3627 expected.name = ASCIIToUTF16("dayphone3"); |
3010 expected.max_length = 4; | 3628 expected.max_length = 4; |
3011 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); | 3629 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); |
3012 | 3630 |
3013 expected.label = ASCIIToUTF16("ext.:"); | 3631 expected.label = ASCIIToUTF16("ext.:"); |
3014 expected.name = ASCIIToUTF16("dayphone4"); | 3632 expected.name = ASCIIToUTF16("dayphone4"); |
3015 expected.max_length = 5; | 3633 expected.max_length = 5; |
3016 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); | 3634 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); |
3017 | 3635 |
3018 // When unspecified |size|, default is returned. | 3636 // When unspecified |size|, default is returned. |
3019 expected.label = base::string16(); | 3637 expected.label.clear(); |
3020 expected.name = ASCIIToUTF16("default1"); | 3638 expected.name = ASCIIToUTF16("default1"); |
3021 expected.max_length = WebInputElement::defaultMaxLength(); | 3639 expected.max_length = WebInputElement::defaultMaxLength(); |
3022 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[4]); | 3640 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[4]); |
3023 | 3641 |
3024 // When invalid |size|, default is returned. | 3642 // When invalid |size|, default is returned. |
3025 expected.label = base::string16(); | 3643 expected.label.clear(); |
3026 expected.name = ASCIIToUTF16("invalid1"); | 3644 expected.name = ASCIIToUTF16("invalid1"); |
3027 expected.max_length = WebInputElement::defaultMaxLength(); | 3645 expected.max_length = WebInputElement::defaultMaxLength(); |
3028 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[5]); | 3646 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[5]); |
3029 } | 3647 } |
3030 | 3648 |
3031 // This test re-creates the experience of typing in a field then selecting a | 3649 // This test re-creates the experience of typing in a field then selecting a |
3032 // profile from the Autofill suggestions popup. The field that is being typed | 3650 // profile from the Autofill suggestions popup. The field that is being typed |
3033 // into should be filled even though it's not technically empty. | 3651 // into should be filled even though it's not technically empty. |
3034 TEST_F(FormAutofillTest, FillFormNonEmptyField) { | 3652 TEST_F(FormAutofillTest, FillFormNonEmptyField) { |
3035 LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" | 3653 TestFillFormNonEmptyField( |
3036 " <INPUT type='text' id='firstname'/>" | 3654 "<FORM name='TestForm' action='http://buh.com' method='post'>" |
3037 " <INPUT type='text' id='lastname'/>" | 3655 " <INPUT type='text' id='firstname'/>" |
3038 " <INPUT type='text' id='email'/>" | 3656 " <INPUT type='text' id='lastname'/>" |
3039 " <INPUT type='submit' value='Send'/>" | 3657 " <INPUT type='text' id='email'/>" |
3040 "</FORM>"); | 3658 " <INPUT type='submit' value='Send'/>" |
| 3659 "</FORM>", |
| 3660 false); |
| 3661 } |
3041 | 3662 |
3042 WebFrame* web_frame = GetMainFrame(); | 3663 TEST_F(FormAutofillTest, FillFormNonEmptyFieldForUnownedForm) { |
3043 ASSERT_NE(nullptr, web_frame); | 3664 TestFillFormNonEmptyField("<INPUT type='text' id='firstname'/>" |
3044 | 3665 "<INPUT type='text' id='lastname'/>" |
3045 FormCache form_cache; | 3666 "<INPUT type='text' id='email'/>" |
3046 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); | 3667 "<INPUT type='submit' value='Send'/>", |
3047 ASSERT_EQ(1U, forms.size()); | 3668 true); |
3048 | |
3049 // Get the input element we want to find. | |
3050 WebInputElement input_element = GetInputElementById("firstname"); | |
3051 | |
3052 // Simulate typing by modifying the field value. | |
3053 input_element.setValue(ASCIIToUTF16("Wy")); | |
3054 | |
3055 // Find the form that contains the input element. | |
3056 FormData form; | |
3057 FormFieldData field; | |
3058 EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, | |
3059 &form, | |
3060 &field, | |
3061 autofill::REQUIRE_NONE)); | |
3062 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
3063 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); | |
3064 EXPECT_EQ(GURL("http://buh.com"), form.action); | |
3065 | |
3066 const std::vector<FormFieldData>& fields = form.fields; | |
3067 ASSERT_EQ(3U, fields.size()); | |
3068 | |
3069 FormFieldData expected; | |
3070 expected.form_control_type = "text"; | |
3071 expected.max_length = WebInputElement::defaultMaxLength(); | |
3072 | |
3073 expected.name = ASCIIToUTF16("firstname"); | |
3074 expected.value = ASCIIToUTF16("Wy"); | |
3075 expected.is_autofilled = false; | |
3076 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); | |
3077 | |
3078 expected.name = ASCIIToUTF16("lastname"); | |
3079 expected.value = base::string16(); | |
3080 expected.is_autofilled = false; | |
3081 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); | |
3082 | |
3083 expected.name = ASCIIToUTF16("email"); | |
3084 expected.value = base::string16(); | |
3085 expected.is_autofilled = false; | |
3086 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); | |
3087 | |
3088 // Preview the form and verify that the cursor position has been updated. | |
3089 form.fields[0].value = ASCIIToUTF16("Wyatt"); | |
3090 form.fields[1].value = ASCIIToUTF16("Earp"); | |
3091 form.fields[2].value = ASCIIToUTF16("wyatt@example.com"); | |
3092 form.fields[0].is_autofilled = true; | |
3093 form.fields[1].is_autofilled = true; | |
3094 form.fields[2].is_autofilled = true; | |
3095 PreviewForm(form, input_element); | |
3096 EXPECT_EQ(2, input_element.selectionStart()); | |
3097 EXPECT_EQ(5, input_element.selectionEnd()); | |
3098 | |
3099 // Fill the form. | |
3100 FillForm(form, input_element); | |
3101 | |
3102 // Find the newly-filled form that contains the input element. | |
3103 FormData form2; | |
3104 FormFieldData field2; | |
3105 EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, | |
3106 &form2, | |
3107 &field2, | |
3108 autofill::REQUIRE_NONE)); | |
3109 | |
3110 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); | |
3111 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); | |
3112 EXPECT_EQ(GURL("http://buh.com"), form2.action); | |
3113 | |
3114 const std::vector<FormFieldData>& fields2 = form2.fields; | |
3115 ASSERT_EQ(3U, fields2.size()); | |
3116 | |
3117 expected.name = ASCIIToUTF16("firstname"); | |
3118 expected.value = ASCIIToUTF16("Wyatt"); | |
3119 expected.is_autofilled = true; | |
3120 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); | |
3121 | |
3122 expected.name = ASCIIToUTF16("lastname"); | |
3123 expected.value = ASCIIToUTF16("Earp"); | |
3124 expected.is_autofilled = true; | |
3125 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); | |
3126 | |
3127 expected.name = ASCIIToUTF16("email"); | |
3128 expected.value = ASCIIToUTF16("wyatt@example.com"); | |
3129 expected.is_autofilled = true; | |
3130 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); | |
3131 | |
3132 // Verify that the cursor position has been updated. | |
3133 EXPECT_EQ(5, input_element.selectionStart()); | |
3134 EXPECT_EQ(5, input_element.selectionEnd()); | |
3135 } | 3669 } |
3136 | 3670 |
3137 TEST_F(FormAutofillTest, ClearFormWithNode) { | 3671 TEST_F(FormAutofillTest, ClearFormWithNode) { |
3138 LoadHTML( | 3672 TestClearFormWithNode( |
3139 "<FORM name='TestForm' action='http://buh.com' method='post'>" | 3673 "<FORM name='TestForm' action='http://buh.com' method='post'>" |
3140 " <INPUT type='text' id='firstname' value='Wyatt'/>" | 3674 " <INPUT type='text' id='firstname' value='Wyatt'/>" |
3141 " <INPUT type='text' id='lastname' value='Earp'/>" | 3675 " <INPUT type='text' id='lastname' value='Earp'/>" |
3142 " <INPUT type='text' autocomplete='off' id='noAC' value='one'/>" | 3676 " <INPUT type='text' autocomplete='off' id='noAC' value='one'/>" |
3143 " <INPUT type='text' id='notenabled' disabled='disabled'>" | 3677 " <INPUT type='text' id='notenabled' disabled='disabled'>" |
3144 " <INPUT type='month' id='month' value='2012-11'>" | 3678 " <INPUT type='month' id='month' value='2012-11'>" |
3145 " <INPUT type='month' id='month-disabled' value='2012-11'" | 3679 " <INPUT type='month' id='month-disabled' value='2012-11'" |
3146 " disabled='disabled'>" | 3680 " disabled='disabled'>" |
3147 " <TEXTAREA id='textarea'>Apple.</TEXTAREA>" | 3681 " <TEXTAREA id='textarea'>Apple.</TEXTAREA>" |
3148 " <TEXTAREA id='textarea-disabled' disabled='disabled'>" | 3682 " <TEXTAREA id='textarea-disabled' disabled='disabled'>" |
3149 " Banana!" | 3683 " Banana!" |
3150 " </TEXTAREA>" | 3684 " </TEXTAREA>" |
3151 " <TEXTAREA id='textarea-noAC' autocomplete='off'>Carrot?</TEXTAREA>" | 3685 " <TEXTAREA id='textarea-noAC' autocomplete='off'>Carrot?</TEXTAREA>" |
3152 " <INPUT type='submit' value='Send'/>" | 3686 " <INPUT type='submit' value='Send'/>" |
3153 "</FORM>"); | 3687 "</FORM>", |
| 3688 false); |
| 3689 } |
3154 | 3690 |
3155 WebFrame* web_frame = GetMainFrame(); | 3691 TEST_F(FormAutofillTest, ClearFormWithNodeForUnownedForm) { |
3156 ASSERT_NE(nullptr, web_frame); | 3692 TestClearFormWithNode( |
3157 | 3693 " <!-- Indented on purpose //-->" |
3158 FormCache form_cache; | 3694 " <INPUT type='text' id='firstname' value='Wyatt'/>" |
3159 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); | 3695 " <INPUT type='text' id='lastname' value='Earp'/>" |
3160 ASSERT_EQ(1U, forms.size()); | 3696 " <INPUT type='text' autocomplete='off' id='noAC' value='one'/>" |
3161 | 3697 " <INPUT type='text' id='notenabled' disabled='disabled'>" |
3162 // Set the auto-filled attribute. | 3698 " <INPUT type='month' id='month' value='2012-11'>" |
3163 WebInputElement firstname = GetInputElementById("firstname"); | 3699 " <INPUT type='month' id='month-disabled' value='2012-11'" |
3164 firstname.setAutofilled(true); | 3700 " disabled='disabled'>" |
3165 WebInputElement lastname = GetInputElementById("lastname"); | 3701 " <TEXTAREA id='textarea'>Apple.</TEXTAREA>" |
3166 lastname.setAutofilled(true); | 3702 " <TEXTAREA id='textarea-disabled' disabled='disabled'>" |
3167 WebInputElement month = GetInputElementById("month"); | 3703 " Banana!" |
3168 month.setAutofilled(true); | 3704 " </TEXTAREA>" |
3169 WebInputElement textarea = GetInputElementById("textarea"); | 3705 " <TEXTAREA id='textarea-noAC' autocomplete='off'>Carrot?</TEXTAREA>" |
3170 textarea.setAutofilled(true); | 3706 " <INPUT type='submit' value='Send'/>", |
3171 | 3707 true); |
3172 // Set the value of the disabled text input element. | |
3173 WebInputElement notenabled = GetInputElementById("notenabled"); | |
3174 notenabled.setValue(WebString::fromUTF8("no clear")); | |
3175 | |
3176 // Clear the form. | |
3177 EXPECT_TRUE(form_cache.ClearFormWithElement(firstname)); | |
3178 | |
3179 // Verify that the auto-filled attribute has been turned off. | |
3180 EXPECT_FALSE(firstname.isAutofilled()); | |
3181 | |
3182 // Verify the form is cleared. | |
3183 FormData form2; | |
3184 FormFieldData field2; | |
3185 EXPECT_TRUE(FindFormAndFieldForFormControlElement(firstname, | |
3186 &form2, | |
3187 &field2, | |
3188 autofill::REQUIRE_NONE)); | |
3189 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); | |
3190 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); | |
3191 EXPECT_EQ(GURL("http://buh.com"), form2.action); | |
3192 | |
3193 const std::vector<FormFieldData>& fields2 = form2.fields; | |
3194 ASSERT_EQ(9U, fields2.size()); | |
3195 | |
3196 FormFieldData expected; | |
3197 expected.form_control_type = "text"; | |
3198 expected.max_length = WebInputElement::defaultMaxLength(); | |
3199 | |
3200 expected.name = ASCIIToUTF16("firstname"); | |
3201 expected.value = base::string16(); | |
3202 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); | |
3203 | |
3204 expected.name = ASCIIToUTF16("lastname"); | |
3205 expected.value = base::string16(); | |
3206 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); | |
3207 | |
3208 expected.name = ASCIIToUTF16("noAC"); | |
3209 expected.value = ASCIIToUTF16("one"); | |
3210 expected.autocomplete_attribute = "off"; | |
3211 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); | |
3212 expected.autocomplete_attribute = std::string(); // reset | |
3213 | |
3214 expected.name = ASCIIToUTF16("notenabled"); | |
3215 expected.value = ASCIIToUTF16("no clear"); | |
3216 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[3]); | |
3217 | |
3218 expected.form_control_type = "month"; | |
3219 expected.max_length = 0; | |
3220 expected.name = ASCIIToUTF16("month"); | |
3221 expected.value = base::string16(); | |
3222 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[4]); | |
3223 | |
3224 expected.name = ASCIIToUTF16("month-disabled"); | |
3225 expected.value = ASCIIToUTF16("2012-11"); | |
3226 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[5]); | |
3227 | |
3228 expected.form_control_type = "textarea"; | |
3229 expected.name = ASCIIToUTF16("textarea"); | |
3230 expected.value = base::string16(); | |
3231 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[6]); | |
3232 | |
3233 expected.name = ASCIIToUTF16("textarea-disabled"); | |
3234 expected.value = ASCIIToUTF16(" Banana! "); | |
3235 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[7]); | |
3236 | |
3237 expected.name = ASCIIToUTF16("textarea-noAC"); | |
3238 expected.value = ASCIIToUTF16("Carrot?"); | |
3239 expected.autocomplete_attribute = "off"; | |
3240 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[8]); | |
3241 expected.autocomplete_attribute = std::string(); // reset | |
3242 | |
3243 // Verify that the cursor position has been updated. | |
3244 EXPECT_EQ(0, firstname.selectionStart()); | |
3245 EXPECT_EQ(0, firstname.selectionEnd()); | |
3246 } | 3708 } |
3247 | 3709 |
3248 TEST_F(FormAutofillTest, ClearFormWithNodeContainingSelectOne) { | 3710 TEST_F(FormAutofillTest, ClearFormWithNodeContainingSelectOne) { |
3249 LoadHTML( | 3711 TestClearFormWithNodeContainingSelectOne( |
3250 "<FORM name='TestForm' action='http://buh.com' method='post'>" | 3712 "<FORM name='TestForm' action='http://buh.com' method='post'>" |
3251 " <INPUT type='text' id='firstname' value='Wyatt'/>" | 3713 " <INPUT type='text' id='firstname' value='Wyatt'/>" |
3252 " <INPUT type='text' id='lastname' value='Earp'/>" | 3714 " <INPUT type='text' id='lastname' value='Earp'/>" |
3253 " <SELECT id='state' name='state'>" | 3715 " <SELECT id='state' name='state'>" |
3254 " <OPTION selected>?</OPTION>" | 3716 " <OPTION selected>?</OPTION>" |
3255 " <OPTION>AA</OPTION>" | 3717 " <OPTION>AA</OPTION>" |
3256 " <OPTION>AE</OPTION>" | 3718 " <OPTION>AE</OPTION>" |
3257 " <OPTION>AK</OPTION>" | 3719 " <OPTION>AK</OPTION>" |
3258 " </SELECT>" | 3720 " </SELECT>" |
3259 " <INPUT type='submit' value='Send'/>" | 3721 " <INPUT type='submit' value='Send'/>" |
3260 "</FORM>"); | 3722 "</FORM>", |
| 3723 false); |
| 3724 } |
3261 | 3725 |
3262 WebFrame* web_frame = GetMainFrame(); | 3726 TEST_F(FormAutofillTest, ClearFormWithNodeContainingSelectOneForUnownedForm) { |
3263 ASSERT_NE(nullptr, web_frame); | 3727 TestClearFormWithNodeContainingSelectOne( |
3264 | 3728 "<INPUT type='text' id='firstname' value='Wyatt'/>" |
3265 FormCache form_cache; | 3729 "<INPUT type='text' id='lastname' value='Earp'/>" |
3266 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); | 3730 "<SELECT id='state' name='state'>" |
3267 ASSERT_EQ(1U, forms.size()); | 3731 " <OPTION selected>?</OPTION>" |
3268 | 3732 " <OPTION>AA</OPTION>" |
3269 // Set the auto-filled attribute. | 3733 " <OPTION>AE</OPTION>" |
3270 WebInputElement firstname = GetInputElementById("firstname"); | 3734 " <OPTION>AK</OPTION>" |
3271 firstname.setAutofilled(true); | 3735 "</SELECT>" |
3272 WebInputElement lastname = GetInputElementById("lastname"); | 3736 "<INPUT type='submit' value='Send'/>", |
3273 lastname.setAutofilled(true); | 3737 true); |
3274 | |
3275 // Set the value and auto-filled attribute of the state element. | |
3276 WebSelectElement state = | |
3277 web_frame->document().getElementById("state").to<WebSelectElement>(); | |
3278 state.setValue(WebString::fromUTF8("AK")); | |
3279 state.setAutofilled(true); | |
3280 | |
3281 // Clear the form. | |
3282 EXPECT_TRUE(form_cache.ClearFormWithElement(firstname)); | |
3283 | |
3284 // Verify that the auto-filled attribute has been turned off. | |
3285 EXPECT_FALSE(firstname.isAutofilled()); | |
3286 | |
3287 // Verify the form is cleared. | |
3288 FormData form2; | |
3289 FormFieldData field2; | |
3290 EXPECT_TRUE(FindFormAndFieldForFormControlElement(firstname, | |
3291 &form2, | |
3292 &field2, | |
3293 autofill::REQUIRE_NONE)); | |
3294 EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); | |
3295 EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); | |
3296 EXPECT_EQ(GURL("http://buh.com"), form2.action); | |
3297 | |
3298 const std::vector<FormFieldData>& fields2 = form2.fields; | |
3299 ASSERT_EQ(3U, fields2.size()); | |
3300 | |
3301 FormFieldData expected; | |
3302 | |
3303 expected.name = ASCIIToUTF16("firstname"); | |
3304 expected.value = base::string16(); | |
3305 expected.form_control_type = "text"; | |
3306 expected.max_length = WebInputElement::defaultMaxLength(); | |
3307 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); | |
3308 | |
3309 expected.name = ASCIIToUTF16("lastname"); | |
3310 expected.value = base::string16(); | |
3311 expected.form_control_type = "text"; | |
3312 expected.max_length = WebInputElement::defaultMaxLength(); | |
3313 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); | |
3314 | |
3315 expected.name = ASCIIToUTF16("state"); | |
3316 expected.value = ASCIIToUTF16("?"); | |
3317 expected.form_control_type = "select-one"; | |
3318 expected.max_length = 0; | |
3319 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); | |
3320 | |
3321 // Verify that the cursor position has been updated. | |
3322 EXPECT_EQ(0, firstname.selectionStart()); | |
3323 EXPECT_EQ(0, firstname.selectionEnd()); | |
3324 } | 3738 } |
3325 | 3739 |
3326 TEST_F(FormAutofillTest, ClearPreviewedFormWithElement) { | 3740 TEST_F(FormAutofillTest, ClearPreviewedFormWithElement) { |
3327 LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" | 3741 TestClearPreviewedFormWithElement( |
3328 " <INPUT type='text' id='firstname' value='Wyatt'/>" | 3742 "<FORM name='TestForm' action='http://buh.com' method='post'>" |
3329 " <INPUT type='text' id='lastname'/>" | 3743 " <INPUT type='text' id='firstname' value='Wyatt'/>" |
3330 " <INPUT type='text' id='email'/>" | 3744 " <INPUT type='text' id='lastname'/>" |
3331 " <INPUT type='email' id='email2'/>" | 3745 " <INPUT type='text' id='email'/>" |
3332 " <INPUT type='tel' id='phone'/>" | 3746 " <INPUT type='email' id='email2'/>" |
3333 " <INPUT type='submit' value='Send'/>" | 3747 " <INPUT type='tel' id='phone'/>" |
3334 "</FORM>"); | 3748 " <INPUT type='submit' value='Send'/>" |
| 3749 "</FORM>"); |
| 3750 } |
3335 | 3751 |
3336 WebFrame* web_frame = GetMainFrame(); | 3752 TEST_F(FormAutofillTest, ClearPreviewedFormWithElementForUnownedForm) { |
3337 ASSERT_NE(nullptr, web_frame); | 3753 TestClearPreviewedFormWithElement( |
3338 | 3754 "<INPUT type='text' id='firstname' value='Wyatt'/>" |
3339 FormCache form_cache; | 3755 "<INPUT type='text' id='lastname'/>" |
3340 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); | 3756 "<INPUT type='text' id='email'/>" |
3341 ASSERT_EQ(1U, forms.size()); | 3757 "<INPUT type='email' id='email2'/>" |
3342 | 3758 "<INPUT type='tel' id='phone'/>" |
3343 // Set the auto-filled attribute. | 3759 "<INPUT type='submit' value='Send'/>"); |
3344 WebInputElement firstname = GetInputElementById("firstname"); | |
3345 firstname.setAutofilled(true); | |
3346 WebInputElement lastname = GetInputElementById("lastname"); | |
3347 lastname.setAutofilled(true); | |
3348 WebInputElement email = GetInputElementById("email"); | |
3349 email.setAutofilled(true); | |
3350 WebInputElement email2 = GetInputElementById("email2"); | |
3351 email2.setAutofilled(true); | |
3352 WebInputElement phone = GetInputElementById("phone"); | |
3353 phone.setAutofilled(true); | |
3354 | |
3355 // Set the suggested values on two of the elements. | |
3356 lastname.setSuggestedValue(ASCIIToUTF16("Earp")); | |
3357 email.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); | |
3358 email2.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); | |
3359 phone.setSuggestedValue(ASCIIToUTF16("650-777-9999")); | |
3360 | |
3361 // Clear the previewed fields. | |
3362 EXPECT_TRUE(ClearPreviewedFormWithElement(lastname, false)); | |
3363 | |
3364 // Fields with empty suggestions suggestions are not modified. | |
3365 EXPECT_EQ(ASCIIToUTF16("Wyatt"), firstname.value()); | |
3366 EXPECT_TRUE(firstname.suggestedValue().isEmpty()); | |
3367 EXPECT_TRUE(firstname.isAutofilled()); | |
3368 | |
3369 // Verify the previewed fields are cleared. | |
3370 EXPECT_TRUE(lastname.value().isEmpty()); | |
3371 EXPECT_TRUE(lastname.suggestedValue().isEmpty()); | |
3372 EXPECT_FALSE(lastname.isAutofilled()); | |
3373 EXPECT_TRUE(email.value().isEmpty()); | |
3374 EXPECT_TRUE(email.suggestedValue().isEmpty()); | |
3375 EXPECT_FALSE(email.isAutofilled()); | |
3376 EXPECT_TRUE(email2.value().isEmpty()); | |
3377 EXPECT_TRUE(email2.suggestedValue().isEmpty()); | |
3378 EXPECT_FALSE(email2.isAutofilled()); | |
3379 EXPECT_TRUE(phone.value().isEmpty()); | |
3380 EXPECT_TRUE(phone.suggestedValue().isEmpty()); | |
3381 EXPECT_FALSE(phone.isAutofilled()); | |
3382 | |
3383 // Verify that the cursor position has been updated. | |
3384 EXPECT_EQ(0, lastname.selectionStart()); | |
3385 EXPECT_EQ(0, lastname.selectionEnd()); | |
3386 } | 3760 } |
3387 | 3761 |
3388 TEST_F(FormAutofillTest, ClearPreviewedFormWithNonEmptyInitiatingNode) { | 3762 TEST_F(FormAutofillTest, ClearPreviewedFormWithNonEmptyInitiatingNode) { |
3389 LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" | 3763 TestClearPreviewedFormWithNonEmptyInitiatingNode( |
3390 " <INPUT type='text' id='firstname' value='W'/>" | 3764 "<FORM name='TestForm' action='http://buh.com' method='post'>" |
3391 " <INPUT type='text' id='lastname'/>" | 3765 " <INPUT type='text' id='firstname' value='W'/>" |
3392 " <INPUT type='text' id='email'/>" | 3766 " <INPUT type='text' id='lastname'/>" |
3393 " <INPUT type='email' id='email2'/>" | 3767 " <INPUT type='text' id='email'/>" |
3394 " <INPUT type='tel' id='phone'/>" | 3768 " <INPUT type='email' id='email2'/>" |
3395 " <INPUT type='submit' value='Send'/>" | 3769 " <INPUT type='tel' id='phone'/>" |
3396 "</FORM>"); | 3770 " <INPUT type='submit' value='Send'/>" |
| 3771 "</FORM>"); |
| 3772 } |
3397 | 3773 |
3398 WebFrame* web_frame = GetMainFrame(); | 3774 TEST_F(FormAutofillTest, |
3399 ASSERT_NE(nullptr, web_frame); | 3775 ClearPreviewedFormWithNonEmptyInitiatingNodeForUnownedForm) { |
3400 | 3776 TestClearPreviewedFormWithNonEmptyInitiatingNode( |
3401 FormCache form_cache; | 3777 "<INPUT type='text' id='firstname' value='W'/>" |
3402 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); | 3778 "<INPUT type='text' id='lastname'/>" |
3403 ASSERT_EQ(1U, forms.size()); | 3779 "<INPUT type='text' id='email'/>" |
3404 | 3780 "<INPUT type='email' id='email2'/>" |
3405 // Set the auto-filled attribute. | 3781 "<INPUT type='tel' id='phone'/>" |
3406 WebInputElement firstname = GetInputElementById("firstname"); | 3782 "<INPUT type='submit' value='Send'/>"); |
3407 firstname.setAutofilled(true); | |
3408 WebInputElement lastname = GetInputElementById("lastname"); | |
3409 lastname.setAutofilled(true); | |
3410 WebInputElement email = GetInputElementById("email"); | |
3411 email.setAutofilled(true); | |
3412 WebInputElement email2 = GetInputElementById("email2"); | |
3413 email2.setAutofilled(true); | |
3414 WebInputElement phone = GetInputElementById("phone"); | |
3415 phone.setAutofilled(true); | |
3416 | |
3417 | |
3418 // Set the suggested values on all of the elements. | |
3419 firstname.setSuggestedValue(ASCIIToUTF16("Wyatt")); | |
3420 lastname.setSuggestedValue(ASCIIToUTF16("Earp")); | |
3421 email.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); | |
3422 email2.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); | |
3423 phone.setSuggestedValue(ASCIIToUTF16("650-777-9999")); | |
3424 | |
3425 // Clear the previewed fields. | |
3426 EXPECT_TRUE(ClearPreviewedFormWithElement(firstname, false)); | |
3427 | |
3428 // Fields with non-empty values are restored. | |
3429 EXPECT_EQ(ASCIIToUTF16("W"), firstname.value()); | |
3430 EXPECT_TRUE(firstname.suggestedValue().isEmpty()); | |
3431 EXPECT_FALSE(firstname.isAutofilled()); | |
3432 EXPECT_EQ(1, firstname.selectionStart()); | |
3433 EXPECT_EQ(1, firstname.selectionEnd()); | |
3434 | |
3435 // Verify the previewed fields are cleared. | |
3436 EXPECT_TRUE(lastname.value().isEmpty()); | |
3437 EXPECT_TRUE(lastname.suggestedValue().isEmpty()); | |
3438 EXPECT_FALSE(lastname.isAutofilled()); | |
3439 EXPECT_TRUE(email.value().isEmpty()); | |
3440 EXPECT_TRUE(email.suggestedValue().isEmpty()); | |
3441 EXPECT_FALSE(email.isAutofilled()); | |
3442 EXPECT_TRUE(email2.value().isEmpty()); | |
3443 EXPECT_TRUE(email2.suggestedValue().isEmpty()); | |
3444 EXPECT_FALSE(email2.isAutofilled()); | |
3445 EXPECT_TRUE(phone.value().isEmpty()); | |
3446 EXPECT_TRUE(phone.suggestedValue().isEmpty()); | |
3447 EXPECT_FALSE(phone.isAutofilled()); | |
3448 } | 3783 } |
3449 | 3784 |
3450 TEST_F(FormAutofillTest, ClearPreviewedFormWithAutofilledInitiatingNode) { | 3785 TEST_F(FormAutofillTest, ClearPreviewedFormWithAutofilledInitiatingNode) { |
3451 LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" | 3786 TestClearPreviewedFormWithAutofilledInitiatingNode( |
3452 " <INPUT type='text' id='firstname' value='W'/>" | 3787 "<FORM name='TestForm' action='http://buh.com' method='post'>" |
3453 " <INPUT type='text' id='lastname'/>" | 3788 " <INPUT type='text' id='firstname' value='W'/>" |
3454 " <INPUT type='text' id='email'/>" | 3789 " <INPUT type='text' id='lastname'/>" |
3455 " <INPUT type='email' id='email2'/>" | 3790 " <INPUT type='text' id='email'/>" |
3456 " <INPUT type='tel' id='phone'/>" | 3791 " <INPUT type='email' id='email2'/>" |
3457 " <INPUT type='submit' value='Send'/>" | 3792 " <INPUT type='tel' id='phone'/>" |
3458 "</FORM>"); | 3793 " <INPUT type='submit' value='Send'/>" |
| 3794 "</FORM>"); |
| 3795 } |
3459 | 3796 |
3460 WebFrame* web_frame = GetMainFrame(); | 3797 TEST_F(FormAutofillTest, |
3461 ASSERT_NE(nullptr, web_frame); | 3798 ClearPreviewedFormWithAutofilledInitiatingNodeForUnownedForm) { |
3462 | 3799 TestClearPreviewedFormWithAutofilledInitiatingNode( |
3463 FormCache form_cache; | 3800 "<INPUT type='text' id='firstname' value='W'/>" |
3464 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); | 3801 "<INPUT type='text' id='lastname'/>" |
3465 ASSERT_EQ(1U, forms.size()); | 3802 "<INPUT type='text' id='email'/>" |
3466 | 3803 "<INPUT type='email' id='email2'/>" |
3467 // Set the auto-filled attribute. | 3804 "<INPUT type='tel' id='phone'/>" |
3468 WebInputElement firstname = GetInputElementById("firstname"); | 3805 "<INPUT type='submit' value='Send'/>"); |
3469 firstname.setAutofilled(true); | |
3470 WebInputElement lastname = GetInputElementById("lastname"); | |
3471 lastname.setAutofilled(true); | |
3472 WebInputElement email = GetInputElementById("email"); | |
3473 email.setAutofilled(true); | |
3474 WebInputElement email2 = GetInputElementById("email2"); | |
3475 email2.setAutofilled(true); | |
3476 WebInputElement phone = GetInputElementById("phone"); | |
3477 phone.setAutofilled(true); | |
3478 | |
3479 // Set the suggested values on all of the elements. | |
3480 firstname.setSuggestedValue(ASCIIToUTF16("Wyatt")); | |
3481 lastname.setSuggestedValue(ASCIIToUTF16("Earp")); | |
3482 email.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); | |
3483 email2.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); | |
3484 phone.setSuggestedValue(ASCIIToUTF16("650-777-9999")); | |
3485 | |
3486 // Clear the previewed fields. | |
3487 EXPECT_TRUE(ClearPreviewedFormWithElement(firstname, true)); | |
3488 | |
3489 // Fields with non-empty values are restored. | |
3490 EXPECT_EQ(ASCIIToUTF16("W"), firstname.value()); | |
3491 EXPECT_TRUE(firstname.suggestedValue().isEmpty()); | |
3492 EXPECT_TRUE(firstname.isAutofilled()); | |
3493 EXPECT_EQ(1, firstname.selectionStart()); | |
3494 EXPECT_EQ(1, firstname.selectionEnd()); | |
3495 | |
3496 // Verify the previewed fields are cleared. | |
3497 EXPECT_TRUE(lastname.value().isEmpty()); | |
3498 EXPECT_TRUE(lastname.suggestedValue().isEmpty()); | |
3499 EXPECT_FALSE(lastname.isAutofilled()); | |
3500 EXPECT_TRUE(email.value().isEmpty()); | |
3501 EXPECT_TRUE(email.suggestedValue().isEmpty()); | |
3502 EXPECT_FALSE(email.isAutofilled()); | |
3503 EXPECT_TRUE(email2.value().isEmpty()); | |
3504 EXPECT_TRUE(email2.suggestedValue().isEmpty()); | |
3505 EXPECT_FALSE(email2.isAutofilled()); | |
3506 EXPECT_TRUE(phone.value().isEmpty()); | |
3507 EXPECT_TRUE(phone.suggestedValue().isEmpty()); | |
3508 EXPECT_FALSE(phone.isAutofilled()); | |
3509 } | 3806 } |
3510 | 3807 |
3511 // Autofill's "Clear Form" should clear only autofilled fields | 3808 // Autofill's "Clear Form" should clear only autofilled fields |
3512 TEST_F(FormAutofillTest, ClearOnlyAutofilledFields) { | 3809 TEST_F(FormAutofillTest, ClearOnlyAutofilledFields) { |
3513 // Load the form. | 3810 TestClearOnlyAutofilledFields( |
3514 LoadHTML( | |
3515 "<FORM name='TestForm' action='http://buh.com' method='post'>" | 3811 "<FORM name='TestForm' action='http://buh.com' method='post'>" |
3516 " <INPUT type='text' id='firstname' value='Wyatt'/>" | 3812 " <INPUT type='text' id='firstname' value='Wyatt'/>" |
3517 " <INPUT type='text' id='lastname' value='Earp'/>" | 3813 " <INPUT type='text' id='lastname' value='Earp'/>" |
3518 " <INPUT type='email' id='email' value='wyatt@earp.com'/>" | 3814 " <INPUT type='email' id='email' value='wyatt@earp.com'/>" |
3519 " <INPUT type='tel' id='phone' value='650-777-9999'/>" | 3815 " <INPUT type='tel' id='phone' value='650-777-9999'/>" |
3520 " <INPUT type='submit' value='Send'/>" | 3816 " <INPUT type='submit' value='Send'/>" |
3521 "</FORM>"); | 3817 "</FORM>"); |
| 3818 } |
3522 | 3819 |
3523 WebFrame* web_frame = GetMainFrame(); | 3820 TEST_F(FormAutofillTest, ClearOnlyAutofilledFieldsForUnownedForm) { |
3524 ASSERT_NE(nullptr, web_frame); | 3821 TestClearOnlyAutofilledFields( |
3525 | 3822 "<INPUT type='text' id='firstname' value='Wyatt'/>" |
3526 FormCache form_cache; | 3823 "<INPUT type='text' id='lastname' value='Earp'/>" |
3527 std::vector<FormData> forms = form_cache.ExtractNewForms(*web_frame); | 3824 "<INPUT type='email' id='email' value='wyatt@earp.com'/>" |
3528 ASSERT_EQ(1U, forms.size()); | 3825 "<INPUT type='tel' id='phone' value='650-777-9999'/>" |
3529 | 3826 "<INPUT type='submit' value='Send'/>"); |
3530 // Set the autofilled attribute. | |
3531 WebInputElement firstname = GetInputElementById("firstname"); | |
3532 firstname.setAutofilled(false); | |
3533 WebInputElement lastname = GetInputElementById("lastname"); | |
3534 lastname.setAutofilled(true); | |
3535 WebInputElement email = GetInputElementById("email"); | |
3536 email.setAutofilled(true); | |
3537 WebInputElement phone = GetInputElementById("phone"); | |
3538 phone.setAutofilled(true); | |
3539 | |
3540 // Clear the fields. | |
3541 EXPECT_TRUE(form_cache.ClearFormWithElement(firstname)); | |
3542 | |
3543 // Verify only autofilled fields are cleared. | |
3544 EXPECT_EQ(ASCIIToUTF16("Wyatt"), firstname.value()); | |
3545 EXPECT_TRUE(firstname.suggestedValue().isEmpty()); | |
3546 EXPECT_FALSE(firstname.isAutofilled()); | |
3547 EXPECT_TRUE(lastname.value().isEmpty()); | |
3548 EXPECT_TRUE(lastname.suggestedValue().isEmpty()); | |
3549 EXPECT_FALSE(lastname.isAutofilled()); | |
3550 EXPECT_TRUE(email.value().isEmpty()); | |
3551 EXPECT_TRUE(email.suggestedValue().isEmpty()); | |
3552 EXPECT_FALSE(email.isAutofilled()); | |
3553 EXPECT_TRUE(phone.value().isEmpty()); | |
3554 EXPECT_TRUE(phone.suggestedValue().isEmpty()); | |
3555 EXPECT_FALSE(phone.isAutofilled()); | |
3556 } | 3827 } |
3557 | 3828 |
3558 // If we have multiple labels per id, the labels concatenated into label string. | 3829 // If we have multiple labels per id, the labels concatenated into label string. |
3559 TEST_F(FormAutofillTest, MultipleLabelsPerElement) { | 3830 TEST_F(FormAutofillTest, MultipleLabelsPerElement) { |
3560 std::vector<base::string16> labels, names, values; | 3831 std::vector<base::string16> labels, names, values; |
3561 | 3832 |
3562 labels.push_back(ASCIIToUTF16("First Name:")); | 3833 labels.push_back(ASCIIToUTF16("First Name:")); |
3563 names.push_back(ASCIIToUTF16("firstname")); | 3834 names.push_back(ASCIIToUTF16("firstname")); |
3564 values.push_back(ASCIIToUTF16("John")); | 3835 values.push_back(ASCIIToUTF16("John")); |
3565 | 3836 |
(...skipping 21 matching lines...) Expand all Loading... |
3587 labels, names, values); | 3858 labels, names, values); |
3588 } | 3859 } |
3589 | 3860 |
3590 TEST_F(FormAutofillTest, ClickElement) { | 3861 TEST_F(FormAutofillTest, ClickElement) { |
3591 LoadHTML("<BUTTON id='link'>Button</BUTTON>" | 3862 LoadHTML("<BUTTON id='link'>Button</BUTTON>" |
3592 "<BUTTON name='button'>Button</BUTTON>"); | 3863 "<BUTTON name='button'>Button</BUTTON>"); |
3593 WebFrame* frame = GetMainFrame(); | 3864 WebFrame* frame = GetMainFrame(); |
3594 ASSERT_NE(nullptr, frame); | 3865 ASSERT_NE(nullptr, frame); |
3595 | 3866 |
3596 // Successful retrieval by id. | 3867 // Successful retrieval by id. |
3597 autofill::WebElementDescriptor clicker; | 3868 WebElementDescriptor clicker; |
3598 clicker.retrieval_method = autofill::WebElementDescriptor::ID; | 3869 clicker.retrieval_method = WebElementDescriptor::ID; |
3599 clicker.descriptor = "link"; | 3870 clicker.descriptor = "link"; |
3600 EXPECT_TRUE(ClickElement(frame->document(), clicker)); | 3871 EXPECT_TRUE(ClickElement(frame->document(), clicker)); |
3601 | 3872 |
3602 // Successful retrieval by css selector. | 3873 // Successful retrieval by css selector. |
3603 clicker.retrieval_method = autofill::WebElementDescriptor::CSS_SELECTOR; | 3874 clicker.retrieval_method = WebElementDescriptor::CSS_SELECTOR; |
3604 clicker.descriptor = "button[name='button']"; | 3875 clicker.descriptor = "button[name='button']"; |
3605 EXPECT_TRUE(ClickElement(frame->document(), clicker)); | 3876 EXPECT_TRUE(ClickElement(frame->document(), clicker)); |
3606 | 3877 |
3607 // Unsuccessful retrieval due to invalid CSS selector. | 3878 // Unsuccessful retrieval due to invalid CSS selector. |
3608 clicker.descriptor = "^*&"; | 3879 clicker.descriptor = "^*&"; |
3609 EXPECT_FALSE(ClickElement(frame->document(), clicker)); | 3880 EXPECT_FALSE(ClickElement(frame->document(), clicker)); |
3610 | 3881 |
3611 // Unsuccessful retrieval because element does not exist. | 3882 // Unsuccessful retrieval because element does not exist. |
3612 clicker.descriptor = "#junk"; | 3883 clicker.descriptor = "#junk"; |
3613 EXPECT_FALSE(ClickElement(frame->document(), clicker)); | 3884 EXPECT_FALSE(ClickElement(frame->document(), clicker)); |
(...skipping 20 matching lines...) Expand all Loading... |
3634 select_element.setValue(WebString::fromUTF8("AL")); | 3905 select_element.setValue(WebString::fromUTF8("AL")); |
3635 | 3906 |
3636 WebVector<WebFormElement> forms; | 3907 WebVector<WebFormElement> forms; |
3637 frame->document().forms(forms); | 3908 frame->document().forms(forms); |
3638 ASSERT_EQ(1U, forms.size()); | 3909 ASSERT_EQ(1U, forms.size()); |
3639 | 3910 |
3640 FormData form; | 3911 FormData form; |
3641 | 3912 |
3642 // Extract the country select-one value as text. | 3913 // Extract the country select-one value as text. |
3643 EXPECT_TRUE(WebFormElementToFormData( | 3914 EXPECT_TRUE(WebFormElementToFormData( |
3644 forms[0], WebFormControlElement(), autofill::REQUIRE_NONE, | 3915 forms[0], WebFormControlElement(), REQUIRE_NONE, |
3645 static_cast<autofill::ExtractMask>( | 3916 static_cast<ExtractMask>(EXTRACT_VALUE | EXTRACT_OPTION_TEXT), |
3646 autofill::EXTRACT_VALUE | autofill::EXTRACT_OPTION_TEXT), | 3917 &form, nullptr)); |
3647 &form, NULL)); | |
3648 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | 3918 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); |
3649 EXPECT_EQ(GURL(frame->document().url()), form.origin); | 3919 EXPECT_EQ(GURL(frame->document().url()), form.origin); |
3650 EXPECT_EQ(GURL("http://cnn.com"), form.action); | 3920 EXPECT_EQ(GURL("http://cnn.com"), form.action); |
3651 | 3921 |
3652 const std::vector<FormFieldData>& fields = form.fields; | 3922 const std::vector<FormFieldData>& fields = form.fields; |
3653 ASSERT_EQ(3U, fields.size()); | 3923 ASSERT_EQ(3U, fields.size()); |
3654 | 3924 |
3655 FormFieldData expected; | 3925 FormFieldData expected; |
3656 | 3926 |
3657 expected.name = ASCIIToUTF16("firstname"); | 3927 expected.name = ASCIIToUTF16("firstname"); |
(...skipping 11 matching lines...) Expand all Loading... |
3669 expected.name = ASCIIToUTF16("country"); | 3939 expected.name = ASCIIToUTF16("country"); |
3670 expected.value = ASCIIToUTF16("Albania"); | 3940 expected.value = ASCIIToUTF16("Albania"); |
3671 expected.form_control_type = "select-one"; | 3941 expected.form_control_type = "select-one"; |
3672 expected.max_length = 0; | 3942 expected.max_length = 0; |
3673 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); | 3943 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); |
3674 | 3944 |
3675 form.fields.clear(); | 3945 form.fields.clear(); |
3676 // Extract the country select-one value as value. | 3946 // Extract the country select-one value as value. |
3677 EXPECT_TRUE(WebFormElementToFormData(forms[0], | 3947 EXPECT_TRUE(WebFormElementToFormData(forms[0], |
3678 WebFormControlElement(), | 3948 WebFormControlElement(), |
3679 autofill::REQUIRE_NONE, | 3949 REQUIRE_NONE, |
3680 autofill::EXTRACT_VALUE, | 3950 EXTRACT_VALUE, |
3681 &form, | 3951 &form, |
3682 NULL)); | 3952 nullptr)); |
3683 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | 3953 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); |
3684 EXPECT_EQ(GURL(frame->document().url()), form.origin); | 3954 EXPECT_EQ(GURL(frame->document().url()), form.origin); |
3685 EXPECT_EQ(GURL("http://cnn.com"), form.action); | 3955 EXPECT_EQ(GURL("http://cnn.com"), form.action); |
3686 | 3956 |
3687 ASSERT_EQ(3U, fields.size()); | 3957 ASSERT_EQ(3U, fields.size()); |
3688 | 3958 |
3689 expected.name = ASCIIToUTF16("firstname"); | 3959 expected.name = ASCIIToUTF16("firstname"); |
3690 expected.value = ASCIIToUTF16("John"); | 3960 expected.value = ASCIIToUTF16("John"); |
3691 expected.form_control_type = "text"; | 3961 expected.form_control_type = "text"; |
3692 expected.max_length = WebInputElement::defaultMaxLength(); | 3962 expected.max_length = WebInputElement::defaultMaxLength(); |
(...skipping 30 matching lines...) Expand all Loading... |
3723 " </FIELDSET>" | 3993 " </FIELDSET>" |
3724 " <FIELDSET>" | 3994 " <FIELDSET>" |
3725 " <LABEL for='email'>Email:</LABEL>" | 3995 " <LABEL for='email'>Email:</LABEL>" |
3726 " <INPUT type='text' id='email' value='john@example.com'/>" | 3996 " <INPUT type='text' id='email' value='john@example.com'/>" |
3727 " </FIELDSET>" | 3997 " </FIELDSET>" |
3728 "</DIV>"); | 3998 "</DIV>"); |
3729 | 3999 |
3730 WebFrame* frame = GetMainFrame(); | 4000 WebFrame* frame = GetMainFrame(); |
3731 ASSERT_NE(nullptr, frame); | 4001 ASSERT_NE(nullptr, frame); |
3732 | 4002 |
3733 control_elements = FormCache::GetUnownedAutofillableFormFieldElements( | 4003 control_elements = GetUnownedAutofillableFormFieldElements( |
3734 frame->document().all(), &fieldsets); | 4004 frame->document().all(), &fieldsets); |
3735 ASSERT_EQ(3U, control_elements.size()); | 4005 ASSERT_EQ(3U, control_elements.size()); |
3736 ASSERT_EQ(2U, fieldsets.size()); | 4006 ASSERT_EQ(2U, fieldsets.size()); |
3737 | 4007 |
3738 FormData form; | 4008 FormData form; |
3739 EXPECT_TRUE(UnownedFormElementsAndFieldSetsToFormData( | 4009 EXPECT_TRUE(UnownedFormElementsAndFieldSetsToFormData( |
3740 fieldsets, control_elements, dummy_origin, extract_mask, &form)); | 4010 fieldsets, control_elements, nullptr, dummy_origin, REQUIRE_NONE, |
| 4011 extract_mask, &form, nullptr)); |
3741 | 4012 |
3742 EXPECT_TRUE(form.name.empty()); | 4013 EXPECT_TRUE(form.name.empty()); |
3743 EXPECT_EQ(dummy_origin, form.origin); | 4014 EXPECT_EQ(dummy_origin, form.origin); |
3744 EXPECT_FALSE(form.action.is_valid()); | 4015 EXPECT_FALSE(form.action.is_valid()); |
3745 | 4016 |
3746 const std::vector<FormFieldData>& fields = form.fields; | 4017 const std::vector<FormFieldData>& fields = form.fields; |
3747 ASSERT_EQ(3U, fields.size()); | 4018 ASSERT_EQ(3U, fields.size()); |
3748 | 4019 |
3749 FormFieldData expected; | 4020 FormFieldData expected; |
3750 expected.form_control_type = "text"; | 4021 expected.form_control_type = "text"; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3782 " <INPUT type='text' id='firstname' value='John'/>" | 4053 " <INPUT type='text' id='firstname' value='John'/>" |
3783 " <INPUT type='text' id='lastname' value='Smith'/>" | 4054 " <INPUT type='text' id='lastname' value='Smith'/>" |
3784 " <LABEL for='email'>Email:</LABEL>" | 4055 " <LABEL for='email'>Email:</LABEL>" |
3785 " </FIELDSET>" | 4056 " </FIELDSET>" |
3786 " <INPUT type='text' id='email' value='john@example.com'/>" | 4057 " <INPUT type='text' id='email' value='john@example.com'/>" |
3787 "</DIV>"); | 4058 "</DIV>"); |
3788 | 4059 |
3789 WebFrame* frame = GetMainFrame(); | 4060 WebFrame* frame = GetMainFrame(); |
3790 ASSERT_NE(nullptr, frame); | 4061 ASSERT_NE(nullptr, frame); |
3791 | 4062 |
3792 control_elements = FormCache::GetUnownedAutofillableFormFieldElements( | 4063 control_elements = GetUnownedAutofillableFormFieldElements( |
3793 frame->document().all(), &fieldsets); | 4064 frame->document().all(), &fieldsets); |
3794 ASSERT_EQ(3U, control_elements.size()); | 4065 ASSERT_EQ(3U, control_elements.size()); |
3795 ASSERT_EQ(1U, fieldsets.size()); | 4066 ASSERT_EQ(1U, fieldsets.size()); |
3796 | 4067 |
3797 FormData form; | 4068 FormData form; |
3798 EXPECT_TRUE(UnownedFormElementsAndFieldSetsToFormData( | 4069 EXPECT_TRUE(UnownedFormElementsAndFieldSetsToFormData( |
3799 fieldsets, control_elements, dummy_origin, extract_mask, &form)); | 4070 fieldsets, control_elements, nullptr, dummy_origin, REQUIRE_NONE, |
| 4071 extract_mask, &form, nullptr)); |
3800 | 4072 |
3801 EXPECT_TRUE(form.name.empty()); | 4073 EXPECT_TRUE(form.name.empty()); |
3802 EXPECT_EQ(dummy_origin, form.origin); | 4074 EXPECT_EQ(dummy_origin, form.origin); |
3803 EXPECT_FALSE(form.action.is_valid()); | 4075 EXPECT_FALSE(form.action.is_valid()); |
3804 | 4076 |
3805 const std::vector<FormFieldData>& fields = form.fields; | 4077 const std::vector<FormFieldData>& fields = form.fields; |
3806 ASSERT_EQ(3U, fields.size()); | 4078 ASSERT_EQ(3U, fields.size()); |
3807 | 4079 |
3808 FormFieldData expected; | 4080 FormFieldData expected; |
3809 expected.form_control_type = "text"; | 4081 expected.form_control_type = "text"; |
(...skipping 21 matching lines...) Expand all Loading... |
3831 | 4103 |
3832 const ExtractMask extract_mask = | 4104 const ExtractMask extract_mask = |
3833 static_cast<ExtractMask>(EXTRACT_VALUE | EXTRACT_OPTIONS); | 4105 static_cast<ExtractMask>(EXTRACT_VALUE | EXTRACT_OPTIONS); |
3834 const GURL dummy_origin("http://www.example.com"); | 4106 const GURL dummy_origin("http://www.example.com"); |
3835 | 4107 |
3836 LoadHTML(kFormHtml); | 4108 LoadHTML(kFormHtml); |
3837 | 4109 |
3838 WebFrame* frame = GetMainFrame(); | 4110 WebFrame* frame = GetMainFrame(); |
3839 ASSERT_NE(nullptr, frame); | 4111 ASSERT_NE(nullptr, frame); |
3840 | 4112 |
3841 control_elements = FormCache::GetUnownedAutofillableFormFieldElements( | 4113 control_elements = GetUnownedAutofillableFormFieldElements( |
3842 frame->document().all(), &fieldsets); | 4114 frame->document().all(), &fieldsets); |
3843 ASSERT_EQ(0U, control_elements.size()); | 4115 ASSERT_TRUE(control_elements.empty()); |
3844 ASSERT_EQ(0U, fieldsets.size()); | 4116 ASSERT_TRUE(fieldsets.empty()); |
3845 | 4117 |
3846 FormData form; | 4118 FormData form; |
3847 EXPECT_FALSE(UnownedFormElementsAndFieldSetsToFormData( | 4119 EXPECT_FALSE(UnownedFormElementsAndFieldSetsToFormData( |
3848 fieldsets, control_elements, dummy_origin, extract_mask, &form)); | 4120 fieldsets, control_elements, nullptr, dummy_origin, REQUIRE_NONE, |
| 4121 extract_mask, &form, nullptr)); |
3849 } | 4122 } |
3850 | 4123 |
3851 } // namespace autofill | 4124 } // namespace autofill |
OLD | NEW |