OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/password_manager/core/browser/password_manager.h" | 5 #include "components/password_manager/core/browser/password_manager.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
125 } | 125 } |
126 | 126 |
127 PasswordForm MakeSimpleForm() { | 127 PasswordForm MakeSimpleForm() { |
128 PasswordForm form; | 128 PasswordForm form; |
129 form.origin = GURL("http://www.google.com/a/LoginAuth"); | 129 form.origin = GURL("http://www.google.com/a/LoginAuth"); |
130 form.action = GURL("http://www.google.com/a/Login"); | 130 form.action = GURL("http://www.google.com/a/Login"); |
131 form.username_element = ASCIIToUTF16("Email"); | 131 form.username_element = ASCIIToUTF16("Email"); |
132 form.password_element = ASCIIToUTF16("Passwd"); | 132 form.password_element = ASCIIToUTF16("Passwd"); |
133 form.username_value = ASCIIToUTF16("google"); | 133 form.username_value = ASCIIToUTF16("google"); |
134 form.password_value = ASCIIToUTF16("password"); | 134 form.password_value = ASCIIToUTF16("password"); |
135 // Default to true so we only need to add tests in autocomplete=off cases. | |
136 form.password_autocomplete_set = true; | |
137 form.submit_element = ASCIIToUTF16("signIn"); | 135 form.submit_element = ASCIIToUTF16("signIn"); |
138 form.signon_realm = "http://www.google.com"; | 136 form.signon_realm = "http://www.google.com"; |
139 return form; | 137 return form; |
140 } | 138 } |
141 | 139 |
142 // Create a sign-up form that only has a new password field. | 140 // Create a sign-up form that only has a new password field. |
143 PasswordForm MakeFormWithOnlyNewPasswordField() { | 141 PasswordForm MakeFormWithOnlyNewPasswordField() { |
144 PasswordForm form = MakeSimpleForm(); | 142 PasswordForm form = MakeSimpleForm(); |
145 form.new_password_element.swap(form.password_element); | 143 form.new_password_element.swap(form.password_element); |
146 form.new_password_value.swap(form.password_value); | 144 form.new_password_value.swap(form.password_value); |
147 return form; | 145 return form; |
148 } | 146 } |
149 | 147 |
150 // Reproduction of the form present on twitter's login page. | 148 // Reproduction of the form present on twitter's login page. |
151 PasswordForm MakeTwitterLoginForm() { | 149 PasswordForm MakeTwitterLoginForm() { |
152 PasswordForm form; | 150 PasswordForm form; |
153 form.origin = GURL("https://twitter.com/"); | 151 form.origin = GURL("https://twitter.com/"); |
154 form.action = GURL("https://twitter.com/sessions"); | 152 form.action = GURL("https://twitter.com/sessions"); |
155 form.username_element = ASCIIToUTF16("Email"); | 153 form.username_element = ASCIIToUTF16("Email"); |
156 form.password_element = ASCIIToUTF16("Passwd"); | 154 form.password_element = ASCIIToUTF16("Passwd"); |
157 form.username_value = ASCIIToUTF16("twitter"); | 155 form.username_value = ASCIIToUTF16("twitter"); |
158 form.password_value = ASCIIToUTF16("password"); | 156 form.password_value = ASCIIToUTF16("password"); |
159 form.password_autocomplete_set = true; | |
160 form.submit_element = ASCIIToUTF16("signIn"); | 157 form.submit_element = ASCIIToUTF16("signIn"); |
161 form.signon_realm = "https://twitter.com"; | 158 form.signon_realm = "https://twitter.com"; |
162 return form; | 159 return form; |
163 } | 160 } |
164 | 161 |
165 // Reproduction of the form present on twitter's failed login page. | 162 // Reproduction of the form present on twitter's failed login page. |
166 PasswordForm MakeTwitterFailedLoginForm() { | 163 PasswordForm MakeTwitterFailedLoginForm() { |
167 PasswordForm form; | 164 PasswordForm form; |
168 form.origin = GURL("https://twitter.com/login/error?redirect_after_login"); | 165 form.origin = GURL("https://twitter.com/login/error?redirect_after_login"); |
169 form.action = GURL("https://twitter.com/sessions"); | 166 form.action = GURL("https://twitter.com/sessions"); |
170 form.username_element = ASCIIToUTF16("EmailField"); | 167 form.username_element = ASCIIToUTF16("EmailField"); |
171 form.password_element = ASCIIToUTF16("PasswdField"); | 168 form.password_element = ASCIIToUTF16("PasswdField"); |
172 form.username_value = ASCIIToUTF16("twitter"); | 169 form.username_value = ASCIIToUTF16("twitter"); |
173 form.password_value = ASCIIToUTF16("password"); | 170 form.password_value = ASCIIToUTF16("password"); |
174 form.password_autocomplete_set = true; | |
175 form.submit_element = ASCIIToUTF16("signIn"); | 171 form.submit_element = ASCIIToUTF16("signIn"); |
176 form.signon_realm = "https://twitter.com"; | 172 form.signon_realm = "https://twitter.com"; |
177 return form; | 173 return form; |
178 } | 174 } |
179 | 175 |
180 PasswordForm MakeSimpleFormWithOnlyPasswordField() { | 176 PasswordForm MakeSimpleFormWithOnlyPasswordField() { |
181 PasswordForm form(MakeSimpleForm()); | 177 PasswordForm form(MakeSimpleForm()); |
182 form.username_element.clear(); | 178 form.username_element.clear(); |
183 form.username_value.clear(); | 179 form.username_value.clear(); |
184 return form; | 180 return form; |
(...skipping 10 matching lines...) Expand all Loading... | |
195 if (lhs.password_element != rhs.password_element) | 191 if (lhs.password_element != rhs.password_element) |
196 return false; | 192 return false; |
197 if (lhs.new_password_element != rhs.new_password_element) | 193 if (lhs.new_password_element != rhs.new_password_element) |
198 return false; | 194 return false; |
199 if (lhs.username_value != rhs.username_value) | 195 if (lhs.username_value != rhs.username_value) |
200 return false; | 196 return false; |
201 if (lhs.password_value != rhs.password_value) | 197 if (lhs.password_value != rhs.password_value) |
202 return false; | 198 return false; |
203 if (lhs.new_password_value != rhs.new_password_value) | 199 if (lhs.new_password_value != rhs.new_password_value) |
204 return false; | 200 return false; |
205 if (lhs.password_autocomplete_set != rhs.password_autocomplete_set) | |
206 return false; | |
207 if (lhs.submit_element != rhs.submit_element) | 201 if (lhs.submit_element != rhs.submit_element) |
208 return false; | 202 return false; |
209 if (lhs.signon_realm != rhs.signon_realm) | 203 if (lhs.signon_realm != rhs.signon_realm) |
210 return false; | 204 return false; |
211 return true; | 205 return true; |
212 } | 206 } |
213 | 207 |
214 TestPasswordManager* manager() { return manager_.get(); } | 208 TestPasswordManager* manager() { return manager_.get(); } |
215 | 209 |
216 void OnPasswordFormSubmitted(const autofill::PasswordForm& form) { | 210 void OnPasswordFormSubmitted(const autofill::PasswordForm& form) { |
(...skipping 17 matching lines...) Expand all Loading... | |
234 scoped_ptr<TestPasswordManager> manager_; | 228 scoped_ptr<TestPasswordManager> manager_; |
235 PasswordForm submitted_form_; | 229 PasswordForm submitted_form_; |
236 }; | 230 }; |
237 | 231 |
238 MATCHER_P(FormMatches, form, "") { | 232 MATCHER_P(FormMatches, form, "") { |
239 return form.signon_realm == arg.signon_realm && form.origin == arg.origin && | 233 return form.signon_realm == arg.signon_realm && form.origin == arg.origin && |
240 form.action == arg.action && | 234 form.action == arg.action && |
241 form.username_element == arg.username_element && | 235 form.username_element == arg.username_element && |
242 form.password_element == arg.password_element && | 236 form.password_element == arg.password_element && |
243 form.new_password_element == arg.new_password_element && | 237 form.new_password_element == arg.new_password_element && |
244 form.password_autocomplete_set == arg.password_autocomplete_set && | |
245 form.submit_element == arg.submit_element; | 238 form.submit_element == arg.submit_element; |
246 } | 239 } |
247 | 240 |
248 TEST_F(PasswordManagerTest, FormSubmitEmptyStore) { | 241 TEST_F(PasswordManagerTest, FormSubmitEmptyStore) { |
249 // Test that observing a newly submitted form shows the save password bar. | 242 // Test that observing a newly submitted form shows the save password bar. |
250 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); | 243 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); |
251 std::vector<PasswordForm> observed; | 244 std::vector<PasswordForm> observed; |
252 PasswordForm form(MakeSimpleForm()); | 245 PasswordForm form(MakeSimpleForm()); |
253 observed.push_back(form); | 246 observed.push_back(form); |
254 // The initial load. | 247 // The initial load. |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
588 EXPECT_CALL(driver_, FillPasswordForm(_)); | 581 EXPECT_CALL(driver_, FillPasswordForm(_)); |
589 EXPECT_CALL(*store_, | 582 EXPECT_CALL(*store_, |
590 GetLogins(_, testing::Eq(PasswordStore::DISALLOW_PROMPT), _)) | 583 GetLogins(_, testing::Eq(PasswordStore::DISALLOW_PROMPT), _)) |
591 .WillOnce(WithArg<2>(InvokeConsumer(&result))); | 584 .WillOnce(WithArg<2>(InvokeConsumer(&result))); |
592 std::vector<PasswordForm> observed; | 585 std::vector<PasswordForm> observed; |
593 PasswordForm form(MakeSimpleForm()); | 586 PasswordForm form(MakeSimpleForm()); |
594 observed.push_back(form); | 587 observed.push_back(form); |
595 manager()->OnPasswordFormsParsed(&driver_, observed); | 588 manager()->OnPasswordFormsParsed(&driver_, observed); |
596 } | 589 } |
597 | 590 |
598 TEST_F(PasswordManagerTest, FormSavedWithAutocompleteOff) { | 591 TEST_F(PasswordManagerTest, FormSavedWithAutocompleteOff) { |
vabr (Chromium)
2015/06/19 16:25:11
Please delete this test completely.
Without the au
| |
599 // Test password form with non-generated password will be saved even if | 592 // Test password form with non-generated password will be saved even if |
600 // autocomplete=off. | 593 // autocomplete=off. |
601 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); | 594 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); |
602 std::vector<PasswordForm> observed; | 595 std::vector<PasswordForm> observed; |
603 PasswordForm form(MakeSimpleForm()); | 596 PasswordForm form(MakeSimpleForm()); |
604 form.password_autocomplete_set = false; | |
605 observed.push_back(form); | 597 observed.push_back(form); |
606 manager()->OnPasswordFormsParsed(&driver_, observed); // The initial load. | 598 manager()->OnPasswordFormsParsed(&driver_, observed); // The initial load. |
607 manager()->OnPasswordFormsRendered(&driver_, observed, | 599 manager()->OnPasswordFormsRendered(&driver_, observed, |
608 true); // The initial layout. | 600 true); // The initial layout. |
609 | 601 |
610 // And the form submit contract is to call ProvisionallySavePassword. | 602 // And the form submit contract is to call ProvisionallySavePassword. |
611 manager()->ProvisionallySavePassword(form); | 603 manager()->ProvisionallySavePassword(form); |
612 | 604 |
613 // Password form should be saved. | 605 // Password form should be saved. |
614 scoped_ptr<PasswordFormManager> form_to_save; | 606 scoped_ptr<PasswordFormManager> form_to_save; |
615 EXPECT_CALL(client_, | 607 EXPECT_CALL(client_, |
616 PromptUserToSavePasswordPtr( | 608 PromptUserToSavePasswordPtr( |
617 _, CredentialSourceType::CREDENTIAL_SOURCE_PASSWORD_MANAGER)) | 609 _, CredentialSourceType::CREDENTIAL_SOURCE_PASSWORD_MANAGER)) |
618 .Times(Exactly(1)) | 610 .Times(Exactly(1)) |
619 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); | 611 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); |
620 EXPECT_CALL(*store_, AddLogin(FormMatches(form))).Times(Exactly(0)); | 612 EXPECT_CALL(*store_, AddLogin(FormMatches(form))).Times(Exactly(0)); |
621 | 613 |
622 // Now the password manager waits for the navigation to complete. | 614 // Now the password manager waits for the navigation to complete. |
623 observed.clear(); | 615 observed.clear(); |
624 manager()->OnPasswordFormsParsed(&driver_, | 616 manager()->OnPasswordFormsParsed(&driver_, |
625 observed); // The post-navigation load. | 617 observed); // The post-navigation load. |
626 manager()->OnPasswordFormsRendered(&driver_, observed, | 618 manager()->OnPasswordFormsRendered(&driver_, observed, |
627 true); // The post-navigation layout. | 619 true); // The post-navigation layout. |
628 | 620 |
629 ASSERT_TRUE(form_to_save.get()); | 621 ASSERT_TRUE(form_to_save.get()); |
630 } | 622 } |
631 | 623 |
632 TEST_F(PasswordManagerTest, GeneratedPasswordFormSavedAutocompleteOff) { | 624 TEST_F(PasswordManagerTest, GeneratedPasswordFormSavedAutocompleteOff) { |
vabr (Chromium)
2015/06/19 16:25:11
Remove this test completely, it is the same as Gen
| |
633 // Test password form with generated password will still be saved if | 625 // Test password form with generated password will still be saved if |
634 // autocomplete=off. | 626 // autocomplete=off. |
635 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); | 627 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); |
636 std::vector<PasswordForm> observed; | 628 std::vector<PasswordForm> observed; |
637 PasswordForm form(MakeSimpleForm()); | 629 PasswordForm form(MakeSimpleForm()); |
638 form.password_autocomplete_set = false; | |
639 observed.push_back(form); | 630 observed.push_back(form); |
640 manager()->OnPasswordFormsParsed(&driver_, observed); // The initial load. | 631 manager()->OnPasswordFormsParsed(&driver_, observed); // The initial load. |
641 manager()->OnPasswordFormsRendered(&driver_, observed, | 632 manager()->OnPasswordFormsRendered(&driver_, observed, |
642 true); // The initial layout. | 633 true); // The initial layout. |
643 | 634 |
644 // Simulate the user generating the password and submitting the form. | 635 // Simulate the user generating the password and submitting the form. |
645 manager()->SetHasGeneratedPasswordForForm(&driver_, form, true); | 636 manager()->SetHasGeneratedPasswordForForm(&driver_, form, true); |
646 manager()->ProvisionallySavePassword(form); | 637 manager()->ProvisionallySavePassword(form); |
647 | 638 |
648 // The user should not be presented with an infobar as they have already given | 639 // The user should not be presented with an infobar as they have already given |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
699 } | 690 } |
700 | 691 |
701 TEST_F(PasswordManagerTest, SyncCredentialsNotSaved) { | 692 TEST_F(PasswordManagerTest, SyncCredentialsNotSaved) { |
702 EXPECT_CALL(client_, IsSyncAccountCredential(_, _)) | 693 EXPECT_CALL(client_, IsSyncAccountCredential(_, _)) |
703 .WillRepeatedly(Return(true)); | 694 .WillRepeatedly(Return(true)); |
704 | 695 |
705 // Simulate loading a simple form with no existing stored password. | 696 // Simulate loading a simple form with no existing stored password. |
706 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); | 697 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); |
707 std::vector<PasswordForm> observed; | 698 std::vector<PasswordForm> observed; |
708 PasswordForm form(MakeSimpleForm()); | 699 PasswordForm form(MakeSimpleForm()); |
709 form.password_autocomplete_set = false; | |
710 observed.push_back(form); | 700 observed.push_back(form); |
711 manager()->OnPasswordFormsParsed(&driver_, observed); // The initial load. | 701 manager()->OnPasswordFormsParsed(&driver_, observed); // The initial load. |
712 manager()->OnPasswordFormsRendered(&driver_, observed, | 702 manager()->OnPasswordFormsRendered(&driver_, observed, |
713 true); // The initial layout. | 703 true); // The initial layout. |
714 | 704 |
715 // User should not be prompted and password should not be saved. | 705 // User should not be prompted and password should not be saved. |
716 EXPECT_CALL(client_, | 706 EXPECT_CALL(client_, |
717 PromptUserToSavePasswordPtr( | 707 PromptUserToSavePasswordPtr( |
718 _, CredentialSourceType::CREDENTIAL_SOURCE_PASSWORD_MANAGER)) | 708 _, CredentialSourceType::CREDENTIAL_SOURCE_PASSWORD_MANAGER)) |
719 .Times(Exactly(0)); | 709 .Times(Exactly(0)); |
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1102 manager()->OnPasswordFormsRendered(&driver_, observed, true); | 1092 manager()->OnPasswordFormsRendered(&driver_, observed, true); |
1103 | 1093 |
1104 ASSERT_TRUE(form_to_save); | 1094 ASSERT_TRUE(form_to_save); |
1105 EXPECT_CALL(*store_, AddLogin(FormMatches(form))); | 1095 EXPECT_CALL(*store_, AddLogin(FormMatches(form))); |
1106 | 1096 |
1107 // Simulate saving the form, as if the info bar was accepted. | 1097 // Simulate saving the form, as if the info bar was accepted. |
1108 form_to_save->Save(); | 1098 form_to_save->Save(); |
1109 } | 1099 } |
1110 | 1100 |
1111 } // namespace password_manager | 1101 } // namespace password_manager |
OLD | NEW |