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 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 form.username_element = ASCIIToUTF16("EmailField"); | 170 form.username_element = ASCIIToUTF16("EmailField"); |
171 form.password_element = ASCIIToUTF16("PasswdField"); | 171 form.password_element = ASCIIToUTF16("PasswdField"); |
172 form.username_value = ASCIIToUTF16("twitter"); | 172 form.username_value = ASCIIToUTF16("twitter"); |
173 form.password_value = ASCIIToUTF16("password"); | 173 form.password_value = ASCIIToUTF16("password"); |
174 form.password_autocomplete_set = true; | 174 form.password_autocomplete_set = true; |
175 form.submit_element = ASCIIToUTF16("signIn"); | 175 form.submit_element = ASCIIToUTF16("signIn"); |
176 form.signon_realm = "https://twitter.com"; | 176 form.signon_realm = "https://twitter.com"; |
177 return form; | 177 return form; |
178 } | 178 } |
179 | 179 |
| 180 PasswordForm MakeSimpleFormWithOnlyPasswordField() { |
| 181 PasswordForm form(MakeSimpleForm()); |
| 182 form.username_element.clear(); |
| 183 form.username_value.clear(); |
| 184 return form; |
| 185 } |
| 186 |
180 bool FormsAreEqual(const autofill::PasswordForm& lhs, | 187 bool FormsAreEqual(const autofill::PasswordForm& lhs, |
181 const autofill::PasswordForm& rhs) { | 188 const autofill::PasswordForm& rhs) { |
182 if (lhs.origin != rhs.origin) | 189 if (lhs.origin != rhs.origin) |
183 return false; | 190 return false; |
184 if (lhs.action != rhs.action) | 191 if (lhs.action != rhs.action) |
185 return false; | 192 return false; |
186 if (lhs.username_element != rhs.username_element) | 193 if (lhs.username_element != rhs.username_element) |
187 return false; | 194 return false; |
188 if (lhs.password_element != rhs.password_element) | 195 if (lhs.password_element != rhs.password_element) |
189 return false; | 196 return false; |
(...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
820 scoped_ptr<PasswordFormManager> form_to_save; | 827 scoped_ptr<PasswordFormManager> form_to_save; |
821 EXPECT_CALL(client_, PromptUserToSavePasswordPtr(_)).Times(0); | 828 EXPECT_CALL(client_, PromptUserToSavePasswordPtr(_)).Times(0); |
822 | 829 |
823 // Now the password manager waits for the login to complete successfully. | 830 // Now the password manager waits for the login to complete successfully. |
824 observed.clear(); | 831 observed.clear(); |
825 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. | 832 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. |
826 manager()->OnPasswordFormsRendered(observed, | 833 manager()->OnPasswordFormsRendered(observed, |
827 true); // The post-navigation layout. | 834 true); // The post-navigation layout. |
828 } | 835 } |
829 | 836 |
| 837 TEST_F(PasswordManagerTest, FormSubmitWithOnlyPassowrdField) { |
| 838 // Test to verify that on submitting the HTML password form without having |
| 839 // username input filed shows password save promt and saves the password to |
| 840 // store. |
| 841 std::vector<PasswordForm*> result; // Empty password store. |
| 842 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); |
| 843 EXPECT_CALL(*store_.get(), GetLogins(_, _, _)) |
| 844 .WillOnce(DoAll(WithArg<2>(InvokeConsumer(result)), Return())); |
| 845 std::vector<PasswordForm> observed; |
| 846 |
| 847 // Loads passsword form without username input field. |
| 848 PasswordForm form(MakeSimpleFormWithOnlyPasswordField()); |
| 849 observed.push_back(form); |
| 850 manager()->OnPasswordFormsParsed(observed); // The initial load. |
| 851 manager()->OnPasswordFormsRendered(observed, true); // The initial layout. |
| 852 |
| 853 // And the form submit contract is to call ProvisionallySavePassword. |
| 854 manager()->ProvisionallySavePassword(form); |
| 855 |
| 856 scoped_ptr<PasswordFormManager> form_to_save; |
| 857 EXPECT_CALL(client_, PromptUserToSavePasswordPtr(_)) |
| 858 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); |
| 859 |
| 860 // Now the password manager waits for the navigation to complete. |
| 861 observed.clear(); |
| 862 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. |
| 863 manager()->OnPasswordFormsRendered(observed, |
| 864 true); // The post-navigation layout. |
| 865 |
| 866 ASSERT_TRUE(form_to_save.get()); |
| 867 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))); |
| 868 |
| 869 // Simulate saving the form, as if the info bar was accepted. |
| 870 form_to_save->Save(); |
| 871 } |
| 872 |
830 } // namespace password_manager | 873 } // namespace password_manager |
OLD | NEW |