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

Side by Side Diff: chrome/renderer/autofill/password_autofill_agent_browsertest.cc

Issue 1026493002: Allow only a user gesture to trigger autofill popup (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Do not layout frame. Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "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
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
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', true);
753 // Now the fields should have the same value, but the selection should have a 705 // Now the fields should have the same value, but the selection should have a
754 // different start value. 706 // different start value.
755 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); 707 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
756 CheckUsernameSelection(2, 5); 708 CheckUsernameSelection(2, 5);
757 709
758 // Test that deleting does not trigger autocomplete. 710 // Test that backspace will erase the selection and will stop autocompletion.
759 SimulateKeyDownEvent(username_element_, ui::VKEY_BACK); 711 SimulateUserTypingASCIICharacter(ui::VKEY_BACK, true);
760 SimulateUsernameChange("alic", true); 712 CheckTextFieldsState("al", false, std::string(), false);
761 CheckTextFieldsState("alic", false, std::string(), false); 713 CheckUsernameSelection(2, 2); // No selection.
762 CheckUsernameSelection(4, 4); // No selection.
763 // Reset the last pressed key to something other than backspace.
764 SimulateKeyDownEvent(username_element_, ui::VKEY_A);
765 714
766 // Now lets say the user goes astray from the stored username and types the 715 // 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 716 // 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 717 // practice the username should no longer be 'alice' and the selected range
769 // should be empty. 718 // should be empty.
770 SimulateUsernameChange("alf", true); 719 SimulateUserTypingASCIICharacter('f', true);
771 CheckTextFieldsState("alf", false, std::string(), false); 720 CheckTextFieldsState("alf", false, std::string(), false);
772 CheckUsernameSelection(3, 3); // No selection. 721 CheckUsernameSelection(3, 3); // No selection.
773 722
774 // Ok, so now the user removes all the text and enters the letter 'b'. 723 // Ok, so now the user removes all the text and enters the letter 'b'.
775 SimulateUsernameChange("b", true); 724 SimulateUsernameChange("b");
776 // The username and password fields should match the 'bob' entry. 725 // The username and password fields should match the 'bob' entry.
777 CheckTextFieldsState(kBobUsername, true, kBobPassword, true); 726 CheckTextFieldsDOMState(kBobUsername, true, kBobPassword, true);
778 CheckUsernameSelection(1, 3); 727 CheckUsernameSelection(1, 3);
779 728
780 // Then, the user again removes all the text and types an uppercase 'C'. 729 // Then, the user again removes all the text and types an uppercase 'C'.
781 SimulateUsernameChange("C", true); 730 SimulateUsernameChange("C");
782 // The username and password fields should match the 'Carol' entry. 731 // The username and password fields should match the 'Carol' entry.
783 CheckTextFieldsState(kCarolUsername, true, kCarolPassword, true); 732 CheckTextFieldsDOMState(kCarolUsername, true, kCarolPassword, true);
784 CheckUsernameSelection(1, 5); 733 CheckUsernameSelection(1, 5);
734
785 // The user removes all the text and types a lowercase 'c'. We only 735 // 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 736 // want case-sensitive autocompletion, so the username and the selected range
787 // should be empty. 737 // should be empty.
788 SimulateUsernameChange("c", true); 738 SimulateUsernameChange("c");
789 CheckTextFieldsState("c", false, std::string(), false); 739 CheckTextFieldsState("c", false, std::string(), false);
790 CheckUsernameSelection(1, 1); 740 CheckUsernameSelection(1, 1);
791 741
792 // Check that we complete other_possible_usernames as well. 742 // Check that we complete other_possible_usernames as well.
793 SimulateUsernameChange("R", true); 743 SimulateUsernameChange("R");
794 CheckTextFieldsState(kCarolAlternateUsername, true, kCarolPassword, true); 744 CheckTextFieldsDOMState(kCarolAlternateUsername, true, kCarolPassword, true);
795 CheckUsernameSelection(1, 17); 745 CheckUsernameSelection(1, 17);
796 } 746 }
797 747
798 TEST_F(PasswordAutofillAgentTest, IsWebNodeVisibleTest) { 748 TEST_F(PasswordAutofillAgentTest, IsWebNodeVisibleTest) {
799 blink::WebVector<blink::WebFormElement> forms1, forms2, forms3; 749 blink::WebVector<blink::WebFormElement> forms1, forms2, forms3;
800 blink::WebFrame* frame; 750 blink::WebFrame* frame;
801 751
802 LoadHTML(kVisibleFormWithNoUsernameHTML); 752 LoadHTML(kVisibleFormWithNoUsernameHTML);
803 frame = GetMainFrame(); 753 frame = GetMainFrame();
804 frame->document().forms(forms1); 754 frame->document().forms(forms1);
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
913 863
914 WebInputElement username_input = username_element.to<WebInputElement>(); 864 WebInputElement username_input = username_element.to<WebInputElement>();
915 WebInputElement password_input = password_element.to<WebInputElement>(); 865 WebInputElement password_input = password_element.to<WebInputElement>();
916 ASSERT_FALSE(username_element.isNull()); 866 ASSERT_FALSE(username_element.isNull());
917 867
918 CheckTextFieldsStateForElements( 868 CheckTextFieldsStateForElements(
919 username_input, "", false, password_input, "", false, false); 869 username_input, "", false, password_input, "", false, false);
920 870
921 // Simulate the user typing in the username in the iframe which should cause 871 // Simulate the user typing in the username in the iframe which should cause
922 // an autofill. 872 // an autofill.
923 SimulateInputChangeForElement( 873 content::RenderFrame::FromWebFrame(iframe)
924 kAliceUsername, true, iframe, username_input, true); 874 ->OnMessageReceived(AutofillMsg_FirstUserGestureObservedInTab(0));
875 SimulateUserInputChangeForElement(&username_input, kAliceUsername);
925 876
926 CheckTextFieldsStateForElements(username_input, 877 CheckTextFieldsStateForElements(username_input,
927 kAliceUsername, 878 kAliceUsername,
928 true, 879 true,
929 password_input, 880 password_input,
930 kAlicePassword, 881 kAlicePassword,
931 true, 882 true,
932 false); 883 false);
933 } 884 }
934 885
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1022 fill_data_.wait_for_username = true; 973 fill_data_.wait_for_username = true;
1023 SimulateOnFillPasswordForm(fill_data_); 974 SimulateOnFillPasswordForm(fill_data_);
1024 975
1025 // The username and password should not yet have been autocompleted. 976 // The username and password should not yet have been autocompleted.
1026 CheckTextFieldsState(std::string(), false, std::string(), false); 977 CheckTextFieldsState(std::string(), false, std::string(), false);
1027 978
1028 // Simulate a click just to force a user gesture, since the username value is 979 // Simulate a click just to force a user gesture, since the username value is
1029 // set directly. 980 // set directly.
1030 SimulateElementClick(kUsernameName); 981 SimulateElementClick(kUsernameName);
1031 982
1032 // Simulate the user entering her username and selecting the matching autofill 983 // Simulate the user entering the first letter of her username and selecting
1033 // from the dropdown. 984 // the matching autofill from the dropdown.
1034 SimulateUsernameChange(kAliceUsername, true, true); 985 SimulateUsernameChange("a");
1035 SimulateSuggestionChoice(username_element_); 986 SimulateSuggestionChoice(username_element_);
1036 987
1037 // The username and password should now have been autocompleted. 988 // The username and password should now have been autocompleted.
1038 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); 989 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
1039 990
1040 // JavaScript onChange events should have been triggered both for the username 991 // JavaScript onChange events should have been triggered both for the username
1041 // and for the password. 992 // and for the password.
1042 int username_onchange_called = -1; 993 int username_onchange_called = -1;
1043 int password_onchange_called = -1; 994 int password_onchange_called = -1;
1044 ASSERT_TRUE( 995 ASSERT_TRUE(
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
1282 // Tests that |ClearPreview| properly restores the original selection range of 1233 // Tests that |ClearPreview| properly restores the original selection range of
1283 // username field that has initially been filled by inline autocomplete. 1234 // username field that has initially been filled by inline autocomplete.
1284 TEST_F(PasswordAutofillAgentTest, ClearPreviewWithInlineAutocompletedUsername) { 1235 TEST_F(PasswordAutofillAgentTest, ClearPreviewWithInlineAutocompletedUsername) {
1285 // Simulate the browser sending back the login info. 1236 // Simulate the browser sending back the login info.
1286 SimulateOnFillPasswordForm(fill_data_); 1237 SimulateOnFillPasswordForm(fill_data_);
1287 1238
1288 // Clear the text fields to start fresh. 1239 // Clear the text fields to start fresh.
1289 ClearUsernameAndPasswordFields(); 1240 ClearUsernameAndPasswordFields();
1290 1241
1291 // Simulate the user typing in the first letter of 'alice', a stored username. 1242 // Simulate the user typing in the first letter of 'alice', a stored username.
1292 SimulateUsernameChange("a", true); 1243 SimulateUsernameChange("a");
1293 // Both the username and password text fields should reflect selection of the 1244 // Both the username and password text fields should reflect selection of the
1294 // stored login. 1245 // stored login.
1295 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); 1246 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
1296 // The selection should have been set to 'lice', the last 4 letters. 1247 // The selection should have been set to 'lice', the last 4 letters.
1297 CheckUsernameSelection(1, 5); 1248 CheckUsernameSelection(1, 5);
1298 1249
1299 EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion( 1250 EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion(
1300 username_element_, "alicia", "secret")); 1251 username_element_, "alicia", "secret"));
1301 EXPECT_EQ( 1252 EXPECT_EQ(
1302 "alicia", 1253 "alicia",
1303 static_cast<std::string>(username_element_.suggestedValue().utf8())); 1254 static_cast<std::string>(username_element_.suggestedValue().utf8()));
1304 EXPECT_TRUE(username_element_.isAutofilled()); 1255 EXPECT_TRUE(username_element_.isAutofilled());
1305 EXPECT_EQ( 1256 EXPECT_EQ(
1306 "secret", 1257 "secret",
1307 static_cast<std::string>(password_element_.suggestedValue().utf8())); 1258 static_cast<std::string>(password_element_.suggestedValue().utf8()));
1308 EXPECT_TRUE(password_element_.isAutofilled()); 1259 EXPECT_TRUE(password_element_.isAutofilled());
1309 CheckUsernameSelection(1, 6); 1260 CheckUsernameSelection(1, 6);
1310 1261
1311 EXPECT_TRUE( 1262 EXPECT_TRUE(
1312 password_autofill_agent_->DidClearAutofillSelection(username_element_)); 1263 password_autofill_agent_->DidClearAutofillSelection(username_element_));
1313 1264
1314 EXPECT_EQ(kAliceUsername, username_element_.value().utf8()); 1265 EXPECT_EQ(kAliceUsername, username_element_.value().utf8());
1315 EXPECT_TRUE(username_element_.suggestedValue().isEmpty()); 1266 EXPECT_TRUE(username_element_.suggestedValue().isEmpty());
1316 EXPECT_TRUE(username_element_.isAutofilled()); 1267 EXPECT_TRUE(username_element_.isAutofilled());
1317 EXPECT_TRUE(password_element_.value().isEmpty()); 1268 EXPECT_EQ(kAlicePassword, password_element_.value().utf8());
1318 EXPECT_TRUE(password_element_.suggestedValue().isEmpty()); 1269 EXPECT_TRUE(password_element_.suggestedValue().isEmpty());
1319 EXPECT_TRUE(password_element_.isAutofilled()); 1270 EXPECT_TRUE(password_element_.isAutofilled());
1320 CheckUsernameSelection(1, 5); 1271 CheckUsernameSelection(1, 5);
1321 } 1272 }
1322 1273
1323 // Tests that logging is off by default. 1274 // Tests that logging is off by default.
1324 TEST_F(PasswordAutofillAgentTest, OnChangeLoggingState_NoMessage) { 1275 TEST_F(PasswordAutofillAgentTest, OnChangeLoggingState_NoMessage) {
1325 render_thread_->sink().ClearMessages(); 1276 render_thread_->sink().ClearMessages();
1326 SendVisiblePasswordForms(); 1277 SendVisiblePasswordForms();
1327 const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching( 1278 const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching(
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1407 // Simulate a user clicking on the username element. This should produce a 1358 // Simulate a user clicking on the username element. This should produce a
1408 // message with all the usernames. 1359 // message with all the usernames.
1409 render_thread_->sink().ClearMessages(); 1360 render_thread_->sink().ClearMessages();
1410 static_cast<PageClickListener*>(autofill_agent_) 1361 static_cast<PageClickListener*>(autofill_agent_)
1411 ->FormControlElementClicked(username_element_, false); 1362 ->FormControlElementClicked(username_element_, false);
1412 CheckSuggestions(std::string(), false); 1363 CheckSuggestions(std::string(), false);
1413 1364
1414 // Now simulate a user typing in an unrecognized username and then 1365 // Now simulate a user typing in an unrecognized username and then
1415 // clicking on the username element. This should also produce a message with 1366 // clicking on the username element. This should also produce a message with
1416 // all the usernames. 1367 // all the usernames.
1417 SimulateUsernameChange("baz", true); 1368 SimulateUsernameChange("baz");
1418 render_thread_->sink().ClearMessages(); 1369 render_thread_->sink().ClearMessages();
1419 static_cast<PageClickListener*>(autofill_agent_) 1370 static_cast<PageClickListener*>(autofill_agent_)
1420 ->FormControlElementClicked(username_element_, true); 1371 ->FormControlElementClicked(username_element_, true);
1421 CheckSuggestions("baz", true); 1372 CheckSuggestions("baz", true);
1373 ClearUsernameAndPasswordFields();
1422 1374
1423 // Now simulate a user typing in the first letter of the username and then 1375 // 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 1376 // 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 1377 // inline autocomplete, clicking on the element should still produce a full
1426 // suggestion list. 1378 // suggestion list.
1427 SimulateUsernameChange("a", true); 1379 SimulateUsernameChange("a");
1428 render_thread_->sink().ClearMessages(); 1380 render_thread_->sink().ClearMessages();
1429 static_cast<PageClickListener*>(autofill_agent_) 1381 static_cast<PageClickListener*>(autofill_agent_)
1430 ->FormControlElementClicked(username_element_, true); 1382 ->FormControlElementClicked(username_element_, true);
1431 CheckSuggestions(kAliceUsername, true); 1383 CheckSuggestions(kAliceUsername, true);
1432 } 1384 }
1433 1385
1434 // Tests that there are no autosuggestions from the password manager when the 1386 // 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 1387 // user clicks on the password field and the username field is editable when
1436 // FillOnAccountSelect is enabled. 1388 // FillOnAccountSelect is enabled.
1437 TEST_F(PasswordAutofillAgentTest, 1389 TEST_F(PasswordAutofillAgentTest,
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1513 EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching( 1465 EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching(
1514 AutofillHostMsg_ShowPasswordSuggestions::ID)); 1466 AutofillHostMsg_ShowPasswordSuggestions::ID));
1515 } 1467 }
1516 1468
1517 // The user types in a username and a password, but then just before sending 1469 // 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 1470 // the form off, a script clears them. This test checks that
1519 // PasswordAutofillAgent can still remember the username and the password 1471 // PasswordAutofillAgent can still remember the username and the password
1520 // typed by the user. 1472 // typed by the user.
1521 TEST_F(PasswordAutofillAgentTest, 1473 TEST_F(PasswordAutofillAgentTest,
1522 RememberLastNonEmptyUsernameAndPasswordOnSubmit_ScriptCleared) { 1474 RememberLastNonEmptyUsernameAndPasswordOnSubmit_ScriptCleared) {
1523 SimulateInputChangeForElement( 1475 SimulateUsernameChange("temp");
1524 "temp", true, GetMainFrame(), username_element_, true); 1476 SimulatePasswordChange("random");
1525 SimulateInputChangeForElement(
1526 "random", true, GetMainFrame(), password_element_, true);
1527 1477
1528 // Simulate that the username and the password value was cleared by the 1478 // Simulate that the username and the password value was cleared by the
1529 // site's JavaScript before submit. 1479 // site's JavaScript before submit.
1530 username_element_.setValue(WebString()); 1480 username_element_.setValue(WebString());
1531 password_element_.setValue(WebString()); 1481 password_element_.setValue(WebString());
1532 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) 1482 static_cast<content::RenderFrameObserver*>(password_autofill_agent_)
1533 ->WillSubmitForm(username_element_.form()); 1483 ->WillSubmitForm(username_element_.form());
1534 1484
1535 // Observe that the PasswordAutofillAgent still remembered the last non-empty 1485 // Observe that the PasswordAutofillAgent still remembered the last non-empty
1536 // username and password and sent that to the browser. 1486 // username and password and sent that to the browser.
1537 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", ""); 1487 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", "");
1538 } 1488 }
1539 1489
1540 // Similar to RememberLastNonEmptyPasswordOnSubmit_ScriptCleared, but this time 1490 // Similar to RememberLastNonEmptyPasswordOnSubmit_ScriptCleared, but this time
1541 // it's the user who clears the username and the password. This test checks 1491 // 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 1492 // that in that case, the last non-empty username and password are not
1543 // remembered. 1493 // remembered.
1544 TEST_F(PasswordAutofillAgentTest, 1494 TEST_F(PasswordAutofillAgentTest,
1545 RememberLastNonEmptyUsernameAndPasswordOnSubmit_UserCleared) { 1495 RememberLastNonEmptyUsernameAndPasswordOnSubmit_UserCleared) {
1546 SimulateInputChangeForElement( 1496 SimulateUsernameChange("temp");
1547 "temp", true, GetMainFrame(), username_element_, true); 1497 SimulatePasswordChange("random");
1548 SimulateInputChangeForElement(
1549 "random", true, GetMainFrame(), password_element_, true);
1550 1498
1551 // Simulate that the user actually cleared the username and password again. 1499 // Simulate that the user actually cleared the username and password again.
1552 SimulateInputChangeForElement("", true, GetMainFrame(), username_element_, 1500 SimulateUsernameChange("");
1553 true); 1501 SimulatePasswordChange("");
1554 SimulateInputChangeForElement(
1555 "", true, GetMainFrame(), password_element_, true);
1556 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) 1502 static_cast<content::RenderFrameObserver*>(password_autofill_agent_)
1557 ->WillSubmitForm(username_element_.form()); 1503 ->WillSubmitForm(username_element_.form());
1558 1504
1559 // Observe that the PasswordAutofillAgent respects the user having cleared the 1505 // Observe that the PasswordAutofillAgent respects the user having cleared the
1560 // password. 1506 // password.
1561 ExpectFormSubmittedWithUsernameAndPasswords("", "", ""); 1507 ExpectFormSubmittedWithUsernameAndPasswords("", "", "");
1562 } 1508 }
1563 1509
1564 // Similar to RememberLastNonEmptyPasswordOnSubmit_ScriptCleared, but uses the 1510 // Similar to RememberLastNonEmptyPasswordOnSubmit_ScriptCleared, but uses the
1565 // new password instead of the current password. 1511 // new password instead of the current password.
1566 TEST_F(PasswordAutofillAgentTest, 1512 TEST_F(PasswordAutofillAgentTest,
1567 RememberLastNonEmptyUsernameAndPasswordOnSubmit_New) { 1513 RememberLastNonEmptyUsernameAndPasswordOnSubmit_New) {
1568 const char kNewPasswordFormHTML[] = 1514 const char kNewPasswordFormHTML[] =
1569 "<FORM name='LoginTestForm'>" 1515 "<FORM name='LoginTestForm'>"
1570 " <INPUT type='text' id='username' autocomplete='username'/>" 1516 " <INPUT type='text' id='username' autocomplete='username'/>"
1571 " <INPUT type='password' id='password' autocomplete='new-password'/>" 1517 " <INPUT type='password' id='password' autocomplete='new-password'/>"
1572 " <INPUT type='submit' value='Login'/>" 1518 " <INPUT type='submit' value='Login'/>"
1573 "</FORM>"; 1519 "</FORM>";
1574 LoadHTML(kNewPasswordFormHTML); 1520 LoadHTML(kNewPasswordFormHTML);
1575 UpdateUsernameAndPasswordElements(); 1521 UpdateUsernameAndPasswordElements();
1576 1522
1577 SimulateInputChangeForElement( 1523 SimulateUsernameChange("temp");
1578 "temp", true, GetMainFrame(), username_element_, true); 1524 SimulatePasswordChange("random");
1579 SimulateInputChangeForElement(
1580 "random", true, GetMainFrame(), password_element_, true);
1581 1525
1582 // Simulate that the username and the password value was cleared by 1526 // Simulate that the username and the password value was cleared by
1583 // the site's JavaScript before submit. 1527 // the site's JavaScript before submit.
1584 username_element_.setValue(WebString()); 1528 username_element_.setValue(WebString());
1585 password_element_.setValue(WebString()); 1529 password_element_.setValue(WebString());
1586 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) 1530 static_cast<content::RenderFrameObserver*>(password_autofill_agent_)
1587 ->WillSubmitForm(username_element_.form()); 1531 ->WillSubmitForm(username_element_.form());
1588 1532
1589 // Observe that the PasswordAutofillAgent still remembered the last non-empty 1533 // Observe that the PasswordAutofillAgent still remembered the last non-empty
1590 // password and sent that to the browser. 1534 // password and sent that to the browser.
1591 ExpectFormSubmittedWithUsernameAndPasswords("temp", "", "random"); 1535 ExpectFormSubmittedWithUsernameAndPasswords("temp", "", "random");
1592 } 1536 }
1593 1537
1594 // The user first accepts a suggestion, but then overwrites the password. This 1538 // 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 1539 // test checks that the overwritten password is not reverted back if the user
1596 // triggers autofill through focusing (but not changing) the username again. 1540 // triggers autofill through focusing (but not changing) the username again.
1597 TEST_F(PasswordAutofillAgentTest, 1541 TEST_F(PasswordAutofillAgentTest,
1598 NoopEditingDoesNotOverwriteManuallyEditedPassword) { 1542 NoopEditingDoesNotOverwriteManuallyEditedPassword) {
1599 // Simulate having credentials which needed to wait until the user starts 1543 // 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 1544 // 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. 1545 // the ones which can be filled as a result of TextFieldDidEndEditing.
1602 fill_data_.wait_for_username = true; 1546 fill_data_.wait_for_username = true;
1603 SimulateOnFillPasswordForm(fill_data_); 1547 SimulateOnFillPasswordForm(fill_data_);
1604 // Simulate that the user typed her name to make the autofill work. 1548 // Simulate that the user typed her name to make the autofill work.
1605 SimulateInputChangeForElement(kAliceUsername, 1549 SimulateUsernameChange(kAliceUsername);
1606 /*move_caret_to_end=*/true,
1607 GetMainFrame(),
1608 username_element_,
1609 /*is_user_input=*/true);
1610 SimulateDidEndEditing(GetMainFrame(), username_element_); 1550 SimulateDidEndEditing(GetMainFrame(), username_element_);
1611 const std::string old_username(username_element_.value().utf8()); 1551 const std::string old_username(username_element_.value().utf8());
1612 const std::string old_password(password_element_.value().utf8()); 1552 const std::string old_password(password_element_.value().utf8());
1613 const std::string new_password(old_password + "modify"); 1553 const std::string new_password(old_password + "modify");
1614 1554
1615 // The user changes the password. 1555 // The user changes the password.
1616 SimulateInputChangeForElement(new_password, 1556 SimulatePasswordChange(new_password);
1617 /*move_caret_to_end=*/true,
1618 GetMainFrame(),
1619 password_element_,
1620 /*is_user_input=*/true);
1621 1557
1622 // The user switches back into the username field, but leaves that without 1558 // The user switches back into the username field, but leaves that without
1623 // changes. 1559 // changes.
1624 SimulateDidEndEditing(GetMainFrame(), username_element_); 1560 SimulateDidEndEditing(GetMainFrame(), username_element_);
1625 1561
1626 // The password should have stayed as the user changed it. 1562 // The password should have stayed as the user changed it.
1627 CheckTextFieldsDOMState(old_username, true, new_password, false); 1563 CheckTextFieldsDOMState(old_username, true, new_password, false);
1628 // The password should not have a suggested value. 1564 // The password should not have a suggested value.
1629 CheckTextFieldsState(old_username, true, std::string(), false); 1565 CheckTextFieldsState(old_username, true, std::string(), false);
1630 } 1566 }
1631 1567
1632 TEST_F(PasswordAutofillAgentTest, 1568 TEST_F(PasswordAutofillAgentTest,
1633 InlineAutocompleteOverwritesManuallyEditedPassword) { 1569 InlineAutocompleteOverwritesManuallyEditedPassword) {
1634 // Simulate the browser sending back the login info. 1570 // Simulate the browser sending back the login info.
1635 SimulateOnFillPasswordForm(fill_data_); 1571 SimulateOnFillPasswordForm(fill_data_);
1636 1572
1637 ClearUsernameAndPasswordFields(); 1573 ClearUsernameAndPasswordFields();
1638 1574
1639 // The user enters a password 1575 // The user enters a password
1640 SimulateInputChangeForElement("someOtherPassword", 1576 SimulatePasswordChange("someOtherPassword");
1641 /*move_caret_to_end=*/true,
1642 GetMainFrame(),
1643 password_element_,
1644 /*is_user_input=*/true);
1645 1577
1646 // Simulate the user typing a stored username. 1578 // Simulate the user typing a stored username.
1647 SimulateUsernameChange(kAliceUsername, true); 1579 SimulateUsernameChange(kAliceUsername);
1648 // The autofileld password should replace the typed one. 1580 // The autofileld password should replace the typed one.
1649 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); 1581 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
1650 } 1582 }
1651 1583
1652 // The user types in a username and a password, but then just before sending 1584 // 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 1585 // the form off, a script changes them. This test checks that
1654 // PasswordAutofillAgent can still remember the username and the password 1586 // PasswordAutofillAgent can still remember the username and the password
1655 // typed by the user. 1587 // typed by the user.
1656 TEST_F(PasswordAutofillAgentTest, 1588 TEST_F(PasswordAutofillAgentTest,
1657 RememberLastTypedUsernameAndPasswordOnSubmit_ScriptChanged) { 1589 RememberLastTypedUsernameAndPasswordOnSubmit_ScriptChanged) {
1658 SimulateInputChangeForElement("temp", true, GetMainFrame(), username_element_, 1590 SimulateUsernameChange("temp");
1659 true); 1591 SimulatePasswordChange("random");
1660 SimulateInputChangeForElement("random", true, GetMainFrame(),
1661 password_element_, true);
1662 1592
1663 // Simulate that the username and the password value was changed by the 1593 // Simulate that the username and the password value was changed by the
1664 // site's JavaScript before submit. 1594 // site's JavaScript before submit.
1665 username_element_.setValue(WebString("new username")); 1595 username_element_.setValue(WebString("new username"));
1666 password_element_.setValue(WebString("new password")); 1596 password_element_.setValue(WebString("new password"));
1667 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) 1597 static_cast<content::RenderFrameObserver*>(password_autofill_agent_)
1668 ->WillSendSubmitEvent(username_element_.form()); 1598 ->WillSendSubmitEvent(username_element_.form());
1669 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) 1599 static_cast<content::RenderFrameObserver*>(password_autofill_agent_)
1670 ->WillSubmitForm(username_element_.form()); 1600 ->WillSubmitForm(username_element_.form());
1671 1601
(...skipping 26 matching lines...) Expand all
1698 1628
1699 // The username/password is autofilled by password manager then user types in a 1629 // 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 1630 // username and a password. Then just before sending the form off, a script
1701 // changes them. This test checks that PasswordAutofillAgent can still remember 1631 // changes them. This test checks that PasswordAutofillAgent can still remember
1702 // the username and the password typed by the user. 1632 // the username and the password typed by the user.
1703 TEST_F( 1633 TEST_F(
1704 PasswordAutofillAgentTest, 1634 PasswordAutofillAgentTest,
1705 RememberLastTypedAfterAutofilledUsernameAndPasswordOnSubmit_ScriptChanged) { 1635 RememberLastTypedAfterAutofilledUsernameAndPasswordOnSubmit_ScriptChanged) {
1706 SimulateOnFillPasswordForm(fill_data_); 1636 SimulateOnFillPasswordForm(fill_data_);
1707 1637
1708 SimulateInputChangeForElement("temp", true, GetMainFrame(), username_element_, 1638 SimulateUsernameChange("temp");
1709 true); 1639 SimulatePasswordChange("random");
1710 SimulateInputChangeForElement("random", true, GetMainFrame(),
1711 password_element_, true);
1712 1640
1713 // Simulate that the username and the password value was changed by the 1641 // Simulate that the username and the password value was changed by the
1714 // site's JavaScript before submit. 1642 // site's JavaScript before submit.
1715 username_element_.setValue(WebString("new username")); 1643 username_element_.setValue(WebString("new username"));
1716 password_element_.setValue(WebString("new password")); 1644 password_element_.setValue(WebString("new password"));
1717 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) 1645 static_cast<content::RenderFrameObserver*>(password_autofill_agent_)
1718 ->WillSendSubmitEvent(username_element_.form()); 1646 ->WillSendSubmitEvent(username_element_.form());
1719 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) 1647 static_cast<content::RenderFrameObserver*>(password_autofill_agent_)
1720 ->WillSubmitForm(username_element_.form()); 1648 ->WillSubmitForm(username_element_.form());
1721 1649
1722 // Observe that the PasswordAutofillAgent still remembered the last typed 1650 // Observe that the PasswordAutofillAgent still remembered the last typed
1723 // username and password and sent that to the browser. 1651 // username and password and sent that to the browser.
1724 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", ""); 1652 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", "");
1725 } 1653 }
1726 1654
1727 // The user starts typing username then it is autofilled. 1655 // The user starts typing username then it is autofilled.
1728 // PasswordAutofillAgent should remember the username that was autofilled, 1656 // PasswordAutofillAgent should remember the username that was autofilled,
1729 // not last typed. 1657 // not last typed.
1730 TEST_F(PasswordAutofillAgentTest, RememberAutofilledUsername) { 1658 TEST_F(PasswordAutofillAgentTest, RememberAutofilledUsername) {
1731 SimulateInputChangeForElement("Te", true, GetMainFrame(), username_element_, 1659 SimulateUsernameChange("Te");
1732 true);
1733 // Simulate that the username was changed by autofilling. 1660 // Simulate that the username was changed by autofilling.
1734 username_element_.setValue(WebString("temp")); 1661 username_element_.setValue(WebString("temp"));
1735 SimulateInputChangeForElement("random", true, GetMainFrame(), 1662 SimulatePasswordChange("random");
1736 password_element_, true);
1737 1663
1738 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) 1664 static_cast<content::RenderFrameObserver*>(password_autofill_agent_)
1739 ->WillSendSubmitEvent(username_element_.form()); 1665 ->WillSendSubmitEvent(username_element_.form());
1740 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) 1666 static_cast<content::RenderFrameObserver*>(password_autofill_agent_)
1741 ->WillSubmitForm(username_element_.form()); 1667 ->WillSubmitForm(username_element_.form());
1742 1668
1743 // Observe that the PasswordAutofillAgent still remembered the last typed 1669 // Observe that the PasswordAutofillAgent still remembered the last typed
1744 // username and password and sent that to the browser. 1670 // username and password and sent that to the browser.
1745 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", ""); 1671 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", "");
1746 } 1672 }
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1871 1797
1872 CheckTextFieldsState(std::string("foobar"), false, std::string(), false); 1798 CheckTextFieldsState(std::string("foobar"), false, std::string(), false);
1873 } 1799 }
1874 1800
1875 // Test that the last plain text field before a password field is chosen as a 1801 // 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. 1802 // username, in a form with 2 plain text fields without username predictions.
1877 TEST_F(PasswordAutofillAgentTest, FindingUsernameWithoutAutofillPredictions) { 1803 TEST_F(PasswordAutofillAgentTest, FindingUsernameWithoutAutofillPredictions) {
1878 LoadHTML(kFormHTMLWithTwoTextFields); 1804 LoadHTML(kFormHTMLWithTwoTextFields);
1879 UpdateUsernameAndPasswordElements(); 1805 UpdateUsernameAndPasswordElements();
1880 blink::WebInputElement email_element = GetInputElementByID(kEmailName); 1806 blink::WebInputElement email_element = GetInputElementByID(kEmailName);
1881 SimulateInputChangeForElement("temp", true, GetMainFrame(), username_element_, 1807 SimulateUsernameChange("temp");
1882 true); 1808 SimulateUserInputChangeForElement(&email_element, "temp@google.com");
1883 SimulateInputChangeForElement("temp@google.com", true, GetMainFrame(), 1809 SimulatePasswordChange("random");
1884 email_element, true);
1885 SimulateInputChangeForElement("random", true, GetMainFrame(),
1886 password_element_, true);
1887 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) 1810 static_cast<content::RenderFrameObserver*>(password_autofill_agent_)
1888 ->WillSendSubmitEvent(username_element_.form()); 1811 ->WillSendSubmitEvent(username_element_.form());
1889 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) 1812 static_cast<content::RenderFrameObserver*>(password_autofill_agent_)
1890 ->WillSubmitForm(username_element_.form()); 1813 ->WillSubmitForm(username_element_.form());
1891 1814
1892 // Observe that the PasswordAutofillAgent identifies the second field (e-mail) 1815 // Observe that the PasswordAutofillAgent identifies the second field (e-mail)
1893 // as username. 1816 // as username.
1894 ExpectFormSubmittedWithUsernameAndPasswords("temp@google.com", "random", ""); 1817 ExpectFormSubmittedWithUsernameAndPasswords("temp@google.com", "random", "");
1895 } 1818 }
1896 1819
1897 // Tests that username predictions are followed when identifying the username 1820 // Tests that username predictions are followed when identifying the username
1898 // in a password form with two plain text fields. 1821 // in a password form with two plain text fields.
1899 TEST_F(PasswordAutofillAgentTest, FindingUsernameWithAutofillPredictions) { 1822 TEST_F(PasswordAutofillAgentTest, FindingUsernameWithAutofillPredictions) {
1900 LoadHTML(kFormHTMLWithTwoTextFields); 1823 LoadHTML(kFormHTMLWithTwoTextFields);
1901 UpdateUsernameAndPasswordElements(); 1824 UpdateUsernameAndPasswordElements();
1902 blink::WebInputElement email_element = GetInputElementByID(kEmailName); 1825 blink::WebInputElement email_element = GetInputElementByID(kEmailName);
1903 SimulateInputChangeForElement("temp", true, GetMainFrame(), username_element_, 1826 SimulateUsernameChange("temp");
1904 true); 1827 SimulateUserInputChangeForElement(&email_element, "temp@google.com");
1905 SimulateInputChangeForElement("temp@google.com", true, GetMainFrame(), 1828 SimulatePasswordChange("random");
1906 email_element, true);
1907 SimulateInputChangeForElement("random", true, GetMainFrame(),
1908 password_element_, true);
1909
1910 // Find FormData for visible password form. 1829 // Find FormData for visible password form.
1911 blink::WebFormElement form_element = username_element_.form(); 1830 blink::WebFormElement form_element = username_element_.form();
1912 FormData form_data; 1831 FormData form_data;
1913 ASSERT_TRUE(WebFormElementToFormData(form_element, 1832 ASSERT_TRUE(WebFormElementToFormData(form_element,
1914 blink::WebFormControlElement(), 1833 blink::WebFormControlElement(),
1915 EXTRACT_NONE, &form_data, nullptr)); 1834 EXTRACT_NONE, &form_data, nullptr));
1916 // Simulate Autofill predictions: the first field is username. 1835 // Simulate Autofill predictions: the first field is username.
1917 std::map<autofill::FormData, autofill::FormFieldData> predictions; 1836 std::map<autofill::FormData, autofill::FormFieldData> predictions;
1918 predictions[form_data] = form_data.fields[0]; 1837 predictions[form_data] = form_data.fields[0];
1919 AutofillMsg_AutofillUsernameDataReceived msg(0, predictions); 1838 AutofillMsg_AutofillUsernameDataReceived msg(0, predictions);
(...skipping 14 matching lines...) Expand all
1934 ->WillSendSubmitEvent(username_element_.form()); 1853 ->WillSendSubmitEvent(username_element_.form());
1935 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) 1854 static_cast<content::RenderFrameObserver*>(password_autofill_agent_)
1936 ->WillSubmitForm(username_element_.form()); 1855 ->WillSubmitForm(username_element_.form());
1937 1856
1938 // Observe that the PasswordAutofillAgent identifies the first field as 1857 // Observe that the PasswordAutofillAgent identifies the first field as
1939 // username. 1858 // username.
1940 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", ""); 1859 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", "");
1941 } 1860 }
1942 1861
1943 } // namespace autofill 1862 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698