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 <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "chrome/browser/password_manager/mock_password_store.h" | 10 #include "chrome/browser/password_manager/mock_password_store.h" |
(...skipping 28 matching lines...) Expand all Loading... |
39 }; | 39 }; |
40 | 40 |
41 ACTION_P(InvokeConsumer, forms) { | 41 ACTION_P(InvokeConsumer, forms) { |
42 arg0->OnGetPasswordStoreResults(forms); | 42 arg0->OnGetPasswordStoreResults(forms); |
43 } | 43 } |
44 | 44 |
45 ACTION_P(SaveToScopedPtr, scoped) { | 45 ACTION_P(SaveToScopedPtr, scoped) { |
46 scoped->reset(arg0); | 46 scoped->reset(arg0); |
47 } | 47 } |
48 | 48 |
| 49 class TestPasswordManager : public PasswordManager { |
| 50 public: |
| 51 TestPasswordManager(content::WebContents* contents, |
| 52 PasswordManagerDelegate* delegate); |
| 53 virtual ~TestPasswordManager(); |
| 54 |
| 55 virtual void OnPasswordFormSubmitted(const PasswordForm& form) OVERRIDE { |
| 56 PasswordManager::OnPasswordFormSubmitted(form); |
| 57 } |
| 58 |
| 59 static TestPasswordManager* CreateForWebContentsAndDelegate( |
| 60 content::WebContents* contents, |
| 61 PasswordManagerDelegate* delegate) { |
| 62 TestPasswordManager* tpm = new TestPasswordManager(contents, delegate); |
| 63 contents->SetUserData(UserDataKey(), tpm); |
| 64 return tpm; |
| 65 } |
| 66 |
| 67 private: |
| 68 DISALLOW_COPY_AND_ASSIGN(TestPasswordManager); |
| 69 }; |
| 70 |
49 class PasswordManagerTest : public ChromeRenderViewHostTestHarness { | 71 class PasswordManagerTest : public ChromeRenderViewHostTestHarness { |
50 protected: | 72 protected: |
51 virtual void SetUp() { | 73 virtual void SetUp() { |
52 ChromeRenderViewHostTestHarness::SetUp(); | 74 ChromeRenderViewHostTestHarness::SetUp(); |
53 store_ = static_cast<MockPasswordStore*>( | 75 store_ = static_cast<MockPasswordStore*>( |
54 PasswordStoreFactory::GetInstance()->SetTestingFactoryAndUse( | 76 PasswordStoreFactory::GetInstance()->SetTestingFactoryAndUse( |
55 profile(), MockPasswordStore::Build).get()); | 77 profile(), MockPasswordStore::Build).get()); |
56 | 78 |
57 EXPECT_CALL(delegate_, GetProfile()).WillRepeatedly(Return(profile())); | 79 EXPECT_CALL(delegate_, GetProfile()).WillRepeatedly(Return(profile())); |
58 PasswordManager::CreateForWebContentsAndDelegate( | 80 password_manager_ = TestPasswordManager::CreateForWebContentsAndDelegate( |
59 web_contents(), &delegate_); | 81 web_contents(), &delegate_); |
60 EXPECT_CALL(delegate_, DidLastPageLoadEncounterSSLErrors()) | 82 EXPECT_CALL(delegate_, DidLastPageLoadEncounterSSLErrors()) |
61 .WillRepeatedly(Return(false)); | 83 .WillRepeatedly(Return(false)); |
62 } | 84 } |
63 | 85 |
64 virtual void TearDown() { | 86 virtual void TearDown() { |
65 store_ = NULL; | 87 store_ = NULL; |
66 ChromeRenderViewHostTestHarness::TearDown(); | 88 ChromeRenderViewHostTestHarness::TearDown(); |
67 } | 89 } |
68 | 90 |
69 PasswordForm MakeSimpleForm() { | 91 PasswordForm MakeSimpleForm() { |
70 PasswordForm form; | 92 PasswordForm form; |
71 form.origin = GURL("http://www.google.com/a/LoginAuth"); | 93 form.origin = GURL("http://www.google.com/a/LoginAuth"); |
72 form.action = GURL("http://www.google.com/a/Login"); | 94 form.action = GURL("http://www.google.com/a/Login"); |
73 form.username_element = ASCIIToUTF16("Email"); | 95 form.username_element = ASCIIToUTF16("Email"); |
74 form.password_element = ASCIIToUTF16("Passwd"); | 96 form.password_element = ASCIIToUTF16("Passwd"); |
75 form.username_value = ASCIIToUTF16("google"); | 97 form.username_value = ASCIIToUTF16("google"); |
76 form.password_value = ASCIIToUTF16("password"); | 98 form.password_value = ASCIIToUTF16("password"); |
77 // Default to true so we only need to add tests in autocomplete=off cases. | 99 // Default to true so we only need to add tests in autocomplete=off cases. |
78 form.password_autocomplete_set = true; | 100 form.password_autocomplete_set = true; |
79 form.submit_element = ASCIIToUTF16("signIn"); | 101 form.submit_element = ASCIIToUTF16("signIn"); |
80 form.signon_realm = "http://www.google.com"; | 102 form.signon_realm = "http://www.google.com"; |
81 return form; | 103 return form; |
82 } | 104 } |
83 | 105 |
84 PasswordManager* manager() { | 106 TestPasswordManager* manager() { |
85 return PasswordManager::FromWebContents(web_contents()); | 107 return manager_; |
| 108 } |
| 109 |
| 110 void OnPasswordFormSubmitted(const content::PasswordForm& form) { |
| 111 manager()->OnPasswordFormSubmitted(form); |
| 112 } |
| 113 |
| 114 PasswordSubmittedCallback SubmissionCallback() { |
| 115 return base::Bind(&PasswordManagerTest::FormSubmitted, |
| 116 base::Unretained(this)); |
| 117 } |
| 118 |
| 119 void FormSubmitted(const content::PasswordForm& form) { |
| 120 submitted_form_ = form; |
86 } | 121 } |
87 | 122 |
88 scoped_refptr<MockPasswordStore> store_; | 123 scoped_refptr<MockPasswordStore> store_; |
| 124 TestPasswordManager manager_; |
89 MockPasswordManagerDelegate delegate_; // Owned by manager_. | 125 MockPasswordManagerDelegate delegate_; // Owned by manager_. |
| 126 PasswordForm submitted_form_; |
90 }; | 127 }; |
91 | 128 |
92 MATCHER_P(FormMatches, form, "") { | 129 MATCHER_P(FormMatches, form, "") { |
93 return form.signon_realm == arg.signon_realm && | 130 return form.signon_realm == arg.signon_realm && |
94 form.origin == arg.origin && | 131 form.origin == arg.origin && |
95 form.action == arg.action && | 132 form.action == arg.action && |
96 form.username_element == arg.username_element && | 133 form.username_element == arg.username_element && |
97 form.password_element == arg.password_element && | 134 form.password_element == arg.password_element && |
98 form.password_autocomplete_set == | 135 form.password_autocomplete_set == |
99 arg.password_autocomplete_set && | 136 arg.password_autocomplete_set && |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 std::vector<PasswordForm*> result; // Empty password store. | 238 std::vector<PasswordForm*> result; // Empty password store. |
202 EXPECT_CALL(delegate_, FillPasswordForm(_)).Times(Exactly(0)); | 239 EXPECT_CALL(delegate_, FillPasswordForm(_)).Times(Exactly(0)); |
203 EXPECT_CALL(*store_.get(), GetLogins(_, _)) | 240 EXPECT_CALL(*store_.get(), GetLogins(_, _)) |
204 .WillOnce(DoAll(WithArg<1>(InvokeConsumer(result)), Return(1))); | 241 .WillOnce(DoAll(WithArg<1>(InvokeConsumer(result)), Return(1))); |
205 std::vector<PasswordForm> observed; | 242 std::vector<PasswordForm> observed; |
206 PasswordForm form(MakeSimpleForm()); | 243 PasswordForm form(MakeSimpleForm()); |
207 observed.push_back(form); | 244 observed.push_back(form); |
208 manager()->OnPasswordFormsParsed(observed); // The initial load. | 245 manager()->OnPasswordFormsParsed(observed); // The initial load. |
209 manager()->OnPasswordFormsRendered(observed); // The initial layout. | 246 manager()->OnPasswordFormsRendered(observed); // The initial layout. |
210 | 247 |
211 PasswordForm empty_form(form); | 248 // No message from the renderer that a password was submitted. No |
212 empty_form.username_value = string16(); | 249 // expected calls. |
213 empty_form.password_value = string16(); | |
214 content::LoadCommittedDetails details; | |
215 content::FrameNavigateParams params; | |
216 params.password_form = empty_form; | |
217 manager()->DidNavigateAnyFrame(details, params); | |
218 | |
219 // No expected calls. | |
220 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)).Times(0); | 250 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)).Times(0); |
221 observed.clear(); | 251 observed.clear(); |
222 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. | 252 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. |
223 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. | 253 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. |
224 } | 254 } |
225 | 255 |
226 TEST_F(PasswordManagerTest, FormSubmitAfterNavigateSubframe) { | 256 TEST_F(PasswordManagerTest, FormSubmitAfterNavigateSubframe) { |
227 // Test that navigating a subframe does not prevent us from showing the save | 257 // Test that navigating a subframe does not prevent us from showing the save |
228 // password infobar. | 258 // password infobar. |
229 std::vector<PasswordForm*> result; // Empty password store. | 259 std::vector<PasswordForm*> result; // Empty password store. |
230 EXPECT_CALL(delegate_, FillPasswordForm(_)).Times(Exactly(0)); | 260 EXPECT_CALL(delegate_, FillPasswordForm(_)).Times(Exactly(0)); |
231 EXPECT_CALL(*store_.get(), GetLogins(_, _)) | 261 EXPECT_CALL(*store_.get(), GetLogins(_, _)) |
232 .WillOnce(DoAll(WithArg<1>(InvokeConsumer(result)), Return(1))); | 262 .WillOnce(DoAll(WithArg<1>(InvokeConsumer(result)), Return(1))); |
233 std::vector<PasswordForm> observed; | 263 std::vector<PasswordForm> observed; |
234 PasswordForm form(MakeSimpleForm()); | 264 PasswordForm form(MakeSimpleForm()); |
235 observed.push_back(form); | 265 observed.push_back(form); |
236 manager()->OnPasswordFormsParsed(observed); // The initial load. | 266 manager()->OnPasswordFormsParsed(observed); // The initial load. |
237 manager()->OnPasswordFormsRendered(observed); // The initial layout. | 267 manager()->OnPasswordFormsRendered(observed); // The initial layout. |
238 | 268 |
239 // Simulate navigating a sub-frame. | 269 // Simulate navigating a sub-frame. |
240 content::LoadCommittedDetails details; | 270 content::LoadCommittedDetails details; |
241 details.is_main_frame = false; | |
242 content::FrameNavigateParams params; | 271 content::FrameNavigateParams params; |
243 manager()->DidNavigateAnyFrame(details, params); | 272 manager()->DidNavigateAnyFrame(details, params); |
244 | 273 |
245 // Simulate navigating the real page. | 274 // Simulate submitting the password. |
246 details.is_main_frame = true; | 275 OnPasswordFormSubmitted(form); |
247 params.password_form = form; | |
248 manager()->DidNavigateAnyFrame(details, params); | |
249 | 276 |
250 // Now the password manager waits for the navigation to complete. | 277 // Now the password manager waits for the navigation to complete. |
251 scoped_ptr<PasswordFormManager> form_to_save; | 278 scoped_ptr<PasswordFormManager> form_to_save; |
252 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)) | 279 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)) |
253 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); | 280 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); |
254 | 281 |
255 observed.clear(); | 282 observed.clear(); |
256 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. | 283 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. |
257 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. | 284 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. |
258 | 285 |
(...skipping 23 matching lines...) Expand all Loading... |
282 std::vector<PasswordForm> observed; | 309 std::vector<PasswordForm> observed; |
283 observed.push_back(first_form); | 310 observed.push_back(first_form); |
284 manager()->OnPasswordFormsParsed(observed); | 311 manager()->OnPasswordFormsParsed(observed); |
285 observed.clear(); | 312 observed.clear(); |
286 manager()->OnPasswordFormsRendered(observed); | 313 manager()->OnPasswordFormsRendered(observed); |
287 | 314 |
288 // Now navigate to a second page. | 315 // Now navigate to a second page. |
289 content::LoadCommittedDetails details; | 316 content::LoadCommittedDetails details; |
290 details.is_main_frame = true; | 317 details.is_main_frame = true; |
291 content::FrameNavigateParams params; | 318 content::FrameNavigateParams params; |
292 manager()->DidNavigateAnyFrame(details, params); | 319 manager()->DidNavigateMainFrame(details, params); |
293 | 320 |
294 // This page contains a form with the same markup, but on a different | 321 // This page contains a form with the same markup, but on a different |
295 // URL. | 322 // URL. |
296 observed.push_back(second_form); | 323 observed.push_back(second_form); |
297 manager()->OnPasswordFormsParsed(observed); | 324 manager()->OnPasswordFormsParsed(observed); |
298 manager()->OnPasswordFormsRendered(observed); | 325 manager()->OnPasswordFormsRendered(observed); |
299 | 326 |
300 // Now submit this form | 327 // Now submit this form |
301 params.password_form = second_form; | 328 OnPasswordFormSubmitted(second_form); |
302 manager()->DidNavigateAnyFrame(details, params); | |
303 | 329 |
304 // Navigation after form submit. | 330 // Navigation after form submit. |
305 scoped_ptr<PasswordFormManager> form_to_save; | 331 scoped_ptr<PasswordFormManager> form_to_save; |
306 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)) | 332 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)) |
307 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); | 333 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); |
308 observed.clear(); | 334 observed.clear(); |
309 manager()->OnPasswordFormsParsed(observed); | 335 manager()->OnPasswordFormsParsed(observed); |
310 manager()->OnPasswordFormsRendered(observed); | 336 manager()->OnPasswordFormsRendered(observed); |
311 | 337 |
312 // Make sure that the saved form matches the second form, not the first. | 338 // Make sure that the saved form matches the second form, not the first. |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 // navigation occurs. | 494 // navigation occurs. |
469 EXPECT_CALL(delegate_, | 495 EXPECT_CALL(delegate_, |
470 AddSavePasswordInfoBarIfPermitted(_)).Times(Exactly(0)); | 496 AddSavePasswordInfoBarIfPermitted(_)).Times(Exactly(0)); |
471 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))); | 497 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))); |
472 | 498 |
473 // Now the password manager waits for the navigation to complete. | 499 // Now the password manager waits for the navigation to complete. |
474 observed.clear(); | 500 observed.clear(); |
475 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. | 501 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. |
476 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. | 502 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. |
477 } | 503 } |
| 504 |
| 505 TEST_F(PasswordManagerTest, SubmissionCallbackTest) { |
| 506 manager()->AddSubmissionCallback(SubmissionCallback()); |
| 507 PasswordForm form = MakeSimpleForm(); |
| 508 OnPasswordFormSubmitted(form); |
| 509 EXPECT_EQ(form, submitted_form_); |
| 510 } |
OLD | NEW |