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

Unified 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 show autofill popup if desktop IME is composing. 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 side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/autofill/password_autofill_agent_browsertest.cc
diff --git a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
index beb842f02ca8206d1e71f1d35cfbc03879508290..e96323a6ff36883cf7fcf68bd3937b094dbd2f34 100644
--- a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
+++ b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
@@ -302,22 +302,15 @@ class PasswordAutofillAgentTest : public ChromeRenderViewTest {
WebFrame* input_frame,
WebInputElement& input,
bool is_user_input) {
- input.setValue(WebString::fromUTF8(new_value), is_user_input);
- // The field must have focus or AutofillAgent will think the
- // change should be ignored.
- while (!input.focused())
- input_frame->document().frame()->view()->advanceFocus(false);
- if (move_caret_to_end)
- input.setSelectionRange(new_value.length(), new_value.length());
- if (is_user_input) {
- AutofillMsg_FirstUserGestureObservedInTab msg(0);
- content::RenderFrame::FromWebFrame(input_frame)->OnMessageReceived(msg);
-
- // Also pass the message to the testing object.
- if (input_frame == GetMainFrame())
- password_autofill_agent_->FirstUserGestureObserved();
- }
- input_frame->toWebLocalFrame()->autofillClient()->textFieldDidChange(input);
+ if (is_user_input)
+ SimulateUserInputChangeForElement(&input, input_frame, new_value);
+ else
+ input.setValue(WebString::fromUTF8(new_value), false);
+
+ ProcessEvents();
+ }
+
+ void ProcessEvents() {
// Processing is delayed because of a Blink bug:
// https://bugs.webkit.org/show_bug.cgi?id=16976
// See PasswordAutofillAgent::TextDidChangeInTextField() for details.
@@ -367,14 +360,6 @@ class PasswordAutofillAgentTest : public ChromeRenderViewTest {
is_user_input);
}
- void SimulateKeyDownEvent(const WebInputElement& element,
- ui::KeyboardCode key_code) {
- blink::WebKeyboardEvent key_event;
- key_event.windowsKeyCode = key_code;
- static_cast<blink::WebAutofillClient*>(autofill_agent_)
- ->textFieldDidReceiveKeyDown(element, key_event);
- }
-
void CheckTextFieldsStateForElements(const WebInputElement& username_element,
const std::string& username,
bool username_autofilled,
@@ -688,7 +673,7 @@ TEST_F(PasswordAutofillAgentTest, PasswordClearOnEdit) {
SimulateOnFillPasswordForm(fill_data_);
// Simulate the user changing the username to some unknown username.
- SimulateUsernameChange("alicia", true);
+ SimulateUsernameChange("alicia", true, true);
// The password should have been cleared.
CheckTextFieldsState("alicia", false, std::string(), false);
@@ -705,31 +690,31 @@ TEST_F(PasswordAutofillAgentTest, WaitUsername) {
CheckTextFieldsState(std::string(), false, std::string(), false);
// No autocomplete should happen when text is entered in the username.
- SimulateUsernameChange("a", true);
+ SimulateUsernameChange("a", true, true);
CheckTextFieldsState("a", false, std::string(), false);
- SimulateUsernameChange("al", true);
+ SimulateUsernameChange("al", true, true);
CheckTextFieldsState("al", false, std::string(), false);
- SimulateUsernameChange(kAliceUsername, true);
+ SimulateUsernameChange(kAliceUsername, true, true);
CheckTextFieldsState(kAliceUsername, false, std::string(), false);
// Autocomplete should happen only when the username textfield is blurred with
// a full match.
- username_element_.setValue("a");
+ SimulateUsernameChange("a", true, true);
static_cast<blink::WebAutofillClient*>(autofill_agent_)
->textFieldDidEndEditing(username_element_);
CheckTextFieldsState("a", false, std::string(), false);
- username_element_.setValue("al");
+ SimulateUsernameChange("al", true, true);
static_cast<blink::WebAutofillClient*>(autofill_agent_)
->textFieldDidEndEditing(username_element_);
CheckTextFieldsState("al", false, std::string(), false);
- username_element_.setValue("alices");
+ SimulateUsernameChange("alices", true, true);
static_cast<blink::WebAutofillClient*>(autofill_agent_)
->textFieldDidEndEditing(username_element_);
CheckTextFieldsState("alices", false, std::string(), false);
- username_element_.setValue(ASCIIToUTF16(kAliceUsername));
+ SimulateUsernameChange(kAliceUsername, true, true);
static_cast<blink::WebAutofillClient*>(autofill_agent_)
->textFieldDidEndEditing(username_element_);
- CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true);
+ CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
}
// Tests that inline autocompletion works properly.
@@ -741,57 +726,58 @@ TEST_F(PasswordAutofillAgentTest, InlineAutocomplete) {
// Simulate the user typing in the first letter of 'alice', a stored
// username.
- SimulateUsernameChange("a", true);
+ SimulateUsernameChange("a", true, true);
// Both the username and password text fields should reflect selection of the
// stored login.
- CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true);
+ CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
// And the selection should have been set to 'lice', the last 4 letters.
CheckUsernameSelection(1, 5);
// Now the user types the next letter of the same username, 'l'.
- SimulateUsernameChange("al", true);
+ SimulateUserTypingASCIICharacter('l');
+ ProcessEvents();
// Now the fields should have the same value, but the selection should have a
// different start value.
- CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true);
+ CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
CheckUsernameSelection(2, 5);
- // Test that deleting does not trigger autocomplete.
- SimulateKeyDownEvent(username_element_, ui::VKEY_BACK);
- SimulateUsernameChange("alic", true);
- CheckTextFieldsState("alic", false, std::string(), false);
- CheckUsernameSelection(4, 4); // No selection.
- // Reset the last pressed key to something other than backspace.
- SimulateKeyDownEvent(username_element_, ui::VKEY_A);
+ // Test that backspace will erase the selection and will stop autocompletion.
+ SimulateUserTypingKeyCodeWithShift(ui::VKEY_BACK, false);
+ ProcessEvents();
+ CheckTextFieldsState("al", false, std::string(), false);
+ CheckUsernameSelection(2, 2); // No selection.
// Now lets say the user goes astray from the stored username and types the
// letter 'f', spelling 'alf'. We don't know alf (that's just sad), so in
// practice the username should no longer be 'alice' and the selected range
// should be empty.
- SimulateUsernameChange("alf", true);
+ SimulateUserTypingASCIICharacter('f');
+ ProcessEvents();
CheckTextFieldsState("alf", false, std::string(), false);
CheckUsernameSelection(3, 3); // No selection.
// Ok, so now the user removes all the text and enters the letter 'b'.
- SimulateUsernameChange("b", true);
+ SimulateUsernameChange("b", true, true);
// The username and password fields should match the 'bob' entry.
- CheckTextFieldsState(kBobUsername, true, kBobPassword, true);
+ CheckTextFieldsDOMState(kBobUsername, true, kBobPassword, true);
CheckUsernameSelection(1, 3);
// Then, the user again removes all the text and types an uppercase 'C'.
- SimulateUsernameChange("C", true);
+ SimulateUsernameChange("C", true, true);
// The username and password fields should match the 'Carol' entry.
- CheckTextFieldsState(kCarolUsername, true, kCarolPassword, true);
+ CheckTextFieldsDOMState(kCarolUsername, true, kCarolPassword, true);
CheckUsernameSelection(1, 5);
+
// The user removes all the text and types a lowercase 'c'. We only
// want case-sensitive autocompletion, so the username and the selected range
// should be empty.
- SimulateUsernameChange("c", true);
+ SimulateUsernameChange("c", true, true);
CheckTextFieldsState("c", false, std::string(), false);
CheckUsernameSelection(1, 1);
// Check that we complete other_possible_usernames as well.
- SimulateUsernameChange("R", true);
- CheckTextFieldsState(kCarolAlternateUsername, true, kCarolPassword, true);
+ SimulateUsernameChange("R", true, true);
+ CheckTextFieldsDOMState(kCarolAlternateUsername, true, kCarolPassword, true);
CheckUsernameSelection(1, 17);
}
@@ -920,6 +906,8 @@ TEST_F(PasswordAutofillAgentTest, IframeNoFillTest) {
// Simulate the user typing in the username in the iframe which should cause
// an autofill.
+ content::RenderFrame::FromWebFrame(iframe)
+ ->OnMessageReceived(AutofillMsg_FirstUserGestureObservedInTab(0));
SimulateInputChangeForElement(
kAliceUsername, true, iframe, username_input, true);
@@ -1029,9 +1017,9 @@ TEST_F(PasswordAutofillAgentTest,
// set directly.
SimulateElementClick(kUsernameName);
- // Simulate the user entering her username and selecting the matching autofill
- // from the dropdown.
- SimulateUsernameChange(kAliceUsername, true, true);
+ // Simulate the user entering the first letter of her username and selecting
+ // the matching autofill from the dropdown.
+ SimulateUsernameChange("a", true, true);
SimulateSuggestionChoice(username_element_);
// The username and password should now have been autocompleted.
@@ -1289,10 +1277,10 @@ TEST_F(PasswordAutofillAgentTest, ClearPreviewWithInlineAutocompletedUsername) {
ClearUsernameAndPasswordFields();
// Simulate the user typing in the first letter of 'alice', a stored username.
- SimulateUsernameChange("a", true);
+ SimulateUsernameChange("a", true, true);
// Both the username and password text fields should reflect selection of the
// stored login.
- CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true);
+ CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
// The selection should have been set to 'lice', the last 4 letters.
CheckUsernameSelection(1, 5);
@@ -1314,7 +1302,7 @@ TEST_F(PasswordAutofillAgentTest, ClearPreviewWithInlineAutocompletedUsername) {
EXPECT_EQ(kAliceUsername, username_element_.value().utf8());
EXPECT_TRUE(username_element_.suggestedValue().isEmpty());
EXPECT_TRUE(username_element_.isAutofilled());
- EXPECT_TRUE(password_element_.value().isEmpty());
+ EXPECT_EQ(kAlicePassword, password_element_.value().utf8());
EXPECT_TRUE(password_element_.suggestedValue().isEmpty());
EXPECT_TRUE(password_element_.isAutofilled());
CheckUsernameSelection(1, 5);
@@ -1419,12 +1407,13 @@ TEST_F(PasswordAutofillAgentTest, CredentialsOnClick) {
static_cast<PageClickListener*>(autofill_agent_)
->FormControlElementClicked(username_element_, true);
CheckSuggestions("baz", true);
+ ClearUsernameAndPasswordFields();
// Now simulate a user typing in the first letter of the username and then
// clicking on the username element. While the typing of the first letter will
// inline autocomplete, clicking on the element should still produce a full
// suggestion list.
- SimulateUsernameChange("a", true);
+ SimulateUsernameChange("a", true, true);
render_thread_->sink().ClearMessages();
static_cast<PageClickListener*>(autofill_agent_)
->FormControlElementClicked(username_element_, true);
@@ -1644,7 +1633,7 @@ TEST_F(PasswordAutofillAgentTest,
/*is_user_input=*/true);
// Simulate the user typing a stored username.
- SimulateUsernameChange(kAliceUsername, true);
+ SimulateUsernameChange(kAliceUsername, true, true);
// The autofileld password should replace the typed one.
CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
}

Powered by Google App Engine
This is Rietveld 408576698