Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Side by Side Diff: components/password_manager/core/browser/password_manager_unittest.cc

Issue 293093002: Don't show "Save password" prompt for a failed login (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Documentation update. Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/prefs/pref_registry_simple.h" 8 #include "base/prefs/pref_registry_simple.h"
9 #include "base/prefs/pref_service.h" 9 #include "base/prefs/pref_service.h"
10 #include "base/prefs/testing_pref_service.h" 10 #include "base/prefs/testing_pref_service.h"
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 TEST_F(PasswordManagerTest, FormSubmitEmptyStore) { 204 TEST_F(PasswordManagerTest, FormSubmitEmptyStore) {
205 // Test that observing a newly submitted form shows the save password bar. 205 // Test that observing a newly submitted form shows the save password bar.
206 std::vector<PasswordForm*> result; // Empty password store. 206 std::vector<PasswordForm*> result; // Empty password store.
207 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); 207 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0));
208 EXPECT_CALL(*store_.get(), GetLogins(_, _, _)) 208 EXPECT_CALL(*store_.get(), GetLogins(_, _, _))
209 .WillOnce(DoAll(WithArg<2>(InvokeConsumer(result)), Return())); 209 .WillOnce(DoAll(WithArg<2>(InvokeConsumer(result)), Return()));
210 std::vector<PasswordForm> observed; 210 std::vector<PasswordForm> observed;
211 PasswordForm form(MakeSimpleForm()); 211 PasswordForm form(MakeSimpleForm());
212 observed.push_back(form); 212 observed.push_back(form);
213 manager()->OnPasswordFormsParsed(observed); // The initial load. 213 manager()->OnPasswordFormsParsed(observed); // The initial load.
214 manager()->OnPasswordFormsRendered(observed); // The initial layout. 214 manager()->OnPasswordFormsRendered(observed, true); // The initial layout.
215 215
216 // And the form submit contract is to call ProvisionallySavePassword. 216 // And the form submit contract is to call ProvisionallySavePassword.
217 manager()->ProvisionallySavePassword(form); 217 manager()->ProvisionallySavePassword(form);
218 218
219 scoped_ptr<PasswordFormManager> form_to_save; 219 scoped_ptr<PasswordFormManager> form_to_save;
220 EXPECT_CALL(client_, PromptUserToSavePassword(_)) 220 EXPECT_CALL(client_, PromptUserToSavePassword(_))
221 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); 221 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save)));
222 222
223 // Now the password manager waits for the navigation to complete. 223 // Now the password manager waits for the navigation to complete.
224 observed.clear(); 224 observed.clear();
225 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. 225 manager()->OnPasswordFormsParsed(observed); // The post-navigation load.
226 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. 226 manager()->OnPasswordFormsRendered(observed,
227 true); // The post-navigation layout.
227 228
228 ASSERT_TRUE(form_to_save.get()); 229 ASSERT_TRUE(form_to_save.get());
229 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))); 230 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form)));
230 231
231 // Simulate saving the form, as if the info bar was accepted. 232 // Simulate saving the form, as if the info bar was accepted.
232 form_to_save->Save(); 233 form_to_save->Save();
233 } 234 }
234 235
235 TEST_F(PasswordManagerTest, GeneratedPasswordFormSubmitEmptyStore) { 236 TEST_F(PasswordManagerTest, GeneratedPasswordFormSubmitEmptyStore) {
236 // This test is the same FormSubmitEmptyStore, except that it simulates the 237 // This test is the same FormSubmitEmptyStore, except that it simulates the
237 // user generating the password through the browser. 238 // user generating the password through the browser.
238 std::vector<PasswordForm*> result; // Empty password store. 239 std::vector<PasswordForm*> result; // Empty password store.
239 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); 240 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0));
240 EXPECT_CALL(*store_.get(), GetLogins(_, _, _)) 241 EXPECT_CALL(*store_.get(), GetLogins(_, _, _))
241 .WillOnce(DoAll(WithArg<2>(InvokeConsumer(result)), Return())); 242 .WillOnce(DoAll(WithArg<2>(InvokeConsumer(result)), Return()));
242 std::vector<PasswordForm> observed; 243 std::vector<PasswordForm> observed;
243 PasswordForm form(MakeSimpleForm()); 244 PasswordForm form(MakeSimpleForm());
244 observed.push_back(form); 245 observed.push_back(form);
245 manager()->OnPasswordFormsParsed(observed); // The initial load. 246 manager()->OnPasswordFormsParsed(observed); // The initial load.
246 manager()->OnPasswordFormsRendered(observed); // The initial layout. 247 manager()->OnPasswordFormsRendered(observed, true); // The initial layout.
247 248
248 // Simulate the user generating the password and submitting the form. 249 // Simulate the user generating the password and submitting the form.
249 manager()->SetFormHasGeneratedPassword(form); 250 manager()->SetFormHasGeneratedPassword(form);
250 manager()->ProvisionallySavePassword(form); 251 manager()->ProvisionallySavePassword(form);
251 252
252 // The user should not be presented with an infobar as they have already given 253 // The user should not be presented with an infobar as they have already given
253 // consent by using the generated password. The form should be saved once 254 // consent by using the generated password. The form should be saved once
254 // navigation occurs. 255 // navigation occurs.
255 EXPECT_CALL(client_, PromptUserToSavePassword(_)).Times(Exactly(0)); 256 EXPECT_CALL(client_, PromptUserToSavePassword(_)).Times(Exactly(0));
256 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))); 257 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form)));
257 258
258 // Now the password manager waits for the navigation to complete. 259 // Now the password manager waits for the navigation to complete.
259 observed.clear(); 260 observed.clear();
260 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. 261 manager()->OnPasswordFormsParsed(observed); // The post-navigation load.
261 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. 262 manager()->OnPasswordFormsRendered(observed,
263 true); // The post-navigation layout.
262 } 264 }
263 265
264 TEST_F(PasswordManagerTest, FormSubmitNoGoodMatch) { 266 TEST_F(PasswordManagerTest, FormSubmitNoGoodMatch) {
265 // Same as above, except with an existing form for the same signon realm, 267 // Same as above, except with an existing form for the same signon realm,
266 // but different origin. Detailed cases like this are covered by 268 // but different origin. Detailed cases like this are covered by
267 // PasswordFormManagerTest. 269 // PasswordFormManagerTest.
268 std::vector<PasswordForm*> result; 270 std::vector<PasswordForm*> result;
269 PasswordForm* existing_different = new PasswordForm(MakeSimpleForm()); 271 PasswordForm* existing_different = new PasswordForm(MakeSimpleForm());
270 existing_different->username_value = ASCIIToUTF16("google2"); 272 existing_different->username_value = ASCIIToUTF16("google2");
271 result.push_back(existing_different); 273 result.push_back(existing_different);
272 EXPECT_CALL(driver_, FillPasswordForm(_)); 274 EXPECT_CALL(driver_, FillPasswordForm(_));
273 EXPECT_CALL(*store_.get(), GetLogins(_, _, _)) 275 EXPECT_CALL(*store_.get(), GetLogins(_, _, _))
274 .WillOnce(DoAll(WithArg<2>(InvokeConsumer(result)), Return())); 276 .WillOnce(DoAll(WithArg<2>(InvokeConsumer(result)), Return()));
275 277
276 std::vector<PasswordForm> observed; 278 std::vector<PasswordForm> observed;
277 PasswordForm form(MakeSimpleForm()); 279 PasswordForm form(MakeSimpleForm());
278 observed.push_back(form); 280 observed.push_back(form);
279 manager()->OnPasswordFormsParsed(observed); // The initial load. 281 manager()->OnPasswordFormsParsed(observed); // The initial load.
280 manager()->OnPasswordFormsRendered(observed); // The initial layout. 282 manager()->OnPasswordFormsRendered(observed, true); // The initial layout.
281 manager()->ProvisionallySavePassword(form); 283 manager()->ProvisionallySavePassword(form);
282 284
283 // We still expect an add, since we didn't have a good match. 285 // We still expect an add, since we didn't have a good match.
284 scoped_ptr<PasswordFormManager> form_to_save; 286 scoped_ptr<PasswordFormManager> form_to_save;
285 EXPECT_CALL(client_, PromptUserToSavePassword(_)) 287 EXPECT_CALL(client_, PromptUserToSavePassword(_))
286 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); 288 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save)));
287 289
288 // Now the password manager waits for the navigation to complete. 290 // Now the password manager waits for the navigation to complete.
289 observed.clear(); 291 observed.clear();
290 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. 292 manager()->OnPasswordFormsParsed(observed); // The post-navigation load.
291 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. 293 manager()->OnPasswordFormsRendered(observed,
294 true); // The post-navigation layout.
292 295
293 ASSERT_TRUE(form_to_save.get()); 296 ASSERT_TRUE(form_to_save.get());
294 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))); 297 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form)));
295 298
296 // Simulate saving the form. 299 // Simulate saving the form.
297 form_to_save->Save(); 300 form_to_save->Save();
298 } 301 }
299 302
300 TEST_F(PasswordManagerTest, FormSeenThenLeftPage) { 303 TEST_F(PasswordManagerTest, FormSeenThenLeftPage) {
301 std::vector<PasswordForm*> result; // Empty password store. 304 std::vector<PasswordForm*> result; // Empty password store.
302 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); 305 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0));
303 EXPECT_CALL(*store_.get(), GetLogins(_, _, _)) 306 EXPECT_CALL(*store_.get(), GetLogins(_, _, _))
304 .WillOnce(DoAll(WithArg<2>(InvokeConsumer(result)), Return())); 307 .WillOnce(DoAll(WithArg<2>(InvokeConsumer(result)), Return()));
305 std::vector<PasswordForm> observed; 308 std::vector<PasswordForm> observed;
306 PasswordForm form(MakeSimpleForm()); 309 PasswordForm form(MakeSimpleForm());
307 observed.push_back(form); 310 observed.push_back(form);
308 manager()->OnPasswordFormsParsed(observed); // The initial load. 311 manager()->OnPasswordFormsParsed(observed); // The initial load.
309 manager()->OnPasswordFormsRendered(observed); // The initial layout. 312 manager()->OnPasswordFormsRendered(observed, true); // The initial layout.
310 313
311 // No message from the renderer that a password was submitted. No 314 // No message from the renderer that a password was submitted. No
312 // expected calls. 315 // expected calls.
313 EXPECT_CALL(client_, PromptUserToSavePassword(_)).Times(0); 316 EXPECT_CALL(client_, PromptUserToSavePassword(_)).Times(0);
314 observed.clear(); 317 observed.clear();
315 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. 318 manager()->OnPasswordFormsParsed(observed); // The post-navigation load.
316 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. 319 manager()->OnPasswordFormsRendered(observed,
320 true); // The post-navigation layout.
317 } 321 }
318 322
319 TEST_F(PasswordManagerTest, FormSubmitAfterNavigateInPage) { 323 TEST_F(PasswordManagerTest, FormSubmitAfterNavigateInPage) {
320 // Test that navigating in the page does not prevent us from showing the save 324 // Test that navigating in the page does not prevent us from showing the save
321 // password infobar. 325 // password infobar.
322 std::vector<PasswordForm*> result; // Empty password store. 326 std::vector<PasswordForm*> result; // Empty password store.
323 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); 327 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0));
324 EXPECT_CALL(*store_.get(), GetLogins(_, _, _)) 328 EXPECT_CALL(*store_.get(), GetLogins(_, _, _))
325 .WillOnce(DoAll(WithArg<2>(InvokeConsumer(result)), Return())); 329 .WillOnce(DoAll(WithArg<2>(InvokeConsumer(result)), Return()));
326 std::vector<PasswordForm> observed; 330 std::vector<PasswordForm> observed;
327 PasswordForm form(MakeSimpleForm()); 331 PasswordForm form(MakeSimpleForm());
328 observed.push_back(form); 332 observed.push_back(form);
329 manager()->OnPasswordFormsParsed(observed); // The initial load. 333 manager()->OnPasswordFormsParsed(observed); // The initial load.
330 manager()->OnPasswordFormsRendered(observed); // The initial layout. 334 manager()->OnPasswordFormsRendered(observed, true); // The initial layout.
331 335
332 // Simulate navigating in the page. 336 // Simulate navigating in the page.
333 manager()->DidNavigateMainFrame(true); 337 manager()->DidNavigateMainFrame(true);
334 338
335 // Simulate submitting the password. 339 // Simulate submitting the password.
336 OnPasswordFormSubmitted(form); 340 OnPasswordFormSubmitted(form);
337 341
338 // Now the password manager waits for the navigation to complete. 342 // Now the password manager waits for the navigation to complete.
339 scoped_ptr<PasswordFormManager> form_to_save; 343 scoped_ptr<PasswordFormManager> form_to_save;
340 EXPECT_CALL(client_, PromptUserToSavePassword(_)) 344 EXPECT_CALL(client_, PromptUserToSavePassword(_))
341 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); 345 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save)));
342 346
343 observed.clear(); 347 observed.clear();
344 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. 348 manager()->OnPasswordFormsParsed(observed); // The post-navigation load.
345 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. 349 manager()->OnPasswordFormsRendered(observed,
350 true); // The post-navigation layout.
346 351
347 ASSERT_FALSE(NULL == form_to_save.get()); 352 ASSERT_FALSE(NULL == form_to_save.get());
348 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))); 353 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form)));
349 354
350 // Simulate saving the form, as if the info bar was accepted. 355 // Simulate saving the form, as if the info bar was accepted.
351 form_to_save->Save(); 356 form_to_save->Save();
352 } 357 }
353 358
354 // This test verifies a fix for http://crbug.com/236673 359 // This test verifies a fix for http://crbug.com/236673
355 TEST_F(PasswordManagerTest, FormSubmitWithFormOnPreviousPage) { 360 TEST_F(PasswordManagerTest, FormSubmitWithFormOnPreviousPage) {
356 std::vector<PasswordForm*> result; // Empty password store. 361 std::vector<PasswordForm*> result; // Empty password store.
357 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); 362 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0));
358 EXPECT_CALL(*store_.get(), GetLogins(_, _, _)) 363 EXPECT_CALL(*store_.get(), GetLogins(_, _, _))
359 .WillRepeatedly(DoAll(WithArg<2>(InvokeConsumer(result)), Return())); 364 .WillRepeatedly(DoAll(WithArg<2>(InvokeConsumer(result)), Return()));
360 PasswordForm first_form(MakeSimpleForm()); 365 PasswordForm first_form(MakeSimpleForm());
361 first_form.origin = GURL("http://www.nytimes.com/"); 366 first_form.origin = GURL("http://www.nytimes.com/");
362 first_form.action = GURL("https://myaccount.nytimes.com/auth/login"); 367 first_form.action = GURL("https://myaccount.nytimes.com/auth/login");
363 first_form.signon_realm = "http://www.nytimes.com/"; 368 first_form.signon_realm = "http://www.nytimes.com/";
364 PasswordForm second_form(MakeSimpleForm()); 369 PasswordForm second_form(MakeSimpleForm());
365 second_form.origin = GURL("https://myaccount.nytimes.com/auth/login"); 370 second_form.origin = GURL("https://myaccount.nytimes.com/auth/login");
366 second_form.action = GURL("https://myaccount.nytimes.com/auth/login"); 371 second_form.action = GURL("https://myaccount.nytimes.com/auth/login");
367 second_form.signon_realm = "https://myaccount.nytimes.com/"; 372 second_form.signon_realm = "https://myaccount.nytimes.com/";
368 373
369 // Pretend that the form is hidden on the first page. 374 // Pretend that the form is hidden on the first page.
370 std::vector<PasswordForm> observed; 375 std::vector<PasswordForm> observed;
371 observed.push_back(first_form); 376 observed.push_back(first_form);
372 manager()->OnPasswordFormsParsed(observed); 377 manager()->OnPasswordFormsParsed(observed);
373 observed.clear(); 378 observed.clear();
374 manager()->OnPasswordFormsRendered(observed); 379 manager()->OnPasswordFormsRendered(observed, true);
375 380
376 // Now navigate to a second page. 381 // Now navigate to a second page.
377 manager()->DidNavigateMainFrame(false); 382 manager()->DidNavigateMainFrame(false);
378 383
379 // This page contains a form with the same markup, but on a different 384 // This page contains a form with the same markup, but on a different
380 // URL. 385 // URL.
381 observed.push_back(second_form); 386 observed.push_back(second_form);
382 manager()->OnPasswordFormsParsed(observed); 387 manager()->OnPasswordFormsParsed(observed);
383 manager()->OnPasswordFormsRendered(observed); 388 manager()->OnPasswordFormsRendered(observed, true);
384 389
385 // Now submit this form 390 // Now submit this form
386 OnPasswordFormSubmitted(second_form); 391 OnPasswordFormSubmitted(second_form);
387 392
388 // Navigation after form submit. 393 // Navigation after form submit.
389 scoped_ptr<PasswordFormManager> form_to_save; 394 scoped_ptr<PasswordFormManager> form_to_save;
390 EXPECT_CALL(client_, PromptUserToSavePassword(_)) 395 EXPECT_CALL(client_, PromptUserToSavePassword(_))
391 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); 396 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save)));
392 observed.clear(); 397 observed.clear();
393 manager()->OnPasswordFormsParsed(observed); 398 manager()->OnPasswordFormsParsed(observed);
394 manager()->OnPasswordFormsRendered(observed); 399 manager()->OnPasswordFormsRendered(observed, true);
395 400
396 // Make sure that the saved form matches the second form, not the first. 401 // Make sure that the saved form matches the second form, not the first.
397 ASSERT_TRUE(form_to_save.get()); 402 ASSERT_TRUE(form_to_save.get());
398 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(second_form))); 403 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(second_form)));
399 404
400 // Simulate saving the form, as if the info bar was accepted. 405 // Simulate saving the form, as if the info bar was accepted.
401 form_to_save->Save(); 406 form_to_save->Save();
402 } 407 }
403 408
404 TEST_F(PasswordManagerTest, FormSubmitFailedLogin) { 409 TEST_F(PasswordManagerTest, FormSubmitFailedLogin) {
405 std::vector<PasswordForm*> result; // Empty password store. 410 std::vector<PasswordForm*> result; // Empty password store.
406 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); 411 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0));
407 EXPECT_CALL(*store_.get(), GetLogins(_, _, _)) 412 EXPECT_CALL(*store_.get(), GetLogins(_, _, _))
408 .WillRepeatedly(DoAll(WithArg<2>(InvokeConsumer(result)), Return())); 413 .WillRepeatedly(DoAll(WithArg<2>(InvokeConsumer(result)), Return()));
409 std::vector<PasswordForm> observed; 414 std::vector<PasswordForm> observed;
410 PasswordForm form(MakeSimpleForm()); 415 PasswordForm form(MakeSimpleForm());
411 observed.push_back(form); 416 observed.push_back(form);
412 manager()->OnPasswordFormsParsed(observed); // The initial load. 417 manager()->OnPasswordFormsParsed(observed); // The initial load.
413 manager()->OnPasswordFormsRendered(observed); // The initial layout. 418 manager()->OnPasswordFormsRendered(observed, true); // The initial layout.
414 419
415 manager()->ProvisionallySavePassword(form); 420 manager()->ProvisionallySavePassword(form);
416 421
417 // The form reappears, and is visible in the layout: 422 // The form reappears, and is visible in the layout:
418 // No expected calls to the PasswordStore... 423 // No expected calls to the PasswordStore...
419 manager()->OnPasswordFormsParsed(observed); 424 manager()->OnPasswordFormsParsed(observed);
420 manager()->OnPasswordFormsRendered(observed); 425 manager()->OnPasswordFormsRendered(observed, true);
421 } 426 }
422 427
423 TEST_F(PasswordManagerTest, FormSubmitInvisibleLogin) { 428 TEST_F(PasswordManagerTest, FormSubmitInvisibleLogin) {
424 // Tests fix of issue 28911: if the login form reappears on the subsequent 429 // Tests fix of issue 28911: if the login form reappears on the subsequent
425 // page, but is invisible, it shouldn't count as a failed login. 430 // page, but is invisible, it shouldn't count as a failed login.
426 std::vector<PasswordForm*> result; // Empty password store. 431 std::vector<PasswordForm*> result; // Empty password store.
427 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); 432 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0));
428 EXPECT_CALL(*store_.get(), GetLogins(_, _, _)) 433 EXPECT_CALL(*store_.get(), GetLogins(_, _, _))
429 .WillRepeatedly(DoAll(WithArg<2>(InvokeConsumer(result)), Return())); 434 .WillRepeatedly(DoAll(WithArg<2>(InvokeConsumer(result)), Return()));
430 std::vector<PasswordForm> observed; 435 std::vector<PasswordForm> observed;
431 PasswordForm form(MakeSimpleForm()); 436 PasswordForm form(MakeSimpleForm());
432 observed.push_back(form); 437 observed.push_back(form);
433 manager()->OnPasswordFormsParsed(observed); // The initial load. 438 manager()->OnPasswordFormsParsed(observed); // The initial load.
434 manager()->OnPasswordFormsRendered(observed); // The initial layout. 439 manager()->OnPasswordFormsRendered(observed, true); // The initial layout.
435 440
436 manager()->ProvisionallySavePassword(form); 441 manager()->ProvisionallySavePassword(form);
437 442
438 // Expect info bar to appear: 443 // Expect info bar to appear:
439 scoped_ptr<PasswordFormManager> form_to_save; 444 scoped_ptr<PasswordFormManager> form_to_save;
440 EXPECT_CALL(client_, PromptUserToSavePassword(_)) 445 EXPECT_CALL(client_, PromptUserToSavePassword(_))
441 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); 446 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save)));
442 447
443 // The form reappears, but is not visible in the layout: 448 // The form reappears, but is not visible in the layout:
444 manager()->OnPasswordFormsParsed(observed); 449 manager()->OnPasswordFormsParsed(observed);
445 observed.clear(); 450 observed.clear();
446 manager()->OnPasswordFormsRendered(observed); 451 manager()->OnPasswordFormsRendered(observed, true);
447 452
448 ASSERT_TRUE(form_to_save.get()); 453 ASSERT_TRUE(form_to_save.get());
449 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))); 454 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form)));
450 455
451 // Simulate saving the form. 456 // Simulate saving the form.
452 form_to_save->Save(); 457 form_to_save->Save();
453 } 458 }
454 459
455 TEST_F(PasswordManagerTest, InitiallyInvisibleForm) { 460 TEST_F(PasswordManagerTest, InitiallyInvisibleForm) {
456 // Make sure an invisible login form still gets autofilled. 461 // Make sure an invisible login form still gets autofilled.
457 std::vector<PasswordForm*> result; 462 std::vector<PasswordForm*> result;
458 PasswordForm* existing = new PasswordForm(MakeSimpleForm()); 463 PasswordForm* existing = new PasswordForm(MakeSimpleForm());
459 result.push_back(existing); 464 result.push_back(existing);
460 EXPECT_CALL(driver_, FillPasswordForm(_)); 465 EXPECT_CALL(driver_, FillPasswordForm(_));
461 EXPECT_CALL(*store_.get(), GetLogins(_, _, _)) 466 EXPECT_CALL(*store_.get(), GetLogins(_, _, _))
462 .WillRepeatedly(DoAll(WithArg<2>(InvokeConsumer(result)), Return())); 467 .WillRepeatedly(DoAll(WithArg<2>(InvokeConsumer(result)), Return()));
463 std::vector<PasswordForm> observed; 468 std::vector<PasswordForm> observed;
464 PasswordForm form(MakeSimpleForm()); 469 PasswordForm form(MakeSimpleForm());
465 observed.push_back(form); 470 observed.push_back(form);
466 manager()->OnPasswordFormsParsed(observed); // The initial load. 471 manager()->OnPasswordFormsParsed(observed); // The initial load.
467 observed.clear(); 472 observed.clear();
468 manager()->OnPasswordFormsRendered(observed); // The initial layout. 473 manager()->OnPasswordFormsRendered(observed, true); // The initial layout.
469 474
470 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. 475 manager()->OnPasswordFormsParsed(observed); // The post-navigation load.
471 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. 476 manager()->OnPasswordFormsRendered(observed,
477 true); // The post-navigation layout.
472 } 478 }
473 479
474 TEST_F(PasswordManagerTest, SavingDependsOnManagerEnabledPreference) { 480 TEST_F(PasswordManagerTest, SavingDependsOnManagerEnabledPreference) {
475 // Test that saving passwords depends on the password manager enabled 481 // Test that saving passwords depends on the password manager enabled
476 // preference. 482 // preference.
477 prefs_.SetUserPref(prefs::kPasswordManagerEnabled, 483 prefs_.SetUserPref(prefs::kPasswordManagerEnabled,
478 base::Value::CreateBooleanValue(true)); 484 base::Value::CreateBooleanValue(true));
479 EXPECT_TRUE(manager()->IsSavingEnabled()); 485 EXPECT_TRUE(manager()->IsSavingEnabled());
480 prefs_.SetUserPref(prefs::kPasswordManagerEnabled, 486 prefs_.SetUserPref(prefs::kPasswordManagerEnabled,
481 base::Value::CreateBooleanValue(false)); 487 base::Value::CreateBooleanValue(false));
(...skipping 23 matching lines...) Expand all
505 // autocomplete=off. 511 // autocomplete=off.
506 std::vector<PasswordForm*> result; // Empty password store. 512 std::vector<PasswordForm*> result; // Empty password store.
507 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); 513 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0));
508 EXPECT_CALL(*store_.get(), GetLogins(_, _, _)) 514 EXPECT_CALL(*store_.get(), GetLogins(_, _, _))
509 .WillOnce(DoAll(WithArg<2>(InvokeConsumer(result)), Return())); 515 .WillOnce(DoAll(WithArg<2>(InvokeConsumer(result)), Return()));
510 std::vector<PasswordForm> observed; 516 std::vector<PasswordForm> observed;
511 PasswordForm form(MakeSimpleForm()); 517 PasswordForm form(MakeSimpleForm());
512 form.password_autocomplete_set = false; 518 form.password_autocomplete_set = false;
513 observed.push_back(form); 519 observed.push_back(form);
514 manager()->OnPasswordFormsParsed(observed); // The initial load. 520 manager()->OnPasswordFormsParsed(observed); // The initial load.
515 manager()->OnPasswordFormsRendered(observed); // The initial layout. 521 manager()->OnPasswordFormsRendered(observed, true); // The initial layout.
516 522
517 // And the form submit contract is to call ProvisionallySavePassword. 523 // And the form submit contract is to call ProvisionallySavePassword.
518 manager()->ProvisionallySavePassword(form); 524 manager()->ProvisionallySavePassword(form);
519 525
520 // Password form should be saved. 526 // Password form should be saved.
521 scoped_ptr<PasswordFormManager> form_to_save; 527 scoped_ptr<PasswordFormManager> form_to_save;
522 EXPECT_CALL(client_, PromptUserToSavePassword(_)).Times(Exactly(1)).WillOnce( 528 EXPECT_CALL(client_, PromptUserToSavePassword(_)).Times(Exactly(1)).WillOnce(
523 WithArg<0>(SaveToScopedPtr(&form_to_save))); 529 WithArg<0>(SaveToScopedPtr(&form_to_save)));
524 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))).Times(Exactly(0)); 530 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))).Times(Exactly(0));
525 531
526 // Now the password manager waits for the navigation to complete. 532 // Now the password manager waits for the navigation to complete.
527 observed.clear(); 533 observed.clear();
528 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. 534 manager()->OnPasswordFormsParsed(observed); // The post-navigation load.
529 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. 535 manager()->OnPasswordFormsRendered(observed,
536 true); // The post-navigation layout.
530 537
531 ASSERT_TRUE(form_to_save.get()); 538 ASSERT_TRUE(form_to_save.get());
532 } 539 }
533 540
534 TEST_F(PasswordManagerTest, GeneratedPasswordFormSavedAutocompleteOff) { 541 TEST_F(PasswordManagerTest, GeneratedPasswordFormSavedAutocompleteOff) {
535 // Test password form with generated password will still be saved if 542 // Test password form with generated password will still be saved if
536 // autocomplete=off. 543 // autocomplete=off.
537 std::vector<PasswordForm*> result; // Empty password store. 544 std::vector<PasswordForm*> result; // Empty password store.
538 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0)); 545 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0));
539 EXPECT_CALL(*store_.get(), GetLogins(_, _, _)) 546 EXPECT_CALL(*store_.get(), GetLogins(_, _, _))
540 .WillOnce(DoAll(WithArg<2>(InvokeConsumer(result)), Return())); 547 .WillOnce(DoAll(WithArg<2>(InvokeConsumer(result)), Return()));
541 std::vector<PasswordForm> observed; 548 std::vector<PasswordForm> observed;
542 PasswordForm form(MakeSimpleForm()); 549 PasswordForm form(MakeSimpleForm());
543 form.password_autocomplete_set = false; 550 form.password_autocomplete_set = false;
544 observed.push_back(form); 551 observed.push_back(form);
545 manager()->OnPasswordFormsParsed(observed); // The initial load. 552 manager()->OnPasswordFormsParsed(observed); // The initial load.
546 manager()->OnPasswordFormsRendered(observed); // The initial layout. 553 manager()->OnPasswordFormsRendered(observed, true); // The initial layout.
547 554
548 // Simulate the user generating the password and submitting the form. 555 // Simulate the user generating the password and submitting the form.
549 manager()->SetFormHasGeneratedPassword(form); 556 manager()->SetFormHasGeneratedPassword(form);
550 manager()->ProvisionallySavePassword(form); 557 manager()->ProvisionallySavePassword(form);
551 558
552 // The user should not be presented with an infobar as they have already given 559 // The user should not be presented with an infobar as they have already given
553 // consent by using the generated password. The form should be saved once 560 // consent by using the generated password. The form should be saved once
554 // navigation occurs. 561 // navigation occurs.
555 EXPECT_CALL(client_, PromptUserToSavePassword(_)).Times(Exactly(0)); 562 EXPECT_CALL(client_, PromptUserToSavePassword(_)).Times(Exactly(0));
556 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))); 563 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form)));
557 564
558 // Now the password manager waits for the navigation to complete. 565 // Now the password manager waits for the navigation to complete.
559 observed.clear(); 566 observed.clear();
560 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. 567 manager()->OnPasswordFormsParsed(observed); // The post-navigation load.
561 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. 568 manager()->OnPasswordFormsRendered(observed,
569 true); // The post-navigation layout.
562 } 570 }
563 571
564 TEST_F(PasswordManagerTest, SubmissionCallbackTest) { 572 TEST_F(PasswordManagerTest, SubmissionCallbackTest) {
565 manager()->AddSubmissionCallback(SubmissionCallback()); 573 manager()->AddSubmissionCallback(SubmissionCallback());
566 PasswordForm form = MakeSimpleForm(); 574 PasswordForm form = MakeSimpleForm();
567 OnPasswordFormSubmitted(form); 575 OnPasswordFormSubmitted(form);
568 EXPECT_TRUE(FormsAreEqual(form, submitted_form_)); 576 EXPECT_TRUE(FormsAreEqual(form, submitted_form_));
569 } 577 }
570 578
571 TEST_F(PasswordManagerTest, PasswordFormReappearance) { 579 TEST_F(PasswordManagerTest, PasswordFormReappearance) {
572 // Test the heuristic to know if a password form reappears. 580 // Test the heuristic to know if a password form reappears.
573 // We assume that if we send our credentials and there 581 // We assume that if we send our credentials and there
574 // is at least one visible password form in the next page that 582 // is at least one visible password form in the next page that
575 // means that our previous login attempt failed. 583 // means that our previous login attempt failed.
576 std::vector<PasswordForm*> result; // Empty password store. 584 std::vector<PasswordForm*> result; // Empty password store.
577 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(0); 585 EXPECT_CALL(driver_, FillPasswordForm(_)).Times(0);
578 EXPECT_CALL(*store_.get(), GetLogins(_, _, _)) 586 EXPECT_CALL(*store_.get(), GetLogins(_, _, _))
579 .WillRepeatedly(DoAll(WithArg<2>(InvokeConsumer(result)), Return())); 587 .WillRepeatedly(DoAll(WithArg<2>(InvokeConsumer(result)), Return()));
580 std::vector<PasswordForm> observed; 588 std::vector<PasswordForm> observed;
581 PasswordForm login_form(MakeTwitterLoginForm()); 589 PasswordForm login_form(MakeTwitterLoginForm());
582 observed.push_back(login_form); 590 observed.push_back(login_form);
583 manager()->OnPasswordFormsParsed(observed); // The initial load. 591 manager()->OnPasswordFormsParsed(observed); // The initial load.
584 manager()->OnPasswordFormsRendered(observed); // The initial layout. 592 manager()->OnPasswordFormsRendered(observed, true); // The initial layout.
585 593
586 manager()->ProvisionallySavePassword(login_form); 594 manager()->ProvisionallySavePassword(login_form);
587 595
588 PasswordForm failed_login_form(MakeTwitterFailedLoginForm()); 596 PasswordForm failed_login_form(MakeTwitterFailedLoginForm());
589 observed.clear(); 597 observed.clear();
590 observed.push_back(failed_login_form); 598 observed.push_back(failed_login_form);
591 // A PasswordForm appears, and is visible in the layout: 599 // A PasswordForm appears, and is visible in the layout:
592 // No expected calls to the PasswordStore... 600 // No expected calls to the PasswordStore...
593 manager()->OnPasswordFormsParsed(observed); 601 manager()->OnPasswordFormsParsed(observed);
594 manager()->OnPasswordFormsRendered(observed); 602 manager()->OnPasswordFormsRendered(observed, true);
595 } 603 }
596 604
597 } // namespace password_manager 605 } // namespace password_manager
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698