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

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

Issue 853523004: Autofill: Set requirements for number of recognized fields in an autofillable form (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <vector> 5 #include <vector>
6 6
7 #include "base/format_macros.h" 7 #include "base/format_macros.h"
8 #include "base/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 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 ASSERT_EQ(labels.size(), names.size()); 189 ASSERT_EQ(labels.size(), names.size());
190 ASSERT_EQ(labels.size(), values.size()); 190 ASSERT_EQ(labels.size(), values.size());
191 ASSERT_EQ(labels.size(), control_types.size()); 191 ASSERT_EQ(labels.size(), control_types.size());
192 192
193 LoadHTML(html); 193 LoadHTML(html);
194 194
195 WebFrame* web_frame = GetMainFrame(); 195 WebFrame* web_frame = GetMainFrame();
196 ASSERT_NE(nullptr, web_frame); 196 ASSERT_NE(nullptr, web_frame);
197 197
198 FormCache form_cache(*web_frame); 198 FormCache form_cache(*web_frame);
199 std::vector<FormData> forms = form_cache.ExtractNewForms(); 199 size_t unowned_form_index;
200 std::vector<FormData> forms =
201 form_cache.ExtractNewForms(&unowned_form_index);
200 ASSERT_EQ(1U, forms.size()); 202 ASSERT_EQ(1U, forms.size());
203 EXPECT_EQ(1U, unowned_form_index);
201 204
202 const FormData& form = forms[0]; 205 const FormData& form = forms[0];
203 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 206 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
204 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 207 EXPECT_EQ(GURL(web_frame->document().url()), form.origin);
205 EXPECT_EQ(GURL("http://cnn.com"), form.action); 208 EXPECT_EQ(GURL("http://cnn.com"), form.action);
206 209
207 const std::vector<FormFieldData>& fields = form.fields; 210 const std::vector<FormFieldData>& fields = form.fields;
208 ASSERT_EQ(labels.size(), fields.size()); 211 ASSERT_EQ(labels.size(), fields.size());
209 for (size_t i = 0; i < labels.size(); ++i) { 212 for (size_t i = 0; i < labels.size(); ++i) {
210 int max_length = control_types[i] == "text" ? 213 int max_length = control_types[i] == "text" ?
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 const AutofillFieldCase* field_cases, 252 const AutofillFieldCase* field_cases,
250 size_t number_of_field_cases, 253 size_t number_of_field_cases,
251 FillFormFunction fill_form_function, 254 FillFormFunction fill_form_function,
252 GetValueFunction get_value_function) { 255 GetValueFunction get_value_function) {
253 LoadHTML(html); 256 LoadHTML(html);
254 257
255 WebFrame* web_frame = GetMainFrame(); 258 WebFrame* web_frame = GetMainFrame();
256 ASSERT_NE(nullptr, web_frame); 259 ASSERT_NE(nullptr, web_frame);
257 260
258 FormCache form_cache(*web_frame); 261 FormCache form_cache(*web_frame);
259 std::vector<FormData> forms = form_cache.ExtractNewForms(); 262 size_t unowned_form_index;
263 std::vector<FormData> forms =
264 form_cache.ExtractNewForms(&unowned_form_index);
260 ASSERT_EQ(1U, forms.size()); 265 ASSERT_EQ(1U, forms.size());
266 const size_t expected_index = unowned ? 0 : 1;
267 EXPECT_EQ(expected_index, unowned_form_index);
261 268
262 // Get the input element we want to find. 269 // Get the input element we want to find.
263 WebInputElement input_element = GetInputElementById("firstname"); 270 WebInputElement input_element = GetInputElementById("firstname");
264 271
265 // Find the form that contains the input element. 272 // Find the form that contains the input element.
266 FormData form_data; 273 FormData form_data;
267 FormFieldData field; 274 FormFieldData field;
268 EXPECT_TRUE(FindFormAndFieldForFormControlElement( 275 EXPECT_TRUE(FindFormAndFieldForFormControlElement(
269 input_element, &form_data, &field, REQUIRE_NONE)); 276 input_element, &form_data, &field, REQUIRE_NONE));
270 if (!unowned) { 277 if (!unowned) {
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 EXPECT_EQ(0, firstname.selectionStart()); 487 EXPECT_EQ(0, firstname.selectionStart());
481 EXPECT_EQ(19, firstname.selectionEnd()); 488 EXPECT_EQ(19, firstname.selectionEnd());
482 } 489 }
483 490
484 void TestFindFormForInputElement(const char* html, bool unowned) { 491 void TestFindFormForInputElement(const char* html, bool unowned) {
485 LoadHTML(html); 492 LoadHTML(html);
486 WebFrame* web_frame = GetMainFrame(); 493 WebFrame* web_frame = GetMainFrame();
487 ASSERT_NE(nullptr, web_frame); 494 ASSERT_NE(nullptr, web_frame);
488 495
489 FormCache form_cache(*web_frame); 496 FormCache form_cache(*web_frame);
490 std::vector<FormData> forms = form_cache.ExtractNewForms(); 497 size_t unowned_form_index;
498 std::vector<FormData> forms =
499 form_cache.ExtractNewForms(&unowned_form_index);
491 ASSERT_EQ(1U, forms.size()); 500 ASSERT_EQ(1U, forms.size());
501 const size_t expected_index = unowned ? 0 : 1;
502 EXPECT_EQ(expected_index, unowned_form_index);
492 503
493 // Get the input element we want to find. 504 // Get the input element we want to find.
494 WebInputElement input_element = GetInputElementById("firstname"); 505 WebInputElement input_element = GetInputElementById("firstname");
495 506
496 // Find the form and verify it's the correct form. 507 // Find the form and verify it's the correct form.
497 FormData form; 508 FormData form;
498 FormFieldData field; 509 FormFieldData field;
499 EXPECT_TRUE(FindFormAndFieldForFormControlElement( 510 EXPECT_TRUE(FindFormAndFieldForFormControlElement(
500 input_element, &form, &field, REQUIRE_NONE)); 511 input_element, &form, &field, REQUIRE_NONE));
501 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 512 EXPECT_EQ(GURL(web_frame->document().url()), form.origin);
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 expected.value = ASCIIToUTF16("1.800.555.1234"); 571 expected.value = ASCIIToUTF16("1.800.555.1234");
561 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 572 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]);
562 } 573 }
563 574
564 void TestFindFormForTextAreaElement(const char* html, bool unowned) { 575 void TestFindFormForTextAreaElement(const char* html, bool unowned) {
565 LoadHTML(html); 576 LoadHTML(html);
566 WebFrame* web_frame = GetMainFrame(); 577 WebFrame* web_frame = GetMainFrame();
567 ASSERT_NE(nullptr, web_frame); 578 ASSERT_NE(nullptr, web_frame);
568 579
569 FormCache form_cache(*web_frame); 580 FormCache form_cache(*web_frame);
570 std::vector<FormData> forms = form_cache.ExtractNewForms(); 581 size_t unowned_form_index;
582 std::vector<FormData> forms =
583 form_cache.ExtractNewForms(&unowned_form_index);
571 ASSERT_EQ(1U, forms.size()); 584 ASSERT_EQ(1U, forms.size());
585 const size_t expected_index = unowned ? 0 : 1;
586 EXPECT_EQ(expected_index, unowned_form_index);
572 587
573 // Get the textarea element we want to find. 588 // Get the textarea element we want to find.
574 WebElement element = web_frame->document().getElementById("street-address"); 589 WebElement element = web_frame->document().getElementById("street-address");
575 WebTextAreaElement textarea_element = element.to<WebTextAreaElement>(); 590 WebTextAreaElement textarea_element = element.to<WebTextAreaElement>();
576 591
577 // Find the form and verify it's the correct form. 592 // Find the form and verify it's the correct form.
578 FormData form; 593 FormData form;
579 FormFieldData field; 594 FormFieldData field;
580 EXPECT_TRUE(FindFormAndFieldForFormControlElement( 595 EXPECT_TRUE(FindFormAndFieldForFormControlElement(
581 textarea_element, &form, &field, REQUIRE_NONE)); 596 textarea_element, &form, &field, REQUIRE_NONE));
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
650 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 665 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]);
651 EXPECT_FORM_FIELD_DATA_EQUALS(expected, field); 666 EXPECT_FORM_FIELD_DATA_EQUALS(expected, field);
652 } 667 }
653 668
654 void TestFillFormMaxLength(const char* html, bool unowned) { 669 void TestFillFormMaxLength(const char* html, bool unowned) {
655 LoadHTML(html); 670 LoadHTML(html);
656 WebFrame* web_frame = GetMainFrame(); 671 WebFrame* web_frame = GetMainFrame();
657 ASSERT_NE(nullptr, web_frame); 672 ASSERT_NE(nullptr, web_frame);
658 673
659 FormCache form_cache(*web_frame); 674 FormCache form_cache(*web_frame);
660 std::vector<FormData> forms = form_cache.ExtractNewForms(); 675 size_t unowned_form_index;
676 std::vector<FormData> forms =
677 form_cache.ExtractNewForms(&unowned_form_index);
661 ASSERT_EQ(1U, forms.size()); 678 ASSERT_EQ(1U, forms.size());
679 const size_t expected_index = unowned ? 0 : 1;
680 EXPECT_EQ(expected_index, unowned_form_index);
662 681
663 // Get the input element we want to find. 682 // Get the input element we want to find.
664 WebInputElement input_element = GetInputElementById("firstname"); 683 WebInputElement input_element = GetInputElementById("firstname");
665 684
666 // Find the form that contains the input element. 685 // Find the form that contains the input element.
667 FormData form; 686 FormData form;
668 FormFieldData field; 687 FormFieldData field;
669 EXPECT_TRUE(FindFormAndFieldForFormControlElement( 688 EXPECT_TRUE(FindFormAndFieldForFormControlElement(
670 input_element, &form, &field, REQUIRE_NONE)); 689 input_element, &form, &field, REQUIRE_NONE));
671 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 690 EXPECT_EQ(GURL(web_frame->document().url()), form.origin);
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
738 expected.is_autofilled = true; 757 expected.is_autofilled = true;
739 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 758 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]);
740 } 759 }
741 760
742 void TestFillFormNegativeMaxLength(const char* html, bool unowned) { 761 void TestFillFormNegativeMaxLength(const char* html, bool unowned) {
743 LoadHTML(html); 762 LoadHTML(html);
744 WebFrame* web_frame = GetMainFrame(); 763 WebFrame* web_frame = GetMainFrame();
745 ASSERT_NE(nullptr, web_frame); 764 ASSERT_NE(nullptr, web_frame);
746 765
747 FormCache form_cache(*web_frame); 766 FormCache form_cache(*web_frame);
748 std::vector<FormData> forms = form_cache.ExtractNewForms(); 767 size_t unowned_form_index;
768 std::vector<FormData> forms =
769 form_cache.ExtractNewForms(&unowned_form_index);
749 ASSERT_EQ(1U, forms.size()); 770 ASSERT_EQ(1U, forms.size());
771 const size_t expected_index = unowned ? 0 : 1;
772 EXPECT_EQ(expected_index, unowned_form_index);
750 773
751 // Get the input element we want to find. 774 // Get the input element we want to find.
752 WebInputElement input_element = GetInputElementById("firstname"); 775 WebInputElement input_element = GetInputElementById("firstname");
753 776
754 // Find the form that contains the input element. 777 // Find the form that contains the input element.
755 FormData form; 778 FormData form;
756 FormFieldData field; 779 FormFieldData field;
757 EXPECT_TRUE(FindFormAndFieldForFormControlElement( 780 EXPECT_TRUE(FindFormAndFieldForFormControlElement(
758 input_element, &form, &field, REQUIRE_NONE)); 781 input_element, &form, &field, REQUIRE_NONE));
759 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 782 EXPECT_EQ(GURL(web_frame->document().url()), form.origin);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
810 expected.value = ASCIIToUTF16("brotherj@example.com"); 833 expected.value = ASCIIToUTF16("brotherj@example.com");
811 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 834 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]);
812 } 835 }
813 836
814 void TestFillFormEmptyName(const char* html, bool unowned) { 837 void TestFillFormEmptyName(const char* html, bool unowned) {
815 LoadHTML(html); 838 LoadHTML(html);
816 WebFrame* web_frame = GetMainFrame(); 839 WebFrame* web_frame = GetMainFrame();
817 ASSERT_NE(nullptr, web_frame); 840 ASSERT_NE(nullptr, web_frame);
818 841
819 FormCache form_cache(*web_frame); 842 FormCache form_cache(*web_frame);
820 std::vector<FormData> forms = form_cache.ExtractNewForms(); 843 size_t unowned_form_index;
844 std::vector<FormData> forms =
845 form_cache.ExtractNewForms(&unowned_form_index);
821 ASSERT_EQ(1U, forms.size()); 846 ASSERT_EQ(1U, forms.size());
847 const size_t expected_index = unowned ? 0 : 1;
848 EXPECT_EQ(expected_index, unowned_form_index);
822 849
823 // Get the input element we want to find. 850 // Get the input element we want to find.
824 WebInputElement input_element = GetInputElementById("firstname"); 851 WebInputElement input_element = GetInputElementById("firstname");
825 852
826 // Find the form that contains the input element. 853 // Find the form that contains the input element.
827 FormData form; 854 FormData form;
828 FormFieldData field; 855 FormFieldData field;
829 EXPECT_TRUE(FindFormAndFieldForFormControlElement( 856 EXPECT_TRUE(FindFormAndFieldForFormControlElement(
830 input_element, &form, &field, REQUIRE_NONE)); 857 input_element, &form, &field, REQUIRE_NONE));
831 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 858 EXPECT_EQ(GURL(web_frame->document().url()), form.origin);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 expected.value = ASCIIToUTF16("wyatt@example.com"); 912 expected.value = ASCIIToUTF16("wyatt@example.com");
886 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 913 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]);
887 } 914 }
888 915
889 void TestFillFormEmptyFormNames(const char* html, bool unowned) { 916 void TestFillFormEmptyFormNames(const char* html, bool unowned) {
890 LoadHTML(html); 917 LoadHTML(html);
891 WebFrame* web_frame = GetMainFrame(); 918 WebFrame* web_frame = GetMainFrame();
892 ASSERT_NE(nullptr, web_frame); 919 ASSERT_NE(nullptr, web_frame);
893 920
894 FormCache form_cache(*web_frame); 921 FormCache form_cache(*web_frame);
895 std::vector<FormData> forms = form_cache.ExtractNewForms(); 922 size_t unowned_form_index;
923 std::vector<FormData> forms =
924 form_cache.ExtractNewForms(&unowned_form_index);
896 const size_t expected_size = unowned ? 1 : 2; 925 const size_t expected_size = unowned ? 1 : 2;
897 ASSERT_EQ(expected_size, forms.size()); 926 ASSERT_EQ(expected_size, forms.size());
927 const size_t expected_index = unowned ? 0 : 2;
928 EXPECT_EQ(expected_index, unowned_form_index);
898 929
899 // Get the input element we want to find. 930 // Get the input element we want to find.
900 WebInputElement input_element = GetInputElementById("apple"); 931 WebInputElement input_element = GetInputElementById("apple");
901 932
902 // Find the form that contains the input element. 933 // Find the form that contains the input element.
903 FormData form; 934 FormData form;
904 FormFieldData field; 935 FormFieldData field;
905 EXPECT_TRUE(FindFormAndFieldForFormControlElement( 936 EXPECT_TRUE(FindFormAndFieldForFormControlElement(
906 input_element, &form, &field, REQUIRE_NONE)); 937 input_element, &form, &field, REQUIRE_NONE));
907 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 938 EXPECT_EQ(GURL(web_frame->document().url()), form.origin);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
968 expected.is_autofilled = true; 999 expected.is_autofilled = true;
969 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[unowned_offset + 2]); 1000 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[unowned_offset + 2]);
970 } 1001 }
971 1002
972 void TestFillFormNonEmptyField(const char* html, bool unowned) { 1003 void TestFillFormNonEmptyField(const char* html, bool unowned) {
973 LoadHTML(html); 1004 LoadHTML(html);
974 WebFrame* web_frame = GetMainFrame(); 1005 WebFrame* web_frame = GetMainFrame();
975 ASSERT_NE(nullptr, web_frame); 1006 ASSERT_NE(nullptr, web_frame);
976 1007
977 FormCache form_cache(*web_frame); 1008 FormCache form_cache(*web_frame);
978 std::vector<FormData> forms = form_cache.ExtractNewForms(); 1009 size_t unowned_form_index;
1010 std::vector<FormData> forms =
1011 form_cache.ExtractNewForms(&unowned_form_index);
979 ASSERT_EQ(1U, forms.size()); 1012 ASSERT_EQ(1U, forms.size());
1013 const size_t expected_index = unowned ? 0 : 1;
1014 EXPECT_EQ(expected_index, unowned_form_index);
980 1015
981 // Get the input element we want to find. 1016 // Get the input element we want to find.
982 WebInputElement input_element = GetInputElementById("firstname"); 1017 WebInputElement input_element = GetInputElementById("firstname");
983 1018
984 // Simulate typing by modifying the field value. 1019 // Simulate typing by modifying the field value.
985 input_element.setValue(ASCIIToUTF16("Wy")); 1020 input_element.setValue(ASCIIToUTF16("Wy"));
986 1021
987 // Find the form that contains the input element. 1022 // Find the form that contains the input element.
988 FormData form; 1023 FormData form;
989 FormFieldData field; 1024 FormFieldData field;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1064 EXPECT_EQ(5, input_element.selectionStart()); 1099 EXPECT_EQ(5, input_element.selectionStart());
1065 EXPECT_EQ(5, input_element.selectionEnd()); 1100 EXPECT_EQ(5, input_element.selectionEnd());
1066 } 1101 }
1067 1102
1068 void TestClearFormWithNode(const char* html, bool unowned) { 1103 void TestClearFormWithNode(const char* html, bool unowned) {
1069 LoadHTML(html); 1104 LoadHTML(html);
1070 WebFrame* web_frame = GetMainFrame(); 1105 WebFrame* web_frame = GetMainFrame();
1071 ASSERT_NE(nullptr, web_frame); 1106 ASSERT_NE(nullptr, web_frame);
1072 1107
1073 FormCache form_cache(*web_frame); 1108 FormCache form_cache(*web_frame);
1074 std::vector<FormData> forms = form_cache.ExtractNewForms(); 1109 size_t unowned_form_index;
1110 std::vector<FormData> forms =
1111 form_cache.ExtractNewForms(&unowned_form_index);
1075 ASSERT_EQ(1U, forms.size()); 1112 ASSERT_EQ(1U, forms.size());
1113 const size_t expected_index = unowned ? 0 : 1;
1114 EXPECT_EQ(expected_index, unowned_form_index);
1076 1115
1077 // Set the auto-filled attribute. 1116 // Set the auto-filled attribute.
1078 WebInputElement firstname = GetInputElementById("firstname"); 1117 WebInputElement firstname = GetInputElementById("firstname");
1079 firstname.setAutofilled(true); 1118 firstname.setAutofilled(true);
1080 WebInputElement lastname = GetInputElementById("lastname"); 1119 WebInputElement lastname = GetInputElementById("lastname");
1081 lastname.setAutofilled(true); 1120 lastname.setAutofilled(true);
1082 WebInputElement month = GetInputElementById("month"); 1121 WebInputElement month = GetInputElementById("month");
1083 month.setAutofilled(true); 1122 month.setAutofilled(true);
1084 WebInputElement textarea = GetInputElementById("textarea"); 1123 WebInputElement textarea = GetInputElementById("textarea");
1085 textarea.setAutofilled(true); 1124 textarea.setAutofilled(true);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1160 EXPECT_EQ(0, firstname.selectionEnd()); 1199 EXPECT_EQ(0, firstname.selectionEnd());
1161 } 1200 }
1162 1201
1163 void TestClearFormWithNodeContainingSelectOne(const char* html, 1202 void TestClearFormWithNodeContainingSelectOne(const char* html,
1164 bool unowned) { 1203 bool unowned) {
1165 LoadHTML(html); 1204 LoadHTML(html);
1166 WebFrame* web_frame = GetMainFrame(); 1205 WebFrame* web_frame = GetMainFrame();
1167 ASSERT_NE(nullptr, web_frame); 1206 ASSERT_NE(nullptr, web_frame);
1168 1207
1169 FormCache form_cache(*web_frame); 1208 FormCache form_cache(*web_frame);
1170 std::vector<FormData> forms = form_cache.ExtractNewForms(); 1209 size_t unowned_form_index;
1210 std::vector<FormData> forms =
1211 form_cache.ExtractNewForms(&unowned_form_index);
1171 ASSERT_EQ(1U, forms.size()); 1212 ASSERT_EQ(1U, forms.size());
1213 const size_t expected_index = unowned ? 0 : 1;
1214 EXPECT_EQ(expected_index, unowned_form_index);
1172 1215
1173 // Set the auto-filled attribute. 1216 // Set the auto-filled attribute.
1174 WebInputElement firstname = GetInputElementById("firstname"); 1217 WebInputElement firstname = GetInputElementById("firstname");
1175 firstname.setAutofilled(true); 1218 firstname.setAutofilled(true);
1176 WebInputElement lastname = GetInputElementById("lastname"); 1219 WebInputElement lastname = GetInputElementById("lastname");
1177 lastname.setAutofilled(true); 1220 lastname.setAutofilled(true);
1178 1221
1179 // Set the value and auto-filled attribute of the state element. 1222 // Set the value and auto-filled attribute of the state element.
1180 WebSelectElement state = 1223 WebSelectElement state =
1181 web_frame->document().getElementById("state").to<WebSelectElement>(); 1224 web_frame->document().getElementById("state").to<WebSelectElement>();
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1220 expected.value = ASCIIToUTF16("?"); 1263 expected.value = ASCIIToUTF16("?");
1221 expected.form_control_type = "select-one"; 1264 expected.form_control_type = "select-one";
1222 expected.max_length = 0; 1265 expected.max_length = 0;
1223 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 1266 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]);
1224 1267
1225 // Verify that the cursor position has been updated. 1268 // Verify that the cursor position has been updated.
1226 EXPECT_EQ(0, firstname.selectionStart()); 1269 EXPECT_EQ(0, firstname.selectionStart());
1227 EXPECT_EQ(0, firstname.selectionEnd()); 1270 EXPECT_EQ(0, firstname.selectionEnd());
1228 } 1271 }
1229 1272
1230 void TestClearPreviewedFormWithElement(const char* html) { 1273 void TestClearPreviewedFormWithElement(const char* html, bool unowned) {
1231 LoadHTML(html); 1274 LoadHTML(html);
1232 WebFrame* web_frame = GetMainFrame(); 1275 WebFrame* web_frame = GetMainFrame();
1233 ASSERT_NE(nullptr, web_frame); 1276 ASSERT_NE(nullptr, web_frame);
1234 1277
1235 FormCache form_cache(*web_frame); 1278 FormCache form_cache(*web_frame);
1236 std::vector<FormData> forms = form_cache.ExtractNewForms(); 1279 size_t unowned_form_index;
1280 std::vector<FormData> forms =
1281 form_cache.ExtractNewForms(&unowned_form_index);
1237 ASSERT_EQ(1U, forms.size()); 1282 ASSERT_EQ(1U, forms.size());
1283 const size_t expected_index = unowned ? 0 : 1;
1284 EXPECT_EQ(expected_index, unowned_form_index);
1238 1285
1239 // Set the auto-filled attribute. 1286 // Set the auto-filled attribute.
1240 WebInputElement firstname = GetInputElementById("firstname"); 1287 WebInputElement firstname = GetInputElementById("firstname");
1241 firstname.setAutofilled(true); 1288 firstname.setAutofilled(true);
1242 WebInputElement lastname = GetInputElementById("lastname"); 1289 WebInputElement lastname = GetInputElementById("lastname");
1243 lastname.setAutofilled(true); 1290 lastname.setAutofilled(true);
1244 WebInputElement email = GetInputElementById("email"); 1291 WebInputElement email = GetInputElementById("email");
1245 email.setAutofilled(true); 1292 email.setAutofilled(true);
1246 WebInputElement email2 = GetInputElementById("email2"); 1293 WebInputElement email2 = GetInputElementById("email2");
1247 email2.setAutofilled(true); 1294 email2.setAutofilled(true);
(...skipping 26 matching lines...) Expand all
1274 EXPECT_FALSE(email2.isAutofilled()); 1321 EXPECT_FALSE(email2.isAutofilled());
1275 EXPECT_TRUE(phone.value().isEmpty()); 1322 EXPECT_TRUE(phone.value().isEmpty());
1276 EXPECT_TRUE(phone.suggestedValue().isEmpty()); 1323 EXPECT_TRUE(phone.suggestedValue().isEmpty());
1277 EXPECT_FALSE(phone.isAutofilled()); 1324 EXPECT_FALSE(phone.isAutofilled());
1278 1325
1279 // Verify that the cursor position has been updated. 1326 // Verify that the cursor position has been updated.
1280 EXPECT_EQ(0, lastname.selectionStart()); 1327 EXPECT_EQ(0, lastname.selectionStart());
1281 EXPECT_EQ(0, lastname.selectionEnd()); 1328 EXPECT_EQ(0, lastname.selectionEnd());
1282 } 1329 }
1283 1330
1284 void TestClearPreviewedFormWithNonEmptyInitiatingNode(const char* html) { 1331 void TestClearPreviewedFormWithNonEmptyInitiatingNode(const char* html,
1332 bool unowned) {
1285 LoadHTML(html); 1333 LoadHTML(html);
1286 WebFrame* web_frame = GetMainFrame(); 1334 WebFrame* web_frame = GetMainFrame();
1287 ASSERT_NE(nullptr, web_frame); 1335 ASSERT_NE(nullptr, web_frame);
1288 1336
1289 FormCache form_cache(*web_frame); 1337 FormCache form_cache(*web_frame);
1290 std::vector<FormData> forms = form_cache.ExtractNewForms(); 1338 size_t unowned_form_index;
1339 std::vector<FormData> forms =
1340 form_cache.ExtractNewForms(&unowned_form_index);
1291 ASSERT_EQ(1U, forms.size()); 1341 ASSERT_EQ(1U, forms.size());
1342 const size_t expected_index = unowned ? 0 : 1;
1343 EXPECT_EQ(expected_index, unowned_form_index);
1292 1344
1293 // Set the auto-filled attribute. 1345 // Set the auto-filled attribute.
1294 WebInputElement firstname = GetInputElementById("firstname"); 1346 WebInputElement firstname = GetInputElementById("firstname");
1295 firstname.setAutofilled(true); 1347 firstname.setAutofilled(true);
1296 WebInputElement lastname = GetInputElementById("lastname"); 1348 WebInputElement lastname = GetInputElementById("lastname");
1297 lastname.setAutofilled(true); 1349 lastname.setAutofilled(true);
1298 WebInputElement email = GetInputElementById("email"); 1350 WebInputElement email = GetInputElementById("email");
1299 email.setAutofilled(true); 1351 email.setAutofilled(true);
1300 WebInputElement email2 = GetInputElementById("email2"); 1352 WebInputElement email2 = GetInputElementById("email2");
1301 email2.setAutofilled(true); 1353 email2.setAutofilled(true);
(...skipping 26 matching lines...) Expand all
1328 EXPECT_TRUE(email.suggestedValue().isEmpty()); 1380 EXPECT_TRUE(email.suggestedValue().isEmpty());
1329 EXPECT_FALSE(email.isAutofilled()); 1381 EXPECT_FALSE(email.isAutofilled());
1330 EXPECT_TRUE(email2.value().isEmpty()); 1382 EXPECT_TRUE(email2.value().isEmpty());
1331 EXPECT_TRUE(email2.suggestedValue().isEmpty()); 1383 EXPECT_TRUE(email2.suggestedValue().isEmpty());
1332 EXPECT_FALSE(email2.isAutofilled()); 1384 EXPECT_FALSE(email2.isAutofilled());
1333 EXPECT_TRUE(phone.value().isEmpty()); 1385 EXPECT_TRUE(phone.value().isEmpty());
1334 EXPECT_TRUE(phone.suggestedValue().isEmpty()); 1386 EXPECT_TRUE(phone.suggestedValue().isEmpty());
1335 EXPECT_FALSE(phone.isAutofilled()); 1387 EXPECT_FALSE(phone.isAutofilled());
1336 } 1388 }
1337 1389
1338 void TestClearPreviewedFormWithAutofilledInitiatingNode(const char* html) { 1390 void TestClearPreviewedFormWithAutofilledInitiatingNode(const char* html,
1391 bool unowned) {
1339 LoadHTML(html); 1392 LoadHTML(html);
1340 WebFrame* web_frame = GetMainFrame(); 1393 WebFrame* web_frame = GetMainFrame();
1341 ASSERT_NE(nullptr, web_frame); 1394 ASSERT_NE(nullptr, web_frame);
1342 1395
1343 FormCache form_cache(*web_frame); 1396 FormCache form_cache(*web_frame);
1344 std::vector<FormData> forms = form_cache.ExtractNewForms(); 1397 size_t unowned_form_index;
1398 std::vector<FormData> forms =
1399 form_cache.ExtractNewForms(&unowned_form_index);
1345 ASSERT_EQ(1U, forms.size()); 1400 ASSERT_EQ(1U, forms.size());
1401 const size_t expected_index = unowned ? 0 : 1;
1402 EXPECT_EQ(expected_index, unowned_form_index);
1346 1403
1347 // Set the auto-filled attribute. 1404 // Set the auto-filled attribute.
1348 WebInputElement firstname = GetInputElementById("firstname"); 1405 WebInputElement firstname = GetInputElementById("firstname");
1349 firstname.setAutofilled(true); 1406 firstname.setAutofilled(true);
1350 WebInputElement lastname = GetInputElementById("lastname"); 1407 WebInputElement lastname = GetInputElementById("lastname");
1351 lastname.setAutofilled(true); 1408 lastname.setAutofilled(true);
1352 WebInputElement email = GetInputElementById("email"); 1409 WebInputElement email = GetInputElementById("email");
1353 email.setAutofilled(true); 1410 email.setAutofilled(true);
1354 WebInputElement email2 = GetInputElementById("email2"); 1411 WebInputElement email2 = GetInputElementById("email2");
1355 email2.setAutofilled(true); 1412 email2.setAutofilled(true);
(...skipping 25 matching lines...) Expand all
1381 EXPECT_TRUE(email.suggestedValue().isEmpty()); 1438 EXPECT_TRUE(email.suggestedValue().isEmpty());
1382 EXPECT_FALSE(email.isAutofilled()); 1439 EXPECT_FALSE(email.isAutofilled());
1383 EXPECT_TRUE(email2.value().isEmpty()); 1440 EXPECT_TRUE(email2.value().isEmpty());
1384 EXPECT_TRUE(email2.suggestedValue().isEmpty()); 1441 EXPECT_TRUE(email2.suggestedValue().isEmpty());
1385 EXPECT_FALSE(email2.isAutofilled()); 1442 EXPECT_FALSE(email2.isAutofilled());
1386 EXPECT_TRUE(phone.value().isEmpty()); 1443 EXPECT_TRUE(phone.value().isEmpty());
1387 EXPECT_TRUE(phone.suggestedValue().isEmpty()); 1444 EXPECT_TRUE(phone.suggestedValue().isEmpty());
1388 EXPECT_FALSE(phone.isAutofilled()); 1445 EXPECT_FALSE(phone.isAutofilled());
1389 } 1446 }
1390 1447
1391 void TestClearOnlyAutofilledFields(const char* html) { 1448 void TestClearOnlyAutofilledFields(const char* html, bool unowned) {
1392 LoadHTML(html); 1449 LoadHTML(html);
1393 1450
1394 WebFrame* web_frame = GetMainFrame(); 1451 WebFrame* web_frame = GetMainFrame();
1395 ASSERT_NE(nullptr, web_frame); 1452 ASSERT_NE(nullptr, web_frame);
1396 1453
1397 FormCache form_cache(*web_frame); 1454 FormCache form_cache(*web_frame);
1398 std::vector<FormData> forms = form_cache.ExtractNewForms(); 1455 size_t unowned_form_index;
1456 std::vector<FormData> forms =
1457 form_cache.ExtractNewForms(&unowned_form_index);
1399 ASSERT_EQ(1U, forms.size()); 1458 ASSERT_EQ(1U, forms.size());
1459 const size_t expected_index = unowned ? 0 : 1;
1460 EXPECT_EQ(expected_index, unowned_form_index);
1400 1461
1401 // Set the autofilled attribute. 1462 // Set the autofilled attribute.
1402 WebInputElement firstname = GetInputElementById("firstname"); 1463 WebInputElement firstname = GetInputElementById("firstname");
1403 firstname.setAutofilled(false); 1464 firstname.setAutofilled(false);
1404 WebInputElement lastname = GetInputElementById("lastname"); 1465 WebInputElement lastname = GetInputElementById("lastname");
1405 lastname.setAutofilled(true); 1466 lastname.setAutofilled(true);
1406 WebInputElement email = GetInputElementById("email"); 1467 WebInputElement email = GetInputElementById("email");
1407 email.setAutofilled(true); 1468 email.setAutofilled(true);
1408 WebInputElement phone = GetInputElementById("phone"); 1469 WebInputElement phone = GetInputElementById("phone");
1409 phone.setAutofilled(true); 1470 phone.setAutofilled(true);
(...skipping 671 matching lines...) Expand 10 before | Expand all | Expand 10 after
2081 " <INPUT type='text' id='firstname' value='Jack'/>" 2142 " <INPUT type='text' id='firstname' value='Jack'/>"
2082 " <INPUT type='text' id='lastname' value='Adams'/>" 2143 " <INPUT type='text' id='lastname' value='Adams'/>"
2083 " <INPUT type='text' id='email' value='jack@example.com'/>" 2144 " <INPUT type='text' id='email' value='jack@example.com'/>"
2084 " <INPUT type='submit' name='reply-send' value='Send'/>" 2145 " <INPUT type='submit' name='reply-send' value='Send'/>"
2085 "</FORM>"); 2146 "</FORM>");
2086 2147
2087 WebFrame* web_frame = GetMainFrame(); 2148 WebFrame* web_frame = GetMainFrame();
2088 ASSERT_NE(nullptr, web_frame); 2149 ASSERT_NE(nullptr, web_frame);
2089 2150
2090 FormCache form_cache(*web_frame); 2151 FormCache form_cache(*web_frame);
2091 std::vector<FormData> forms = form_cache.ExtractNewForms(); 2152 size_t unowned_form_index;
2153 std::vector<FormData> forms = form_cache.ExtractNewForms(&unowned_form_index);
2092 ASSERT_EQ(2U, forms.size()); 2154 ASSERT_EQ(2U, forms.size());
2155 EXPECT_EQ(2U, unowned_form_index);
2093 2156
2094 // First form. 2157 // First form.
2095 const FormData& form = forms[0]; 2158 const FormData& form = forms[0];
2096 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 2159 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
2097 EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 2160 EXPECT_EQ(GURL(web_frame->document().url()), form.origin);
2098 EXPECT_EQ(GURL("http://cnn.com"), form.action); 2161 EXPECT_EQ(GURL("http://cnn.com"), form.action);
2099 2162
2100 const std::vector<FormFieldData>& fields = form.fields; 2163 const std::vector<FormFieldData>& fields = form.fields;
2101 ASSERT_EQ(3U, fields.size()); 2164 ASSERT_EQ(3U, fields.size());
2102 2165
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2144 " <INPUT type='text' id='firstname' value='John'/>" 2207 " <INPUT type='text' id='firstname' value='John'/>"
2145 " <INPUT type='text' id='lastname' value='Smith'/>" 2208 " <INPUT type='text' id='lastname' value='Smith'/>"
2146 " <INPUT type='text' id='email' value='john@example.com'/>" 2209 " <INPUT type='text' id='email' value='john@example.com'/>"
2147 " <INPUT type='submit' name='reply-send' value='Send'/>" 2210 " <INPUT type='submit' name='reply-send' value='Send'/>"
2148 "</FORM>"); 2211 "</FORM>");
2149 2212
2150 WebFrame* web_frame = GetMainFrame(); 2213 WebFrame* web_frame = GetMainFrame();
2151 ASSERT_NE(nullptr, web_frame); 2214 ASSERT_NE(nullptr, web_frame);
2152 2215
2153 FormCache form_cache(*web_frame); 2216 FormCache form_cache(*web_frame);
2154 std::vector<FormData> forms = form_cache.ExtractNewForms(); 2217 size_t unowned_form_index;
2218 std::vector<FormData> forms = form_cache.ExtractNewForms(&unowned_form_index);
2155 ASSERT_EQ(1U, forms.size()); 2219 ASSERT_EQ(1U, forms.size());
2220 EXPECT_EQ(1U, unowned_form_index);
2156 2221
2157 // Second call should give nothing as there are no new forms. 2222 // Second call should give nothing as there are no new forms.
2158 forms = form_cache.ExtractNewForms(); 2223 forms = form_cache.ExtractNewForms(&unowned_form_index);
2159 ASSERT_TRUE(forms.empty()); 2224 ASSERT_TRUE(forms.empty());
2225 EXPECT_EQ(0U, unowned_form_index);
2160 2226
2161 // Append to the current form will re-extract. 2227 // Append to the current form will re-extract.
2162 ExecuteJavaScript( 2228 ExecuteJavaScript(
2163 "var newInput = document.createElement('input');" 2229 "var newInput = document.createElement('input');"
2164 "newInput.setAttribute('type', 'text');" 2230 "newInput.setAttribute('type', 'text');"
2165 "newInput.setAttribute('id', 'telephone');" 2231 "newInput.setAttribute('id', 'telephone');"
2166 "newInput.value = '12345';" 2232 "newInput.value = '12345';"
2167 "document.getElementById('testform').appendChild(newInput);"); 2233 "document.getElementById('testform').appendChild(newInput);");
2168 msg_loop_.RunUntilIdle(); 2234 msg_loop_.RunUntilIdle();
2169 2235
2170 forms = form_cache.ExtractNewForms(); 2236 forms = form_cache.ExtractNewForms(&unowned_form_index);
2171 ASSERT_EQ(1U, forms.size()); 2237 ASSERT_EQ(1U, forms.size());
2238 EXPECT_EQ(1U, unowned_form_index);
2172 2239
2173 const std::vector<FormFieldData>& fields = forms[0].fields; 2240 const std::vector<FormFieldData>& fields = forms[0].fields;
2174 ASSERT_EQ(4U, fields.size()); 2241 ASSERT_EQ(4U, fields.size());
2175 2242
2176 FormFieldData expected; 2243 FormFieldData expected;
2177 expected.form_control_type = "text"; 2244 expected.form_control_type = "text";
2178 expected.max_length = WebInputElement::defaultMaxLength(); 2245 expected.max_length = WebInputElement::defaultMaxLength();
2179 2246
2180 expected.name = ASCIIToUTF16("firstname"); 2247 expected.name = ASCIIToUTF16("firstname");
2181 expected.value = ASCIIToUTF16("John"); 2248 expected.value = ASCIIToUTF16("John");
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2213 "newEmail.setAttribute('type', 'text');" 2280 "newEmail.setAttribute('type', 'text');"
2214 "newEmail.setAttribute('id', 'second_email');" 2281 "newEmail.setAttribute('id', 'second_email');"
2215 "newEmail.value = 'bobhope@example.com';" 2282 "newEmail.value = 'bobhope@example.com';"
2216 "newForm.appendChild(newFirstname);" 2283 "newForm.appendChild(newFirstname);"
2217 "newForm.appendChild(newLastname);" 2284 "newForm.appendChild(newLastname);"
2218 "newForm.appendChild(newEmail);" 2285 "newForm.appendChild(newEmail);"
2219 "document.body.appendChild(newForm);"); 2286 "document.body.appendChild(newForm);");
2220 msg_loop_.RunUntilIdle(); 2287 msg_loop_.RunUntilIdle();
2221 2288
2222 web_frame = GetMainFrame(); 2289 web_frame = GetMainFrame();
2223 forms = form_cache.ExtractNewForms(); 2290 forms = form_cache.ExtractNewForms(&unowned_form_index);
2224 ASSERT_EQ(1U, forms.size()); 2291 ASSERT_EQ(1U, forms.size());
2292 EXPECT_EQ(1U, unowned_form_index);
2225 2293
2226 const std::vector<FormFieldData>& fields2 = forms[0].fields; 2294 const std::vector<FormFieldData>& fields2 = forms[0].fields;
2227 ASSERT_EQ(3U, fields2.size()); 2295 ASSERT_EQ(3U, fields2.size());
2228 2296
2229 expected.name = ASCIIToUTF16("second_firstname"); 2297 expected.name = ASCIIToUTF16("second_firstname");
2230 expected.value = ASCIIToUTF16("Bob"); 2298 expected.value = ASCIIToUTF16("Bob");
2231 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); 2299 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]);
2232 2300
2233 expected.name = ASCIIToUTF16("second_lastname"); 2301 expected.name = ASCIIToUTF16("second_lastname");
2234 expected.value = ASCIIToUTF16("Hope"); 2302 expected.value = ASCIIToUTF16("Hope");
2235 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); 2303 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]);
2236 2304
2237 expected.name = ASCIIToUTF16("second_email"); 2305 expected.name = ASCIIToUTF16("second_email");
2238 expected.value = ASCIIToUTF16("bobhope@example.com"); 2306 expected.value = ASCIIToUTF16("bobhope@example.com");
2239 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 2307 EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]);
2240 } 2308 }
2241 2309
2242 // We should not extract a form if it has too few fillable fields. 2310 // We should not extract a form if it has too few fillable fields.
2243 TEST_F(FormAutofillTest, ExtractFormsTooFewFields) { 2311 TEST_F(FormAutofillTest, ExtractFormsTooFewFields) {
2244 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" 2312 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>"
2245 " <INPUT type='text' id='firstname' value='John'/>" 2313 " <INPUT type='text' id='firstname' value='John'/>"
2246 " <INPUT type='text' id='lastname' value='Smith'/>" 2314 " <INPUT type='text' id='lastname' value='Smith'/>"
2247 " <INPUT type='submit' name='reply-send' value='Send'/>" 2315 " <INPUT type='submit' name='reply-send' value='Send'/>"
2248 "</FORM>"); 2316 "</FORM>");
2249 2317
2250 WebFrame* web_frame = GetMainFrame(); 2318 WebFrame* web_frame = GetMainFrame();
2251 ASSERT_NE(nullptr, web_frame); 2319 ASSERT_NE(nullptr, web_frame);
2252 2320
2253 FormCache form_cache(*web_frame); 2321 FormCache form_cache(*web_frame);
2254 std::vector<FormData> forms = form_cache.ExtractNewForms(); 2322 size_t unowned_form_index;
2323 std::vector<FormData> forms = form_cache.ExtractNewForms(&unowned_form_index);
2255 ASSERT_TRUE(forms.empty()); 2324 ASSERT_TRUE(forms.empty());
2325 EXPECT_EQ(0U, unowned_form_index);
2256 } 2326 }
2257 2327
2258 // We should not report additional forms for empty forms. 2328 // We should not report additional forms for empty forms.
2259 TEST_F(FormAutofillTest, ExtractFormsSkippedForms) { 2329 TEST_F(FormAutofillTest, ExtractFormsSkippedForms) {
2260 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" 2330 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>"
2261 " <INPUT type='text' id='firstname' value='John'/>" 2331 " <INPUT type='text' id='firstname' value='John'/>"
2262 " <INPUT type='text' id='lastname' value='Smith'/>" 2332 " <INPUT type='text' id='lastname' value='Smith'/>"
2263 "</FORM>"); 2333 "</FORM>");
2264 2334
2265 WebFrame* web_frame = GetMainFrame(); 2335 WebFrame* web_frame = GetMainFrame();
2266 ASSERT_NE(nullptr, web_frame); 2336 ASSERT_NE(nullptr, web_frame);
2267 2337
2268 FormCache form_cache(*web_frame); 2338 FormCache form_cache(*web_frame);
2269 std::vector<FormData> forms = form_cache.ExtractNewForms(); 2339 size_t unowned_form_index;
2340 std::vector<FormData> forms = form_cache.ExtractNewForms(&unowned_form_index);
2270 ASSERT_TRUE(forms.empty()); 2341 ASSERT_TRUE(forms.empty());
2342 EXPECT_EQ(0U, unowned_form_index);
2271 } 2343 }
2272 2344
2273 // We should not report additional forms for empty forms. 2345 // We should not report additional forms for empty forms.
2274 TEST_F(FormAutofillTest, ExtractFormsNoFields) { 2346 TEST_F(FormAutofillTest, ExtractFormsNoFields) {
2275 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" 2347 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>"
2276 "</FORM>"); 2348 "</FORM>");
2277 2349
2278 WebFrame* web_frame = GetMainFrame(); 2350 WebFrame* web_frame = GetMainFrame();
2279 ASSERT_NE(nullptr, web_frame); 2351 ASSERT_NE(nullptr, web_frame);
2280 2352
2281 FormCache form_cache(*web_frame); 2353 FormCache form_cache(*web_frame);
2282 std::vector<FormData> forms = form_cache.ExtractNewForms(); 2354 size_t unowned_form_index;
2355 std::vector<FormData> forms = form_cache.ExtractNewForms(&unowned_form_index);
2283 ASSERT_TRUE(forms.empty()); 2356 ASSERT_TRUE(forms.empty());
2357 EXPECT_EQ(0U, unowned_form_index);
2284 } 2358 }
2285 2359
2286 // We should not extract a form if it has too few fillable fields. 2360 // We should not extract a form if it has too few fillable fields.
2287 // Make sure radio and checkbox fields don't count. 2361 // Make sure radio and checkbox fields don't count.
2288 TEST_F(FormAutofillTest, ExtractFormsTooFewFieldsSkipsCheckable) { 2362 TEST_F(FormAutofillTest, ExtractFormsTooFewFieldsSkipsCheckable) {
2289 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" 2363 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>"
2290 " <INPUT type='text' id='firstname' value='John'/>" 2364 " <INPUT type='text' id='firstname' value='John'/>"
2291 " <INPUT type='text' id='lastname' value='Smith'/>" 2365 " <INPUT type='text' id='lastname' value='Smith'/>"
2292 " <INPUT type='radio' id='a_radio' value='0'/>" 2366 " <INPUT type='radio' id='a_radio' value='0'/>"
2293 " <INPUT type='checkbox' id='a_check' value='1'/>" 2367 " <INPUT type='checkbox' id='a_check' value='1'/>"
2294 " <INPUT type='submit' name='reply-send' value='Send'/>" 2368 " <INPUT type='submit' name='reply-send' value='Send'/>"
2295 "</FORM>"); 2369 "</FORM>");
2296 2370
2297 WebFrame* web_frame = GetMainFrame(); 2371 WebFrame* web_frame = GetMainFrame();
2298 ASSERT_NE(nullptr, web_frame); 2372 ASSERT_NE(nullptr, web_frame);
2299 2373
2300 FormCache form_cache(*web_frame); 2374 FormCache form_cache(*web_frame);
2301 std::vector<FormData> forms = form_cache.ExtractNewForms(); 2375 size_t unowned_form_index;
2376 std::vector<FormData> forms = form_cache.ExtractNewForms(&unowned_form_index);
2302 ASSERT_TRUE(forms.empty()); 2377 ASSERT_TRUE(forms.empty());
2378 EXPECT_EQ(0U, unowned_form_index);
2303 } 2379 }
2304 2380
2305 TEST_F(FormAutofillTest, WebFormElementToFormDataAutocomplete) { 2381 TEST_F(FormAutofillTest, WebFormElementToFormDataAutocomplete) {
2306 { 2382 {
2307 // Form is not auto-completable due to autocomplete=off. 2383 // Form is not auto-completable due to autocomplete=off.
2308 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'" 2384 LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'"
2309 " autocomplete=off>" 2385 " autocomplete=off>"
2310 " <INPUT type='text' id='firstname' value='John'/>" 2386 " <INPUT type='text' id='firstname' value='John'/>"
2311 " <INPUT type='text' id='lastname' value='Smith'/>" 2387 " <INPUT type='text' id='lastname' value='Smith'/>"
2312 " <INPUT type='text' id='email' value='john@example.com'/>" 2388 " <INPUT type='text' id='email' value='john@example.com'/>"
(...skipping 1397 matching lines...) Expand 10 before | Expand all | Expand 10 after
3710 3786
3711 TEST_F(FormAutofillTest, ClearPreviewedFormWithElement) { 3787 TEST_F(FormAutofillTest, ClearPreviewedFormWithElement) {
3712 TestClearPreviewedFormWithElement( 3788 TestClearPreviewedFormWithElement(
3713 "<FORM name='TestForm' action='http://buh.com' method='post'>" 3789 "<FORM name='TestForm' action='http://buh.com' method='post'>"
3714 " <INPUT type='text' id='firstname' value='Wyatt'/>" 3790 " <INPUT type='text' id='firstname' value='Wyatt'/>"
3715 " <INPUT type='text' id='lastname'/>" 3791 " <INPUT type='text' id='lastname'/>"
3716 " <INPUT type='text' id='email'/>" 3792 " <INPUT type='text' id='email'/>"
3717 " <INPUT type='email' id='email2'/>" 3793 " <INPUT type='email' id='email2'/>"
3718 " <INPUT type='tel' id='phone'/>" 3794 " <INPUT type='tel' id='phone'/>"
3719 " <INPUT type='submit' value='Send'/>" 3795 " <INPUT type='submit' value='Send'/>"
3720 "</FORM>"); 3796 "</FORM>",
3797 false);
3721 } 3798 }
3722 3799
3723 TEST_F(FormAutofillTest, ClearPreviewedFormWithElementForUnownedForm) { 3800 TEST_F(FormAutofillTest, ClearPreviewedFormWithElementForUnownedForm) {
3724 TestClearPreviewedFormWithElement( 3801 TestClearPreviewedFormWithElement(
3725 "<INPUT type='text' id='firstname' value='Wyatt'/>" 3802 "<INPUT type='text' id='firstname' value='Wyatt'/>"
3726 "<INPUT type='text' id='lastname'/>" 3803 "<INPUT type='text' id='lastname'/>"
3727 "<INPUT type='text' id='email'/>" 3804 "<INPUT type='text' id='email'/>"
3728 "<INPUT type='email' id='email2'/>" 3805 "<INPUT type='email' id='email2'/>"
3729 "<INPUT type='tel' id='phone'/>" 3806 "<INPUT type='tel' id='phone'/>"
3730 "<INPUT type='submit' value='Send'/>"); 3807 "<INPUT type='submit' value='Send'/>",
3808 true);
3731 } 3809 }
3732 3810
3733 TEST_F(FormAutofillTest, ClearPreviewedFormWithNonEmptyInitiatingNode) { 3811 TEST_F(FormAutofillTest, ClearPreviewedFormWithNonEmptyInitiatingNode) {
3734 TestClearPreviewedFormWithNonEmptyInitiatingNode( 3812 TestClearPreviewedFormWithNonEmptyInitiatingNode(
3735 "<FORM name='TestForm' action='http://buh.com' method='post'>" 3813 "<FORM name='TestForm' action='http://buh.com' method='post'>"
3736 " <INPUT type='text' id='firstname' value='W'/>" 3814 " <INPUT type='text' id='firstname' value='W'/>"
3737 " <INPUT type='text' id='lastname'/>" 3815 " <INPUT type='text' id='lastname'/>"
3738 " <INPUT type='text' id='email'/>" 3816 " <INPUT type='text' id='email'/>"
3739 " <INPUT type='email' id='email2'/>" 3817 " <INPUT type='email' id='email2'/>"
3740 " <INPUT type='tel' id='phone'/>" 3818 " <INPUT type='tel' id='phone'/>"
3741 " <INPUT type='submit' value='Send'/>" 3819 " <INPUT type='submit' value='Send'/>"
3742 "</FORM>"); 3820 "</FORM>",
3821 false);
3743 } 3822 }
3744 3823
3745 TEST_F(FormAutofillTest, 3824 TEST_F(FormAutofillTest,
3746 ClearPreviewedFormWithNonEmptyInitiatingNodeForUnownedForm) { 3825 ClearPreviewedFormWithNonEmptyInitiatingNodeForUnownedForm) {
3747 TestClearPreviewedFormWithNonEmptyInitiatingNode( 3826 TestClearPreviewedFormWithNonEmptyInitiatingNode(
3748 "<INPUT type='text' id='firstname' value='W'/>" 3827 "<INPUT type='text' id='firstname' value='W'/>"
3749 "<INPUT type='text' id='lastname'/>" 3828 "<INPUT type='text' id='lastname'/>"
3750 "<INPUT type='text' id='email'/>" 3829 "<INPUT type='text' id='email'/>"
3751 "<INPUT type='email' id='email2'/>" 3830 "<INPUT type='email' id='email2'/>"
3752 "<INPUT type='tel' id='phone'/>" 3831 "<INPUT type='tel' id='phone'/>"
3753 "<INPUT type='submit' value='Send'/>"); 3832 "<INPUT type='submit' value='Send'/>",
3833 true);
3754 } 3834 }
3755 3835
3756 TEST_F(FormAutofillTest, ClearPreviewedFormWithAutofilledInitiatingNode) { 3836 TEST_F(FormAutofillTest, ClearPreviewedFormWithAutofilledInitiatingNode) {
3757 TestClearPreviewedFormWithAutofilledInitiatingNode( 3837 TestClearPreviewedFormWithAutofilledInitiatingNode(
3758 "<FORM name='TestForm' action='http://buh.com' method='post'>" 3838 "<FORM name='TestForm' action='http://buh.com' method='post'>"
3759 " <INPUT type='text' id='firstname' value='W'/>" 3839 " <INPUT type='text' id='firstname' value='W'/>"
3760 " <INPUT type='text' id='lastname'/>" 3840 " <INPUT type='text' id='lastname'/>"
3761 " <INPUT type='text' id='email'/>" 3841 " <INPUT type='text' id='email'/>"
3762 " <INPUT type='email' id='email2'/>" 3842 " <INPUT type='email' id='email2'/>"
3763 " <INPUT type='tel' id='phone'/>" 3843 " <INPUT type='tel' id='phone'/>"
3764 " <INPUT type='submit' value='Send'/>" 3844 " <INPUT type='submit' value='Send'/>"
3765 "</FORM>"); 3845 "</FORM>",
3846 false);
3766 } 3847 }
3767 3848
3768 TEST_F(FormAutofillTest, 3849 TEST_F(FormAutofillTest,
3769 ClearPreviewedFormWithAutofilledInitiatingNodeForUnownedForm) { 3850 ClearPreviewedFormWithAutofilledInitiatingNodeForUnownedForm) {
3770 TestClearPreviewedFormWithAutofilledInitiatingNode( 3851 TestClearPreviewedFormWithAutofilledInitiatingNode(
3771 "<INPUT type='text' id='firstname' value='W'/>" 3852 "<INPUT type='text' id='firstname' value='W'/>"
3772 "<INPUT type='text' id='lastname'/>" 3853 "<INPUT type='text' id='lastname'/>"
3773 "<INPUT type='text' id='email'/>" 3854 "<INPUT type='text' id='email'/>"
3774 "<INPUT type='email' id='email2'/>" 3855 "<INPUT type='email' id='email2'/>"
3775 "<INPUT type='tel' id='phone'/>" 3856 "<INPUT type='tel' id='phone'/>"
3776 "<INPUT type='submit' value='Send'/>"); 3857 "<INPUT type='submit' value='Send'/>",
3858 true);
3777 } 3859 }
3778 3860
3779 // Autofill's "Clear Form" should clear only autofilled fields 3861 // Autofill's "Clear Form" should clear only autofilled fields
3780 TEST_F(FormAutofillTest, ClearOnlyAutofilledFields) { 3862 TEST_F(FormAutofillTest, ClearOnlyAutofilledFields) {
3781 TestClearOnlyAutofilledFields( 3863 TestClearOnlyAutofilledFields(
3782 "<FORM name='TestForm' action='http://buh.com' method='post'>" 3864 "<FORM name='TestForm' action='http://buh.com' method='post'>"
3783 " <INPUT type='text' id='firstname' value='Wyatt'/>" 3865 " <INPUT type='text' id='firstname' value='Wyatt'/>"
3784 " <INPUT type='text' id='lastname' value='Earp'/>" 3866 " <INPUT type='text' id='lastname' value='Earp'/>"
3785 " <INPUT type='email' id='email' value='wyatt@earp.com'/>" 3867 " <INPUT type='email' id='email' value='wyatt@earp.com'/>"
3786 " <INPUT type='tel' id='phone' value='650-777-9999'/>" 3868 " <INPUT type='tel' id='phone' value='650-777-9999'/>"
3787 " <INPUT type='submit' value='Send'/>" 3869 " <INPUT type='submit' value='Send'/>"
3788 "</FORM>"); 3870 "</FORM>",
3871 false);
3789 } 3872 }
3790 3873
3791 TEST_F(FormAutofillTest, ClearOnlyAutofilledFieldsForUnownedForm) { 3874 TEST_F(FormAutofillTest, ClearOnlyAutofilledFieldsForUnownedForm) {
3792 TestClearOnlyAutofilledFields( 3875 TestClearOnlyAutofilledFields(
3793 "<INPUT type='text' id='firstname' value='Wyatt'/>" 3876 "<INPUT type='text' id='firstname' value='Wyatt'/>"
3794 "<INPUT type='text' id='lastname' value='Earp'/>" 3877 "<INPUT type='text' id='lastname' value='Earp'/>"
3795 "<INPUT type='email' id='email' value='wyatt@earp.com'/>" 3878 "<INPUT type='email' id='email' value='wyatt@earp.com'/>"
3796 "<INPUT type='tel' id='phone' value='650-777-9999'/>" 3879 "<INPUT type='tel' id='phone' value='650-777-9999'/>"
3797 "<INPUT type='submit' value='Send'/>"); 3880 "<INPUT type='submit' value='Send'/>",
3881 true);
3798 } 3882 }
3799 3883
3800 // If we have multiple labels per id, the labels concatenated into label string. 3884 // If we have multiple labels per id, the labels concatenated into label string.
3801 TEST_F(FormAutofillTest, MultipleLabelsPerElement) { 3885 TEST_F(FormAutofillTest, MultipleLabelsPerElement) {
3802 std::vector<base::string16> labels, names, values; 3886 std::vector<base::string16> labels, names, values;
3803 3887
3804 labels.push_back(ASCIIToUTF16("First Name:")); 3888 labels.push_back(ASCIIToUTF16("First Name:"));
3805 names.push_back(ASCIIToUTF16("firstname")); 3889 names.push_back(ASCIIToUTF16("firstname"));
3806 values.push_back(ASCIIToUTF16("John")); 3890 values.push_back(ASCIIToUTF16("John"));
3807 3891
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
4086 ASSERT_TRUE(control_elements.empty()); 4170 ASSERT_TRUE(control_elements.empty());
4087 ASSERT_TRUE(fieldsets.empty()); 4171 ASSERT_TRUE(fieldsets.empty());
4088 4172
4089 FormData form; 4173 FormData form;
4090 EXPECT_FALSE(UnownedFormElementsAndFieldSetsToFormData( 4174 EXPECT_FALSE(UnownedFormElementsAndFieldSetsToFormData(
4091 fieldsets, control_elements, nullptr, dummy_origin, REQUIRE_NONE, 4175 fieldsets, control_elements, nullptr, dummy_origin, REQUIRE_NONE,
4092 extract_mask, &form, nullptr)); 4176 extract_mask, &form, nullptr));
4093 } 4177 }
4094 4178
4095 } // namespace autofill 4179 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698