| 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 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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, | 300 void SimulateInputChangeForElement(const std::string& new_value, |
| 301 bool move_caret_to_end, | 301 bool move_caret_to_end, |
| 302 WebFrame* input_frame, | 302 WebFrame* input_frame, |
| 303 WebInputElement& input, | 303 WebInputElement& input, |
| 304 bool is_user_input) { | 304 bool is_user_input) { |
| 305 input.setValue(WebString::fromUTF8(new_value), is_user_input); | 305 if (is_user_input) |
| 306 // The field must have focus or AutofillAgent will think the | 306 SimulateUserInputChangeForElement(&input, input_frame, new_value); |
| 307 // change should be ignored. | 307 else |
| 308 while (!input.focused()) | 308 input.setValue(WebString::fromUTF8(new_value), false); |
| 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 | 309 |
| 316 // Also pass the message to the testing object. | 310 ProcessEvents(); |
| 317 if (input_frame == GetMainFrame()) | 311 } |
| 318 password_autofill_agent_->FirstUserGestureObserved(); | 312 |
| 319 } | 313 void ProcessEvents() { |
| 320 input_frame->toWebLocalFrame()->autofillClient()->textFieldDidChange(input); | |
| 321 // Processing is delayed because of a Blink bug: | 314 // Processing is delayed because of a Blink bug: |
| 322 // https://bugs.webkit.org/show_bug.cgi?id=16976 | 315 // https://bugs.webkit.org/show_bug.cgi?id=16976 |
| 323 // See PasswordAutofillAgent::TextDidChangeInTextField() for details. | 316 // See PasswordAutofillAgent::TextDidChangeInTextField() for details. |
| 324 | 317 |
| 325 // Autocomplete will trigger a style recalculation when we put up the next | 318 // 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 | 319 // frame, but we don't want to wait that long. Instead, trigger a style |
| 327 // recalcuation manually after TextFieldDidChangeImpl runs. | 320 // recalcuation manually after TextFieldDidChangeImpl runs. |
| 328 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | 321 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
| 329 &PasswordAutofillAgentTest::LayoutMainFrame, base::Unretained(this))); | 322 &PasswordAutofillAgentTest::LayoutMainFrame, base::Unretained(this))); |
| 330 | 323 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 360 void SimulateUsernameChange(const std::string& username, | 353 void SimulateUsernameChange(const std::string& username, |
| 361 bool move_caret_to_end, | 354 bool move_caret_to_end, |
| 362 bool is_user_input = false) { | 355 bool is_user_input = false) { |
| 363 SimulateInputChangeForElement(username, | 356 SimulateInputChangeForElement(username, |
| 364 move_caret_to_end, | 357 move_caret_to_end, |
| 365 GetMainFrame(), | 358 GetMainFrame(), |
| 366 username_element_, | 359 username_element_, |
| 367 is_user_input); | 360 is_user_input); |
| 368 } | 361 } |
| 369 | 362 |
| 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 } | |
| 377 | |
| 378 void CheckTextFieldsStateForElements(const WebInputElement& username_element, | 363 void CheckTextFieldsStateForElements(const WebInputElement& username_element, |
| 379 const std::string& username, | 364 const std::string& username, |
| 380 bool username_autofilled, | 365 bool username_autofilled, |
| 381 const WebInputElement& password_element, | 366 const WebInputElement& password_element, |
| 382 const std::string& password, | 367 const std::string& password, |
| 383 bool password_autofilled, | 368 bool password_autofilled, |
| 384 bool checkSuggestedValue) { | 369 bool checkSuggestedValue) { |
| 385 EXPECT_EQ(username, | 370 EXPECT_EQ(username, |
| 386 static_cast<std::string>(username_element.value().utf8())); | 371 static_cast<std::string>(username_element.value().utf8())); |
| 387 EXPECT_EQ(username_autofilled, username_element.isAutofilled()); | 372 EXPECT_EQ(username_autofilled, username_element.isAutofilled()); |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 681 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); | 666 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); |
| 682 } | 667 } |
| 683 | 668 |
| 684 // Tests that editing the password clears the autocompleted password field. | 669 // Tests that editing the password clears the autocompleted password field. |
| 685 TEST_F(PasswordAutofillAgentTest, PasswordClearOnEdit) { | 670 TEST_F(PasswordAutofillAgentTest, PasswordClearOnEdit) { |
| 686 // Simulate the browser sending back the login info, it triggers the | 671 // Simulate the browser sending back the login info, it triggers the |
| 687 // autocomplete. | 672 // autocomplete. |
| 688 SimulateOnFillPasswordForm(fill_data_); | 673 SimulateOnFillPasswordForm(fill_data_); |
| 689 | 674 |
| 690 // Simulate the user changing the username to some unknown username. | 675 // Simulate the user changing the username to some unknown username. |
| 691 SimulateUsernameChange("alicia", true); | 676 SimulateUsernameChange("alicia", true, true); |
| 692 | 677 |
| 693 // The password should have been cleared. | 678 // The password should have been cleared. |
| 694 CheckTextFieldsState("alicia", false, std::string(), false); | 679 CheckTextFieldsState("alicia", false, std::string(), false); |
| 695 } | 680 } |
| 696 | 681 |
| 697 // Tests that we only autocomplete on focus lost and with a full username match | 682 // Tests that we only autocomplete on focus lost and with a full username match |
| 698 // when |wait_for_username| is true. | 683 // when |wait_for_username| is true. |
| 699 TEST_F(PasswordAutofillAgentTest, WaitUsername) { | 684 TEST_F(PasswordAutofillAgentTest, WaitUsername) { |
| 700 // Simulate the browser sending back the login info. | 685 // Simulate the browser sending back the login info. |
| 701 fill_data_.wait_for_username = true; | 686 fill_data_.wait_for_username = true; |
| 702 SimulateOnFillPasswordForm(fill_data_); | 687 SimulateOnFillPasswordForm(fill_data_); |
| 703 | 688 |
| 704 // No auto-fill should have taken place. | 689 // No auto-fill should have taken place. |
| 705 CheckTextFieldsState(std::string(), false, std::string(), false); | 690 CheckTextFieldsState(std::string(), false, std::string(), false); |
| 706 | 691 |
| 707 // No autocomplete should happen when text is entered in the username. | 692 // No autocomplete should happen when text is entered in the username. |
| 708 SimulateUsernameChange("a", true); | 693 SimulateUsernameChange("a", true, true); |
| 709 CheckTextFieldsState("a", false, std::string(), false); | 694 CheckTextFieldsState("a", false, std::string(), false); |
| 710 SimulateUsernameChange("al", true); | 695 SimulateUsernameChange("al", true, true); |
| 711 CheckTextFieldsState("al", false, std::string(), false); | 696 CheckTextFieldsState("al", false, std::string(), false); |
| 712 SimulateUsernameChange(kAliceUsername, true); | 697 SimulateUsernameChange(kAliceUsername, true, true); |
| 713 CheckTextFieldsState(kAliceUsername, false, std::string(), false); | 698 CheckTextFieldsState(kAliceUsername, false, std::string(), false); |
| 714 | 699 |
| 715 // Autocomplete should happen only when the username textfield is blurred with | 700 // Autocomplete should happen only when the username textfield is blurred with |
| 716 // a full match. | 701 // a full match. |
| 717 username_element_.setValue("a"); | 702 SimulateUsernameChange("a", true, true); |
| 718 static_cast<blink::WebAutofillClient*>(autofill_agent_) | 703 static_cast<blink::WebAutofillClient*>(autofill_agent_) |
| 719 ->textFieldDidEndEditing(username_element_); | 704 ->textFieldDidEndEditing(username_element_); |
| 720 CheckTextFieldsState("a", false, std::string(), false); | 705 CheckTextFieldsState("a", false, std::string(), false); |
| 721 username_element_.setValue("al"); | 706 SimulateUsernameChange("al", true, true); |
| 722 static_cast<blink::WebAutofillClient*>(autofill_agent_) | 707 static_cast<blink::WebAutofillClient*>(autofill_agent_) |
| 723 ->textFieldDidEndEditing(username_element_); | 708 ->textFieldDidEndEditing(username_element_); |
| 724 CheckTextFieldsState("al", false, std::string(), false); | 709 CheckTextFieldsState("al", false, std::string(), false); |
| 725 username_element_.setValue("alices"); | 710 SimulateUsernameChange("alices", true, true); |
| 726 static_cast<blink::WebAutofillClient*>(autofill_agent_) | 711 static_cast<blink::WebAutofillClient*>(autofill_agent_) |
| 727 ->textFieldDidEndEditing(username_element_); | 712 ->textFieldDidEndEditing(username_element_); |
| 728 CheckTextFieldsState("alices", false, std::string(), false); | 713 CheckTextFieldsState("alices", false, std::string(), false); |
| 729 username_element_.setValue(ASCIIToUTF16(kAliceUsername)); | 714 SimulateUsernameChange(kAliceUsername, true, true); |
| 730 static_cast<blink::WebAutofillClient*>(autofill_agent_) | 715 static_cast<blink::WebAutofillClient*>(autofill_agent_) |
| 731 ->textFieldDidEndEditing(username_element_); | 716 ->textFieldDidEndEditing(username_element_); |
| 732 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); | 717 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); |
| 733 } | 718 } |
| 734 | 719 |
| 735 // Tests that inline autocompletion works properly. | 720 // Tests that inline autocompletion works properly. |
| 736 TEST_F(PasswordAutofillAgentTest, InlineAutocomplete) { | 721 TEST_F(PasswordAutofillAgentTest, InlineAutocomplete) { |
| 737 // Simulate the browser sending back the login info. | 722 // Simulate the browser sending back the login info. |
| 738 SimulateOnFillPasswordForm(fill_data_); | 723 SimulateOnFillPasswordForm(fill_data_); |
| 739 | 724 |
| 740 ClearUsernameAndPasswordFields(); | 725 ClearUsernameAndPasswordFields(); |
| 741 | 726 |
| 742 // Simulate the user typing in the first letter of 'alice', a stored | 727 // Simulate the user typing in the first letter of 'alice', a stored |
| 743 // username. | 728 // username. |
| 744 SimulateUsernameChange("a", true); | 729 SimulateUsernameChange("a", true, true); |
| 745 // Both the username and password text fields should reflect selection of the | 730 // Both the username and password text fields should reflect selection of the |
| 746 // stored login. | 731 // stored login. |
| 747 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); | 732 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); |
| 748 // And the selection should have been set to 'lice', the last 4 letters. | 733 // And the selection should have been set to 'lice', the last 4 letters. |
| 749 CheckUsernameSelection(1, 5); | 734 CheckUsernameSelection(1, 5); |
| 750 | 735 |
| 751 // Now the user types the next letter of the same username, 'l'. | 736 // Now the user types the next letter of the same username, 'l'. |
| 752 SimulateUsernameChange("al", true); | 737 SimulateUserTypingASCIICharacter('l'); |
| 738 ProcessEvents(); |
| 753 // Now the fields should have the same value, but the selection should have a | 739 // Now the fields should have the same value, but the selection should have a |
| 754 // different start value. | 740 // different start value. |
| 755 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); | 741 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); |
| 756 CheckUsernameSelection(2, 5); | 742 CheckUsernameSelection(2, 5); |
| 757 | 743 |
| 758 // Test that deleting does not trigger autocomplete. | 744 // Test that backspace will erase the selection and will stop autocompletion. |
| 759 SimulateKeyDownEvent(username_element_, ui::VKEY_BACK); | 745 SimulateUserTypingKeyCodeWithShift(ui::VKEY_BACK, false); |
| 760 SimulateUsernameChange("alic", true); | 746 ProcessEvents(); |
| 761 CheckTextFieldsState("alic", false, std::string(), false); | 747 CheckTextFieldsState("al", false, std::string(), false); |
| 762 CheckUsernameSelection(4, 4); // No selection. | 748 CheckUsernameSelection(2, 2); // No selection. |
| 763 // Reset the last pressed key to something other than backspace. | |
| 764 SimulateKeyDownEvent(username_element_, ui::VKEY_A); | |
| 765 | 749 |
| 766 // Now lets say the user goes astray from the stored username and types the | 750 // 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 | 751 // 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 | 752 // practice the username should no longer be 'alice' and the selected range |
| 769 // should be empty. | 753 // should be empty. |
| 770 SimulateUsernameChange("alf", true); | 754 SimulateUserTypingASCIICharacter('f'); |
| 755 ProcessEvents(); |
| 771 CheckTextFieldsState("alf", false, std::string(), false); | 756 CheckTextFieldsState("alf", false, std::string(), false); |
| 772 CheckUsernameSelection(3, 3); // No selection. | 757 CheckUsernameSelection(3, 3); // No selection. |
| 773 | 758 |
| 774 // Ok, so now the user removes all the text and enters the letter 'b'. | 759 // Ok, so now the user removes all the text and enters the letter 'b'. |
| 775 SimulateUsernameChange("b", true); | 760 SimulateUsernameChange("b", true, true); |
| 776 // The username and password fields should match the 'bob' entry. | 761 // The username and password fields should match the 'bob' entry. |
| 777 CheckTextFieldsState(kBobUsername, true, kBobPassword, true); | 762 CheckTextFieldsDOMState(kBobUsername, true, kBobPassword, true); |
| 778 CheckUsernameSelection(1, 3); | 763 CheckUsernameSelection(1, 3); |
| 779 | 764 |
| 780 // Then, the user again removes all the text and types an uppercase 'C'. | 765 // Then, the user again removes all the text and types an uppercase 'C'. |
| 781 SimulateUsernameChange("C", true); | 766 SimulateUsernameChange("C", true, true); |
| 782 // The username and password fields should match the 'Carol' entry. | 767 // The username and password fields should match the 'Carol' entry. |
| 783 CheckTextFieldsState(kCarolUsername, true, kCarolPassword, true); | 768 CheckTextFieldsDOMState(kCarolUsername, true, kCarolPassword, true); |
| 784 CheckUsernameSelection(1, 5); | 769 CheckUsernameSelection(1, 5); |
| 770 |
| 785 // The user removes all the text and types a lowercase 'c'. We only | 771 // 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 | 772 // want case-sensitive autocompletion, so the username and the selected range |
| 787 // should be empty. | 773 // should be empty. |
| 788 SimulateUsernameChange("c", true); | 774 SimulateUsernameChange("c", true, true); |
| 789 CheckTextFieldsState("c", false, std::string(), false); | 775 CheckTextFieldsState("c", false, std::string(), false); |
| 790 CheckUsernameSelection(1, 1); | 776 CheckUsernameSelection(1, 1); |
| 791 | 777 |
| 792 // Check that we complete other_possible_usernames as well. | 778 // Check that we complete other_possible_usernames as well. |
| 793 SimulateUsernameChange("R", true); | 779 SimulateUsernameChange("R", true, true); |
| 794 CheckTextFieldsState(kCarolAlternateUsername, true, kCarolPassword, true); | 780 CheckTextFieldsDOMState(kCarolAlternateUsername, true, kCarolPassword, true); |
| 795 CheckUsernameSelection(1, 17); | 781 CheckUsernameSelection(1, 17); |
| 796 } | 782 } |
| 797 | 783 |
| 798 TEST_F(PasswordAutofillAgentTest, IsWebNodeVisibleTest) { | 784 TEST_F(PasswordAutofillAgentTest, IsWebNodeVisibleTest) { |
| 799 blink::WebVector<blink::WebFormElement> forms1, forms2, forms3; | 785 blink::WebVector<blink::WebFormElement> forms1, forms2, forms3; |
| 800 blink::WebFrame* frame; | 786 blink::WebFrame* frame; |
| 801 | 787 |
| 802 LoadHTML(kVisibleFormWithNoUsernameHTML); | 788 LoadHTML(kVisibleFormWithNoUsernameHTML); |
| 803 frame = GetMainFrame(); | 789 frame = GetMainFrame(); |
| 804 frame->document().forms(forms1); | 790 frame->document().forms(forms1); |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 913 | 899 |
| 914 WebInputElement username_input = username_element.to<WebInputElement>(); | 900 WebInputElement username_input = username_element.to<WebInputElement>(); |
| 915 WebInputElement password_input = password_element.to<WebInputElement>(); | 901 WebInputElement password_input = password_element.to<WebInputElement>(); |
| 916 ASSERT_FALSE(username_element.isNull()); | 902 ASSERT_FALSE(username_element.isNull()); |
| 917 | 903 |
| 918 CheckTextFieldsStateForElements( | 904 CheckTextFieldsStateForElements( |
| 919 username_input, "", false, password_input, "", false, false); | 905 username_input, "", false, password_input, "", false, false); |
| 920 | 906 |
| 921 // Simulate the user typing in the username in the iframe which should cause | 907 // Simulate the user typing in the username in the iframe which should cause |
| 922 // an autofill. | 908 // an autofill. |
| 909 content::RenderFrame::FromWebFrame(iframe) |
| 910 ->OnMessageReceived(AutofillMsg_FirstUserGestureObservedInTab(0)); |
| 923 SimulateInputChangeForElement( | 911 SimulateInputChangeForElement( |
| 924 kAliceUsername, true, iframe, username_input, true); | 912 kAliceUsername, true, iframe, username_input, true); |
| 925 | 913 |
| 926 CheckTextFieldsStateForElements(username_input, | 914 CheckTextFieldsStateForElements(username_input, |
| 927 kAliceUsername, | 915 kAliceUsername, |
| 928 true, | 916 true, |
| 929 password_input, | 917 password_input, |
| 930 kAlicePassword, | 918 kAlicePassword, |
| 931 true, | 919 true, |
| 932 false); | 920 false); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1022 fill_data_.wait_for_username = true; | 1010 fill_data_.wait_for_username = true; |
| 1023 SimulateOnFillPasswordForm(fill_data_); | 1011 SimulateOnFillPasswordForm(fill_data_); |
| 1024 | 1012 |
| 1025 // The username and password should not yet have been autocompleted. | 1013 // The username and password should not yet have been autocompleted. |
| 1026 CheckTextFieldsState(std::string(), false, std::string(), false); | 1014 CheckTextFieldsState(std::string(), false, std::string(), false); |
| 1027 | 1015 |
| 1028 // Simulate a click just to force a user gesture, since the username value is | 1016 // Simulate a click just to force a user gesture, since the username value is |
| 1029 // set directly. | 1017 // set directly. |
| 1030 SimulateElementClick(kUsernameName); | 1018 SimulateElementClick(kUsernameName); |
| 1031 | 1019 |
| 1032 // Simulate the user entering her username and selecting the matching autofill | 1020 // Simulate the user entering the first letter of her username and selecting |
| 1033 // from the dropdown. | 1021 // the matching autofill from the dropdown. |
| 1034 SimulateUsernameChange(kAliceUsername, true, true); | 1022 SimulateUsernameChange("a", true, true); |
| 1035 SimulateSuggestionChoice(username_element_); | 1023 SimulateSuggestionChoice(username_element_); |
| 1036 | 1024 |
| 1037 // The username and password should now have been autocompleted. | 1025 // The username and password should now have been autocompleted. |
| 1038 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); | 1026 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); |
| 1039 | 1027 |
| 1040 // JavaScript onChange events should have been triggered both for the username | 1028 // JavaScript onChange events should have been triggered both for the username |
| 1041 // and for the password. | 1029 // and for the password. |
| 1042 int username_onchange_called = -1; | 1030 int username_onchange_called = -1; |
| 1043 int password_onchange_called = -1; | 1031 int password_onchange_called = -1; |
| 1044 ASSERT_TRUE( | 1032 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 | 1270 // Tests that |ClearPreview| properly restores the original selection range of |
| 1283 // username field that has initially been filled by inline autocomplete. | 1271 // username field that has initially been filled by inline autocomplete. |
| 1284 TEST_F(PasswordAutofillAgentTest, ClearPreviewWithInlineAutocompletedUsername) { | 1272 TEST_F(PasswordAutofillAgentTest, ClearPreviewWithInlineAutocompletedUsername) { |
| 1285 // Simulate the browser sending back the login info. | 1273 // Simulate the browser sending back the login info. |
| 1286 SimulateOnFillPasswordForm(fill_data_); | 1274 SimulateOnFillPasswordForm(fill_data_); |
| 1287 | 1275 |
| 1288 // Clear the text fields to start fresh. | 1276 // Clear the text fields to start fresh. |
| 1289 ClearUsernameAndPasswordFields(); | 1277 ClearUsernameAndPasswordFields(); |
| 1290 | 1278 |
| 1291 // Simulate the user typing in the first letter of 'alice', a stored username. | 1279 // Simulate the user typing in the first letter of 'alice', a stored username. |
| 1292 SimulateUsernameChange("a", true); | 1280 SimulateUsernameChange("a", true, true); |
| 1293 // Both the username and password text fields should reflect selection of the | 1281 // Both the username and password text fields should reflect selection of the |
| 1294 // stored login. | 1282 // stored login. |
| 1295 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); | 1283 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); |
| 1296 // The selection should have been set to 'lice', the last 4 letters. | 1284 // The selection should have been set to 'lice', the last 4 letters. |
| 1297 CheckUsernameSelection(1, 5); | 1285 CheckUsernameSelection(1, 5); |
| 1298 | 1286 |
| 1299 EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion( | 1287 EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion( |
| 1300 username_element_, "alicia", "secret")); | 1288 username_element_, "alicia", "secret")); |
| 1301 EXPECT_EQ( | 1289 EXPECT_EQ( |
| 1302 "alicia", | 1290 "alicia", |
| 1303 static_cast<std::string>(username_element_.suggestedValue().utf8())); | 1291 static_cast<std::string>(username_element_.suggestedValue().utf8())); |
| 1304 EXPECT_TRUE(username_element_.isAutofilled()); | 1292 EXPECT_TRUE(username_element_.isAutofilled()); |
| 1305 EXPECT_EQ( | 1293 EXPECT_EQ( |
| 1306 "secret", | 1294 "secret", |
| 1307 static_cast<std::string>(password_element_.suggestedValue().utf8())); | 1295 static_cast<std::string>(password_element_.suggestedValue().utf8())); |
| 1308 EXPECT_TRUE(password_element_.isAutofilled()); | 1296 EXPECT_TRUE(password_element_.isAutofilled()); |
| 1309 CheckUsernameSelection(1, 6); | 1297 CheckUsernameSelection(1, 6); |
| 1310 | 1298 |
| 1311 EXPECT_TRUE( | 1299 EXPECT_TRUE( |
| 1312 password_autofill_agent_->DidClearAutofillSelection(username_element_)); | 1300 password_autofill_agent_->DidClearAutofillSelection(username_element_)); |
| 1313 | 1301 |
| 1314 EXPECT_EQ(kAliceUsername, username_element_.value().utf8()); | 1302 EXPECT_EQ(kAliceUsername, username_element_.value().utf8()); |
| 1315 EXPECT_TRUE(username_element_.suggestedValue().isEmpty()); | 1303 EXPECT_TRUE(username_element_.suggestedValue().isEmpty()); |
| 1316 EXPECT_TRUE(username_element_.isAutofilled()); | 1304 EXPECT_TRUE(username_element_.isAutofilled()); |
| 1317 EXPECT_TRUE(password_element_.value().isEmpty()); | 1305 EXPECT_EQ(kAlicePassword, password_element_.value().utf8()); |
| 1318 EXPECT_TRUE(password_element_.suggestedValue().isEmpty()); | 1306 EXPECT_TRUE(password_element_.suggestedValue().isEmpty()); |
| 1319 EXPECT_TRUE(password_element_.isAutofilled()); | 1307 EXPECT_TRUE(password_element_.isAutofilled()); |
| 1320 CheckUsernameSelection(1, 5); | 1308 CheckUsernameSelection(1, 5); |
| 1321 } | 1309 } |
| 1322 | 1310 |
| 1323 // Tests that logging is off by default. | 1311 // Tests that logging is off by default. |
| 1324 TEST_F(PasswordAutofillAgentTest, OnChangeLoggingState_NoMessage) { | 1312 TEST_F(PasswordAutofillAgentTest, OnChangeLoggingState_NoMessage) { |
| 1325 render_thread_->sink().ClearMessages(); | 1313 render_thread_->sink().ClearMessages(); |
| 1326 SendVisiblePasswordForms(); | 1314 SendVisiblePasswordForms(); |
| 1327 const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching( | 1315 const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching( |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1412 CheckSuggestions(std::string(), false); | 1400 CheckSuggestions(std::string(), false); |
| 1413 | 1401 |
| 1414 // Now simulate a user typing in an unrecognized username and then | 1402 // Now simulate a user typing in an unrecognized username and then |
| 1415 // clicking on the username element. This should also produce a message with | 1403 // clicking on the username element. This should also produce a message with |
| 1416 // all the usernames. | 1404 // all the usernames. |
| 1417 SimulateUsernameChange("baz", true); | 1405 SimulateUsernameChange("baz", true); |
| 1418 render_thread_->sink().ClearMessages(); | 1406 render_thread_->sink().ClearMessages(); |
| 1419 static_cast<PageClickListener*>(autofill_agent_) | 1407 static_cast<PageClickListener*>(autofill_agent_) |
| 1420 ->FormControlElementClicked(username_element_, true); | 1408 ->FormControlElementClicked(username_element_, true); |
| 1421 CheckSuggestions("baz", true); | 1409 CheckSuggestions("baz", true); |
| 1410 ClearUsernameAndPasswordFields(); |
| 1422 | 1411 |
| 1423 // Now simulate a user typing in the first letter of the username and then | 1412 // 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 | 1413 // 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 | 1414 // inline autocomplete, clicking on the element should still produce a full |
| 1426 // suggestion list. | 1415 // suggestion list. |
| 1427 SimulateUsernameChange("a", true); | 1416 SimulateUsernameChange("a", true, true); |
| 1428 render_thread_->sink().ClearMessages(); | 1417 render_thread_->sink().ClearMessages(); |
| 1429 static_cast<PageClickListener*>(autofill_agent_) | 1418 static_cast<PageClickListener*>(autofill_agent_) |
| 1430 ->FormControlElementClicked(username_element_, true); | 1419 ->FormControlElementClicked(username_element_, true); |
| 1431 CheckSuggestions(kAliceUsername, true); | 1420 CheckSuggestions(kAliceUsername, true); |
| 1432 } | 1421 } |
| 1433 | 1422 |
| 1434 // Tests that there are no autosuggestions from the password manager when the | 1423 // 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 | 1424 // user clicks on the password field and the username field is editable when |
| 1436 // FillOnAccountSelect is enabled. | 1425 // FillOnAccountSelect is enabled. |
| 1437 TEST_F(PasswordAutofillAgentTest, | 1426 TEST_F(PasswordAutofillAgentTest, |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1637 ClearUsernameAndPasswordFields(); | 1626 ClearUsernameAndPasswordFields(); |
| 1638 | 1627 |
| 1639 // The user enters a password | 1628 // The user enters a password |
| 1640 SimulateInputChangeForElement("someOtherPassword", | 1629 SimulateInputChangeForElement("someOtherPassword", |
| 1641 /*move_caret_to_end=*/true, | 1630 /*move_caret_to_end=*/true, |
| 1642 GetMainFrame(), | 1631 GetMainFrame(), |
| 1643 password_element_, | 1632 password_element_, |
| 1644 /*is_user_input=*/true); | 1633 /*is_user_input=*/true); |
| 1645 | 1634 |
| 1646 // Simulate the user typing a stored username. | 1635 // Simulate the user typing a stored username. |
| 1647 SimulateUsernameChange(kAliceUsername, true); | 1636 SimulateUsernameChange(kAliceUsername, true, true); |
| 1648 // The autofileld password should replace the typed one. | 1637 // The autofileld password should replace the typed one. |
| 1649 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); | 1638 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); |
| 1650 } | 1639 } |
| 1651 | 1640 |
| 1652 // The user types in a username and a password, but then just before sending | 1641 // 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 | 1642 // the form off, a script changes them. This test checks that |
| 1654 // PasswordAutofillAgent can still remember the username and the password | 1643 // PasswordAutofillAgent can still remember the username and the password |
| 1655 // typed by the user. | 1644 // typed by the user. |
| 1656 TEST_F(PasswordAutofillAgentTest, | 1645 TEST_F(PasswordAutofillAgentTest, |
| 1657 RememberLastTypedUsernameAndPasswordOnSubmit_ScriptChanged) { | 1646 RememberLastTypedUsernameAndPasswordOnSubmit_ScriptChanged) { |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1923 ->WillSendSubmitEvent(username_element_.form()); | 1912 ->WillSendSubmitEvent(username_element_.form()); |
| 1924 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) | 1913 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) |
| 1925 ->WillSubmitForm(username_element_.form()); | 1914 ->WillSubmitForm(username_element_.form()); |
| 1926 | 1915 |
| 1927 // Observe that the PasswordAutofillAgent identifies the first field as | 1916 // Observe that the PasswordAutofillAgent identifies the first field as |
| 1928 // username. | 1917 // username. |
| 1929 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", ""); | 1918 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", ""); |
| 1930 } | 1919 } |
| 1931 | 1920 |
| 1932 } // namespace autofill | 1921 } // namespace autofill |
| OLD | NEW |