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 "base/strings/string_util.h" | 5 #include "base/strings/string_util.h" |
6 #include "base/strings/utf_string_conversions.h" | 6 #include "base/strings/utf_string_conversions.h" |
7 #include "chrome/test/base/chrome_render_view_test.h" | 7 #include "chrome/test/base/chrome_render_view_test.h" |
8 #include "components/autofill/content/renderer/autofill_agent.h" | 8 #include "components/autofill/content/renderer/autofill_agent.h" |
9 #include "components/autofill/content/renderer/form_autofill_util.h" | 9 #include "components/autofill/content/renderer/form_autofill_util.h" |
10 #include "components/autofill/content/renderer/password_autofill_agent.h" | 10 #include "components/autofill/content/renderer/password_autofill_agent.h" |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 fill_data_.basic_data.action = GURL(origin); | 333 fill_data_.basic_data.action = GURL(origin); |
334 | 334 |
335 // Simulate the browser sending back the login info, it triggers the | 335 // Simulate the browser sending back the login info, it triggers the |
336 // autocomplete. | 336 // autocomplete. |
337 SimulateOnFillPasswordForm(fill_data_); | 337 SimulateOnFillPasswordForm(fill_data_); |
338 | 338 |
339 // The username and password should have been autocompleted. | 339 // The username and password should have been autocompleted. |
340 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); | 340 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); |
341 } | 341 } |
342 | 342 |
343 // Tests that if a password or input element is marked as readonly, neither | 343 // Tests that if a password is marked as readonly, neither field is autofilled |
344 // field is autofilled on page load. | 344 // on page load. |
345 TEST_F(PasswordAutofillAgentTest, NoInitialAutocompleteForReadOnly) { | 345 TEST_F(PasswordAutofillAgentTest, NoInitialAutocompleteForReadOnlyPassword) { |
346 password_element_.setAttribute(WebString::fromUTF8("readonly"), | 346 password_element_.setAttribute(WebString::fromUTF8("readonly"), |
347 WebString::fromUTF8("true")); | 347 WebString::fromUTF8("true")); |
348 | 348 |
349 // Simulate the browser sending back the login info, it triggers the | 349 // Simulate the browser sending back the login info, it triggers the |
350 // autocomplete. | 350 // autocomplete. |
351 SimulateOnFillPasswordForm(fill_data_); | 351 SimulateOnFillPasswordForm(fill_data_); |
352 | 352 |
353 CheckTextFieldsState(std::string(), false, std::string(), false); | 353 CheckTextFieldsState(std::string(), false, std::string(), false); |
354 } | 354 } |
355 | 355 |
| 356 // Can still fill a password field if the username is set to a value that |
| 357 // matches. |
| 358 TEST_F(PasswordAutofillAgentTest, |
| 359 AutocompletePasswordForReadonlyUsernameMatched) { |
| 360 username_element_.setValue(username3_); |
| 361 username_element_.setAttribute(WebString::fromUTF8("readonly"), |
| 362 WebString::fromUTF8("true")); |
| 363 |
| 364 // Filled even though username is not the preferred match. |
| 365 SimulateOnFillPasswordForm(fill_data_); |
| 366 CheckTextFieldsState(UTF16ToUTF8(username3_), false, |
| 367 UTF16ToUTF8(password3_), true); |
| 368 } |
| 369 |
| 370 // If a username field is empty and readonly, don't autofill. |
| 371 TEST_F(PasswordAutofillAgentTest, |
| 372 NoAutocompletePasswordForReadonlyUsernameUnmatched) { |
| 373 username_element_.setValue(WebString::fromUTF8("")); |
| 374 username_element_.setAttribute(WebString::fromUTF8("readonly"), |
| 375 WebString::fromUTF8("true")); |
| 376 |
| 377 SimulateOnFillPasswordForm(fill_data_); |
| 378 CheckTextFieldsState(std::string(), false, std::string(), false); |
| 379 } |
| 380 |
356 // Tests that having a non-matching username precludes the autocomplete. | 381 // Tests that having a non-matching username precludes the autocomplete. |
357 TEST_F(PasswordAutofillAgentTest, NoInitialAutocompleteForFilledField) { | 382 TEST_F(PasswordAutofillAgentTest, NoAutocompleteForFilledFieldUnmatched) { |
358 username_element_.setValue(WebString::fromUTF8("bogus")); | 383 username_element_.setValue(WebString::fromUTF8("bogus")); |
359 | 384 |
360 // Simulate the browser sending back the login info, it triggers the | 385 // Simulate the browser sending back the login info, it triggers the |
361 // autocomplete. | 386 // autocomplete. |
362 SimulateOnFillPasswordForm(fill_data_); | 387 SimulateOnFillPasswordForm(fill_data_); |
363 | 388 |
364 // Neither field should be autocompleted. | 389 // Neither field should be autocompleted. |
365 CheckTextFieldsState("bogus", false, std::string(), false); | 390 CheckTextFieldsState("bogus", false, std::string(), false); |
366 } | 391 } |
367 | 392 |
| 393 // Don't try to complete a prefilled value even if it's a partial match |
| 394 // to a username. |
| 395 TEST_F(PasswordAutofillAgentTest, NoPartialMatchForPrefilledUsername) { |
| 396 username_element_.setValue(WebString::fromUTF8("ali")); |
| 397 |
| 398 SimulateOnFillPasswordForm(fill_data_); |
| 399 |
| 400 CheckTextFieldsState("ali", false, std::string(), false); |
| 401 } |
| 402 |
| 403 TEST_F(PasswordAutofillAgentTest, InputWithNoForms) { |
| 404 const char kNoFormInputs[] = |
| 405 "<input type='text' id='username'/>" |
| 406 "<input type='password' id='password'/>"; |
| 407 LoadHTML(kNoFormInputs); |
| 408 |
| 409 SimulateOnFillPasswordForm(fill_data_); |
| 410 |
| 411 // Input elements that aren't in a <form> won't autofill. |
| 412 CheckTextFieldsState(std::string(), false, std::string(), false); |
| 413 } |
| 414 |
368 // Tests that we do not autofill username/passwords if marked as | 415 // Tests that we do not autofill username/passwords if marked as |
369 // autocomplete="off". | 416 // autocomplete="off". |
370 TEST_F(PasswordAutofillAgentTest, NoInitialAutocompleteForAutocompleteOff) { | 417 TEST_F(PasswordAutofillAgentTest, NoInitialAutocompleteForAutocompleteOff) { |
371 username_element_.setAttribute(WebString::fromUTF8("autocomplete"), | 418 username_element_.setAttribute(WebString::fromUTF8("autocomplete"), |
372 WebString::fromUTF8("off")); | 419 WebString::fromUTF8("off")); |
373 | 420 |
374 // Simulate the browser sending back the login info, it triggers the | 421 // Simulate the browser sending back the login info, it triggers the |
375 // autocomplete. | 422 // autocomplete. |
376 SimulateOnFillPasswordForm(fill_data_); | 423 SimulateOnFillPasswordForm(fill_data_); |
377 | 424 |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 EXPECT_TRUE(render_thread_->sink().GetFirstMessageMatching( | 692 EXPECT_TRUE(render_thread_->sink().GetFirstMessageMatching( |
646 AutofillHostMsg_PasswordFormsRendered::ID)); | 693 AutofillHostMsg_PasswordFormsRendered::ID)); |
647 | 694 |
648 render_thread_->sink().ClearMessages(); | 695 render_thread_->sink().ClearMessages(); |
649 LoadHTML(kWebpageWithDynamicContent); | 696 LoadHTML(kWebpageWithDynamicContent); |
650 EXPECT_TRUE(render_thread_->sink().GetFirstMessageMatching( | 697 EXPECT_TRUE(render_thread_->sink().GetFirstMessageMatching( |
651 AutofillHostMsg_PasswordFormsRendered::ID)); | 698 AutofillHostMsg_PasswordFormsRendered::ID)); |
652 } | 699 } |
653 | 700 |
654 } // namespace autofill | 701 } // namespace autofill |
OLD | NEW |