Chromium Code Reviews| Index: chrome/renderer/autofill/form_autofill_browsertest.cc |
| diff --git a/chrome/renderer/autofill/form_autofill_browsertest.cc b/chrome/renderer/autofill/form_autofill_browsertest.cc |
| index f8ff9c54705ac49835dfa6316375d76235f16a88..da57a1cb6d9dc1b53a2c451204ca3aade6cf9c1b 100644 |
| --- a/chrome/renderer/autofill/form_autofill_browsertest.cc |
| +++ b/chrome/renderer/autofill/form_autofill_browsertest.cc |
| @@ -117,7 +117,7 @@ class FormAutofillTest : public ChromeRenderViewTest { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| ASSERT_EQ(1U, forms.size()); |
| const FormData& form = forms[0]; |
| @@ -177,7 +177,7 @@ class FormAutofillTest : public ChromeRenderViewTest { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| ASSERT_EQ(1U, forms.size()); |
| // Get the input element we want to find. |
| @@ -805,7 +805,7 @@ TEST_F(FormAutofillTest, ExtractMultipleForms) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| ASSERT_EQ(2U, forms.size()); |
| // First form. |
| @@ -855,6 +855,109 @@ TEST_F(FormAutofillTest, ExtractMultipleForms) { |
| EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); |
| } |
| +TEST_F(FormAutofillTest, OnlyExtractNewForms) { |
| + LoadHTML( |
| + "<FORM id='testform' action='http://cnn.com' method='post'>" |
| + " <INPUT type='text' id='firstname' value='John'/>" |
| + " <INPUT type='text' id='lastname' value='Smith'/>" |
| + " <INPUT type='text' id='email' value='john@example.com'/>" |
| + " <INPUT type='submit' name='reply-send' value='Send'/>" |
| + "</FORM>"); |
| + |
| + WebFrame* web_frame = GetMainFrame(); |
| + ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); |
| + |
| + FormCache form_cache; |
| + std::vector<FormData> forms; |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| + ASSERT_EQ(1U, forms.size()); |
| + forms.clear(); |
| + |
| + // Second call should give nothing as there are no new forms. |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| + ASSERT_EQ(0U, forms.size()); |
| + |
| + // Append to the current form will re-extract. |
| + ExecuteJavaScript( |
| + "var newInput=document.createElement('input');" |
|
Ilya Sherman
2014/04/23 05:51:36
nit: Please add spaces around the equals sign.
Garrett Casto
2014/04/23 21:51:14
Done.
|
| + "newInput.setAttribute('type', 'text');" |
| + "newInput.setAttribute('id', 'telephone');" |
| + "newInput.value = '12345';" |
| + "document.getElementById('testform').appendChild(newInput);"); |
| + msg_loop_.RunUntilIdle(); |
| + |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| + ASSERT_EQ(1U, forms.size()); |
| + |
| + const std::vector<FormFieldData>& fields = forms[0].fields; |
| + ASSERT_EQ(4U, fields.size()); |
| + |
| + FormFieldData expected; |
| + expected.form_control_type = "text"; |
| + expected.max_length = WebInputElement::defaultMaxLength(); |
| + |
| + expected.name = ASCIIToUTF16("firstname"); |
| + expected.value = ASCIIToUTF16("John"); |
| + EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); |
| + |
| + expected.name = ASCIIToUTF16("lastname"); |
| + expected.value = ASCIIToUTF16("Smith"); |
| + EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); |
| + |
| + expected.name = ASCIIToUTF16("email"); |
| + expected.value = ASCIIToUTF16("john@example.com"); |
| + EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); |
| + |
| + expected.name = ASCIIToUTF16("telephone"); |
| + expected.value = ASCIIToUTF16("12345"); |
| + EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); |
| + |
| + forms.clear(); |
| + |
| + // Completely new form will also be extracted. |
| + ExecuteJavaScript( |
| + "var newForm=document.createElement('form');" |
| + "newForm.id='new_testform';" |
| + "newForm.action='http://google.com';" |
| + "newForm.method='post';" |
| + "var newFirstname=document.createElement('input');" |
| + "newFirstname.setAttribute('type', 'text');" |
| + "newFirstname.setAttribute('id', 'second_firstname');" |
| + "newFirstname.value = 'Bob';" |
| + "var newLastname=document.createElement('input');" |
| + "newLastname.setAttribute('type', 'text');" |
| + "newLastname.setAttribute('id', 'second_lastname');" |
| + "newLastname.value = 'Hope';" |
| + "var newEmail=document.createElement('input');" |
| + "newEmail.setAttribute('type', 'text');" |
| + "newEmail.setAttribute('id', 'second_email');" |
| + "newEmail.value = 'bobhope@example.com';" |
| + "newForm.appendChild(newFirstname);" |
| + "newForm.appendChild(newLastname);" |
| + "newForm.appendChild(newEmail);" |
| + "document.body.appendChild(newForm);"); |
| + msg_loop_.RunUntilIdle(); |
| + |
| + web_frame = GetMainFrame(); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| + ASSERT_EQ(1U, forms.size()); |
| + |
| + const std::vector<FormFieldData>& fields2 = forms[0].fields; |
| + ASSERT_EQ(3U, fields2.size()); |
| + |
| + expected.name = ASCIIToUTF16("second_firstname"); |
| + expected.value = ASCIIToUTF16("Bob"); |
| + EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); |
| + |
| + expected.name = ASCIIToUTF16("second_lastname"); |
| + expected.value = ASCIIToUTF16("Hope"); |
| + EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); |
| + |
| + expected.name = ASCIIToUTF16("second_email"); |
| + expected.value = ASCIIToUTF16("bobhope@example.com"); |
| + EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); |
| +} |
| + |
| // We should not extract a form if it has too few fillable fields. |
| TEST_F(FormAutofillTest, ExtractFormsTooFewFields) { |
| LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" |
| @@ -868,7 +971,7 @@ TEST_F(FormAutofillTest, ExtractFormsTooFewFields) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| EXPECT_EQ(0U, forms.size()); |
| } |
| @@ -884,12 +987,8 @@ TEST_F(FormAutofillTest, ExtractFormsSkippedForms) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - bool has_skipped_forms = form_cache.ExtractFormsAndFormElements(*web_frame, |
| - 3, |
| - &forms, |
| - NULL); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| EXPECT_EQ(0U, forms.size()); |
| - EXPECT_TRUE(has_skipped_forms); |
| } |
| // We should not report additional forms for empty forms. |
| @@ -902,12 +1001,8 @@ TEST_F(FormAutofillTest, ExtractFormsNoFields) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - bool has_skipped_forms = form_cache.ExtractFormsAndFormElements(*web_frame, |
| - 3, |
| - &forms, |
| - NULL); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| EXPECT_EQ(0U, forms.size()); |
| - EXPECT_FALSE(has_skipped_forms); |
| } |
| // We should not extract a form if it has too few fillable fields. |
| @@ -926,7 +1021,7 @@ TEST_F(FormAutofillTest, ExtractFormsTooFewFieldsSkipsCheckable) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| EXPECT_EQ(0U, forms.size()); |
| } |
| @@ -1023,7 +1118,7 @@ TEST_F(FormAutofillTest, FindFormForInputElement) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| ASSERT_EQ(1U, forms.size()); |
| // Get the input element we want to find. |
| @@ -1117,7 +1212,7 @@ TEST_F(FormAutofillTest, FindFormForTextAreaElement) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| ASSERT_EQ(1U, forms.size()); |
| // Get the textarea element we want to find. |
| @@ -2214,7 +2309,7 @@ TEST_F(FormAutofillTest, FillFormMaxLength) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| ASSERT_EQ(1U, forms.size()); |
| // Get the input element we want to find. |
| @@ -2311,7 +2406,7 @@ TEST_F(FormAutofillTest, FillFormNegativeMaxLength) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| ASSERT_EQ(1U, forms.size()); |
| // Get the input element we want to find. |
| @@ -2392,7 +2487,7 @@ TEST_F(FormAutofillTest, FillFormEmptyName) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| ASSERT_EQ(1U, forms.size()); |
| // Get the input element we want to find. |
| @@ -2482,7 +2577,7 @@ TEST_F(FormAutofillTest, FillFormEmptyFormNames) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| ASSERT_EQ(2U, forms.size()); |
| // Get the input element we want to find. |
| @@ -2702,7 +2797,7 @@ TEST_F(FormAutofillTest, FillFormNonEmptyField) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| ASSERT_EQ(1U, forms.size()); |
| // Get the input element we want to find. |
| @@ -2814,7 +2909,7 @@ TEST_F(FormAutofillTest, ClearFormWithNode) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| ASSERT_EQ(1U, forms.size()); |
| // Set the auto-filled attribute on the firstname element. |
| @@ -2918,7 +3013,7 @@ TEST_F(FormAutofillTest, ClearFormWithNodeContainingSelectOne) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| ASSERT_EQ(1U, forms.size()); |
| // Set the auto-filled attribute on the firstname element. |
| @@ -2991,7 +3086,7 @@ TEST_F(FormAutofillTest, ClearPreviewedFormWithElement) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| ASSERT_EQ(1U, forms.size()); |
| // Set the auto-filled attribute. |
| @@ -3059,7 +3154,7 @@ TEST_F(FormAutofillTest, ClearPreviewedFormWithNonEmptyInitiatingNode) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| ASSERT_EQ(1U, forms.size()); |
| // Set the auto-filled attribute. |
| @@ -3127,7 +3222,7 @@ TEST_F(FormAutofillTest, ClearPreviewedFormWithAutofilledInitiatingNode) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| ASSERT_EQ(1U, forms.size()); |
| // Set the auto-filled attribute. |
| @@ -3194,7 +3289,7 @@ TEST_F(FormAutofillTest, FormWithNodeIsAutofilled) { |
| FormCache form_cache; |
| std::vector<FormData> forms; |
| - form_cache.ExtractForms(*web_frame, &forms); |
| + form_cache.ExtractNewForms(*web_frame, &forms); |
| ASSERT_EQ(1U, forms.size()); |
| WebInputElement firstname = |