Chromium Code Reviews| Index: components/autofill/content/renderer/password_form_conversion_utils_browsertest.cc |
| diff --git a/components/autofill/content/renderer/password_form_conversion_utils_browsertest.cc b/components/autofill/content/renderer/password_form_conversion_utils_browsertest.cc |
| index 46969b4e4775c8e99197c9d69081c6852f049b9e..aafa07d79494780877da3615c95d749873f9f97f 100644 |
| --- a/components/autofill/content/renderer/password_form_conversion_utils_browsertest.cc |
| +++ b/components/autofill/content/renderer/password_form_conversion_utils_browsertest.cc |
| @@ -49,7 +49,7 @@ class PasswordFormBuilder { |
| // Appends a new text-type field at the end of the form, having the specified |
| // |name_and_id|, |value|, and |autocomplete| attributes. The |autocomplete| |
| // argument can take two special values, namely: |
| - // 1.) NULL, causing no autocomplete attribute to be added, |
| + // 1.) nullptr, causing no autocomplete attribute to be added, |
| // 2.) "", causing an empty attribute (i.e. autocomplete="") to be added. |
| void AddTextField(const char* name_and_id, |
| const char* value, |
| @@ -168,23 +168,28 @@ class MAYBE_PasswordFormConversionUtilsTest : public content::RenderViewTest { |
| protected: |
| // Loads the given |html|, retrieves the sole WebFormElement from it, and then |
| // calls CreatePasswordForm(), passing it the |predictions| to convert it into |
| - // a |password_form|. Note that ASSERT() can only be used in void functions, |
| - // this is why |password_form| is passed in as a pointer to a scoped_ptr. |
| - void LoadHTMLAndConvertForm(const std::string& html, |
| - std::unique_ptr<PasswordForm>* password_form, |
| - FormsPredictionsMap* predictions) { |
| + // a |password_form|. If |with_user_input| == true it's considered that all |
|
vabr (Chromium)
2016/04/07 12:03:45
nit: There is no longer |password_form|, please up
dvadym
2016/04/07 14:53:22
Done.
|
| + // values in the form elements came from the user input. |
| + std::unique_ptr<PasswordForm> LoadHTMLAndConvertForm( |
| + const std::string& html, |
| + FormsPredictionsMap* predictions, |
| + bool with_user_input) { |
| WebFormElement form; |
| LoadWebFormFromHTML(html, &form); |
| WebVector<WebFormControlElement> control_elements; |
| form.getFormControlElements(control_elements); |
| + ModifiedValues user_input; |
| for (size_t i = 0; i < control_elements.size(); ++i) { |
| WebInputElement* input_element = toWebInputElement(&control_elements[i]); |
| if (input_element->hasAttribute("set-activated-submit")) |
| input_element->setActivatedSubmit(true); |
| + if (with_user_input) |
| + user_input[*input_element] = input_element->value(); |
| } |
| - *password_form = CreatePasswordFormFromWebForm(form, nullptr, predictions); |
| + return CreatePasswordFormFromWebForm( |
| + form, with_user_input ? &user_input : nullptr, predictions); |
| } |
| // Iterates on the form generated by the |html| and adds the fields and type |
| @@ -237,16 +242,15 @@ class MAYBE_PasswordFormConversionUtilsTest : public content::RenderViewTest { |
| TEST_F(MAYBE_PasswordFormConversionUtilsTest, BasicFormAttributes) { |
| PasswordFormBuilder builder(kTestFormActionURL); |
| - builder.AddTextField("username", "johnsmith", NULL); |
| + builder.AddTextField("username", "johnsmith", nullptr); |
| builder.AddSubmitButton("inactive_submit"); |
| builder.AddSubmitButton("active_submit"); |
| builder.AddSubmitButton("inactive_submit2"); |
| - builder.AddPasswordField("password", "secret", NULL); |
| + builder.AddPasswordField("password", "secret", nullptr); |
| std::string html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> password_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(html, &password_form, nullptr)); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| ASSERT_TRUE(password_form); |
| EXPECT_EQ("data:", password_form->signon_realm); |
| @@ -264,16 +268,15 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, BasicFormAttributes) { |
| TEST_F(MAYBE_PasswordFormConversionUtilsTest, DisabledFieldsAreIgnored) { |
| PasswordFormBuilder builder(kTestFormActionURL); |
| - builder.AddTextField("username", "johnsmith", NULL); |
| + builder.AddTextField("username", "johnsmith", nullptr); |
| builder.AddDisabledUsernameField(); |
| builder.AddDisabledPasswordField(); |
| - builder.AddPasswordField("password", "secret", NULL); |
| + builder.AddPasswordField("password", "secret", nullptr); |
| builder.AddSubmitButton("submit"); |
| std::string html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> password_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(html, &password_form, nullptr)); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| ASSERT_TRUE(password_form); |
| EXPECT_EQ(base::UTF8ToUTF16("username"), password_form->username_element); |
| EXPECT_EQ(base::UTF8ToUTF16("johnsmith"), password_form->username_value); |
| @@ -293,18 +296,20 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, IdentifyingUsernameFields) { |
| // When no elements are marked with autocomplete='username', the text-type |
| // input field before the first password element should get selected as |
| // the username, and the rest should be marked as alternatives. |
| - {{NULL, NULL, NULL}, "username2", "William", "John+Smith"}, |
| + {{nullptr, nullptr, nullptr}, "username2", "William", "John+Smith"}, |
| // When a sole element is marked with autocomplete='username', it should |
| // be treated as the username for sure, with no other_possible_usernames. |
| - {{"username", NULL, NULL}, "username1", "John", ""}, |
| - {{NULL, "username", NULL}, "username2", "William", ""}, |
| - {{NULL, NULL, "username"}, "username3", "Smith", ""}, |
| + {{"username", nullptr, nullptr}, "username1", "John", ""}, |
| + {{nullptr, "username", nullptr}, "username2", "William", ""}, |
| + {{nullptr, nullptr, "username"}, "username3", "Smith", ""}, |
| // When >=2 elements have the attribute, the first should be selected as |
| // the username, and the rest should go to other_possible_usernames. |
| - {{"username", "username", NULL}, "username1", "John", "William"}, |
| - {{NULL, "username", "username"}, "username2", "William", "Smith"}, |
| - {{"username", NULL, "username"}, "username1", "John", "Smith"}, |
| - {{"username", "username", "username"}, "username1", "John", |
| + {{"username", "username", nullptr}, "username1", "John", "William"}, |
| + {{nullptr, "username", "username"}, "username2", "William", "Smith"}, |
| + {{"username", nullptr, "username"}, "username1", "John", "Smith"}, |
| + {{"username", "username", "username"}, |
| + "username1", |
| + "John", |
| "William+Smith"}, |
| // When there is an empty autocomplete attribute (i.e. autocomplete=""), |
| // it should have the same effect as having no attribute whatsoever. |
| @@ -312,8 +317,8 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, IdentifyingUsernameFields) { |
| {{"", "", "username"}, "username3", "Smith", ""}, |
| {{"username", "", "username"}, "username1", "John", "Smith"}, |
| // It should not matter if attribute values are upper or mixed case. |
| - {{"USERNAME", NULL, "uSeRNaMe"}, "username1", "John", "Smith"}, |
| - {{"uSeRNaMe", NULL, "USERNAME"}, "username1", "John", "Smith"}}; |
| + {{"USERNAME", nullptr, "uSeRNaMe"}, "username1", "John", "Smith"}, |
| + {{"uSeRNaMe", nullptr, "USERNAME"}, "username1", "John", "Smith"}}; |
| for (size_t i = 0; i < arraysize(cases); ++i) { |
| for (size_t nonempty_username_fields = 0; nonempty_username_fields < 2; |
| @@ -336,15 +341,14 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, IdentifyingUsernameFields) { |
| PasswordFormBuilder builder(kTestFormActionURL); |
| builder.AddTextField("username1", names[0], cases[i].autocomplete[0]); |
| builder.AddTextField("username2", names[1], cases[i].autocomplete[1]); |
| - builder.AddPasswordField("password", "secret", NULL); |
| + builder.AddPasswordField("password", "secret", nullptr); |
| builder.AddTextField("username3", names[2], cases[i].autocomplete[2]); |
| - builder.AddPasswordField("password2", "othersecret", NULL); |
| + builder.AddPasswordField("password2", "othersecret", nullptr); |
| builder.AddSubmitButton("submit"); |
| std::string html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> password_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(html, &password_form, nullptr)); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| ASSERT_TRUE(password_form); |
| EXPECT_EQ(base::UTF8ToUTF16(cases[i].expected_username_element), |
| @@ -395,16 +399,15 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, IdentifyingTwoPasswordFields) { |
| SCOPED_TRACE(testing::Message() << "Iteration " << i); |
| PasswordFormBuilder builder(kTestFormActionURL); |
| - builder.AddTextField("username1", "William", NULL); |
| - builder.AddPasswordField("password1", cases[i].password_values[0], NULL); |
| - builder.AddTextField("username2", "Smith", NULL); |
| - builder.AddPasswordField("password2", cases[i].password_values[1], NULL); |
| + builder.AddTextField("username1", "William", nullptr); |
| + builder.AddPasswordField("password1", cases[i].password_values[0], nullptr); |
| + builder.AddTextField("username2", "Smith", nullptr); |
| + builder.AddPasswordField("password2", cases[i].password_values[1], nullptr); |
| builder.AddSubmitButton("submit"); |
| std::string html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> password_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(html, &password_form, nullptr)); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| ASSERT_TRUE(password_form); |
| EXPECT_EQ(base::UTF8ToUTF16(cases[i].expected_password_element), |
| @@ -456,17 +459,16 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, IdentifyingThreePasswordFields) { |
| SCOPED_TRACE(testing::Message() << "Iteration " << i); |
| PasswordFormBuilder builder(kTestFormActionURL); |
| - builder.AddTextField("username1", "William", NULL); |
| - builder.AddPasswordField("password1", cases[i].password_values[0], NULL); |
| - builder.AddPasswordField("password2", cases[i].password_values[1], NULL); |
| - builder.AddTextField("username2", "Smith", NULL); |
| - builder.AddPasswordField("password3", cases[i].password_values[2], NULL); |
| + builder.AddTextField("username1", "William", nullptr); |
| + builder.AddPasswordField("password1", cases[i].password_values[0], nullptr); |
| + builder.AddPasswordField("password2", cases[i].password_values[1], nullptr); |
| + builder.AddTextField("username2", "Smith", nullptr); |
| + builder.AddPasswordField("password3", cases[i].password_values[2], nullptr); |
| builder.AddSubmitButton("submit"); |
| std::string html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> password_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(html, &password_form, nullptr)); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| ASSERT_TRUE(password_form); |
| EXPECT_EQ(base::UTF8ToUTF16(cases[i].expected_password_element), |
| @@ -509,105 +511,320 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| // Username is the element just before the first 'current-password' (even |
| // if 'new-password' comes earlier). If no 'current-password', then the |
| // element just before the first 'new-passwords'. |
| - {{"current-password", NULL, NULL}, |
| - "password1", "alpha", "", "", false, "username1", "William"}, |
| - {{NULL, "current-password", NULL}, |
| - "password2", "beta", "", "", false, "username2", "Smith"}, |
| - {{NULL, NULL, "current-password"}, |
| - "password3", "gamma", "", "", false, "username2", "Smith"}, |
| - {{NULL, "current-password", "current-password"}, |
| - "password2", "beta", "", "", false, "username2", "Smith"}, |
| - {{"current-password", NULL, "current-password"}, |
| - "password1", "alpha", "", "", false, "username1", "William"}, |
| - {{"current-password", "current-password", NULL}, |
| - "password1", "alpha", "", "", false, "username1", "William"}, |
| + {{"current-password", nullptr, nullptr}, |
| + "password1", |
| + "alpha", |
| + "", |
| + "", |
| + false, |
| + "username1", |
| + "William"}, |
| + {{nullptr, "current-password", nullptr}, |
| + "password2", |
| + "beta", |
| + "", |
| + "", |
| + false, |
| + "username2", |
| + "Smith"}, |
| + {{nullptr, nullptr, "current-password"}, |
| + "password3", |
| + "gamma", |
| + "", |
| + "", |
| + false, |
| + "username2", |
| + "Smith"}, |
| + {{nullptr, "current-password", "current-password"}, |
| + "password2", |
| + "beta", |
| + "", |
| + "", |
| + false, |
| + "username2", |
| + "Smith"}, |
| + {{"current-password", nullptr, "current-password"}, |
| + "password1", |
| + "alpha", |
| + "", |
| + "", |
| + false, |
| + "username1", |
| + "William"}, |
| + {{"current-password", "current-password", nullptr}, |
| + "password1", |
| + "alpha", |
| + "", |
| + "", |
| + false, |
| + "username1", |
| + "William"}, |
| {{"current-password", "current-password", "current-password"}, |
| - "password1", "alpha", "", "", false, "username1", "William"}, |
| + "password1", |
| + "alpha", |
| + "", |
| + "", |
| + false, |
| + "username1", |
| + "William"}, |
| // The same goes vice versa for autocomplete='new-password'. |
| - {{"new-password", NULL, NULL}, |
| - "", "", "password1", "alpha", true, "username1", "William"}, |
| - {{NULL, "new-password", NULL}, |
| - "", "", "password2", "beta", true, "username2", "Smith"}, |
| - {{NULL, NULL, "new-password"}, |
| - "", "", "password3", "gamma", true, "username2", "Smith"}, |
| - {{NULL, "new-password", "new-password"}, |
| - "", "", "password2", "beta", true, "username2", "Smith"}, |
| - {{"new-password", NULL, "new-password"}, |
| - "", "", "password1", "alpha", true, "username1", "William"}, |
| - {{"new-password", "new-password", NULL}, |
| - "", "", "password1", "alpha", true, "username1", "William"}, |
| + {{"new-password", nullptr, nullptr}, |
| + "", |
| + "", |
| + "password1", |
| + "alpha", |
| + true, |
| + "username1", |
| + "William"}, |
| + {{nullptr, "new-password", nullptr}, |
| + "", |
| + "", |
| + "password2", |
| + "beta", |
| + true, |
| + "username2", |
| + "Smith"}, |
| + {{nullptr, nullptr, "new-password"}, |
| + "", |
| + "", |
| + "password3", |
| + "gamma", |
| + true, |
| + "username2", |
| + "Smith"}, |
| + {{nullptr, "new-password", "new-password"}, |
| + "", |
| + "", |
| + "password2", |
| + "beta", |
| + true, |
| + "username2", |
| + "Smith"}, |
| + {{"new-password", nullptr, "new-password"}, |
| + "", |
| + "", |
| + "password1", |
| + "alpha", |
| + true, |
| + "username1", |
| + "William"}, |
| + {{"new-password", "new-password", nullptr}, |
| + "", |
| + "", |
| + "password1", |
| + "alpha", |
| + true, |
| + "username1", |
| + "William"}, |
| {{"new-password", "new-password", "new-password"}, |
| - "", "", "password1", "alpha", true, "username1", "William"}, |
| + "", |
| + "", |
| + "password1", |
| + "alpha", |
| + true, |
| + "username1", |
| + "William"}, |
| // When there is one element marked with autocomplete='current-password', |
| // and one with 'new-password', just comply. Ignore the unmarked password |
| // field(s) for the same reason as above. |
| - {{"current-password", "new-password", NULL}, |
| - "password1", "alpha", "password2", "beta", true, "username1", "William"}, |
| - {{"current-password", NULL, "new-password"}, |
| - "password1", "alpha", "password3", "gamma", true, "username1","William"}, |
| - {{NULL, "current-password", "new-password"}, |
| - "password2", "beta", "password3", "gamma", true, "username2", "Smith"}, |
| - {{"new-password", "current-password", NULL}, |
| - "password2", "beta", "password1", "alpha", true, "username2", "Smith"}, |
| - {{"new-password", NULL, "current-password"}, |
| - "password3", "gamma", "password1", "alpha", true, "username2","Smith"}, |
| - {{NULL, "new-password", "current-password"}, |
| - "password3", "gamma", "password2", "beta", true, "username2", "Smith"}, |
| + {{"current-password", "new-password", nullptr}, |
| + "password1", |
| + "alpha", |
| + "password2", |
| + "beta", |
| + true, |
| + "username1", |
| + "William"}, |
| + {{"current-password", nullptr, "new-password"}, |
| + "password1", |
| + "alpha", |
| + "password3", |
| + "gamma", |
| + true, |
| + "username1", |
| + "William"}, |
| + {{nullptr, "current-password", "new-password"}, |
| + "password2", |
| + "beta", |
| + "password3", |
| + "gamma", |
| + true, |
| + "username2", |
| + "Smith"}, |
| + {{"new-password", "current-password", nullptr}, |
| + "password2", |
| + "beta", |
| + "password1", |
| + "alpha", |
| + true, |
| + "username2", |
| + "Smith"}, |
| + {{"new-password", nullptr, "current-password"}, |
| + "password3", |
| + "gamma", |
| + "password1", |
| + "alpha", |
| + true, |
| + "username2", |
| + "Smith"}, |
| + {{nullptr, "new-password", "current-password"}, |
| + "password3", |
| + "gamma", |
| + "password2", |
| + "beta", |
| + true, |
| + "username2", |
| + "Smith"}, |
| // In case of duplicated elements of either kind, go with the first one of |
| // its kind. |
| {{"current-password", "current-password", "new-password"}, |
| - "password1", "alpha", "password3", "gamma", true, "username1","William"}, |
| + "password1", |
| + "alpha", |
| + "password3", |
| + "gamma", |
| + true, |
| + "username1", |
| + "William"}, |
| {{"current-password", "new-password", "current-password"}, |
| - "password1", "alpha", "password2", "beta", true, "username1", "William"}, |
| + "password1", |
| + "alpha", |
| + "password2", |
| + "beta", |
| + true, |
| + "username1", |
| + "William"}, |
| {{"new-password", "current-password", "current-password"}, |
| - "password2", "beta", "password1", "alpha", true, "username2", "Smith"}, |
| + "password2", |
| + "beta", |
| + "password1", |
| + "alpha", |
| + true, |
| + "username2", |
| + "Smith"}, |
| {{"current-password", "new-password", "new-password"}, |
| - "password1", "alpha", "password2", "beta", true, "username1", "William"}, |
| + "password1", |
| + "alpha", |
| + "password2", |
| + "beta", |
| + true, |
| + "username1", |
| + "William"}, |
| {{"new-password", "current-password", "new-password"}, |
| - "password2", "beta", "password1", "alpha", true, "username2", "Smith"}, |
| + "password2", |
| + "beta", |
| + "password1", |
| + "alpha", |
| + true, |
| + "username2", |
| + "Smith"}, |
| {{"new-password", "new-password", "current-password"}, |
| - "password3", "gamma", "password1", "alpha", true, "username2", "Smith"}, |
| + "password3", |
| + "gamma", |
| + "password1", |
| + "alpha", |
| + true, |
| + "username2", |
| + "Smith"}, |
| // When there is an empty autocomplete attribute (i.e. autocomplete=""), |
| // it should have the same effect as having no attribute whatsoever. |
| {{"current-password", "", ""}, |
| - "password1", "alpha", "", "", false, "username1", "William"}, |
| + "password1", |
| + "alpha", |
| + "", |
| + "", |
| + false, |
| + "username1", |
| + "William"}, |
| {{"", "", "new-password"}, |
| - "", "", "password3", "gamma", true, "username2", "Smith"}, |
| + "", |
| + "", |
| + "password3", |
| + "gamma", |
| + true, |
| + "username2", |
| + "Smith"}, |
| {{"", "new-password", ""}, |
| - "", "", "password2", "beta", true, "username2", "Smith"}, |
| + "", |
| + "", |
| + "password2", |
| + "beta", |
| + true, |
| + "username2", |
| + "Smith"}, |
| {{"", "current-password", "current-password"}, |
| - "password2", "beta", "", "", false, "username2", "Smith"}, |
| + "password2", |
| + "beta", |
| + "", |
| + "", |
| + false, |
| + "username2", |
| + "Smith"}, |
| {{"new-password", "", "new-password"}, |
| - "", "", "password1", "alpha", true, "username1", "William"}, |
| + "", |
| + "", |
| + "password1", |
| + "alpha", |
| + true, |
| + "username1", |
| + "William"}, |
| {{"new-password", "", "current-password"}, |
| - "password3", "gamma", "password1", "alpha", true, "username2","Smith"}, |
| + "password3", |
| + "gamma", |
| + "password1", |
| + "alpha", |
| + true, |
| + "username2", |
| + "Smith"}, |
| // It should not matter if attribute values are upper or mixed case. |
| - {{NULL, "current-password", NULL}, |
| - "password2", "beta", "", "", false, "username2", "Smith"}, |
| - {{NULL, "CURRENT-PASSWORD", NULL}, |
| - "password2", "beta", "", "", false, "username2", "Smith"}, |
| - {{NULL, "new-password", NULL}, |
| - "", "", "password2", "beta", true, "username2", "Smith"}, |
| - {{NULL, "nEw-PaSsWoRd", NULL}, |
| - "", "", "password2", "beta", true, "username2", "Smith"}}; |
| + {{nullptr, "current-password", nullptr}, |
| + "password2", |
| + "beta", |
| + "", |
| + "", |
| + false, |
| + "username2", |
| + "Smith"}, |
| + {{nullptr, "CURRENT-PASSWORD", nullptr}, |
| + "password2", |
| + "beta", |
| + "", |
| + "", |
| + false, |
| + "username2", |
| + "Smith"}, |
| + {{nullptr, "new-password", nullptr}, |
| + "", |
| + "", |
| + "password2", |
| + "beta", |
| + true, |
| + "username2", |
| + "Smith"}, |
| + {{nullptr, "nEw-PaSsWoRd", nullptr}, |
| + "", |
| + "", |
| + "password2", |
| + "beta", |
| + true, |
| + "username2", |
| + "Smith"}}; |
| for (size_t i = 0; i < arraysize(cases); ++i) { |
| SCOPED_TRACE(testing::Message() << "Iteration " << i); |
| PasswordFormBuilder builder(kTestFormActionURL); |
| - builder.AddPasswordField("pin1", "123456", NULL); |
| - builder.AddPasswordField("pin2", "789101", NULL); |
| - builder.AddTextField("username1", "William", NULL); |
| + builder.AddPasswordField("pin1", "123456", nullptr); |
| + builder.AddPasswordField("pin2", "789101", nullptr); |
| + builder.AddTextField("username1", "William", nullptr); |
| builder.AddPasswordField("password1", "alpha", cases[i].autocomplete[0]); |
| - builder.AddTextField("username2", "Smith", NULL); |
| + builder.AddTextField("username2", "Smith", nullptr); |
| builder.AddPasswordField("password2", "beta", cases[i].autocomplete[1]); |
| builder.AddPasswordField("password3", "gamma", cases[i].autocomplete[2]); |
| builder.AddSubmitButton("submit"); |
| std::string html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> password_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(html, &password_form, nullptr)); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| ASSERT_TRUE(password_form); |
| // In the absence of username autocomplete attributes, the username should |
| @@ -641,16 +858,15 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, IgnoreNonDisplayedTextFields) { |
| PasswordFormBuilder builder(kTestFormActionURL); |
| builder.AddNonDisplayedTextField("nondisplayed1", "nodispalyed_value1"); |
| - builder.AddTextField("username", "johnsmith", NULL); |
| + builder.AddTextField("username", "johnsmith", nullptr); |
| builder.AddNonDisplayedTextField("nondisplayed2", "nodispalyed_value2"); |
| - builder.AddPasswordField("password", "secret", NULL); |
| - builder.AddPasswordField("password", "secret", NULL); |
| + builder.AddPasswordField("password", "secret", nullptr); |
| + builder.AddPasswordField("password", "secret", nullptr); |
| builder.AddSubmitButton("submit"); |
| std::string html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> password_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(html, &password_form, nullptr)); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| ASSERT_TRUE(password_form); |
| EXPECT_EQ(base::UTF8ToUTF16("username"), password_form->username_element); |
| EXPECT_EQ(base::UTF8ToUTF16("johnsmith"), password_form->username_value); |
| @@ -664,17 +880,16 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, IgnoreNonDisplayedLoginPairs) { |
| builder.AddNonDisplayedTextField("nondisplayed1", "nodispalyed_value1"); |
| builder.AddNonDisplayedPasswordField("nondisplayed2", "nodispalyed_value2"); |
| - builder.AddTextField("username", "johnsmith", NULL); |
| + builder.AddTextField("username", "johnsmith", nullptr); |
| builder.AddNonDisplayedTextField("nondisplayed3", "nodispalyed_value3"); |
| builder.AddNonDisplayedPasswordField("nondisplayed4", "nodispalyed_value4"); |
| - builder.AddPasswordField("password", "secret", NULL); |
| - builder.AddPasswordField("password", "secret", NULL); |
| + builder.AddPasswordField("password", "secret", nullptr); |
| + builder.AddPasswordField("password", "secret", nullptr); |
| builder.AddSubmitButton("submit"); |
| std::string html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> password_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(html, &password_form, nullptr)); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| ASSERT_TRUE(password_form); |
| EXPECT_EQ(base::UTF8ToUTF16("username"), password_form->username_element); |
| EXPECT_EQ(base::UTF8ToUTF16("johnsmith"), password_form->username_value); |
| @@ -691,9 +906,8 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, OnlyNonDisplayedLoginPair) { |
| builder.AddSubmitButton("submit"); |
| std::string html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> password_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(html, &password_form, nullptr)); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| ASSERT_TRUE(password_form); |
| EXPECT_EQ(base::UTF8ToUTF16("username"), |
| password_form->username_element); |
| @@ -710,13 +924,12 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| PasswordFormBuilder builder(kTestFormActionURL); |
| builder.AddNonDisplayedTextField("username", "William"); |
| - builder.AddPasswordField("password", "secret", NULL); |
| + builder.AddPasswordField("password", "secret", nullptr); |
| builder.AddSubmitButton("submit"); |
| std::string html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> password_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(html, &password_form, nullptr)); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| ASSERT_TRUE(password_form); |
| EXPECT_EQ(base::UTF8ToUTF16("username"), password_form->username_element); |
| EXPECT_EQ(base::UTF8ToUTF16("William"), password_form->username_value); |
| @@ -729,14 +942,13 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| PasswordFormBuilder builder(kTestFormActionURL); |
| builder.AddNonDisplayedTextField("search", "query"); |
| - builder.AddTextField("username", "William", NULL); |
| + builder.AddTextField("username", "William", nullptr); |
| builder.AddNonDisplayedPasswordField("password", "secret"); |
| builder.AddSubmitButton("submit"); |
| std::string html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> password_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(html, &password_form, nullptr)); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| ASSERT_TRUE(password_form); |
| EXPECT_EQ(base::UTF8ToUTF16("username"), password_form->username_element); |
| EXPECT_EQ(base::UTF8ToUTF16("William"), password_form->username_value); |
| @@ -748,15 +960,14 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| InvisiblePassword_LatestUsernameIsInvisible) { |
| PasswordFormBuilder builder(kTestFormActionURL); |
| - builder.AddTextField("search", "query", NULL); |
| + builder.AddTextField("search", "query", nullptr); |
| builder.AddNonDisplayedTextField("username", "William"); |
| builder.AddNonDisplayedPasswordField("password", "secret"); |
| builder.AddSubmitButton("submit"); |
| std::string html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> password_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(html, &password_form, nullptr)); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| ASSERT_TRUE(password_form); |
| EXPECT_EQ(base::UTF8ToUTF16("username"), password_form->username_element); |
| EXPECT_EQ(base::UTF8ToUTF16("William"), password_form->username_value); |
| @@ -766,28 +977,26 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| TEST_F(MAYBE_PasswordFormConversionUtilsTest, InvalidFormDueToBadActionURL) { |
| PasswordFormBuilder builder("invalid_target"); |
| - builder.AddTextField("username", "JohnSmith", NULL); |
| + builder.AddTextField("username", "JohnSmith", nullptr); |
| builder.AddSubmitButton("submit"); |
| - builder.AddPasswordField("password", "secret", NULL); |
| + builder.AddPasswordField("password", "secret", nullptr); |
| std::string html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> password_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(html, &password_form, nullptr)); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| EXPECT_FALSE(password_form); |
| } |
| TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| InvalidFormDueToNoPasswordFields) { |
| PasswordFormBuilder builder(kTestFormActionURL); |
| - builder.AddTextField("username1", "John", NULL); |
| - builder.AddTextField("username2", "Smith", NULL); |
| + builder.AddTextField("username1", "John", nullptr); |
| + builder.AddTextField("username2", "Smith", nullptr); |
| builder.AddSubmitButton("submit"); |
| std::string html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> password_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(html, &password_form, nullptr)); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| EXPECT_FALSE(password_form); |
| } |
| @@ -809,16 +1018,15 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| SCOPED_TRACE(testing::Message() << "Iteration " << i); |
| PasswordFormBuilder builder(kTestFormActionURL); |
| - builder.AddTextField("username1", "John", NULL); |
| - builder.AddPasswordField("password1", cases[i][0], NULL); |
| - builder.AddPasswordField("password2", cases[i][1], NULL); |
| - builder.AddPasswordField("password3", cases[i][2], NULL); |
| + builder.AddTextField("username1", "John", nullptr); |
| + builder.AddPasswordField("password1", cases[i][0], nullptr); |
| + builder.AddPasswordField("password2", cases[i][1], nullptr); |
| + builder.AddPasswordField("password3", cases[i][2], nullptr); |
| builder.AddSubmitButton("submit"); |
| std::string html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> password_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(html, &password_form, nullptr)); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| EXPECT_FALSE(password_form); |
| } |
| } |
| @@ -826,17 +1034,16 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| InvalidFormDueToTooManyPasswordFieldsWithoutAutocompleteAttributes) { |
| PasswordFormBuilder builder(kTestFormActionURL); |
| - builder.AddTextField("username1", "John", NULL); |
| - builder.AddPasswordField("password1", "alpha", NULL); |
| - builder.AddPasswordField("password2", "alpha", NULL); |
| - builder.AddPasswordField("password3", "alpha", NULL); |
| - builder.AddPasswordField("password4", "alpha", NULL); |
| + builder.AddTextField("username1", "John", nullptr); |
| + builder.AddPasswordField("password1", "alpha", nullptr); |
| + builder.AddPasswordField("password2", "alpha", nullptr); |
| + builder.AddPasswordField("password3", "alpha", nullptr); |
| + builder.AddPasswordField("password4", "alpha", nullptr); |
| builder.AddSubmitButton("submit"); |
| std::string html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> password_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(html, &password_form, nullptr)); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| EXPECT_FALSE(password_form); |
| } |
| @@ -848,9 +1055,8 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, LayoutClassificationLogin) { |
| builder.AddSubmitButton("submit"); |
| std::string login_html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> login_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(login_html, &login_form, nullptr)); |
| + std::unique_ptr<PasswordForm> login_form = |
| + LoadHTMLAndConvertForm(login_html, nullptr, false); |
| ASSERT_TRUE(login_form); |
| EXPECT_EQ(PasswordForm::Layout::LAYOUT_OTHER, login_form->layout); |
| } |
| @@ -865,9 +1071,8 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, LayoutClassificationSignup) { |
| builder.AddSubmitButton("submit"); |
| std::string signup_html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> signup_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(signup_html, &signup_form, nullptr)); |
| + std::unique_ptr<PasswordForm> signup_form = |
| + LoadHTMLAndConvertForm(signup_html, nullptr, false); |
| ASSERT_TRUE(signup_form); |
| EXPECT_EQ(PasswordForm::Layout::LAYOUT_OTHER, signup_form->layout); |
| } |
| @@ -882,9 +1087,8 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, LayoutClassificationChange) { |
| builder.AddSubmitButton("submit"); |
| std::string change_html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> change_form; |
| - ASSERT_NO_FATAL_FAILURE( |
| - LoadHTMLAndConvertForm(change_html, &change_form, nullptr)); |
| + std::unique_ptr<PasswordForm> change_form = |
| + LoadHTMLAndConvertForm(change_html, nullptr, false); |
| ASSERT_TRUE(change_form); |
| EXPECT_EQ(PasswordForm::Layout::LAYOUT_OTHER, change_form->layout); |
| } |
| @@ -903,9 +1107,8 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| builder.AddSubmitButton("submit"); |
| std::string login_plus_signup_html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> login_plus_signup_form; |
| - ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm( |
| - login_plus_signup_html, &login_plus_signup_form, nullptr)); |
| + std::unique_ptr<PasswordForm> login_plus_signup_form = |
| + LoadHTMLAndConvertForm(login_plus_signup_html, nullptr, false); |
| ASSERT_TRUE(login_plus_signup_form); |
| EXPECT_EQ(PasswordForm::Layout::LAYOUT_LOGIN_AND_SIGNUP, |
| login_plus_signup_form->layout); |
| @@ -925,9 +1128,8 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| builder.AddSubmitButton("submit"); |
| std::string login_plus_signup_html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> login_plus_signup_form; |
| - ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm( |
| - login_plus_signup_html, &login_plus_signup_form, nullptr)); |
| + std::unique_ptr<PasswordForm> login_plus_signup_form = |
| + LoadHTMLAndConvertForm(login_plus_signup_html, nullptr, false); |
| ASSERT_TRUE(login_plus_signup_form); |
| EXPECT_EQ(PasswordForm::Layout::LAYOUT_LOGIN_AND_SIGNUP, |
| login_plus_signup_form->layout); |
| @@ -949,8 +1151,8 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| FormsPredictionsMap predictions; |
| SetPredictions(html, &predictions, predictions_positions); |
| - std::unique_ptr<PasswordForm> password_form; |
| - LoadHTMLAndConvertForm(html, &password_form, &predictions); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, &predictions, false); |
| EXPECT_FALSE(password_form); |
| } |
| @@ -969,8 +1171,8 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| FormsPredictionsMap predictions; |
| SetPredictions(html, &predictions, predictions_positions); |
| - std::unique_ptr<PasswordForm> password_form; |
| - LoadHTMLAndConvertForm(html, &password_form, &predictions); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, &predictions, false); |
| EXPECT_FALSE(password_form); |
| } |
| @@ -990,8 +1192,8 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| FormsPredictionsMap predictions; |
| SetPredictions(html, &predictions, predictions_positions); |
| - std::unique_ptr<PasswordForm> password_form; |
| - LoadHTMLAndConvertForm(html, &password_form, &predictions); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, &predictions, false); |
| EXPECT_TRUE(password_form); |
| } |
| @@ -1010,8 +1212,8 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| FormsPredictionsMap predictions; |
| SetPredictions(html, &predictions, predictions_positions); |
| - std::unique_ptr<PasswordForm> password_form; |
| - LoadHTMLAndConvertForm(html, &password_form, &predictions); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, &predictions, false); |
| EXPECT_TRUE(password_form); |
| } |
| @@ -1175,8 +1377,8 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| } |
| std::string html = builder.ProduceHTML(); |
| - std::unique_ptr<PasswordForm> password_form; |
| - LoadHTMLAndConvertForm(html, &password_form, nullptr); |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| EXPECT_TRUE(password_form); |
| EXPECT_EQ(base::UTF8ToUTF16(test_cases[i].expected_username_element), |
| @@ -1188,4 +1390,71 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| } |
| } |
| +TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| + ProbablySignUpFormTwoTextOnePassword) { |
| + PasswordFormBuilder builder(kTestFormActionURL); |
| + builder.AddTextField("email", "johnsmith@gmail.com", nullptr); |
| + builder.AddTextField("username", "johnsmith", nullptr); |
| + builder.AddPasswordField("password", "secret", nullptr); |
| + std::string html = builder.ProduceHTML(); |
| + |
| + // No user input, not considered as SignUp. |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| + ASSERT_TRUE(password_form); |
| + EXPECT_FALSE(password_form->does_look_like_signup_form); |
| + |
| + // With user input, considered as SignUp. |
| + password_form = LoadHTMLAndConvertForm(html, nullptr, true); |
| + ASSERT_TRUE(password_form); |
| + EXPECT_TRUE(password_form->does_look_like_signup_form); |
| +} |
| + |
| +TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| + ProbablySignUpFormOneTextNewAndConfirmPassword) { |
| + PasswordFormBuilder builder(kTestFormActionURL); |
| + builder.AddTextField("username", "johnsmith", nullptr); |
| + builder.AddPasswordField("new_password", "secret", nullptr); |
| + builder.AddPasswordField("confirm_password", "secret", nullptr); |
| + std::string html = builder.ProduceHTML(); |
| + |
| + // No user input, not considered as SignUp. |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, false); |
| + ASSERT_TRUE(password_form); |
| + EXPECT_FALSE(password_form->does_look_like_signup_form); |
| + |
| + // With user input, considered as SignUp. |
| + password_form = LoadHTMLAndConvertForm(html, nullptr, true); |
| + ASSERT_TRUE(password_form); |
| + EXPECT_TRUE(password_form->does_look_like_signup_form); |
| +} |
| + |
| +TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| + NotProbablySignUpFormOneTextCurrentAndNewPassword) { |
| + PasswordFormBuilder builder(kTestFormActionURL); |
| + builder.AddTextField("username", "johnsmith", nullptr); |
| + builder.AddPasswordField("password", "secret", nullptr); |
| + builder.AddPasswordField("new_password", "new_secret", nullptr); |
| + std::string html = builder.ProduceHTML(); |
| + |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, true); |
| + ASSERT_TRUE(password_form); |
| + EXPECT_FALSE(password_form->does_look_like_signup_form); |
| +} |
| + |
| +TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
| + NotProbablySignUpFormForSignInForm) { |
| + PasswordFormBuilder builder(kTestFormActionURL); |
| + builder.AddTextField("username", "johnsmith", nullptr); |
| + builder.AddPasswordField("password", "secret", nullptr); |
| + std::string html = builder.ProduceHTML(); |
| + |
| + std::unique_ptr<PasswordForm> password_form = |
| + LoadHTMLAndConvertForm(html, nullptr, true); |
| + ASSERT_TRUE(password_form); |
| + EXPECT_FALSE(password_form->does_look_like_signup_form); |
| +} |
| + |
| } // namespace autofill |