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

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

Issue 166043006: Add password manager autocomplete suggestion when a username element in clicked. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed a comment and cleaned up a browser test Created 6 years, 9 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 | Annotate | Revision Log
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 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 void ClearUsernameAndPasswordFields() { 247 void ClearUsernameAndPasswordFields() {
248 username_element_.setValue(""); 248 username_element_.setValue("");
249 username_element_.setAutofilled(false); 249 username_element_.setAutofilled(false);
250 password_element_.setValue(""); 250 password_element_.setValue("");
251 password_element_.setAutofilled(false); 251 password_element_.setAutofilled(false);
252 } 252 }
253 253
254 void SimulateUsernameChangeForElement(const std::string& username, 254 void SimulateUsernameChangeForElement(const std::string& username,
255 bool move_caret_to_end, 255 bool move_caret_to_end,
256 WebFrame* input_frame, 256 WebFrame* input_frame,
257 WebInputElement& username_input) { 257 WebInputElement& username_input,
258 username_input.setValue(WebString::fromUTF8(username)); 258 bool is_user_input) {
259 username_input.setValue(WebString::fromUTF8(username), is_user_input);
259 // The field must have focus or AutofillAgent will think the 260 // The field must have focus or AutofillAgent will think the
260 // change should be ignored. 261 // change should be ignored.
261 while (!username_input.focused()) 262 while (!username_input.focused())
262 input_frame->document().frame()->view()->advanceFocus(false); 263 input_frame->document().frame()->view()->advanceFocus(false);
263 if (move_caret_to_end) 264 if (move_caret_to_end)
264 username_input.setSelectionRange(username.length(), username.length()); 265 username_input.setSelectionRange(username.length(), username.length());
266 if (is_user_input)
267 autofill_agent_->password_autofill_agent_->gatekeeper_.OnUserGesture();
265 autofill_agent_->textFieldDidChange(username_input); 268 autofill_agent_->textFieldDidChange(username_input);
266 // Processing is delayed because of a Blink bug: 269 // Processing is delayed because of a Blink bug:
267 // https://bugs.webkit.org/show_bug.cgi?id=16976 270 // https://bugs.webkit.org/show_bug.cgi?id=16976
268 // See PasswordAutofillAgent::TextDidChangeInTextField() for details. 271 // See PasswordAutofillAgent::TextDidChangeInTextField() for details.
269 272
270 // Autocomplete will trigger a style recalculation when we put up the next 273 // Autocomplete will trigger a style recalculation when we put up the next
271 // frame, but we don't want to wait that long. Instead, trigger a style 274 // frame, but we don't want to wait that long. Instead, trigger a style
272 // recalcuation manually after TextFieldDidChangeImpl runs. 275 // recalcuation manually after TextFieldDidChangeImpl runs.
273 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( 276 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
274 &PasswordAutofillAgentTest::LayoutMainFrame, base::Unretained(this))); 277 &PasswordAutofillAgentTest::LayoutMainFrame, base::Unretained(this)));
275 278
276 base::MessageLoop::current()->RunUntilIdle(); 279 base::MessageLoop::current()->RunUntilIdle();
277 } 280 }
278 281
282 void SimulateSuggestionChoice(const std::string& username,
283 WebInputElement& username_input) {
284 blink::WebString blink_username = blink::WebString::fromUTF8(username);
285
286 // This call is necessary to setup the autofill agent appropriate for the
287 // user selection; simulates the menu actually popping up.
288 autofill_agent_->InputElementClicked(username_input, false, true);
289
290 autofill_agent_->OnAcceptPasswordAutofillSuggestion(blink_username);
291 }
292
279 void LayoutMainFrame() { 293 void LayoutMainFrame() {
280 GetMainFrame()->view()->layout(); 294 GetMainFrame()->view()->layout();
281 } 295 }
282 296
283 void SimulateUsernameChange(const std::string& username, 297 void SimulateUsernameChange(const std::string& username,
284 bool move_caret_to_end) { 298 bool move_caret_to_end,
285 SimulateUsernameChangeForElement(username, move_caret_to_end, 299 bool is_user_input = false) {
286 GetMainFrame(), username_element_); 300 SimulateUsernameChangeForElement(username,
301 move_caret_to_end,
302 GetMainFrame(),
303 username_element_,
304 is_user_input);
287 } 305 }
288 306
289 // Tests that no suggestion popup is generated when the username_element_ is 307 // Tests that no suggestion popup is generated when the username_element_ is
290 // edited. 308 // edited.
291 void ExpectNoSuggestionsPopup() { 309 void ExpectNoSuggestionsPopup() {
292 // The first test below ensures that the suggestions have been handled by 310 // The first test below ensures that the suggestions have been handled by
293 // the password_autofill_agent, even though autocomplete='off' is set. The 311 // the password_autofill_agent, even though autocomplete='off' is set. The
294 // second check ensures that, although handled, no "show suggestions" IPC to 312 // second check ensures that, although handled, no "show suggestions" IPC to
295 // the browser was generated. 313 // the browser was generated.
296 // 314 //
297 // This is interesting in the specific case of an autocomplete='off' form 315 // This is interesting in the specific case of an autocomplete='off' form
298 // that also has a remembered username and password 316 // that also has a remembered username and password
299 // (http://crbug.com/326679). To fix the DCHECK that this case used to hit, 317 // (http://crbug.com/326679). To fix the DCHECK that this case used to hit,
300 // |true| is returned from ShowSuggestions for all forms with valid 318 // |true| is returned from ShowSuggestions for all forms with valid
301 // usersnames that are autocomplete='off', prentending that a selection box 319 // usersnames that are autocomplete='off', prentending that a selection box
302 // has been shown to the user. Of course, it hasn't, so a message is never 320 // has been shown to the user. Of course, it hasn't, so a message is never
303 // sent to the browser on acceptance, and the DCHECK isn't hit (and nothing 321 // sent to the browser on acceptance, and the DCHECK isn't hit (and nothing
304 // is filled). 322 // is filled).
305 // 323 //
306 // These tests only make sense in the context of not ignoring 324 // These tests only make sense in the context of not ignoring
307 // autocomplete='off', so only test them if the disable autocomplete='off' 325 // autocomplete='off', so only test them if the disable autocomplete='off'
308 // flag is not enabled. 326 // flag is not enabled.
309 // TODO(jww): Remove this function and callers once autocomplete='off' is 327 // TODO(jww): Remove this function and callers once autocomplete='off' is
310 // permanently ignored. 328 // permanently ignored.
311 if (!ShouldIgnoreAutocompleteOffForPasswordFields()) { 329 if (!ShouldIgnoreAutocompleteOffForPasswordFields()) {
312 EXPECT_TRUE(autofill_agent_->password_autofill_agent_->ShowSuggestions( 330 EXPECT_TRUE(autofill_agent_->password_autofill_agent_->ShowSuggestions(
313 username_element_)); 331 username_element_, false));
314 332
315 EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching( 333 EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching(
316 AutofillHostMsg_ShowPasswordSuggestions::ID)); 334 AutofillHostMsg_ShowPasswordSuggestions::ID));
317 } 335 }
318 } 336 }
319 337
320 void SimulateKeyDownEvent(const WebInputElement& element, 338 void SimulateKeyDownEvent(const WebInputElement& element,
321 ui::KeyboardCode key_code) { 339 ui::KeyboardCode key_code) {
322 blink::WebKeyboardEvent key_event; 340 blink::WebKeyboardEvent key_event;
323 key_event.windowsKeyCode = key_code; 341 key_event.windowsKeyCode = key_code;
324 autofill_agent_->textFieldDidReceiveKeyDown(element, key_event); 342 autofill_agent_->textFieldDidReceiveKeyDown(element, key_event);
325 } 343 }
326 344
327 void CheckTextFieldsStateForElements(const WebInputElement& username_element, 345 void CheckTextFieldsStateForElements(const WebInputElement& username_element,
328 const std::string& username, 346 const std::string& username,
329 bool username_autofilled, 347 bool username_autofilled,
330 const WebInputElement& password_element, 348 const WebInputElement& password_element,
331 const std::string& password, 349 const std::string& password,
332 bool password_autofilled, 350 bool password_autofilled,
333 bool checkSuggestedValue = true) { 351 bool checkSuggestedValue) {
334 EXPECT_EQ(username, 352 EXPECT_EQ(username,
335 static_cast<std::string>(username_element.value().utf8())); 353 static_cast<std::string>(username_element.value().utf8()));
336 EXPECT_EQ(username_autofilled, username_element.isAutofilled()); 354 EXPECT_EQ(username_autofilled, username_element.isAutofilled());
337 EXPECT_EQ(password, 355 EXPECT_EQ(password,
338 static_cast<std::string>( 356 static_cast<std::string>(
339 checkSuggestedValue ? password_element.suggestedValue().utf8() 357 checkSuggestedValue ? password_element.suggestedValue().utf8()
340 : password_element.value().utf8())); 358 : password_element.value().utf8()));
341 EXPECT_EQ(password_autofilled, password_element.isAutofilled()); 359 EXPECT_EQ(password_autofilled, password_element.isAutofilled());
342 } 360 }
343 361
344 // Checks the DOM-accessible value of the username element and the 362 // Checks the DOM-accessible value of the username element and the
345 // *suggested* value of the password element. 363 // *suggested* value of the password element.
346 void CheckTextFieldsState(const std::string& username, 364 void CheckTextFieldsState(const std::string& username,
347 bool username_autofilled, 365 bool username_autofilled,
348 const std::string& password, 366 const std::string& password,
349 bool password_autofilled) { 367 bool password_autofilled) {
350 CheckTextFieldsStateForElements(username_element_, username, 368 CheckTextFieldsStateForElements(username_element_,
351 username_autofilled, password_element_, 369 username,
352 password, password_autofilled); 370 username_autofilled,
371 password_element_,
372 password,
373 password_autofilled,
374 true);
353 } 375 }
354 376
355 // Checks the DOM-accessible value of the username element and the 377 // Checks the DOM-accessible value of the username element and the
356 // DOM-accessible value of the password element. 378 // DOM-accessible value of the password element.
357 void CheckTextFieldsDOMState(const std::string& username, 379 void CheckTextFieldsDOMState(const std::string& username,
358 bool username_autofilled, 380 bool username_autofilled,
359 const std::string& password, 381 const std::string& password,
360 bool password_autofilled) { 382 bool password_autofilled) {
361 CheckTextFieldsStateForElements(username_element_, 383 CheckTextFieldsStateForElements(username_element_,
362 username, 384 username,
363 username_autofilled, 385 username_autofilled,
364 password_element_, 386 password_element_,
365 password, 387 password,
366 password_autofilled, 388 password_autofilled,
367 false); 389 false);
368 } 390 }
369 391
370 void CheckUsernameSelection(int start, int end) { 392 void CheckUsernameSelection(int start, int end) {
371 EXPECT_EQ(start, username_element_.selectionStart()); 393 EXPECT_EQ(start, username_element_.selectionStart());
372 EXPECT_EQ(end, username_element_.selectionEnd()); 394 EXPECT_EQ(end, username_element_.selectionEnd());
373 } 395 }
374 396
397 void ExpectAllCredentials() {
398 std::set<base::string16> usernames;
399 usernames.insert(username1_);
400 usernames.insert(username2_);
401 usernames.insert(username3_);
402 usernames.insert(alternate_username3_);
403
404 ASSERT_EQ(1u, password_autofill_->messages().size());
405 ASSERT_EQ(AutofillHostMsg_ShowPasswordSuggestions::ID,
406 password_autofill_->messages()[0]->type());
407 AutofillHostMsg_ShowPasswordSuggestions* msg =
408 reinterpret_cast<AutofillHostMsg_ShowPasswordSuggestions*>(
409 password_autofill_->messages()[0]);
410 Tuple4<autofill::FormFieldData,
411 gfx::RectF,
412 std::vector<base::string16>,
413 std::vector<base::string16> > args;
414 AutofillHostMsg_ShowPasswordSuggestions::Read(msg, &args);
415 ASSERT_EQ(4u, args.c.size());
416 std::set<base::string16>::iterator it;
417
418 for (int i = 0; i < 4; i++) {
419 it = usernames.find(args.c[i]);
420 EXPECT_TRUE(it != usernames.end());
421 if (it != usernames.end())
422 usernames.erase(it);
423 }
424
425 EXPECT_TRUE(usernames.empty());
426 }
427
375 base::string16 username1_; 428 base::string16 username1_;
376 base::string16 username2_; 429 base::string16 username2_;
377 base::string16 username3_; 430 base::string16 username3_;
378 base::string16 password1_; 431 base::string16 password1_;
379 base::string16 password2_; 432 base::string16 password2_;
380 base::string16 password3_; 433 base::string16 password3_;
381 base::string16 alternate_username3_; 434 base::string16 alternate_username3_;
382 PasswordFormFillData fill_data_; 435 PasswordFormFillData fill_data_;
383 436
384 WebInputElement username_element_; 437 WebInputElement username_element_;
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 username_element_.setValue(ASCIIToUTF16(kAliceUsername)); 691 username_element_.setValue(ASCIIToUTF16(kAliceUsername));
639 autofill_agent_->textFieldDidEndEditing(username_element_); 692 autofill_agent_->textFieldDidEndEditing(username_element_);
640 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); 693 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true);
641 } 694 }
642 695
643 // Tests that inline autocompletion works properly. 696 // Tests that inline autocompletion works properly.
644 TEST_F(PasswordAutofillAgentTest, InlineAutocomplete) { 697 TEST_F(PasswordAutofillAgentTest, InlineAutocomplete) {
645 // Simulate the browser sending back the login info. 698 // Simulate the browser sending back the login info.
646 SimulateOnFillPasswordForm(fill_data_); 699 SimulateOnFillPasswordForm(fill_data_);
647 700
648 // Clear the text fields to start fresh.
649 ClearUsernameAndPasswordFields(); 701 ClearUsernameAndPasswordFields();
650 702
651 // Simulate the user typing in the first letter of 'alice', a stored username. 703 // Simulate the user typing in the first letter of 'alice', a stored
704 // username.
652 SimulateUsernameChange("a", true); 705 SimulateUsernameChange("a", true);
653 // Both the username and password text fields should reflect selection of the 706 // Both the username and password text fields should reflect selection of the
654 // stored login. 707 // stored login.
655 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); 708 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true);
656 // And the selection should have been set to 'lice', the last 4 letters. 709 // And the selection should have been set to 'lice', the last 4 letters.
657 CheckUsernameSelection(1, 5); 710 CheckUsernameSelection(1, 5);
658 711
659 // Now the user types the next letter of the same username, 'l'. 712 // Now the user types the next letter of the same username, 'l'.
660 SimulateUsernameChange("al", true); 713 SimulateUsernameChange("al", true);
661 // Now the fields should have the same value, but the selection should have a 714 // Now the fields should have the same value, but the selection should have a
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
815 868
816 WebElement username_element = document.getElementById(kUsernameName); 869 WebElement username_element = document.getElementById(kUsernameName);
817 WebElement password_element = document.getElementById(kPasswordName); 870 WebElement password_element = document.getElementById(kPasswordName);
818 ASSERT_FALSE(username_element.isNull()); 871 ASSERT_FALSE(username_element.isNull());
819 ASSERT_FALSE(password_element.isNull()); 872 ASSERT_FALSE(password_element.isNull());
820 873
821 WebInputElement username_input = username_element.to<WebInputElement>(); 874 WebInputElement username_input = username_element.to<WebInputElement>();
822 WebInputElement password_input = password_element.to<WebInputElement>(); 875 WebInputElement password_input = password_element.to<WebInputElement>();
823 ASSERT_FALSE(username_element.isNull()); 876 ASSERT_FALSE(username_element.isNull());
824 877
825 CheckTextFieldsStateForElements(username_input, "", false, 878 CheckTextFieldsStateForElements(
826 password_input, "", false); 879 username_input, "", false, password_input, "", false, false);
827 880
828 // Simulate the user typing in the username in the iframe, which should cause 881 // Simulate the user typing in the username in the iframe which should cause
829 // an autofill. 882 // an autofill.
830 SimulateUsernameChangeForElement(kAliceUsername, true, 883 SimulateUsernameChangeForElement(
831 iframe, username_input); 884 kAliceUsername, true, iframe, username_input, true);
832 885
833 CheckTextFieldsStateForElements(username_input, kAliceUsername, true, 886 CheckTextFieldsStateForElements(username_input,
834 password_input, kAlicePassword, true); 887 kAliceUsername,
888 true,
889 password_input,
890 kAlicePassword,
891 true,
892 false);
835 } 893 }
836 894
837 // Tests that a password will only be filled as a suggested and will not be 895 // Tests that a password will only be filled as a suggested and will not be
838 // accessible by the DOM until a user gesture has occurred. 896 // accessible by the DOM until a user gesture has occurred.
839 TEST_F(PasswordAutofillAgentTest, GestureRequiredTest) { 897 TEST_F(PasswordAutofillAgentTest, GestureRequiredTest) {
840 // Trigger the initial autocomplete. 898 // Trigger the initial autocomplete.
841 SimulateOnFillPasswordForm(fill_data_); 899 SimulateOnFillPasswordForm(fill_data_);
842 900
843 // The username and password should have been autocompleted. 901 // The username and password should have been autocompleted.
844 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); 902 CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true);
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
986 fill_data_.wait_for_username = true; 1044 fill_data_.wait_for_username = true;
987 SimulateOnFillPasswordForm(fill_data_); 1045 SimulateOnFillPasswordForm(fill_data_);
988 1046
989 // The username and password should not yet have been autocompleted. 1047 // The username and password should not yet have been autocompleted.
990 CheckTextFieldsState(std::string(), false, std::string(), false); 1048 CheckTextFieldsState(std::string(), false, std::string(), false);
991 1049
992 // Simulate a click just to force a user gesture, since the username value is 1050 // Simulate a click just to force a user gesture, since the username value is
993 // set directly. 1051 // set directly.
994 SimulateElementClick(kUsernameName); 1052 SimulateElementClick(kUsernameName);
995 1053
996 // Simulate the user entering her username. 1054 // Simulate the user entering her username and selecting the matching autofill
997 username_element_.setValue(ASCIIToUTF16(kAliceUsername), true); 1055 // from the dropdown.
998 autofill_agent_->textFieldDidEndEditing(username_element_); 1056 SimulateUsernameChange(kAliceUsername, true, true);
1057 SimulateSuggestionChoice(kAliceUsername, username_element_);
999 1058
1000 // The username and password should now have been autocompleted. 1059 // The username and password should now have been autocompleted.
1001 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); 1060 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
1002 1061
1003 // JavaScript onChange events should have been triggered both for the username 1062 // JavaScript onChange events should have been triggered both for the username
1004 // and for the password. 1063 // and for the password.
1005 int username_onchange_called = -1; 1064 int username_onchange_called = -1;
1006 int password_onchange_called = -1; 1065 int password_onchange_called = -1;
1007 ASSERT_TRUE( 1066 ASSERT_TRUE(
1008 ExecuteJavaScriptAndReturnIntValue( 1067 ExecuteJavaScriptAndReturnIntValue(
1009 ASCIIToUTF16("usernameOnchangeCalled ? 1 : 0"), 1068 ASCIIToUTF16("usernameOnchangeCalled ? 1 : 0"),
1010 &username_onchange_called)); 1069 &username_onchange_called));
1011 EXPECT_EQ(1, username_onchange_called); 1070 EXPECT_EQ(1, username_onchange_called);
1012 ASSERT_TRUE( 1071 ASSERT_TRUE(
1013 ExecuteJavaScriptAndReturnIntValue( 1072 ExecuteJavaScriptAndReturnIntValue(
1014 ASCIIToUTF16("passwordOnchangeCalled ? 1 : 0"), 1073 ASCIIToUTF16("passwordOnchangeCalled ? 1 : 0"),
1015 &password_onchange_called)); 1074 &password_onchange_called));
1016 EXPECT_EQ(1, password_onchange_called); 1075 EXPECT_EQ(1, password_onchange_called);
1017 } 1076 }
1018 1077
1078 // Tests that one user click on a username field is sufficient to bring up a
1079 // credential suggestion popup, and the user can autocomplete the password by
1080 // selecting the credential from the popup.
1081 TEST_F(PasswordAutofillAgentTest, ClickAndSelect) {
1082 // Simulate the browser sending back the login info.
1083 SimulateOnFillPasswordForm(fill_data_);
1084
1085 // Clear the text fields to start fresh.
1086 ClearUsernameAndPasswordFields();
1087
1088 // SimulateElementClick() is called so that a user gesture is actually made
1089 // and the password can be filled. However, SimulateElementClick() does not
1090 // actually lead to the AutofillAgent's InputElementClicked() method being
1091 // called, so SimulateSuggestionChoice has to manually call
1092 // InputElementClicked().
1093 SimulateElementClick(kUsernameName);
1094 SimulateSuggestionChoice(kAliceUsername, username_element_);
1095
1096 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
1097 }
1098
1099 TEST_F(PasswordAutofillAgentTest, AllCredentialsOnClick) {
1100 // Simulate the browser sending back the login info.
1101 SimulateOnFillPasswordForm(fill_data_);
1102
1103 // Clear the text fields to start fresh.
1104 ClearUsernameAndPasswordFields();
1105
1106 // Call SimulateElementClick() to produce a user gesture on the page so
1107 // autofill will actually fill.
1108 SimulateElementClick(kUsernameName);
1109
1110 // Simulate a user clicking on the username element. This should produce a
1111 // message with all the usernames.
1112 password_autofill_->pause_messages();
Garrett Casto 2014/03/06 01:23:46 I'd probably remove pause_messages() and resume_me
jww 2014/03/07 02:06:06 Yeah, I was overthinking it. I've modified the tes
1113 autofill_agent_->InputElementClicked(username_element_, false, true);
1114 ExpectAllCredentials();
1115 password_autofill_->resume_messages();
1116
1117 // Now simulate a user typing in the first letter of the username and then
1118 // clicking on the username element. While the typing of the first letter will
1119 // inline autocomplete, clicking on the element should still produce a message
1120 // with all the usernames.
Garrett Casto 2014/03/06 01:23:46 I think that we have a misunderstanding somewhere,
jww 2014/03/07 02:06:06 No misunderstanding; just a screw-up on my part.
1121 SimulateUsernameChange("a", true);
1122 password_autofill_->pause_messages();
Garrett Casto 2014/03/06 01:23:46 I'd probably remove pause_messages() and resume_me
jww 2014/03/07 02:06:06 Done.
1123 autofill_agent_->InputElementClicked(username_element_, false, true);
1124 ExpectAllCredentials();
1125 password_autofill_->resume_messages();
1126 }
1127
1019 } // namespace autofill 1128 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698