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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 form.password_autocomplete_set = true; | 78 form.password_autocomplete_set = true; |
79 form.submit_element = ASCIIToUTF16("signIn"); | 79 form.submit_element = ASCIIToUTF16("signIn"); |
80 form.signon_realm = "http://www.google.com"; | 80 form.signon_realm = "http://www.google.com"; |
81 return form; | 81 return form; |
82 } | 82 } |
83 | 83 |
84 PasswordManager* manager() { | 84 PasswordManager* manager() { |
85 return PasswordManager::FromWebContents(web_contents()); | 85 return PasswordManager::FromWebContents(web_contents()); |
86 } | 86 } |
87 | 87 |
| 88 void OnPasswordFormSubmitted(const content::PasswordForm& form) { |
| 89 manager()->OnPasswordFormSubmitted(form); |
| 90 } |
| 91 |
88 scoped_refptr<MockPasswordStore> store_; | 92 scoped_refptr<MockPasswordStore> store_; |
89 MockPasswordManagerDelegate delegate_; // Owned by manager_. | 93 MockPasswordManagerDelegate delegate_; // Owned by manager_. |
90 }; | 94 }; |
91 | 95 |
92 MATCHER_P(FormMatches, form, "") { | 96 MATCHER_P(FormMatches, form, "") { |
93 return form.signon_realm == arg.signon_realm && | 97 return form.signon_realm == arg.signon_realm && |
94 form.origin == arg.origin && | 98 form.origin == arg.origin && |
95 form.action == arg.action && | 99 form.action == arg.action && |
96 form.username_element == arg.username_element && | 100 form.username_element == arg.username_element && |
97 form.password_element == arg.password_element && | 101 form.password_element == arg.password_element && |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 std::vector<PasswordForm*> result; // Empty password store. | 205 std::vector<PasswordForm*> result; // Empty password store. |
202 EXPECT_CALL(delegate_, FillPasswordForm(_)).Times(Exactly(0)); | 206 EXPECT_CALL(delegate_, FillPasswordForm(_)).Times(Exactly(0)); |
203 EXPECT_CALL(*store_.get(), GetLogins(_, _)) | 207 EXPECT_CALL(*store_.get(), GetLogins(_, _)) |
204 .WillOnce(DoAll(WithArg<1>(InvokeConsumer(result)), Return(1))); | 208 .WillOnce(DoAll(WithArg<1>(InvokeConsumer(result)), Return(1))); |
205 std::vector<PasswordForm> observed; | 209 std::vector<PasswordForm> observed; |
206 PasswordForm form(MakeSimpleForm()); | 210 PasswordForm form(MakeSimpleForm()); |
207 observed.push_back(form); | 211 observed.push_back(form); |
208 manager()->OnPasswordFormsParsed(observed); // The initial load. | 212 manager()->OnPasswordFormsParsed(observed); // The initial load. |
209 manager()->OnPasswordFormsRendered(observed); // The initial layout. | 213 manager()->OnPasswordFormsRendered(observed); // The initial layout. |
210 | 214 |
211 PasswordForm empty_form(form); | 215 // No message from the renderer that a password was submitted. No |
212 empty_form.username_value = string16(); | 216 // 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); | 217 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)).Times(0); |
221 observed.clear(); | 218 observed.clear(); |
222 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. | 219 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. |
223 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. | 220 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. |
224 } | 221 } |
225 | 222 |
226 TEST_F(PasswordManagerTest, FormSubmitAfterNavigateSubframe) { | 223 TEST_F(PasswordManagerTest, FormSubmitAfterNavigateSubframe) { |
227 // Test that navigating a subframe does not prevent us from showing the save | 224 // Test that navigating a subframe does not prevent us from showing the save |
228 // password infobar. | 225 // password infobar. |
229 std::vector<PasswordForm*> result; // Empty password store. | 226 std::vector<PasswordForm*> result; // Empty password store. |
230 EXPECT_CALL(delegate_, FillPasswordForm(_)).Times(Exactly(0)); | 227 EXPECT_CALL(delegate_, FillPasswordForm(_)).Times(Exactly(0)); |
231 EXPECT_CALL(*store_.get(), GetLogins(_, _)) | 228 EXPECT_CALL(*store_.get(), GetLogins(_, _)) |
232 .WillOnce(DoAll(WithArg<1>(InvokeConsumer(result)), Return(1))); | 229 .WillOnce(DoAll(WithArg<1>(InvokeConsumer(result)), Return(1))); |
233 std::vector<PasswordForm> observed; | 230 std::vector<PasswordForm> observed; |
234 PasswordForm form(MakeSimpleForm()); | 231 PasswordForm form(MakeSimpleForm()); |
235 observed.push_back(form); | 232 observed.push_back(form); |
236 manager()->OnPasswordFormsParsed(observed); // The initial load. | 233 manager()->OnPasswordFormsParsed(observed); // The initial load. |
237 manager()->OnPasswordFormsRendered(observed); // The initial layout. | 234 manager()->OnPasswordFormsRendered(observed); // The initial layout. |
238 | 235 |
239 // Simulate navigating a sub-frame. | 236 // Simulate navigating a sub-frame. |
240 content::LoadCommittedDetails details; | 237 content::LoadCommittedDetails details; |
241 details.is_main_frame = false; | |
242 content::FrameNavigateParams params; | 238 content::FrameNavigateParams params; |
243 manager()->DidNavigateAnyFrame(details, params); | 239 manager()->DidNavigateAnyFrame(details, params); |
244 | 240 |
245 // Simulate navigating the real page. | 241 // Simulate submitting the password. |
246 details.is_main_frame = true; | 242 OnPasswordFormSubmitted(form); |
247 params.password_form = form; | |
248 manager()->DidNavigateAnyFrame(details, params); | |
249 | 243 |
250 // Now the password manager waits for the navigation to complete. | 244 // Now the password manager waits for the navigation to complete. |
251 scoped_ptr<PasswordFormManager> form_to_save; | 245 scoped_ptr<PasswordFormManager> form_to_save; |
252 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)) | 246 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)) |
253 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); | 247 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); |
254 | 248 |
255 observed.clear(); | 249 observed.clear(); |
256 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. | 250 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. |
257 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. | 251 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. |
258 | 252 |
(...skipping 23 matching lines...) Expand all Loading... |
282 std::vector<PasswordForm> observed; | 276 std::vector<PasswordForm> observed; |
283 observed.push_back(first_form); | 277 observed.push_back(first_form); |
284 manager()->OnPasswordFormsParsed(observed); | 278 manager()->OnPasswordFormsParsed(observed); |
285 observed.clear(); | 279 observed.clear(); |
286 manager()->OnPasswordFormsRendered(observed); | 280 manager()->OnPasswordFormsRendered(observed); |
287 | 281 |
288 // Now navigate to a second page. | 282 // Now navigate to a second page. |
289 content::LoadCommittedDetails details; | 283 content::LoadCommittedDetails details; |
290 details.is_main_frame = true; | 284 details.is_main_frame = true; |
291 content::FrameNavigateParams params; | 285 content::FrameNavigateParams params; |
292 manager()->DidNavigateAnyFrame(details, params); | 286 manager()->DidNavigateMainFrame(details, params); |
293 | 287 |
294 // This page contains a form with the same markup, but on a different | 288 // This page contains a form with the same markup, but on a different |
295 // URL. | 289 // URL. |
296 observed.push_back(second_form); | 290 observed.push_back(second_form); |
297 manager()->OnPasswordFormsParsed(observed); | 291 manager()->OnPasswordFormsParsed(observed); |
298 manager()->OnPasswordFormsRendered(observed); | 292 manager()->OnPasswordFormsRendered(observed); |
299 | 293 |
300 // Now submit this form | 294 // Now submit this form |
301 params.password_form = second_form; | 295 OnPasswordFormSubmitted(second_form); |
302 manager()->DidNavigateAnyFrame(details, params); | |
303 | 296 |
304 // Navigation after form submit. | 297 // Navigation after form submit. |
305 scoped_ptr<PasswordFormManager> form_to_save; | 298 scoped_ptr<PasswordFormManager> form_to_save; |
306 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)) | 299 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)) |
307 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); | 300 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); |
308 observed.clear(); | 301 observed.clear(); |
309 manager()->OnPasswordFormsParsed(observed); | 302 manager()->OnPasswordFormsParsed(observed); |
310 manager()->OnPasswordFormsRendered(observed); | 303 manager()->OnPasswordFormsRendered(observed); |
311 | 304 |
312 // Make sure that the saved form matches the second form, not the first. | 305 // 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. | 461 // navigation occurs. |
469 EXPECT_CALL(delegate_, | 462 EXPECT_CALL(delegate_, |
470 AddSavePasswordInfoBarIfPermitted(_)).Times(Exactly(0)); | 463 AddSavePasswordInfoBarIfPermitted(_)).Times(Exactly(0)); |
471 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))); | 464 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))); |
472 | 465 |
473 // Now the password manager waits for the navigation to complete. | 466 // Now the password manager waits for the navigation to complete. |
474 observed.clear(); | 467 observed.clear(); |
475 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. | 468 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. |
476 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. | 469 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. |
477 } | 470 } |
OLD | NEW |