| OLD | NEW | 
|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "base/strings/string16.h" | 5 #include "base/strings/string16.h" | 
| 6 #include "base/strings/string_util.h" | 6 #include "base/strings/string_util.h" | 
| 7 #include "base/strings/stringprintf.h" | 7 #include "base/strings/stringprintf.h" | 
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" | 
| 9 #include "components/autofill/content/renderer/password_form_conversion_utils.h" | 9 #include "components/autofill/content/renderer/password_form_conversion_utils.h" | 
| 10 #include "components/autofill/core/common/password_form.h" | 10 #include "components/autofill/core/common/password_form.h" | 
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 98   std::string ProduceHTML() const { | 98   std::string ProduceHTML() const { | 
| 99     return html_ + "</FORM>"; | 99     return html_ + "</FORM>"; | 
| 100   } | 100   } | 
| 101 | 101 | 
| 102  private: | 102  private: | 
| 103   std::string html_; | 103   std::string html_; | 
| 104 | 104 | 
| 105   DISALLOW_COPY_AND_ASSIGN(PasswordFormBuilder); | 105   DISALLOW_COPY_AND_ASSIGN(PasswordFormBuilder); | 
| 106 }; | 106 }; | 
| 107 | 107 | 
| 108 class PasswordFormConversionUtilsTest : public content::RenderViewTest { | 108 // RenderVIewTest-based tests crash on Android | 
|  | 109 // http://crbug.com/187500 | 
|  | 110 #if defined(OS_ANDROID) | 
|  | 111 #define MAYBE_PasswordFormConversionUtilsTest \ | 
|  | 112   DISABLED_PasswordFormConversionUtilsTest | 
|  | 113 #else | 
|  | 114 #define MAYBE_PasswordFormConversionUtilsTest PasswordFormConversionUtilsTest | 
|  | 115 #endif  // defined(OS_ANDROID) | 
|  | 116 | 
|  | 117 class MAYBE_PasswordFormConversionUtilsTest : public content::RenderViewTest { | 
| 109  public: | 118  public: | 
| 110   PasswordFormConversionUtilsTest() : content::RenderViewTest() {} | 119   MAYBE_PasswordFormConversionUtilsTest() : content::RenderViewTest() {} | 
| 111   ~PasswordFormConversionUtilsTest() override {} | 120   ~MAYBE_PasswordFormConversionUtilsTest() override {} | 
| 112 | 121 | 
| 113  protected: | 122  protected: | 
| 114   // Loads the given |html|, retrieves the sole WebFormElement from it, and then | 123   // Loads the given |html|, retrieves the sole WebFormElement from it, and then | 
| 115   // calls CreatePasswordForm() to convert it into a |password_form|. Note that | 124   // calls CreatePasswordForm() to convert it into a |password_form|. Note that | 
| 116   // ASSERT() can only be used in void functions, this is why |password_form| is | 125   // ASSERT() can only be used in void functions, this is why |password_form| is | 
| 117   // passed in as a pointer to a scoped_ptr. | 126   // passed in as a pointer to a scoped_ptr. | 
| 118   void LoadHTMLAndConvertForm(const std::string& html, | 127   void LoadHTMLAndConvertForm(const std::string& html, | 
| 119                               scoped_ptr<PasswordForm>* password_form) { | 128                               scoped_ptr<PasswordForm>* password_form) { | 
| 120     LoadHTML(html.c_str()); | 129     LoadHTML(html.c_str()); | 
| 121 | 130 | 
| 122     WebFrame* frame = GetMainFrame(); | 131     WebFrame* frame = GetMainFrame(); | 
| 123     ASSERT_NE(static_cast<WebFrame*>(NULL), frame); | 132     ASSERT_NE(static_cast<WebFrame*>(NULL), frame); | 
| 124 | 133 | 
| 125     WebVector<WebFormElement> forms; | 134     WebVector<WebFormElement> forms; | 
| 126     frame->document().forms(forms); | 135     frame->document().forms(forms); | 
| 127     ASSERT_EQ(1U, forms.size()); | 136     ASSERT_EQ(1U, forms.size()); | 
| 128 | 137 | 
| 129     WebVector<WebFormControlElement> control_elements; | 138     WebVector<WebFormControlElement> control_elements; | 
| 130     forms[0].getFormControlElements(control_elements); | 139     forms[0].getFormControlElements(control_elements); | 
| 131     for (size_t i = 0; i < control_elements.size(); ++i) { | 140     for (size_t i = 0; i < control_elements.size(); ++i) { | 
| 132       WebInputElement* input_element = toWebInputElement(&control_elements[i]); | 141       WebInputElement* input_element = toWebInputElement(&control_elements[i]); | 
| 133       if (input_element->hasAttribute("set-activated-submit")) | 142       if (input_element->hasAttribute("set-activated-submit")) | 
| 134         input_element->setActivatedSubmit(true); | 143         input_element->setActivatedSubmit(true); | 
| 135     } | 144     } | 
| 136 | 145 | 
| 137     *password_form = CreatePasswordForm(forms[0], nullptr, nullptr); | 146     *password_form = CreatePasswordForm(forms[0], nullptr, nullptr); | 
| 138   } | 147   } | 
| 139 | 148 | 
| 140  private: | 149  private: | 
| 141   DISALLOW_COPY_AND_ASSIGN(PasswordFormConversionUtilsTest); | 150   DISALLOW_COPY_AND_ASSIGN(MAYBE_PasswordFormConversionUtilsTest); | 
| 142 }; | 151 }; | 
| 143 | 152 | 
| 144 }  // namespace | 153 }  // namespace | 
| 145 | 154 | 
| 146 TEST_F(PasswordFormConversionUtilsTest, BasicFormAttributes) { | 155 TEST_F(MAYBE_PasswordFormConversionUtilsTest, BasicFormAttributes) { | 
| 147   PasswordFormBuilder builder(kTestFormActionURL); | 156   PasswordFormBuilder builder(kTestFormActionURL); | 
| 148   builder.AddUsernameField("username", "johnsmith", NULL); | 157   builder.AddUsernameField("username", "johnsmith", NULL); | 
| 149   builder.AddSubmitButton("inactive_submit", false); | 158   builder.AddSubmitButton("inactive_submit", false); | 
| 150   builder.AddSubmitButton("active_submit", true); | 159   builder.AddSubmitButton("active_submit", true); | 
| 151   builder.AddSubmitButton("inactive_submit2", false); | 160   builder.AddSubmitButton("inactive_submit2", false); | 
| 152   builder.AddPasswordField("password", "secret", NULL); | 161   builder.AddPasswordField("password", "secret", NULL); | 
| 153   std::string html = builder.ProduceHTML(); | 162   std::string html = builder.ProduceHTML(); | 
| 154 | 163 | 
| 155   scoped_ptr<PasswordForm> password_form; | 164   scoped_ptr<PasswordForm> password_form; | 
| 156   ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(html, &password_form)); | 165   ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(html, &password_form)); | 
| 157   ASSERT_TRUE(password_form); | 166   ASSERT_TRUE(password_form); | 
| 158 | 167 | 
| 159   EXPECT_EQ("data:", password_form->signon_realm); | 168   EXPECT_EQ("data:", password_form->signon_realm); | 
| 160   EXPECT_EQ(GURL(kTestFormActionURL), password_form->action); | 169   EXPECT_EQ(GURL(kTestFormActionURL), password_form->action); | 
| 161   EXPECT_EQ(base::UTF8ToUTF16("active_submit"), password_form->submit_element); | 170   EXPECT_EQ(base::UTF8ToUTF16("active_submit"), password_form->submit_element); | 
| 162   EXPECT_EQ(base::UTF8ToUTF16("username"), password_form->username_element); | 171   EXPECT_EQ(base::UTF8ToUTF16("username"), password_form->username_element); | 
| 163   EXPECT_EQ(base::UTF8ToUTF16("johnsmith"), password_form->username_value); | 172   EXPECT_EQ(base::UTF8ToUTF16("johnsmith"), password_form->username_value); | 
| 164   EXPECT_EQ(base::UTF8ToUTF16("password"), password_form->password_element); | 173   EXPECT_EQ(base::UTF8ToUTF16("password"), password_form->password_element); | 
| 165   EXPECT_EQ(base::UTF8ToUTF16("secret"), password_form->password_value); | 174   EXPECT_EQ(base::UTF8ToUTF16("secret"), password_form->password_value); | 
| 166   EXPECT_EQ(PasswordForm::SCHEME_HTML, password_form->scheme); | 175   EXPECT_EQ(PasswordForm::SCHEME_HTML, password_form->scheme); | 
| 167   EXPECT_FALSE(password_form->ssl_valid); | 176   EXPECT_FALSE(password_form->ssl_valid); | 
| 168   EXPECT_FALSE(password_form->preferred); | 177   EXPECT_FALSE(password_form->preferred); | 
| 169   EXPECT_FALSE(password_form->blacklisted_by_user); | 178   EXPECT_FALSE(password_form->blacklisted_by_user); | 
| 170   EXPECT_EQ(PasswordForm::TYPE_MANUAL, password_form->type); | 179   EXPECT_EQ(PasswordForm::TYPE_MANUAL, password_form->type); | 
| 171 } | 180 } | 
| 172 | 181 | 
| 173 TEST_F(PasswordFormConversionUtilsTest, DisabledFieldsAreIgnored) { | 182 TEST_F(MAYBE_PasswordFormConversionUtilsTest, DisabledFieldsAreIgnored) { | 
| 174   PasswordFormBuilder builder(kTestFormActionURL); | 183   PasswordFormBuilder builder(kTestFormActionURL); | 
| 175   builder.AddUsernameField("username", "johnsmith", NULL); | 184   builder.AddUsernameField("username", "johnsmith", NULL); | 
| 176   builder.AddDisabledUsernameField(); | 185   builder.AddDisabledUsernameField(); | 
| 177   builder.AddDisabledPasswordField(); | 186   builder.AddDisabledPasswordField(); | 
| 178   builder.AddPasswordField("password", "secret", NULL); | 187   builder.AddPasswordField("password", "secret", NULL); | 
| 179   builder.AddSubmitButton("submit", true); | 188   builder.AddSubmitButton("submit", true); | 
| 180   std::string html = builder.ProduceHTML(); | 189   std::string html = builder.ProduceHTML(); | 
| 181 | 190 | 
| 182   scoped_ptr<PasswordForm> password_form; | 191   scoped_ptr<PasswordForm> password_form; | 
| 183   ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(html, &password_form)); | 192   ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(html, &password_form)); | 
| 184   ASSERT_TRUE(password_form); | 193   ASSERT_TRUE(password_form); | 
| 185   EXPECT_EQ(base::UTF8ToUTF16("username"), password_form->username_element); | 194   EXPECT_EQ(base::UTF8ToUTF16("username"), password_form->username_element); | 
| 186   EXPECT_EQ(base::UTF8ToUTF16("johnsmith"), password_form->username_value); | 195   EXPECT_EQ(base::UTF8ToUTF16("johnsmith"), password_form->username_value); | 
| 187   EXPECT_EQ(base::UTF8ToUTF16("password"), password_form->password_element); | 196   EXPECT_EQ(base::UTF8ToUTF16("password"), password_form->password_element); | 
| 188   EXPECT_EQ(base::UTF8ToUTF16("secret"), password_form->password_value); | 197   EXPECT_EQ(base::UTF8ToUTF16("secret"), password_form->password_value); | 
| 189 } | 198 } | 
| 190 | 199 | 
| 191 TEST_F(PasswordFormConversionUtilsTest, IdentifyingUsernameFields) { | 200 TEST_F(MAYBE_PasswordFormConversionUtilsTest, IdentifyingUsernameFields) { | 
| 192   // Each test case consists of a set of parameters to be plugged into the | 201   // Each test case consists of a set of parameters to be plugged into the | 
| 193   // PasswordFormBuilder below, plus the corresponding expectations. | 202   // PasswordFormBuilder below, plus the corresponding expectations. | 
| 194   struct TestCase { | 203   struct TestCase { | 
| 195     const char* autocomplete[3]; | 204     const char* autocomplete[3]; | 
| 196     const char* expected_username_element; | 205     const char* expected_username_element; | 
| 197     const char* expected_username_value; | 206     const char* expected_username_value; | 
| 198     const char* expected_other_possible_usernames; | 207     const char* expected_other_possible_usernames; | 
| 199   } cases[] = { | 208   } cases[] = { | 
| 200       // When no elements are marked with autocomplete='username', the text-type | 209       // When no elements are marked with autocomplete='username', the text-type | 
| 201       // input field before the first password element should get selected as | 210       // input field before the first password element should get selected as | 
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 266         EXPECT_TRUE(password_form->other_possible_usernames.empty()); | 275         EXPECT_TRUE(password_form->other_possible_usernames.empty()); | 
| 267       } | 276       } | 
| 268 | 277 | 
| 269       // Do a basic sanity check that we are still having a password field. | 278       // Do a basic sanity check that we are still having a password field. | 
| 270       EXPECT_EQ(base::UTF8ToUTF16("password"), password_form->password_element); | 279       EXPECT_EQ(base::UTF8ToUTF16("password"), password_form->password_element); | 
| 271       EXPECT_EQ(base::UTF8ToUTF16("secret"), password_form->password_value); | 280       EXPECT_EQ(base::UTF8ToUTF16("secret"), password_form->password_value); | 
| 272     } | 281     } | 
| 273   } | 282   } | 
| 274 } | 283 } | 
| 275 | 284 | 
| 276 TEST_F(PasswordFormConversionUtilsTest, IdentifyingTwoPasswordFields) { | 285 TEST_F(MAYBE_PasswordFormConversionUtilsTest, IdentifyingTwoPasswordFields) { | 
| 277   // Each test case consists of a set of parameters to be plugged into the | 286   // Each test case consists of a set of parameters to be plugged into the | 
| 278   // PasswordFormBuilder below, plus the corresponding expectations. | 287   // PasswordFormBuilder below, plus the corresponding expectations. | 
| 279   struct TestCase { | 288   struct TestCase { | 
| 280     const char* password_values[2]; | 289     const char* password_values[2]; | 
| 281     const char* expected_password_element; | 290     const char* expected_password_element; | 
| 282     const char* expected_password_value; | 291     const char* expected_password_value; | 
| 283     const char* expected_new_password_element; | 292     const char* expected_new_password_element; | 
| 284     const char* expected_new_password_value; | 293     const char* expected_new_password_value; | 
| 285   } cases[] = { | 294   } cases[] = { | 
| 286       // Twp non-empty fields with the same value should be treated as a new | 295       // Twp non-empty fields with the same value should be treated as a new | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 321               password_form->new_password_value); | 330               password_form->new_password_value); | 
| 322 | 331 | 
| 323     // Do a basic sanity check that we are still selecting the right username. | 332     // Do a basic sanity check that we are still selecting the right username. | 
| 324     EXPECT_EQ(base::UTF8ToUTF16("username1"), password_form->username_element); | 333     EXPECT_EQ(base::UTF8ToUTF16("username1"), password_form->username_element); | 
| 325     EXPECT_EQ(base::UTF8ToUTF16("William"), password_form->username_value); | 334     EXPECT_EQ(base::UTF8ToUTF16("William"), password_form->username_value); | 
| 326     EXPECT_THAT(password_form->other_possible_usernames, | 335     EXPECT_THAT(password_form->other_possible_usernames, | 
| 327                 testing::ElementsAre(base::UTF8ToUTF16("Smith"))); | 336                 testing::ElementsAre(base::UTF8ToUTF16("Smith"))); | 
| 328   } | 337   } | 
| 329 } | 338 } | 
| 330 | 339 | 
| 331 TEST_F(PasswordFormConversionUtilsTest, IdentifyingThreePasswordFields) { | 340 TEST_F(MAYBE_PasswordFormConversionUtilsTest, IdentifyingThreePasswordFields) { | 
| 332   // Each test case consists of a set of parameters to be plugged into the | 341   // Each test case consists of a set of parameters to be plugged into the | 
| 333   // PasswordFormBuilder below, plus the corresponding expectations. | 342   // PasswordFormBuilder below, plus the corresponding expectations. | 
| 334   struct TestCase { | 343   struct TestCase { | 
| 335     const char* password_values[3]; | 344     const char* password_values[3]; | 
| 336     const char* expected_password_element; | 345     const char* expected_password_element; | 
| 337     const char* expected_password_value; | 346     const char* expected_password_value; | 
| 338     const char* expected_new_password_element; | 347     const char* expected_new_password_element; | 
| 339     const char* expected_new_password_value; | 348     const char* expected_new_password_value; | 
| 340   } cases[] = { | 349   } cases[] = { | 
| 341       // Two fields with the same value, and one different: we should treat this | 350       // Two fields with the same value, and one different: we should treat this | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 382               password_form->new_password_value); | 391               password_form->new_password_value); | 
| 383 | 392 | 
| 384     // Do a basic sanity check that we are still selecting the right username. | 393     // Do a basic sanity check that we are still selecting the right username. | 
| 385     EXPECT_EQ(base::UTF8ToUTF16("username1"), password_form->username_element); | 394     EXPECT_EQ(base::UTF8ToUTF16("username1"), password_form->username_element); | 
| 386     EXPECT_EQ(base::UTF8ToUTF16("William"), password_form->username_value); | 395     EXPECT_EQ(base::UTF8ToUTF16("William"), password_form->username_value); | 
| 387     EXPECT_THAT(password_form->other_possible_usernames, | 396     EXPECT_THAT(password_form->other_possible_usernames, | 
| 388                 testing::ElementsAre(base::UTF8ToUTF16("Smith"))); | 397                 testing::ElementsAre(base::UTF8ToUTF16("Smith"))); | 
| 389   } | 398   } | 
| 390 } | 399 } | 
| 391 | 400 | 
| 392 TEST_F(PasswordFormConversionUtilsTest, | 401 TEST_F(MAYBE_PasswordFormConversionUtilsTest, | 
| 393        IdentifyingPasswordFieldsWithAutocompleteAttributes) { | 402        IdentifyingPasswordFieldsWithAutocompleteAttributes) { | 
| 394   // Each test case consists of a set of parameters to be plugged into the | 403   // Each test case consists of a set of parameters to be plugged into the | 
| 395   // PasswordFormBuilder below, plus the corresponding expectations. | 404   // PasswordFormBuilder below, plus the corresponding expectations. | 
| 396   struct TestCase { | 405   struct TestCase { | 
| 397     const char* autocomplete[3]; | 406     const char* autocomplete[3]; | 
| 398     const char* expected_password_element; | 407     const char* expected_password_element; | 
| 399     const char* expected_password_value; | 408     const char* expected_password_value; | 
| 400     const char* expected_new_password_element; | 409     const char* expected_new_password_element; | 
| 401     const char* expected_new_password_value; | 410     const char* expected_new_password_value; | 
| 402     bool expected_new_password_marked_by_site; | 411     bool expected_new_password_marked_by_site; | 
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 520               password_form->password_value); | 529               password_form->password_value); | 
| 521     EXPECT_EQ(base::UTF8ToUTF16(cases[i].expected_new_password_element), | 530     EXPECT_EQ(base::UTF8ToUTF16(cases[i].expected_new_password_element), | 
| 522               password_form->new_password_element); | 531               password_form->new_password_element); | 
| 523     EXPECT_EQ(base::UTF8ToUTF16(cases[i].expected_new_password_value), | 532     EXPECT_EQ(base::UTF8ToUTF16(cases[i].expected_new_password_value), | 
| 524               password_form->new_password_value); | 533               password_form->new_password_value); | 
| 525     EXPECT_EQ(cases[i].expected_new_password_marked_by_site, | 534     EXPECT_EQ(cases[i].expected_new_password_marked_by_site, | 
| 526               password_form->new_password_marked_by_site); | 535               password_form->new_password_marked_by_site); | 
| 527   } | 536   } | 
| 528 } | 537 } | 
| 529 | 538 | 
| 530 TEST_F(PasswordFormConversionUtilsTest, InvalidFormDueToBadActionURL) { | 539 TEST_F(MAYBE_PasswordFormConversionUtilsTest, InvalidFormDueToBadActionURL) { | 
| 531   PasswordFormBuilder builder("invalid_target"); | 540   PasswordFormBuilder builder("invalid_target"); | 
| 532   builder.AddUsernameField("username", "JohnSmith", NULL); | 541   builder.AddUsernameField("username", "JohnSmith", NULL); | 
| 533   builder.AddSubmitButton("submit", true); | 542   builder.AddSubmitButton("submit", true); | 
| 534   builder.AddPasswordField("password", "secret", NULL); | 543   builder.AddPasswordField("password", "secret", NULL); | 
| 535   std::string html = builder.ProduceHTML(); | 544   std::string html = builder.ProduceHTML(); | 
| 536 | 545 | 
| 537   scoped_ptr<PasswordForm> password_form; | 546   scoped_ptr<PasswordForm> password_form; | 
| 538   ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(html, &password_form)); | 547   ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(html, &password_form)); | 
| 539   EXPECT_FALSE(password_form); | 548   EXPECT_FALSE(password_form); | 
| 540 } | 549 } | 
| 541 | 550 | 
| 542 TEST_F(PasswordFormConversionUtilsTest, InvalidFormDueToNoPasswordFields) { | 551 TEST_F(MAYBE_PasswordFormConversionUtilsTest, | 
|  | 552        InvalidFormDueToNoPasswordFields) { | 
| 543   PasswordFormBuilder builder(kTestFormActionURL); | 553   PasswordFormBuilder builder(kTestFormActionURL); | 
| 544   builder.AddUsernameField("username1", "John", NULL); | 554   builder.AddUsernameField("username1", "John", NULL); | 
| 545   builder.AddUsernameField("username2", "Smith", NULL); | 555   builder.AddUsernameField("username2", "Smith", NULL); | 
| 546   builder.AddSubmitButton("submit", true); | 556   builder.AddSubmitButton("submit", true); | 
| 547   std::string html = builder.ProduceHTML(); | 557   std::string html = builder.ProduceHTML(); | 
| 548 | 558 | 
| 549   scoped_ptr<PasswordForm> password_form; | 559   scoped_ptr<PasswordForm> password_form; | 
| 550   ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(html, &password_form)); | 560   ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(html, &password_form)); | 
| 551   EXPECT_FALSE(password_form); | 561   EXPECT_FALSE(password_form); | 
| 552 } | 562 } | 
| 553 | 563 | 
| 554 TEST_F(PasswordFormConversionUtilsTest, | 564 TEST_F(MAYBE_PasswordFormConversionUtilsTest, | 
| 555        InvalidFormsDueToConfusingPasswordFields) { | 565        InvalidFormsDueToConfusingPasswordFields) { | 
| 556   // Each test case consists of a set of parameters to be plugged into the | 566   // Each test case consists of a set of parameters to be plugged into the | 
| 557   // PasswordFormBuilder below. | 567   // PasswordFormBuilder below. | 
| 558   const char* cases[][3] = { | 568   const char* cases[][3] = { | 
| 559       // No autocomplete attributes to guide us, and we see: | 569       // No autocomplete attributes to guide us, and we see: | 
| 560       //  * three password values that are all different, | 570       //  * three password values that are all different, | 
| 561       //  * three password values that are all the same; | 571       //  * three password values that are all the same; | 
| 562       //  * three password values with the first and last matching. | 572       //  * three password values with the first and last matching. | 
| 563       // In any case, we should just give up on this form. | 573       // In any case, we should just give up on this form. | 
| 564       {"alpha", "beta", "gamma"}, | 574       {"alpha", "beta", "gamma"}, | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 575     builder.AddPasswordField("password3", cases[i][2], NULL); | 585     builder.AddPasswordField("password3", cases[i][2], NULL); | 
| 576     builder.AddSubmitButton("submit", true); | 586     builder.AddSubmitButton("submit", true); | 
| 577     std::string html = builder.ProduceHTML(); | 587     std::string html = builder.ProduceHTML(); | 
| 578 | 588 | 
| 579     scoped_ptr<PasswordForm> password_form; | 589     scoped_ptr<PasswordForm> password_form; | 
| 580     ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(html, &password_form)); | 590     ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(html, &password_form)); | 
| 581     EXPECT_FALSE(password_form); | 591     EXPECT_FALSE(password_form); | 
| 582   } | 592   } | 
| 583 } | 593 } | 
| 584 | 594 | 
| 585 TEST_F(PasswordFormConversionUtilsTest, | 595 TEST_F(MAYBE_PasswordFormConversionUtilsTest, | 
| 586        InvalidFormDueToTooManyPasswordFieldsWithoutAutocompleteAttributes) { | 596        InvalidFormDueToTooManyPasswordFieldsWithoutAutocompleteAttributes) { | 
| 587   PasswordFormBuilder builder(kTestFormActionURL); | 597   PasswordFormBuilder builder(kTestFormActionURL); | 
| 588   builder.AddUsernameField("username1", "John", NULL); | 598   builder.AddUsernameField("username1", "John", NULL); | 
| 589   builder.AddPasswordField("password1", "alpha", NULL); | 599   builder.AddPasswordField("password1", "alpha", NULL); | 
| 590   builder.AddPasswordField("password2", "alpha", NULL); | 600   builder.AddPasswordField("password2", "alpha", NULL); | 
| 591   builder.AddPasswordField("password3", "alpha", NULL); | 601   builder.AddPasswordField("password3", "alpha", NULL); | 
| 592   builder.AddPasswordField("password4", "alpha", NULL); | 602   builder.AddPasswordField("password4", "alpha", NULL); | 
| 593   builder.AddSubmitButton("submit", true); | 603   builder.AddSubmitButton("submit", true); | 
| 594   std::string html = builder.ProduceHTML(); | 604   std::string html = builder.ProduceHTML(); | 
| 595 | 605 | 
| 596   scoped_ptr<PasswordForm> password_form; | 606   scoped_ptr<PasswordForm> password_form; | 
| 597   ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(html, &password_form)); | 607   ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(html, &password_form)); | 
| 598   EXPECT_FALSE(password_form); | 608   EXPECT_FALSE(password_form); | 
| 599 } | 609 } | 
| 600 | 610 | 
| 601 TEST_F(PasswordFormConversionUtilsTest, LayoutClassificationLogin) { | 611 TEST_F(MAYBE_PasswordFormConversionUtilsTest, LayoutClassificationLogin) { | 
| 602   PasswordFormBuilder builder(kTestFormActionURL); | 612   PasswordFormBuilder builder(kTestFormActionURL); | 
| 603   builder.AddHiddenField(); | 613   builder.AddHiddenField(); | 
| 604   builder.AddUsernameField("username", "", nullptr); | 614   builder.AddUsernameField("username", "", nullptr); | 
| 605   builder.AddPasswordField("password", "", nullptr); | 615   builder.AddPasswordField("password", "", nullptr); | 
| 606   builder.AddSubmitButton("submit", false); | 616   builder.AddSubmitButton("submit", false); | 
| 607   std::string login_html = builder.ProduceHTML(); | 617   std::string login_html = builder.ProduceHTML(); | 
| 608 | 618 | 
| 609   scoped_ptr<PasswordForm> login_form; | 619   scoped_ptr<PasswordForm> login_form; | 
| 610   ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(login_html, &login_form)); | 620   ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(login_html, &login_form)); | 
| 611   ASSERT_TRUE(login_form); | 621   ASSERT_TRUE(login_form); | 
| 612   EXPECT_EQ(PasswordForm::Layout::LAYOUT_OTHER, login_form->layout); | 622   EXPECT_EQ(PasswordForm::Layout::LAYOUT_OTHER, login_form->layout); | 
| 613 } | 623 } | 
| 614 | 624 | 
| 615 TEST_F(PasswordFormConversionUtilsTest, LayoutClassificationSignup) { | 625 TEST_F(MAYBE_PasswordFormConversionUtilsTest, LayoutClassificationSignup) { | 
| 616   PasswordFormBuilder builder(kTestFormActionURL); | 626   PasswordFormBuilder builder(kTestFormActionURL); | 
| 617   builder.AddUsernameField("someotherfield", "", nullptr); | 627   builder.AddUsernameField("someotherfield", "", nullptr); | 
| 618   builder.AddUsernameField("username", "", nullptr); | 628   builder.AddUsernameField("username", "", nullptr); | 
| 619   builder.AddPasswordField("new_password", "", nullptr); | 629   builder.AddPasswordField("new_password", "", nullptr); | 
| 620   builder.AddHiddenField(); | 630   builder.AddHiddenField(); | 
| 621   builder.AddPasswordField("new_password2", "", nullptr); | 631   builder.AddPasswordField("new_password2", "", nullptr); | 
| 622   builder.AddSubmitButton("submit", false); | 632   builder.AddSubmitButton("submit", false); | 
| 623   std::string signup_html = builder.ProduceHTML(); | 633   std::string signup_html = builder.ProduceHTML(); | 
| 624 | 634 | 
| 625   scoped_ptr<PasswordForm> signup_form; | 635   scoped_ptr<PasswordForm> signup_form; | 
| 626   ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(signup_html, &signup_form)); | 636   ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(signup_html, &signup_form)); | 
| 627   ASSERT_TRUE(signup_form); | 637   ASSERT_TRUE(signup_form); | 
| 628   EXPECT_EQ(PasswordForm::Layout::LAYOUT_OTHER, signup_form->layout); | 638   EXPECT_EQ(PasswordForm::Layout::LAYOUT_OTHER, signup_form->layout); | 
| 629 } | 639 } | 
| 630 | 640 | 
| 631 TEST_F(PasswordFormConversionUtilsTest, LayoutClassificationChange) { | 641 TEST_F(MAYBE_PasswordFormConversionUtilsTest, LayoutClassificationChange) { | 
| 632   PasswordFormBuilder builder(kTestFormActionURL); | 642   PasswordFormBuilder builder(kTestFormActionURL); | 
| 633   builder.AddUsernameField("username", "", nullptr); | 643   builder.AddUsernameField("username", "", nullptr); | 
| 634   builder.AddPasswordField("old_password", "", nullptr); | 644   builder.AddPasswordField("old_password", "", nullptr); | 
| 635   builder.AddHiddenField(); | 645   builder.AddHiddenField(); | 
| 636   builder.AddPasswordField("new_password", "", nullptr); | 646   builder.AddPasswordField("new_password", "", nullptr); | 
| 637   builder.AddPasswordField("new_password2", "", nullptr); | 647   builder.AddPasswordField("new_password2", "", nullptr); | 
| 638   builder.AddSubmitButton("submit", false); | 648   builder.AddSubmitButton("submit", false); | 
| 639   std::string change_html = builder.ProduceHTML(); | 649   std::string change_html = builder.ProduceHTML(); | 
| 640 | 650 | 
| 641   scoped_ptr<PasswordForm> change_form; | 651   scoped_ptr<PasswordForm> change_form; | 
| 642   ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(change_html, &change_form)); | 652   ASSERT_NO_FATAL_FAILURE(LoadHTMLAndConvertForm(change_html, &change_form)); | 
| 643   ASSERT_TRUE(change_form); | 653   ASSERT_TRUE(change_form); | 
| 644   EXPECT_EQ(PasswordForm::Layout::LAYOUT_OTHER, change_form->layout); | 654   EXPECT_EQ(PasswordForm::Layout::LAYOUT_OTHER, change_form->layout); | 
| 645 } | 655 } | 
| 646 | 656 | 
| 647 TEST_F(PasswordFormConversionUtilsTest, LayoutClassificationLoginPlusSignup_A) { | 657 TEST_F(MAYBE_PasswordFormConversionUtilsTest, | 
|  | 658        LayoutClassificationLoginPlusSignup_A) { | 
| 648   PasswordFormBuilder builder(kTestFormActionURL); | 659   PasswordFormBuilder builder(kTestFormActionURL); | 
| 649   builder.AddUsernameField("username", "", nullptr); | 660   builder.AddUsernameField("username", "", nullptr); | 
| 650   builder.AddHiddenField(); | 661   builder.AddHiddenField(); | 
| 651   builder.AddPasswordField("password", "", nullptr); | 662   builder.AddPasswordField("password", "", nullptr); | 
| 652   builder.AddUsernameField("username2", "", nullptr); | 663   builder.AddUsernameField("username2", "", nullptr); | 
| 653   builder.AddUsernameField("someotherfield", "", nullptr); | 664   builder.AddUsernameField("someotherfield", "", nullptr); | 
| 654   builder.AddPasswordField("new_password", "", nullptr); | 665   builder.AddPasswordField("new_password", "", nullptr); | 
| 655   builder.AddPasswordField("new_password2", "", nullptr); | 666   builder.AddPasswordField("new_password2", "", nullptr); | 
| 656   builder.AddHiddenField(); | 667   builder.AddHiddenField(); | 
| 657   builder.AddSubmitButton("submit", false); | 668   builder.AddSubmitButton("submit", false); | 
| 658   std::string login_plus_signup_html = builder.ProduceHTML(); | 669   std::string login_plus_signup_html = builder.ProduceHTML(); | 
| 659 | 670 | 
| 660   scoped_ptr<PasswordForm> login_plus_signup_form; | 671   scoped_ptr<PasswordForm> login_plus_signup_form; | 
| 661   ASSERT_NO_FATAL_FAILURE( | 672   ASSERT_NO_FATAL_FAILURE( | 
| 662       LoadHTMLAndConvertForm(login_plus_signup_html, &login_plus_signup_form)); | 673       LoadHTMLAndConvertForm(login_plus_signup_html, &login_plus_signup_form)); | 
| 663   ASSERT_TRUE(login_plus_signup_form); | 674   ASSERT_TRUE(login_plus_signup_form); | 
| 664   EXPECT_EQ(PasswordForm::Layout::LAYOUT_LOGIN_AND_SIGNUP, | 675   EXPECT_EQ(PasswordForm::Layout::LAYOUT_LOGIN_AND_SIGNUP, | 
| 665             login_plus_signup_form->layout); | 676             login_plus_signup_form->layout); | 
| 666 } | 677 } | 
| 667 | 678 | 
| 668 TEST_F(PasswordFormConversionUtilsTest, LayoutClassificationLoginPlusSignup_B) { | 679 TEST_F(MAYBE_PasswordFormConversionUtilsTest, | 
|  | 680        LayoutClassificationLoginPlusSignup_B) { | 
| 669   PasswordFormBuilder builder(kTestFormActionURL); | 681   PasswordFormBuilder builder(kTestFormActionURL); | 
| 670   builder.AddUsernameField("username", "", nullptr); | 682   builder.AddUsernameField("username", "", nullptr); | 
| 671   builder.AddHiddenField(); | 683   builder.AddHiddenField(); | 
| 672   builder.AddPasswordField("password", "", nullptr); | 684   builder.AddPasswordField("password", "", nullptr); | 
| 673   builder.AddUsernameField("username2", "", nullptr); | 685   builder.AddUsernameField("username2", "", nullptr); | 
| 674   builder.AddUsernameField("someotherfield", "", nullptr); | 686   builder.AddUsernameField("someotherfield", "", nullptr); | 
| 675   builder.AddPasswordField("new_password", "", nullptr); | 687   builder.AddPasswordField("new_password", "", nullptr); | 
| 676   builder.AddUsernameField("someotherfield2", "", nullptr); | 688   builder.AddUsernameField("someotherfield2", "", nullptr); | 
| 677   builder.AddHiddenField(); | 689   builder.AddHiddenField(); | 
| 678   builder.AddSubmitButton("submit", false); | 690   builder.AddSubmitButton("submit", false); | 
| 679   std::string login_plus_signup_html = builder.ProduceHTML(); | 691   std::string login_plus_signup_html = builder.ProduceHTML(); | 
| 680 | 692 | 
| 681   scoped_ptr<PasswordForm> login_plus_signup_form; | 693   scoped_ptr<PasswordForm> login_plus_signup_form; | 
| 682   ASSERT_NO_FATAL_FAILURE( | 694   ASSERT_NO_FATAL_FAILURE( | 
| 683       LoadHTMLAndConvertForm(login_plus_signup_html, &login_plus_signup_form)); | 695       LoadHTMLAndConvertForm(login_plus_signup_html, &login_plus_signup_form)); | 
| 684   ASSERT_TRUE(login_plus_signup_form); | 696   ASSERT_TRUE(login_plus_signup_form); | 
| 685   EXPECT_EQ(PasswordForm::Layout::LAYOUT_LOGIN_AND_SIGNUP, | 697   EXPECT_EQ(PasswordForm::Layout::LAYOUT_LOGIN_AND_SIGNUP, | 
| 686             login_plus_signup_form->layout); | 698             login_plus_signup_form->layout); | 
| 687 } | 699 } | 
| 688 | 700 | 
| 689 }  // namespace autofill | 701 }  // namespace autofill | 
| OLD | NEW | 
|---|