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/common/autofill_messages.h" | 8 #include "components/autofill/content/common/autofill_messages.h" |
9 #include "components/autofill/content/renderer/autofill_agent.h" | 9 #include "components/autofill/content/renderer/autofill_agent.h" |
10 #include "components/autofill/content/renderer/form_autofill_util.h" | 10 #include "components/autofill/content/renderer/form_autofill_util.h" |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 username_element_.setAutofilled(false); | 290 username_element_.setAutofilled(false); |
291 password_element_.setValue(""); | 291 password_element_.setValue(""); |
292 password_element_.setAutofilled(false); | 292 password_element_.setAutofilled(false); |
293 } | 293 } |
294 | 294 |
295 void SimulateDidEndEditing(WebFrame* input_frame, WebInputElement& input) { | 295 void SimulateDidEndEditing(WebFrame* input_frame, WebInputElement& input) { |
296 static_cast<blink::WebAutofillClient*>(autofill_agent_) | 296 static_cast<blink::WebAutofillClient*>(autofill_agent_) |
297 ->textFieldDidEndEditing(input); | 297 ->textFieldDidEndEditing(input); |
298 } | 298 } |
299 | 299 |
300 void SimulateInputChangeForElement(const std::string& new_value, | |
301 bool move_caret_to_end, | |
302 WebFrame* input_frame, | |
303 WebInputElement& input, | |
304 bool is_user_input) { | |
305 input.setValue(WebString::fromUTF8(new_value), is_user_input); | |
306 // The field must have focus or AutofillAgent will think the | |
307 // change should be ignored. | |
308 while (!input.focused()) | |
309 input_frame->document().frame()->view()->advanceFocus(false); | |
310 if (move_caret_to_end) | |
311 input.setSelectionRange(new_value.length(), new_value.length()); | |
312 if (is_user_input) { | |
313 AutofillMsg_FirstUserGestureObservedInTab msg(0); | |
314 content::RenderFrame::FromWebFrame(input_frame)->OnMessageReceived(msg); | |
315 | |
316 // Also pass the message to the testing object. | |
317 if (input_frame == GetMainFrame()) | |
318 password_autofill_agent_->FirstUserGestureObserved(); | |
319 } | |
320 input_frame->toWebLocalFrame()->autofillClient()->textFieldDidChange(input); | |
321 // Processing is delayed because of a Blink bug: | |
322 // https://bugs.webkit.org/show_bug.cgi?id=16976 | |
323 // See PasswordAutofillAgent::TextDidChangeInTextField() for details. | |
324 | |
325 // Autocomplete will trigger a style recalculation when we put up the next | |
326 // frame, but we don't want to wait that long. Instead, trigger a style | |
327 // recalcuation manually after TextFieldDidChangeImpl runs. | |
328 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | |
329 &PasswordAutofillAgentTest::LayoutMainFrame, base::Unretained(this))); | |
330 | |
331 base::MessageLoop::current()->RunUntilIdle(); | |
332 } | |
333 | |
334 void SimulateSuggestionChoice(WebInputElement& username_input) { | 300 void SimulateSuggestionChoice(WebInputElement& username_input) { |
335 base::string16 username(base::ASCIIToUTF16(kAliceUsername)); | 301 base::string16 username(base::ASCIIToUTF16(kAliceUsername)); |
336 base::string16 password(base::ASCIIToUTF16(kAlicePassword)); | 302 base::string16 password(base::ASCIIToUTF16(kAlicePassword)); |
337 SimulateSuggestionChoiceOfUsernameAndPassword(username_input, username, | 303 SimulateSuggestionChoiceOfUsernameAndPassword(username_input, username, |
338 password); | 304 password); |
339 } | 305 } |
340 | 306 |
341 void SimulateSuggestionChoiceOfUsernameAndPassword( | 307 void SimulateSuggestionChoiceOfUsernameAndPassword( |
342 WebInputElement& input, | 308 WebInputElement& input, |
343 const base::string16& username, | 309 const base::string16& username, |
344 const base::string16& password) { | 310 const base::string16& password) { |
345 // This call is necessary to setup the autofill agent appropriate for the | 311 // This call is necessary to setup the autofill agent appropriate for the |
346 // user selection; simulates the menu actually popping up. | 312 // user selection; simulates the menu actually popping up. |
347 render_thread_->sink().ClearMessages(); | 313 render_thread_->sink().ClearMessages(); |
348 static_cast<autofill::PageClickListener*>(autofill_agent_) | 314 static_cast<autofill::PageClickListener*>(autofill_agent_) |
349 ->FormControlElementClicked(input, false); | 315 ->FormControlElementClicked(input, false); |
350 | 316 |
351 AutofillMsg_FillPasswordSuggestion msg(0, username, password); | 317 AutofillMsg_FillPasswordSuggestion msg(0, username, password); |
352 static_cast<content::RenderFrameObserver*>(autofill_agent_) | 318 static_cast<content::RenderFrameObserver*>(autofill_agent_) |
353 ->OnMessageReceived(msg); | 319 ->OnMessageReceived(msg); |
354 } | 320 } |
355 | 321 |
356 void LayoutMainFrame() { | 322 void SimulateUsernameChange(const std::string& username) { |
357 GetMainFrame()->view()->layout(); | 323 SimulateUserInputChangeForElement(&username_element_, username); |
358 } | 324 } |
359 | 325 |
360 void SimulateUsernameChange(const std::string& username, | 326 void SimulatePasswordChange(const std::string& password) { |
361 bool move_caret_to_end, | 327 SimulateUserInputChangeForElement(&password_element_, password); |
362 bool is_user_input = false) { | |
363 SimulateInputChangeForElement(username, | |
364 move_caret_to_end, | |
365 GetMainFrame(), | |
366 username_element_, | |
367 is_user_input); | |
368 } | |
369 | |
370 void SimulateKeyDownEvent(const WebInputElement& element, | |
371 ui::KeyboardCode key_code) { | |
372 blink::WebKeyboardEvent key_event; | |
373 key_event.windowsKeyCode = key_code; | |
374 static_cast<blink::WebAutofillClient*>(autofill_agent_) | |
375 ->textFieldDidReceiveKeyDown(element, key_event); | |
376 } | 328 } |
377 | 329 |
378 void CheckTextFieldsStateForElements(const WebInputElement& username_element, | 330 void CheckTextFieldsStateForElements(const WebInputElement& username_element, |
379 const std::string& username, | 331 const std::string& username, |
380 bool username_autofilled, | 332 bool username_autofilled, |
381 const WebInputElement& password_element, | 333 const WebInputElement& password_element, |
382 const std::string& password, | 334 const std::string& password, |
383 bool password_autofilled, | 335 bool password_autofilled, |
384 bool checkSuggestedValue) { | 336 bool checkSuggestedValue) { |
385 EXPECT_EQ(username, | 337 EXPECT_EQ(username, |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
681 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); | 633 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); |
682 } | 634 } |
683 | 635 |
684 // Tests that editing the password clears the autocompleted password field. | 636 // Tests that editing the password clears the autocompleted password field. |
685 TEST_F(PasswordAutofillAgentTest, PasswordClearOnEdit) { | 637 TEST_F(PasswordAutofillAgentTest, PasswordClearOnEdit) { |
686 // Simulate the browser sending back the login info, it triggers the | 638 // Simulate the browser sending back the login info, it triggers the |
687 // autocomplete. | 639 // autocomplete. |
688 SimulateOnFillPasswordForm(fill_data_); | 640 SimulateOnFillPasswordForm(fill_data_); |
689 | 641 |
690 // Simulate the user changing the username to some unknown username. | 642 // Simulate the user changing the username to some unknown username. |
691 SimulateUsernameChange("alicia", true); | 643 SimulateUsernameChange("alicia"); |
692 | 644 |
693 // The password should have been cleared. | 645 // The password should have been cleared. |
694 CheckTextFieldsState("alicia", false, std::string(), false); | 646 CheckTextFieldsState("alicia", false, std::string(), false); |
695 } | 647 } |
696 | 648 |
697 // Tests that we only autocomplete on focus lost and with a full username match | 649 // Tests that we only autocomplete on focus lost and with a full username match |
698 // when |wait_for_username| is true. | 650 // when |wait_for_username| is true. |
699 TEST_F(PasswordAutofillAgentTest, WaitUsername) { | 651 TEST_F(PasswordAutofillAgentTest, WaitUsername) { |
700 // Simulate the browser sending back the login info. | 652 // Simulate the browser sending back the login info. |
701 fill_data_.wait_for_username = true; | 653 fill_data_.wait_for_username = true; |
702 SimulateOnFillPasswordForm(fill_data_); | 654 SimulateOnFillPasswordForm(fill_data_); |
703 | 655 |
704 // No auto-fill should have taken place. | 656 // No auto-fill should have taken place. |
705 CheckTextFieldsState(std::string(), false, std::string(), false); | 657 CheckTextFieldsState(std::string(), false, std::string(), false); |
706 | 658 |
707 // No autocomplete should happen when text is entered in the username. | 659 // No autocomplete should happen when text is entered in the username. |
708 SimulateUsernameChange("a", true); | 660 SimulateUsernameChange("a"); |
709 CheckTextFieldsState("a", false, std::string(), false); | 661 CheckTextFieldsState("a", false, std::string(), false); |
710 SimulateUsernameChange("al", true); | 662 SimulateUsernameChange("al"); |
711 CheckTextFieldsState("al", false, std::string(), false); | 663 CheckTextFieldsState("al", false, std::string(), false); |
712 SimulateUsernameChange(kAliceUsername, true); | 664 SimulateUsernameChange(kAliceUsername); |
713 CheckTextFieldsState(kAliceUsername, false, std::string(), false); | 665 CheckTextFieldsState(kAliceUsername, false, std::string(), false); |
714 | 666 |
715 // Autocomplete should happen only when the username textfield is blurred with | 667 // Autocomplete should happen only when the username textfield is blurred with |
716 // a full match. | 668 // a full match. |
717 username_element_.setValue("a"); | 669 SimulateUsernameChange("a"); |
718 static_cast<blink::WebAutofillClient*>(autofill_agent_) | 670 static_cast<blink::WebAutofillClient*>(autofill_agent_) |
719 ->textFieldDidEndEditing(username_element_); | 671 ->textFieldDidEndEditing(username_element_); |
720 CheckTextFieldsState("a", false, std::string(), false); | 672 CheckTextFieldsState("a", false, std::string(), false); |
721 username_element_.setValue("al"); | 673 SimulateUsernameChange("al"); |
722 static_cast<blink::WebAutofillClient*>(autofill_agent_) | 674 static_cast<blink::WebAutofillClient*>(autofill_agent_) |
723 ->textFieldDidEndEditing(username_element_); | 675 ->textFieldDidEndEditing(username_element_); |
724 CheckTextFieldsState("al", false, std::string(), false); | 676 CheckTextFieldsState("al", false, std::string(), false); |
725 username_element_.setValue("alices"); | 677 SimulateUsernameChange("alices"); |
726 static_cast<blink::WebAutofillClient*>(autofill_agent_) | 678 static_cast<blink::WebAutofillClient*>(autofill_agent_) |
727 ->textFieldDidEndEditing(username_element_); | 679 ->textFieldDidEndEditing(username_element_); |
728 CheckTextFieldsState("alices", false, std::string(), false); | 680 CheckTextFieldsState("alices", false, std::string(), false); |
729 username_element_.setValue(ASCIIToUTF16(kAliceUsername)); | 681 SimulateUsernameChange(kAliceUsername); |
730 static_cast<blink::WebAutofillClient*>(autofill_agent_) | 682 static_cast<blink::WebAutofillClient*>(autofill_agent_) |
731 ->textFieldDidEndEditing(username_element_); | 683 ->textFieldDidEndEditing(username_element_); |
732 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); | 684 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); |
733 } | 685 } |
734 | 686 |
735 // Tests that inline autocompletion works properly. | 687 // Tests that inline autocompletion works properly. |
736 TEST_F(PasswordAutofillAgentTest, InlineAutocomplete) { | 688 TEST_F(PasswordAutofillAgentTest, InlineAutocomplete) { |
737 // Simulate the browser sending back the login info. | 689 // Simulate the browser sending back the login info. |
738 SimulateOnFillPasswordForm(fill_data_); | 690 SimulateOnFillPasswordForm(fill_data_); |
739 | 691 |
740 ClearUsernameAndPasswordFields(); | 692 ClearUsernameAndPasswordFields(); |
741 | 693 |
742 // Simulate the user typing in the first letter of 'alice', a stored | 694 // Simulate the user typing in the first letter of 'alice', a stored |
743 // username. | 695 // username. |
744 SimulateUsernameChange("a", true); | 696 SimulateUsernameChange("a"); |
745 // Both the username and password text fields should reflect selection of the | 697 // Both the username and password text fields should reflect selection of the |
746 // stored login. | 698 // stored login. |
747 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); | 699 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); |
748 // And the selection should have been set to 'lice', the last 4 letters. | 700 // And the selection should have been set to 'lice', the last 4 letters. |
749 CheckUsernameSelection(1, 5); | 701 CheckUsernameSelection(1, 5); |
750 | 702 |
751 // Now the user types the next letter of the same username, 'l'. | 703 // Now the user types the next letter of the same username, 'l'. |
752 SimulateUsernameChange("al", true); | 704 SimulateUserTypingASCIICharacter('l'); |
| 705 ProcessInputForAutofill(); |
753 // Now the fields should have the same value, but the selection should have a | 706 // Now the fields should have the same value, but the selection should have a |
754 // different start value. | 707 // different start value. |
755 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); | 708 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); |
756 CheckUsernameSelection(2, 5); | 709 CheckUsernameSelection(2, 5); |
757 | 710 |
758 // Test that deleting does not trigger autocomplete. | 711 // Test that backspace will erase the selection and will stop autocompletion. |
759 SimulateKeyDownEvent(username_element_, ui::VKEY_BACK); | 712 SimulateUserTypingASCIICharacter(ui::VKEY_BACK); |
760 SimulateUsernameChange("alic", true); | 713 ProcessInputForAutofill(); |
761 CheckTextFieldsState("alic", false, std::string(), false); | 714 CheckTextFieldsState("al", false, std::string(), false); |
762 CheckUsernameSelection(4, 4); // No selection. | 715 CheckUsernameSelection(2, 2); // No selection. |
763 // Reset the last pressed key to something other than backspace. | |
764 SimulateKeyDownEvent(username_element_, ui::VKEY_A); | |
765 | 716 |
766 // Now lets say the user goes astray from the stored username and types the | 717 // Now lets say the user goes astray from the stored username and types the |
767 // letter 'f', spelling 'alf'. We don't know alf (that's just sad), so in | 718 // letter 'f', spelling 'alf'. We don't know alf (that's just sad), so in |
768 // practice the username should no longer be 'alice' and the selected range | 719 // practice the username should no longer be 'alice' and the selected range |
769 // should be empty. | 720 // should be empty. |
770 SimulateUsernameChange("alf", true); | 721 SimulateUserTypingASCIICharacter('f'); |
| 722 ProcessInputForAutofill(); |
771 CheckTextFieldsState("alf", false, std::string(), false); | 723 CheckTextFieldsState("alf", false, std::string(), false); |
772 CheckUsernameSelection(3, 3); // No selection. | 724 CheckUsernameSelection(3, 3); // No selection. |
773 | 725 |
774 // Ok, so now the user removes all the text and enters the letter 'b'. | 726 // Ok, so now the user removes all the text and enters the letter 'b'. |
775 SimulateUsernameChange("b", true); | 727 SimulateUsernameChange("b"); |
776 // The username and password fields should match the 'bob' entry. | 728 // The username and password fields should match the 'bob' entry. |
777 CheckTextFieldsState(kBobUsername, true, kBobPassword, true); | 729 CheckTextFieldsDOMState(kBobUsername, true, kBobPassword, true); |
778 CheckUsernameSelection(1, 3); | 730 CheckUsernameSelection(1, 3); |
779 | 731 |
780 // Then, the user again removes all the text and types an uppercase 'C'. | 732 // Then, the user again removes all the text and types an uppercase 'C'. |
781 SimulateUsernameChange("C", true); | 733 SimulateUsernameChange("C"); |
782 // The username and password fields should match the 'Carol' entry. | 734 // The username and password fields should match the 'Carol' entry. |
783 CheckTextFieldsState(kCarolUsername, true, kCarolPassword, true); | 735 CheckTextFieldsDOMState(kCarolUsername, true, kCarolPassword, true); |
784 CheckUsernameSelection(1, 5); | 736 CheckUsernameSelection(1, 5); |
| 737 |
785 // The user removes all the text and types a lowercase 'c'. We only | 738 // The user removes all the text and types a lowercase 'c'. We only |
786 // want case-sensitive autocompletion, so the username and the selected range | 739 // want case-sensitive autocompletion, so the username and the selected range |
787 // should be empty. | 740 // should be empty. |
788 SimulateUsernameChange("c", true); | 741 SimulateUsernameChange("c"); |
789 CheckTextFieldsState("c", false, std::string(), false); | 742 CheckTextFieldsState("c", false, std::string(), false); |
790 CheckUsernameSelection(1, 1); | 743 CheckUsernameSelection(1, 1); |
791 | 744 |
792 // Check that we complete other_possible_usernames as well. | 745 // Check that we complete other_possible_usernames as well. |
793 SimulateUsernameChange("R", true); | 746 SimulateUsernameChange("R"); |
794 CheckTextFieldsState(kCarolAlternateUsername, true, kCarolPassword, true); | 747 CheckTextFieldsDOMState(kCarolAlternateUsername, true, kCarolPassword, true); |
795 CheckUsernameSelection(1, 17); | 748 CheckUsernameSelection(1, 17); |
796 } | 749 } |
797 | 750 |
798 TEST_F(PasswordAutofillAgentTest, IsWebNodeVisibleTest) { | 751 TEST_F(PasswordAutofillAgentTest, IsWebNodeVisibleTest) { |
799 blink::WebVector<blink::WebFormElement> forms1, forms2, forms3; | 752 blink::WebVector<blink::WebFormElement> forms1, forms2, forms3; |
800 blink::WebFrame* frame; | 753 blink::WebFrame* frame; |
801 | 754 |
802 LoadHTML(kVisibleFormWithNoUsernameHTML); | 755 LoadHTML(kVisibleFormWithNoUsernameHTML); |
803 frame = GetMainFrame(); | 756 frame = GetMainFrame(); |
804 frame->document().forms(forms1); | 757 frame->document().forms(forms1); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
913 | 866 |
914 WebInputElement username_input = username_element.to<WebInputElement>(); | 867 WebInputElement username_input = username_element.to<WebInputElement>(); |
915 WebInputElement password_input = password_element.to<WebInputElement>(); | 868 WebInputElement password_input = password_element.to<WebInputElement>(); |
916 ASSERT_FALSE(username_element.isNull()); | 869 ASSERT_FALSE(username_element.isNull()); |
917 | 870 |
918 CheckTextFieldsStateForElements( | 871 CheckTextFieldsStateForElements( |
919 username_input, "", false, password_input, "", false, false); | 872 username_input, "", false, password_input, "", false, false); |
920 | 873 |
921 // Simulate the user typing in the username in the iframe which should cause | 874 // Simulate the user typing in the username in the iframe which should cause |
922 // an autofill. | 875 // an autofill. |
923 SimulateInputChangeForElement( | 876 content::RenderFrame::FromWebFrame(iframe) |
924 kAliceUsername, true, iframe, username_input, true); | 877 ->OnMessageReceived(AutofillMsg_FirstUserGestureObservedInTab(0)); |
| 878 SimulateUserInputChangeForElement(&username_input, kAliceUsername); |
925 | 879 |
926 CheckTextFieldsStateForElements(username_input, | 880 CheckTextFieldsStateForElements(username_input, |
927 kAliceUsername, | 881 kAliceUsername, |
928 true, | 882 true, |
929 password_input, | 883 password_input, |
930 kAlicePassword, | 884 kAlicePassword, |
931 true, | 885 true, |
932 false); | 886 false); |
933 } | 887 } |
934 | 888 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1022 fill_data_.wait_for_username = true; | 976 fill_data_.wait_for_username = true; |
1023 SimulateOnFillPasswordForm(fill_data_); | 977 SimulateOnFillPasswordForm(fill_data_); |
1024 | 978 |
1025 // The username and password should not yet have been autocompleted. | 979 // The username and password should not yet have been autocompleted. |
1026 CheckTextFieldsState(std::string(), false, std::string(), false); | 980 CheckTextFieldsState(std::string(), false, std::string(), false); |
1027 | 981 |
1028 // Simulate a click just to force a user gesture, since the username value is | 982 // Simulate a click just to force a user gesture, since the username value is |
1029 // set directly. | 983 // set directly. |
1030 SimulateElementClick(kUsernameName); | 984 SimulateElementClick(kUsernameName); |
1031 | 985 |
1032 // Simulate the user entering her username and selecting the matching autofill | 986 // Simulate the user entering the first letter of her username and selecting |
1033 // from the dropdown. | 987 // the matching autofill from the dropdown. |
1034 SimulateUsernameChange(kAliceUsername, true, true); | 988 SimulateUsernameChange("a"); |
1035 SimulateSuggestionChoice(username_element_); | 989 SimulateSuggestionChoice(username_element_); |
1036 | 990 |
1037 // The username and password should now have been autocompleted. | 991 // The username and password should now have been autocompleted. |
1038 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); | 992 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); |
1039 | 993 |
1040 // JavaScript onChange events should have been triggered both for the username | 994 // JavaScript onChange events should have been triggered both for the username |
1041 // and for the password. | 995 // and for the password. |
1042 int username_onchange_called = -1; | 996 int username_onchange_called = -1; |
1043 int password_onchange_called = -1; | 997 int password_onchange_called = -1; |
1044 ASSERT_TRUE( | 998 ASSERT_TRUE( |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1282 // Tests that |ClearPreview| properly restores the original selection range of | 1236 // Tests that |ClearPreview| properly restores the original selection range of |
1283 // username field that has initially been filled by inline autocomplete. | 1237 // username field that has initially been filled by inline autocomplete. |
1284 TEST_F(PasswordAutofillAgentTest, ClearPreviewWithInlineAutocompletedUsername) { | 1238 TEST_F(PasswordAutofillAgentTest, ClearPreviewWithInlineAutocompletedUsername) { |
1285 // Simulate the browser sending back the login info. | 1239 // Simulate the browser sending back the login info. |
1286 SimulateOnFillPasswordForm(fill_data_); | 1240 SimulateOnFillPasswordForm(fill_data_); |
1287 | 1241 |
1288 // Clear the text fields to start fresh. | 1242 // Clear the text fields to start fresh. |
1289 ClearUsernameAndPasswordFields(); | 1243 ClearUsernameAndPasswordFields(); |
1290 | 1244 |
1291 // Simulate the user typing in the first letter of 'alice', a stored username. | 1245 // Simulate the user typing in the first letter of 'alice', a stored username. |
1292 SimulateUsernameChange("a", true); | 1246 SimulateUsernameChange("a"); |
1293 // Both the username and password text fields should reflect selection of the | 1247 // Both the username and password text fields should reflect selection of the |
1294 // stored login. | 1248 // stored login. |
1295 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); | 1249 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); |
1296 // The selection should have been set to 'lice', the last 4 letters. | 1250 // The selection should have been set to 'lice', the last 4 letters. |
1297 CheckUsernameSelection(1, 5); | 1251 CheckUsernameSelection(1, 5); |
1298 | 1252 |
1299 EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion( | 1253 EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion( |
1300 username_element_, "alicia", "secret")); | 1254 username_element_, "alicia", "secret")); |
1301 EXPECT_EQ( | 1255 EXPECT_EQ( |
1302 "alicia", | 1256 "alicia", |
1303 static_cast<std::string>(username_element_.suggestedValue().utf8())); | 1257 static_cast<std::string>(username_element_.suggestedValue().utf8())); |
1304 EXPECT_TRUE(username_element_.isAutofilled()); | 1258 EXPECT_TRUE(username_element_.isAutofilled()); |
1305 EXPECT_EQ( | 1259 EXPECT_EQ( |
1306 "secret", | 1260 "secret", |
1307 static_cast<std::string>(password_element_.suggestedValue().utf8())); | 1261 static_cast<std::string>(password_element_.suggestedValue().utf8())); |
1308 EXPECT_TRUE(password_element_.isAutofilled()); | 1262 EXPECT_TRUE(password_element_.isAutofilled()); |
1309 CheckUsernameSelection(1, 6); | 1263 CheckUsernameSelection(1, 6); |
1310 | 1264 |
1311 EXPECT_TRUE( | 1265 EXPECT_TRUE( |
1312 password_autofill_agent_->DidClearAutofillSelection(username_element_)); | 1266 password_autofill_agent_->DidClearAutofillSelection(username_element_)); |
1313 | 1267 |
1314 EXPECT_EQ(kAliceUsername, username_element_.value().utf8()); | 1268 EXPECT_EQ(kAliceUsername, username_element_.value().utf8()); |
1315 EXPECT_TRUE(username_element_.suggestedValue().isEmpty()); | 1269 EXPECT_TRUE(username_element_.suggestedValue().isEmpty()); |
1316 EXPECT_TRUE(username_element_.isAutofilled()); | 1270 EXPECT_TRUE(username_element_.isAutofilled()); |
1317 EXPECT_TRUE(password_element_.value().isEmpty()); | 1271 EXPECT_EQ(kAlicePassword, password_element_.value().utf8()); |
1318 EXPECT_TRUE(password_element_.suggestedValue().isEmpty()); | 1272 EXPECT_TRUE(password_element_.suggestedValue().isEmpty()); |
1319 EXPECT_TRUE(password_element_.isAutofilled()); | 1273 EXPECT_TRUE(password_element_.isAutofilled()); |
1320 CheckUsernameSelection(1, 5); | 1274 CheckUsernameSelection(1, 5); |
1321 } | 1275 } |
1322 | 1276 |
1323 // Tests that logging is off by default. | 1277 // Tests that logging is off by default. |
1324 TEST_F(PasswordAutofillAgentTest, OnChangeLoggingState_NoMessage) { | 1278 TEST_F(PasswordAutofillAgentTest, OnChangeLoggingState_NoMessage) { |
1325 render_thread_->sink().ClearMessages(); | 1279 render_thread_->sink().ClearMessages(); |
1326 SendVisiblePasswordForms(); | 1280 SendVisiblePasswordForms(); |
1327 const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching( | 1281 const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching( |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1407 // Simulate a user clicking on the username element. This should produce a | 1361 // Simulate a user clicking on the username element. This should produce a |
1408 // message with all the usernames. | 1362 // message with all the usernames. |
1409 render_thread_->sink().ClearMessages(); | 1363 render_thread_->sink().ClearMessages(); |
1410 static_cast<PageClickListener*>(autofill_agent_) | 1364 static_cast<PageClickListener*>(autofill_agent_) |
1411 ->FormControlElementClicked(username_element_, false); | 1365 ->FormControlElementClicked(username_element_, false); |
1412 CheckSuggestions(std::string(), false); | 1366 CheckSuggestions(std::string(), false); |
1413 | 1367 |
1414 // Now simulate a user typing in an unrecognized username and then | 1368 // Now simulate a user typing in an unrecognized username and then |
1415 // clicking on the username element. This should also produce a message with | 1369 // clicking on the username element. This should also produce a message with |
1416 // all the usernames. | 1370 // all the usernames. |
1417 SimulateUsernameChange("baz", true); | 1371 SimulateUsernameChange("baz"); |
1418 render_thread_->sink().ClearMessages(); | 1372 render_thread_->sink().ClearMessages(); |
1419 static_cast<PageClickListener*>(autofill_agent_) | 1373 static_cast<PageClickListener*>(autofill_agent_) |
1420 ->FormControlElementClicked(username_element_, true); | 1374 ->FormControlElementClicked(username_element_, true); |
1421 CheckSuggestions("baz", true); | 1375 CheckSuggestions("baz", true); |
| 1376 ClearUsernameAndPasswordFields(); |
1422 | 1377 |
1423 // Now simulate a user typing in the first letter of the username and then | 1378 // Now simulate a user typing in the first letter of the username and then |
1424 // clicking on the username element. While the typing of the first letter will | 1379 // clicking on the username element. While the typing of the first letter will |
1425 // inline autocomplete, clicking on the element should still produce a full | 1380 // inline autocomplete, clicking on the element should still produce a full |
1426 // suggestion list. | 1381 // suggestion list. |
1427 SimulateUsernameChange("a", true); | 1382 SimulateUsernameChange("a"); |
1428 render_thread_->sink().ClearMessages(); | 1383 render_thread_->sink().ClearMessages(); |
1429 static_cast<PageClickListener*>(autofill_agent_) | 1384 static_cast<PageClickListener*>(autofill_agent_) |
1430 ->FormControlElementClicked(username_element_, true); | 1385 ->FormControlElementClicked(username_element_, true); |
1431 CheckSuggestions(kAliceUsername, true); | 1386 CheckSuggestions(kAliceUsername, true); |
1432 } | 1387 } |
1433 | 1388 |
1434 // Tests that there are no autosuggestions from the password manager when the | 1389 // Tests that there are no autosuggestions from the password manager when the |
1435 // user clicks on the password field and the username field is editable when | 1390 // user clicks on the password field and the username field is editable when |
1436 // FillOnAccountSelect is enabled. | 1391 // FillOnAccountSelect is enabled. |
1437 TEST_F(PasswordAutofillAgentTest, | 1392 TEST_F(PasswordAutofillAgentTest, |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1513 EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching( | 1468 EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching( |
1514 AutofillHostMsg_ShowPasswordSuggestions::ID)); | 1469 AutofillHostMsg_ShowPasswordSuggestions::ID)); |
1515 } | 1470 } |
1516 | 1471 |
1517 // The user types in a username and a password, but then just before sending | 1472 // The user types in a username and a password, but then just before sending |
1518 // the form off, a script clears them. This test checks that | 1473 // the form off, a script clears them. This test checks that |
1519 // PasswordAutofillAgent can still remember the username and the password | 1474 // PasswordAutofillAgent can still remember the username and the password |
1520 // typed by the user. | 1475 // typed by the user. |
1521 TEST_F(PasswordAutofillAgentTest, | 1476 TEST_F(PasswordAutofillAgentTest, |
1522 RememberLastNonEmptyUsernameAndPasswordOnSubmit_ScriptCleared) { | 1477 RememberLastNonEmptyUsernameAndPasswordOnSubmit_ScriptCleared) { |
1523 SimulateInputChangeForElement( | 1478 SimulateUsernameChange("temp"); |
1524 "temp", true, GetMainFrame(), username_element_, true); | 1479 SimulatePasswordChange("random"); |
1525 SimulateInputChangeForElement( | |
1526 "random", true, GetMainFrame(), password_element_, true); | |
1527 | 1480 |
1528 // Simulate that the username and the password value was cleared by the | 1481 // Simulate that the username and the password value was cleared by the |
1529 // site's JavaScript before submit. | 1482 // site's JavaScript before submit. |
1530 username_element_.setValue(WebString()); | 1483 username_element_.setValue(WebString()); |
1531 password_element_.setValue(WebString()); | 1484 password_element_.setValue(WebString()); |
1532 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) | 1485 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) |
1533 ->WillSubmitForm(username_element_.form()); | 1486 ->WillSubmitForm(username_element_.form()); |
1534 | 1487 |
1535 // Observe that the PasswordAutofillAgent still remembered the last non-empty | 1488 // Observe that the PasswordAutofillAgent still remembered the last non-empty |
1536 // username and password and sent that to the browser. | 1489 // username and password and sent that to the browser. |
1537 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", ""); | 1490 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", ""); |
1538 } | 1491 } |
1539 | 1492 |
1540 // Similar to RememberLastNonEmptyPasswordOnSubmit_ScriptCleared, but this time | 1493 // Similar to RememberLastNonEmptyPasswordOnSubmit_ScriptCleared, but this time |
1541 // it's the user who clears the username and the password. This test checks | 1494 // it's the user who clears the username and the password. This test checks |
1542 // that in that case, the last non-empty username and password are not | 1495 // that in that case, the last non-empty username and password are not |
1543 // remembered. | 1496 // remembered. |
1544 TEST_F(PasswordAutofillAgentTest, | 1497 TEST_F(PasswordAutofillAgentTest, |
1545 RememberLastNonEmptyUsernameAndPasswordOnSubmit_UserCleared) { | 1498 RememberLastNonEmptyUsernameAndPasswordOnSubmit_UserCleared) { |
1546 SimulateInputChangeForElement( | 1499 SimulateUsernameChange("temp"); |
1547 "temp", true, GetMainFrame(), username_element_, true); | 1500 SimulatePasswordChange("random"); |
1548 SimulateInputChangeForElement( | |
1549 "random", true, GetMainFrame(), password_element_, true); | |
1550 | 1501 |
1551 // Simulate that the user actually cleared the username and password again. | 1502 // Simulate that the user actually cleared the username and password again. |
1552 SimulateInputChangeForElement("", true, GetMainFrame(), username_element_, | 1503 SimulateUsernameChange(""); |
1553 true); | 1504 SimulatePasswordChange(""); |
1554 SimulateInputChangeForElement( | |
1555 "", true, GetMainFrame(), password_element_, true); | |
1556 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) | 1505 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) |
1557 ->WillSubmitForm(username_element_.form()); | 1506 ->WillSubmitForm(username_element_.form()); |
1558 | 1507 |
1559 // Observe that the PasswordAutofillAgent respects the user having cleared the | 1508 // Observe that the PasswordAutofillAgent respects the user having cleared the |
1560 // password. | 1509 // password. |
1561 ExpectFormSubmittedWithUsernameAndPasswords("", "", ""); | 1510 ExpectFormSubmittedWithUsernameAndPasswords("", "", ""); |
1562 } | 1511 } |
1563 | 1512 |
1564 // Similar to RememberLastNonEmptyPasswordOnSubmit_ScriptCleared, but uses the | 1513 // Similar to RememberLastNonEmptyPasswordOnSubmit_ScriptCleared, but uses the |
1565 // new password instead of the current password. | 1514 // new password instead of the current password. |
1566 TEST_F(PasswordAutofillAgentTest, | 1515 TEST_F(PasswordAutofillAgentTest, |
1567 RememberLastNonEmptyUsernameAndPasswordOnSubmit_New) { | 1516 RememberLastNonEmptyUsernameAndPasswordOnSubmit_New) { |
1568 const char kNewPasswordFormHTML[] = | 1517 const char kNewPasswordFormHTML[] = |
1569 "<FORM name='LoginTestForm'>" | 1518 "<FORM name='LoginTestForm'>" |
1570 " <INPUT type='text' id='username' autocomplete='username'/>" | 1519 " <INPUT type='text' id='username' autocomplete='username'/>" |
1571 " <INPUT type='password' id='password' autocomplete='new-password'/>" | 1520 " <INPUT type='password' id='password' autocomplete='new-password'/>" |
1572 " <INPUT type='submit' value='Login'/>" | 1521 " <INPUT type='submit' value='Login'/>" |
1573 "</FORM>"; | 1522 "</FORM>"; |
1574 LoadHTML(kNewPasswordFormHTML); | 1523 LoadHTML(kNewPasswordFormHTML); |
1575 UpdateUsernameAndPasswordElements(); | 1524 UpdateUsernameAndPasswordElements(); |
1576 | 1525 |
1577 SimulateInputChangeForElement( | 1526 SimulateUsernameChange("temp"); |
1578 "temp", true, GetMainFrame(), username_element_, true); | 1527 SimulatePasswordChange("random"); |
1579 SimulateInputChangeForElement( | |
1580 "random", true, GetMainFrame(), password_element_, true); | |
1581 | 1528 |
1582 // Simulate that the username and the password value was cleared by | 1529 // Simulate that the username and the password value was cleared by |
1583 // the site's JavaScript before submit. | 1530 // the site's JavaScript before submit. |
1584 username_element_.setValue(WebString()); | 1531 username_element_.setValue(WebString()); |
1585 password_element_.setValue(WebString()); | 1532 password_element_.setValue(WebString()); |
1586 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) | 1533 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) |
1587 ->WillSubmitForm(username_element_.form()); | 1534 ->WillSubmitForm(username_element_.form()); |
1588 | 1535 |
1589 // Observe that the PasswordAutofillAgent still remembered the last non-empty | 1536 // Observe that the PasswordAutofillAgent still remembered the last non-empty |
1590 // password and sent that to the browser. | 1537 // password and sent that to the browser. |
1591 ExpectFormSubmittedWithUsernameAndPasswords("temp", "", "random"); | 1538 ExpectFormSubmittedWithUsernameAndPasswords("temp", "", "random"); |
1592 } | 1539 } |
1593 | 1540 |
1594 // The user first accepts a suggestion, but then overwrites the password. This | 1541 // The user first accepts a suggestion, but then overwrites the password. This |
1595 // test checks that the overwritten password is not reverted back if the user | 1542 // test checks that the overwritten password is not reverted back if the user |
1596 // triggers autofill through focusing (but not changing) the username again. | 1543 // triggers autofill through focusing (but not changing) the username again. |
1597 TEST_F(PasswordAutofillAgentTest, | 1544 TEST_F(PasswordAutofillAgentTest, |
1598 NoopEditingDoesNotOverwriteManuallyEditedPassword) { | 1545 NoopEditingDoesNotOverwriteManuallyEditedPassword) { |
1599 // Simulate having credentials which needed to wait until the user starts | 1546 // Simulate having credentials which needed to wait until the user starts |
1600 // typing the username to be filled (e.g., PSL-matched credentials). Those are | 1547 // typing the username to be filled (e.g., PSL-matched credentials). Those are |
1601 // the ones which can be filled as a result of TextFieldDidEndEditing. | 1548 // the ones which can be filled as a result of TextFieldDidEndEditing. |
1602 fill_data_.wait_for_username = true; | 1549 fill_data_.wait_for_username = true; |
1603 SimulateOnFillPasswordForm(fill_data_); | 1550 SimulateOnFillPasswordForm(fill_data_); |
1604 // Simulate that the user typed her name to make the autofill work. | 1551 // Simulate that the user typed her name to make the autofill work. |
1605 SimulateInputChangeForElement(kAliceUsername, | 1552 SimulateUsernameChange(kAliceUsername); |
1606 /*move_caret_to_end=*/true, | |
1607 GetMainFrame(), | |
1608 username_element_, | |
1609 /*is_user_input=*/true); | |
1610 SimulateDidEndEditing(GetMainFrame(), username_element_); | 1553 SimulateDidEndEditing(GetMainFrame(), username_element_); |
1611 const std::string old_username(username_element_.value().utf8()); | 1554 const std::string old_username(username_element_.value().utf8()); |
1612 const std::string old_password(password_element_.value().utf8()); | 1555 const std::string old_password(password_element_.value().utf8()); |
1613 const std::string new_password(old_password + "modify"); | 1556 const std::string new_password(old_password + "modify"); |
1614 | 1557 |
1615 // The user changes the password. | 1558 // The user changes the password. |
1616 SimulateInputChangeForElement(new_password, | 1559 SimulatePasswordChange(new_password); |
1617 /*move_caret_to_end=*/true, | |
1618 GetMainFrame(), | |
1619 password_element_, | |
1620 /*is_user_input=*/true); | |
1621 | 1560 |
1622 // The user switches back into the username field, but leaves that without | 1561 // The user switches back into the username field, but leaves that without |
1623 // changes. | 1562 // changes. |
1624 SimulateDidEndEditing(GetMainFrame(), username_element_); | 1563 SimulateDidEndEditing(GetMainFrame(), username_element_); |
1625 | 1564 |
1626 // The password should have stayed as the user changed it. | 1565 // The password should have stayed as the user changed it. |
1627 CheckTextFieldsDOMState(old_username, true, new_password, false); | 1566 CheckTextFieldsDOMState(old_username, true, new_password, false); |
1628 // The password should not have a suggested value. | 1567 // The password should not have a suggested value. |
1629 CheckTextFieldsState(old_username, true, std::string(), false); | 1568 CheckTextFieldsState(old_username, true, std::string(), false); |
1630 } | 1569 } |
1631 | 1570 |
1632 TEST_F(PasswordAutofillAgentTest, | 1571 TEST_F(PasswordAutofillAgentTest, |
1633 InlineAutocompleteOverwritesManuallyEditedPassword) { | 1572 InlineAutocompleteOverwritesManuallyEditedPassword) { |
1634 // Simulate the browser sending back the login info. | 1573 // Simulate the browser sending back the login info. |
1635 SimulateOnFillPasswordForm(fill_data_); | 1574 SimulateOnFillPasswordForm(fill_data_); |
1636 | 1575 |
1637 ClearUsernameAndPasswordFields(); | 1576 ClearUsernameAndPasswordFields(); |
1638 | 1577 |
1639 // The user enters a password | 1578 // The user enters a password |
1640 SimulateInputChangeForElement("someOtherPassword", | 1579 SimulatePasswordChange("someOtherPassword"); |
1641 /*move_caret_to_end=*/true, | |
1642 GetMainFrame(), | |
1643 password_element_, | |
1644 /*is_user_input=*/true); | |
1645 | 1580 |
1646 // Simulate the user typing a stored username. | 1581 // Simulate the user typing a stored username. |
1647 SimulateUsernameChange(kAliceUsername, true); | 1582 SimulateUsernameChange(kAliceUsername); |
1648 // The autofileld password should replace the typed one. | 1583 // The autofileld password should replace the typed one. |
1649 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); | 1584 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); |
1650 } | 1585 } |
1651 | 1586 |
1652 // The user types in a username and a password, but then just before sending | 1587 // The user types in a username and a password, but then just before sending |
1653 // the form off, a script changes them. This test checks that | 1588 // the form off, a script changes them. This test checks that |
1654 // PasswordAutofillAgent can still remember the username and the password | 1589 // PasswordAutofillAgent can still remember the username and the password |
1655 // typed by the user. | 1590 // typed by the user. |
1656 TEST_F(PasswordAutofillAgentTest, | 1591 TEST_F(PasswordAutofillAgentTest, |
1657 RememberLastTypedUsernameAndPasswordOnSubmit_ScriptChanged) { | 1592 RememberLastTypedUsernameAndPasswordOnSubmit_ScriptChanged) { |
1658 SimulateInputChangeForElement("temp", true, GetMainFrame(), username_element_, | 1593 SimulateUsernameChange("temp"); |
1659 true); | 1594 SimulatePasswordChange("random"); |
1660 SimulateInputChangeForElement("random", true, GetMainFrame(), | |
1661 password_element_, true); | |
1662 | 1595 |
1663 // Simulate that the username and the password value was changed by the | 1596 // Simulate that the username and the password value was changed by the |
1664 // site's JavaScript before submit. | 1597 // site's JavaScript before submit. |
1665 username_element_.setValue(WebString("new username")); | 1598 username_element_.setValue(WebString("new username")); |
1666 password_element_.setValue(WebString("new password")); | 1599 password_element_.setValue(WebString("new password")); |
1667 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) | 1600 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) |
1668 ->WillSendSubmitEvent(username_element_.form()); | 1601 ->WillSendSubmitEvent(username_element_.form()); |
1669 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) | 1602 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) |
1670 ->WillSubmitForm(username_element_.form()); | 1603 ->WillSubmitForm(username_element_.form()); |
1671 | 1604 |
(...skipping 26 matching lines...) Expand all Loading... |
1698 | 1631 |
1699 // The username/password is autofilled by password manager then user types in a | 1632 // The username/password is autofilled by password manager then user types in a |
1700 // username and a password. Then just before sending the form off, a script | 1633 // username and a password. Then just before sending the form off, a script |
1701 // changes them. This test checks that PasswordAutofillAgent can still remember | 1634 // changes them. This test checks that PasswordAutofillAgent can still remember |
1702 // the username and the password typed by the user. | 1635 // the username and the password typed by the user. |
1703 TEST_F( | 1636 TEST_F( |
1704 PasswordAutofillAgentTest, | 1637 PasswordAutofillAgentTest, |
1705 RememberLastTypedAfterAutofilledUsernameAndPasswordOnSubmit_ScriptChanged) { | 1638 RememberLastTypedAfterAutofilledUsernameAndPasswordOnSubmit_ScriptChanged) { |
1706 SimulateOnFillPasswordForm(fill_data_); | 1639 SimulateOnFillPasswordForm(fill_data_); |
1707 | 1640 |
1708 SimulateInputChangeForElement("temp", true, GetMainFrame(), username_element_, | 1641 SimulateUsernameChange("temp"); |
1709 true); | 1642 SimulatePasswordChange("random"); |
1710 SimulateInputChangeForElement("random", true, GetMainFrame(), | |
1711 password_element_, true); | |
1712 | 1643 |
1713 // Simulate that the username and the password value was changed by the | 1644 // Simulate that the username and the password value was changed by the |
1714 // site's JavaScript before submit. | 1645 // site's JavaScript before submit. |
1715 username_element_.setValue(WebString("new username")); | 1646 username_element_.setValue(WebString("new username")); |
1716 password_element_.setValue(WebString("new password")); | 1647 password_element_.setValue(WebString("new password")); |
1717 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) | 1648 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) |
1718 ->WillSendSubmitEvent(username_element_.form()); | 1649 ->WillSendSubmitEvent(username_element_.form()); |
1719 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) | 1650 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) |
1720 ->WillSubmitForm(username_element_.form()); | 1651 ->WillSubmitForm(username_element_.form()); |
1721 | 1652 |
1722 // Observe that the PasswordAutofillAgent still remembered the last typed | 1653 // Observe that the PasswordAutofillAgent still remembered the last typed |
1723 // username and password and sent that to the browser. | 1654 // username and password and sent that to the browser. |
1724 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", ""); | 1655 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", ""); |
1725 } | 1656 } |
1726 | 1657 |
1727 // The user starts typing username then it is autofilled. | 1658 // The user starts typing username then it is autofilled. |
1728 // PasswordAutofillAgent should remember the username that was autofilled, | 1659 // PasswordAutofillAgent should remember the username that was autofilled, |
1729 // not last typed. | 1660 // not last typed. |
1730 TEST_F(PasswordAutofillAgentTest, RememberAutofilledUsername) { | 1661 TEST_F(PasswordAutofillAgentTest, RememberAutofilledUsername) { |
1731 SimulateInputChangeForElement("Te", true, GetMainFrame(), username_element_, | 1662 SimulateUsernameChange("Te"); |
1732 true); | |
1733 // Simulate that the username was changed by autofilling. | 1663 // Simulate that the username was changed by autofilling. |
1734 username_element_.setValue(WebString("temp")); | 1664 username_element_.setValue(WebString("temp")); |
1735 SimulateInputChangeForElement("random", true, GetMainFrame(), | 1665 SimulatePasswordChange("random"); |
1736 password_element_, true); | |
1737 | 1666 |
1738 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) | 1667 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) |
1739 ->WillSendSubmitEvent(username_element_.form()); | 1668 ->WillSendSubmitEvent(username_element_.form()); |
1740 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) | 1669 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) |
1741 ->WillSubmitForm(username_element_.form()); | 1670 ->WillSubmitForm(username_element_.form()); |
1742 | 1671 |
1743 // Observe that the PasswordAutofillAgent still remembered the last typed | 1672 // Observe that the PasswordAutofillAgent still remembered the last typed |
1744 // username and password and sent that to the browser. | 1673 // username and password and sent that to the browser. |
1745 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", ""); | 1674 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", ""); |
1746 } | 1675 } |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1871 | 1800 |
1872 CheckTextFieldsState(std::string("foobar"), false, std::string(), false); | 1801 CheckTextFieldsState(std::string("foobar"), false, std::string(), false); |
1873 } | 1802 } |
1874 | 1803 |
1875 // Test that the last plain text field before a password field is chosen as a | 1804 // Test that the last plain text field before a password field is chosen as a |
1876 // username, in a form with 2 plain text fields without username predictions. | 1805 // username, in a form with 2 plain text fields without username predictions. |
1877 TEST_F(PasswordAutofillAgentTest, FindingUsernameWithoutAutofillPredictions) { | 1806 TEST_F(PasswordAutofillAgentTest, FindingUsernameWithoutAutofillPredictions) { |
1878 LoadHTML(kFormHTMLWithTwoTextFields); | 1807 LoadHTML(kFormHTMLWithTwoTextFields); |
1879 UpdateUsernameAndPasswordElements(); | 1808 UpdateUsernameAndPasswordElements(); |
1880 blink::WebInputElement email_element = GetInputElementByID(kEmailName); | 1809 blink::WebInputElement email_element = GetInputElementByID(kEmailName); |
1881 SimulateInputChangeForElement("temp", true, GetMainFrame(), username_element_, | 1810 SimulateUsernameChange("temp"); |
1882 true); | 1811 SimulateUserInputChangeForElement(&email_element, "temp@google.com"); |
1883 SimulateInputChangeForElement("temp@google.com", true, GetMainFrame(), | 1812 SimulatePasswordChange("random"); |
1884 email_element, true); | |
1885 SimulateInputChangeForElement("random", true, GetMainFrame(), | |
1886 password_element_, true); | |
1887 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) | 1813 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) |
1888 ->WillSendSubmitEvent(username_element_.form()); | 1814 ->WillSendSubmitEvent(username_element_.form()); |
1889 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) | 1815 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) |
1890 ->WillSubmitForm(username_element_.form()); | 1816 ->WillSubmitForm(username_element_.form()); |
1891 | 1817 |
1892 // Observe that the PasswordAutofillAgent identifies the second field (e-mail) | 1818 // Observe that the PasswordAutofillAgent identifies the second field (e-mail) |
1893 // as username. | 1819 // as username. |
1894 ExpectFormSubmittedWithUsernameAndPasswords("temp@google.com", "random", ""); | 1820 ExpectFormSubmittedWithUsernameAndPasswords("temp@google.com", "random", ""); |
1895 } | 1821 } |
1896 | 1822 |
1897 // Tests that username predictions are followed when identifying the username | 1823 // Tests that username predictions are followed when identifying the username |
1898 // in a password form with two plain text fields. | 1824 // in a password form with two plain text fields. |
1899 TEST_F(PasswordAutofillAgentTest, FindingUsernameWithAutofillPredictions) { | 1825 TEST_F(PasswordAutofillAgentTest, FindingUsernameWithAutofillPredictions) { |
1900 LoadHTML(kFormHTMLWithTwoTextFields); | 1826 LoadHTML(kFormHTMLWithTwoTextFields); |
1901 UpdateUsernameAndPasswordElements(); | 1827 UpdateUsernameAndPasswordElements(); |
1902 blink::WebInputElement email_element = GetInputElementByID(kEmailName); | 1828 blink::WebInputElement email_element = GetInputElementByID(kEmailName); |
1903 SimulateInputChangeForElement("temp", true, GetMainFrame(), username_element_, | 1829 SimulateUsernameChange("temp"); |
1904 true); | 1830 SimulateUserInputChangeForElement(&email_element, "temp@google.com"); |
1905 SimulateInputChangeForElement("temp@google.com", true, GetMainFrame(), | 1831 SimulatePasswordChange("random"); |
1906 email_element, true); | |
1907 SimulateInputChangeForElement("random", true, GetMainFrame(), | |
1908 password_element_, true); | |
1909 | |
1910 // Find FormData for visible password form. | 1832 // Find FormData for visible password form. |
1911 blink::WebFormElement form_element = username_element_.form(); | 1833 blink::WebFormElement form_element = username_element_.form(); |
1912 FormData form_data; | 1834 FormData form_data; |
1913 ASSERT_TRUE(WebFormElementToFormData(form_element, | 1835 ASSERT_TRUE(WebFormElementToFormData(form_element, |
1914 blink::WebFormControlElement(), | 1836 blink::WebFormControlElement(), |
1915 EXTRACT_NONE, &form_data, nullptr)); | 1837 EXTRACT_NONE, &form_data, nullptr)); |
1916 // Simulate Autofill predictions: the first field is username. | 1838 // Simulate Autofill predictions: the first field is username. |
1917 std::map<autofill::FormData, autofill::FormFieldData> predictions; | 1839 std::map<autofill::FormData, autofill::FormFieldData> predictions; |
1918 predictions[form_data] = form_data.fields[0]; | 1840 predictions[form_data] = form_data.fields[0]; |
1919 AutofillMsg_AutofillUsernameDataReceived msg(0, predictions); | 1841 AutofillMsg_AutofillUsernameDataReceived msg(0, predictions); |
(...skipping 14 matching lines...) Expand all Loading... |
1934 ->WillSendSubmitEvent(username_element_.form()); | 1856 ->WillSendSubmitEvent(username_element_.form()); |
1935 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) | 1857 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) |
1936 ->WillSubmitForm(username_element_.form()); | 1858 ->WillSubmitForm(username_element_.form()); |
1937 | 1859 |
1938 // Observe that the PasswordAutofillAgent identifies the first field as | 1860 // Observe that the PasswordAutofillAgent identifies the first field as |
1939 // username. | 1861 // username. |
1940 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", ""); | 1862 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", ""); |
1941 } | 1863 } |
1942 | 1864 |
1943 } // namespace autofill | 1865 } // namespace autofill |
OLD | NEW |