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 <string> | 5 #include <string> |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/metrics/histogram_samples.h" | 8 #include "base/metrics/histogram_samples.h" |
9 #include "base/metrics/statistics_recorder.h" | 9 #include "base/metrics/statistics_recorder.h" |
10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 base::WeakPtr<autofill::AutofillPopupDelegate> delegate) override { | 120 base::WeakPtr<autofill::AutofillPopupDelegate> delegate) override { |
121 message_loop_runner_->Quit(); | 121 message_loop_runner_->Quit(); |
122 } | 122 } |
123 | 123 |
124 private: | 124 private: |
125 scoped_refptr<content::MessageLoopRunner> message_loop_runner_; | 125 scoped_refptr<content::MessageLoopRunner> message_loop_runner_; |
126 | 126 |
127 DISALLOW_COPY_AND_ASSIGN(ObservingAutofillClient); | 127 DISALLOW_COPY_AND_ASSIGN(ObservingAutofillClient); |
128 }; | 128 }; |
129 | 129 |
130 // TODO(dvadym): This is for avoiding unused function compilation error. Remove | |
131 // it when http://crbug.com/359315 is implemented for Mac. | |
132 #if !defined(OS_MACOSX) | |
133 // For simplicity we assume that password store contains only 1 credentials. | |
134 void CheckThatCredentialsStored( | 130 void CheckThatCredentialsStored( |
135 password_manager::TestPasswordStore* password_store, | 131 password_manager::TestPasswordStore* password_store, |
136 const base::string16& username, | 132 const base::string16& username, |
137 const base::string16& password) { | 133 const base::string16& password) { |
138 auto& passwords_map = password_store->stored_passwords(); | 134 auto& passwords_map = password_store->stored_passwords(); |
139 ASSERT_EQ(1u, passwords_map.size()); | 135 ASSERT_EQ(1u, passwords_map.size()); |
140 auto& passwords_vector = passwords_map.begin()->second; | 136 auto& passwords_vector = passwords_map.begin()->second; |
141 ASSERT_EQ(1u, passwords_vector.size()); | 137 ASSERT_EQ(1u, passwords_vector.size()); |
142 const autofill::PasswordForm& form = passwords_vector[0]; | 138 const autofill::PasswordForm& form = passwords_vector[0]; |
143 EXPECT_EQ(username, form.username_value); | 139 EXPECT_EQ(username, form.username_value); |
144 EXPECT_EQ(password, form.password_value); | 140 EXPECT_EQ(password, form.password_value); |
145 } | 141 } |
146 #endif | |
147 | 142 |
148 void TestPromptNotShown(const char* failure_message, | 143 void TestPromptNotShown(const char* failure_message, |
149 content::WebContents* web_contents, | 144 content::WebContents* web_contents, |
150 content::RenderViewHost* rvh) { | 145 content::RenderViewHost* rvh) { |
151 SCOPED_TRACE(testing::Message(failure_message)); | 146 SCOPED_TRACE(testing::Message(failure_message)); |
152 | 147 |
153 NavigationObserver observer(web_contents); | 148 NavigationObserver observer(web_contents); |
154 scoped_ptr<PromptObserver> prompt_observer( | 149 scoped_ptr<PromptObserver> prompt_observer( |
155 PromptObserver::Create(web_contents)); | 150 PromptObserver::Create(web_contents)); |
156 std::string fill_and_submit = | 151 std::string fill_and_submit = |
(...skipping 2599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2756 "var text = document.getElementById('log-entries').innerText;" | 2751 "var text = document.getElementById('log-entries').innerText;" |
2757 "var logs_found = /PasswordManager::/.test(text);" | 2752 "var logs_found = /PasswordManager::/.test(text);" |
2758 "window.domAutomationController.send(logs_found);"; | 2753 "window.domAutomationController.send(logs_found);"; |
2759 bool browser_logs_found; | 2754 bool browser_logs_found; |
2760 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( | 2755 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
2761 internals_web_contents->GetRenderViewHost(), find_browser_logs, | 2756 internals_web_contents->GetRenderViewHost(), find_browser_logs, |
2762 &browser_logs_found)); | 2757 &browser_logs_found)); |
2763 EXPECT_TRUE(browser_logs_found); | 2758 EXPECT_TRUE(browser_logs_found); |
2764 } | 2759 } |
2765 | 2760 |
| 2761 // Tests that submitted credentials are saved on a password form without |
| 2762 // username element when there are no stored credentials. |
| 2763 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
| 2764 PasswordRetryFormSaveNoUsernameCredentials) { |
| 2765 scoped_refptr<password_manager::TestPasswordStore> password_store = |
| 2766 static_cast<password_manager::TestPasswordStore*>( |
| 2767 PasswordStoreFactory::GetForProfile( |
| 2768 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) |
| 2769 .get()); |
| 2770 // Check that password save bubble is shown. |
| 2771 NavigateToFile("/password/password_form.html"); |
| 2772 NavigationObserver observer(WebContents()); |
| 2773 scoped_ptr<PromptObserver> prompt_observer( |
| 2774 PromptObserver::Create(WebContents())); |
| 2775 std::string fill_and_submit = |
| 2776 "document.getElementById('retry_password_field').value = 'pw';" |
| 2777 "document.getElementById('retry_submit_button').click()"; |
| 2778 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 2779 observer.Wait(); |
| 2780 EXPECT_TRUE(prompt_observer->IsShowingPrompt()); |
| 2781 prompt_observer->Accept(); |
| 2782 // Spin the message loop to make sure the password store had a chance to |
| 2783 // update the password. |
| 2784 base::RunLoop run_loop; |
| 2785 run_loop.RunUntilIdle(); |
| 2786 CheckThatCredentialsStored(password_store.get(), base::string16(), |
| 2787 base::ASCIIToUTF16("pw")); |
| 2788 } |
| 2789 |
| 2790 // Tests that no bubble shown when a password form without username submitted |
| 2791 // and there is stored credentials with the same password. |
| 2792 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
| 2793 PasswordRetryFormNoBubbleWhenPasswordTheSame) { |
| 2794 ASSERT_TRUE(ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()); |
| 2795 // At first let us save credentials to the PasswordManager. |
| 2796 scoped_refptr<password_manager::TestPasswordStore> password_store = |
| 2797 static_cast<password_manager::TestPasswordStore*>( |
| 2798 PasswordStoreFactory::GetForProfile( |
| 2799 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) |
| 2800 .get()); |
| 2801 autofill::PasswordForm signin_form; |
| 2802 signin_form.signon_realm = embedded_test_server()->base_url().spec(); |
| 2803 signin_form.username_value = base::ASCIIToUTF16("temp"); |
| 2804 signin_form.password_value = base::ASCIIToUTF16("pw"); |
| 2805 password_store->AddLogin(signin_form); |
| 2806 signin_form.username_value = base::ASCIIToUTF16("temp1"); |
| 2807 signin_form.password_value = base::ASCIIToUTF16("pw1"); |
| 2808 password_store->AddLogin(signin_form); |
| 2809 |
| 2810 // Check that no password bubble is shown when the submitted password is the |
| 2811 // same in one of the stored credentials. |
| 2812 NavigateToFile("/password/password_form.html"); |
| 2813 NavigationObserver observer(WebContents()); |
| 2814 scoped_ptr<PromptObserver> prompt_observer( |
| 2815 PromptObserver::Create(WebContents())); |
| 2816 std::string fill_and_submit = |
| 2817 "document.getElementById('retry_password_field').value = 'pw';" |
| 2818 "document.getElementById('retry_submit_button').click()"; |
| 2819 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 2820 observer.Wait(); |
| 2821 EXPECT_FALSE(prompt_observer->IsShowingPrompt()); |
| 2822 EXPECT_FALSE(prompt_observer->IsShowingUpdatePrompt()); |
| 2823 } |
| 2824 |
| 2825 // TODO(dvadym): Turn on this test when Change password UI will be implemented |
| 2826 // for Mac. http://crbug.com/359315 |
| 2827 #if !defined(OS_MACOSX) |
| 2828 // Tests that the update bubble shown when a password form without username is |
| 2829 // submitted and there are stored credentials but with different password. |
| 2830 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
| 2831 PasswordRetryFormUpdateBubbleShown) { |
| 2832 ASSERT_TRUE(ChromePasswordManagerClient::IsTheHotNewBubbleUIEnabled()); |
| 2833 // At first let us save credentials to the PasswordManager. |
| 2834 scoped_refptr<password_manager::TestPasswordStore> password_store = |
| 2835 static_cast<password_manager::TestPasswordStore*>( |
| 2836 PasswordStoreFactory::GetForProfile( |
| 2837 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) |
| 2838 .get()); |
| 2839 autofill::PasswordForm signin_form; |
| 2840 signin_form.signon_realm = embedded_test_server()->base_url().spec(); |
| 2841 signin_form.username_value = base::ASCIIToUTF16("temp"); |
| 2842 signin_form.password_value = base::ASCIIToUTF16("pw"); |
| 2843 password_store->AddLogin(signin_form); |
| 2844 |
| 2845 // Check that password update bubble is shown. |
| 2846 NavigateToFile("/password/password_form.html"); |
| 2847 NavigationObserver observer(WebContents()); |
| 2848 scoped_ptr<PromptObserver> prompt_observer( |
| 2849 PromptObserver::Create(WebContents())); |
| 2850 std::string fill_and_submit = |
| 2851 "document.getElementById('retry_password_field').value = 'new_pw';" |
| 2852 "document.getElementById('retry_submit_button').click()"; |
| 2853 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
| 2854 observer.Wait(); |
| 2855 // The new password "new_pw" is used, so update prompt is expected. |
| 2856 EXPECT_TRUE(prompt_observer->IsShowingUpdatePrompt()); |
| 2857 |
| 2858 const autofill::PasswordForm stored_form = |
| 2859 password_store->stored_passwords().begin()->second[0]; |
| 2860 prompt_observer->AcceptUpdatePrompt(stored_form); |
| 2861 // Spin the message loop to make sure the password store had a chance to |
| 2862 // update the password. |
| 2863 base::RunLoop run_loop; |
| 2864 run_loop.RunUntilIdle(); |
| 2865 CheckThatCredentialsStored(password_store.get(), base::ASCIIToUTF16("temp"), |
| 2866 base::ASCIIToUTF16("new_pw")); |
| 2867 } |
| 2868 #endif |
| 2869 |
2766 } // namespace password_manager | 2870 } // namespace password_manager |
OLD | NEW |