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" |
11 #include "components/autofill/content/renderer/password_autofill_agent.h" | 11 #include "components/autofill/content/renderer/password_autofill_agent.h" |
12 #include "components/autofill/content/renderer/test_password_autofill_agent.h" | 12 #include "components/autofill/content/renderer/test_password_autofill_agent.h" |
13 #include "components/autofill/core/common/form_data.h" | 13 #include "components/autofill/core/common/form_data.h" |
14 #include "components/autofill/core/common/form_field_data.h" | 14 #include "components/autofill/core/common/form_field_data.h" |
15 #include "components/autofill/core/common/password_autofill_util.h" | |
16 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
17 #include "third_party/WebKit/public/platform/WebString.h" | 16 #include "third_party/WebKit/public/platform/WebString.h" |
18 #include "third_party/WebKit/public/platform/WebVector.h" | 17 #include "third_party/WebKit/public/platform/WebVector.h" |
19 #include "third_party/WebKit/public/web/WebDocument.h" | 18 #include "third_party/WebKit/public/web/WebDocument.h" |
20 #include "third_party/WebKit/public/web/WebElement.h" | 19 #include "third_party/WebKit/public/web/WebElement.h" |
21 #include "third_party/WebKit/public/web/WebFormElement.h" | 20 #include "third_party/WebKit/public/web/WebFormElement.h" |
22 #include "third_party/WebKit/public/web/WebInputElement.h" | 21 #include "third_party/WebKit/public/web/WebInputElement.h" |
23 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 22 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
24 #include "third_party/WebKit/public/web/WebNode.h" | 23 #include "third_party/WebKit/public/web/WebNode.h" |
25 #include "third_party/WebKit/public/web/WebView.h" | 24 #include "third_party/WebKit/public/web/WebView.h" |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 void SimulateUsernameChange(const std::string& username, | 317 void SimulateUsernameChange(const std::string& username, |
319 bool move_caret_to_end, | 318 bool move_caret_to_end, |
320 bool is_user_input = false) { | 319 bool is_user_input = false) { |
321 SimulateInputChangeForElement(username, | 320 SimulateInputChangeForElement(username, |
322 move_caret_to_end, | 321 move_caret_to_end, |
323 GetMainFrame(), | 322 GetMainFrame(), |
324 username_element_, | 323 username_element_, |
325 is_user_input); | 324 is_user_input); |
326 } | 325 } |
327 | 326 |
328 // Tests that no suggestion popup is generated when the username_element_ is | |
329 // edited. | |
330 void ExpectNoSuggestionsPopup() { | |
331 // The first test below ensures that the suggestions have been handled by | |
332 // the password_autofill_agent, even though autocomplete='off' is set. The | |
333 // second check ensures that, although handled, no "show suggestions" IPC to | |
334 // the browser was generated. | |
335 // | |
336 // This is interesting in the specific case of an autocomplete='off' form | |
337 // that also has a remembered username and password | |
338 // (http://crbug.com/326679). To fix the DCHECK that this case used to hit, | |
339 // |true| is returned from ShowSuggestions for all forms with valid | |
340 // usersnames that are autocomplete='off', prentending that a selection box | |
341 // has been shown to the user. Of course, it hasn't, so a message is never | |
342 // sent to the browser on acceptance, and the DCHECK isn't hit (and nothing | |
343 // is filled). | |
344 // | |
345 // These tests only make sense in the context of not ignoring | |
346 // autocomplete='off', so only test them if the disable autocomplete='off' | |
347 // flag is not enabled. | |
348 // TODO(jww): Remove this function and callers once autocomplete='off' is | |
349 // permanently ignored. | |
350 if (!ShouldIgnoreAutocompleteOffForPasswordFields()) { | |
351 EXPECT_TRUE( | |
352 password_autofill_agent_->ShowSuggestions(username_element_, false)); | |
353 | |
354 EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching( | |
355 AutofillHostMsg_ShowPasswordSuggestions::ID)); | |
356 } | |
357 } | |
358 | |
359 void SimulateKeyDownEvent(const WebInputElement& element, | 327 void SimulateKeyDownEvent(const WebInputElement& element, |
360 ui::KeyboardCode key_code) { | 328 ui::KeyboardCode key_code) { |
361 blink::WebKeyboardEvent key_event; | 329 blink::WebKeyboardEvent key_event; |
362 key_event.windowsKeyCode = key_code; | 330 key_event.windowsKeyCode = key_code; |
363 static_cast<blink::WebAutofillClient*>(autofill_agent_) | 331 static_cast<blink::WebAutofillClient*>(autofill_agent_) |
364 ->textFieldDidReceiveKeyDown(element, key_event); | 332 ->textFieldDidReceiveKeyDown(element, key_event); |
365 } | 333 } |
366 | 334 |
367 void CheckTextFieldsStateForElements(const WebInputElement& username_element, | 335 void CheckTextFieldsStateForElements(const WebInputElement& username_element, |
368 const std::string& username, | 336 const std::string& username, |
(...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
963 | 931 |
964 // Verfies that a DOM-activated UI event will not cause an autofill. | 932 // Verfies that a DOM-activated UI event will not cause an autofill. |
965 TEST_F(PasswordAutofillAgentTest, NoDOMActivationTest) { | 933 TEST_F(PasswordAutofillAgentTest, NoDOMActivationTest) { |
966 // Trigger the initial autocomplete. | 934 // Trigger the initial autocomplete. |
967 SimulateOnFillPasswordForm(fill_data_); | 935 SimulateOnFillPasswordForm(fill_data_); |
968 | 936 |
969 ExecuteJavaScript(kJavaScriptClick); | 937 ExecuteJavaScript(kJavaScriptClick); |
970 CheckTextFieldsDOMState(kAliceUsername, true, "", true); | 938 CheckTextFieldsDOMState(kAliceUsername, true, "", true); |
971 } | 939 } |
972 | 940 |
973 // Regression test for http://crbug.com/326679 | |
974 TEST_F(PasswordAutofillAgentTest, SelectUsernameWithUsernameAutofillOff) { | |
975 // Simulate the browser sending back the login info. | |
976 SimulateOnFillPasswordForm(fill_data_); | |
977 | |
978 // Set the username element to autocomplete='off' | |
979 username_element_.setAttribute(WebString::fromUTF8("autocomplete"), | |
980 WebString::fromUTF8("off")); | |
981 | |
982 // Simulate the user changing the username to some known username. | |
983 SimulateUsernameChange(kAliceUsername, true); | |
984 | |
985 ExpectNoSuggestionsPopup(); | |
986 } | |
987 | |
988 // Regression test for http://crbug.com/326679 | |
989 TEST_F(PasswordAutofillAgentTest, | |
990 SelectUnknownUsernameWithUsernameAutofillOff) { | |
991 // Simulate the browser sending back the login info. | |
992 SimulateOnFillPasswordForm(fill_data_); | |
993 | |
994 // Set the username element to autocomplete='off' | |
995 username_element_.setAttribute(WebString::fromUTF8("autocomplete"), | |
996 WebString::fromUTF8("off")); | |
997 | |
998 // Simulate the user changing the username to some unknown username. | |
999 SimulateUsernameChange("foo", true); | |
1000 | |
1001 ExpectNoSuggestionsPopup(); | |
1002 } | |
1003 | |
1004 // Regression test for http://crbug.com/326679 | |
1005 TEST_F(PasswordAutofillAgentTest, SelectUsernameWithPasswordAutofillOff) { | |
1006 // Simulate the browser sending back the login info. | |
1007 SimulateOnFillPasswordForm(fill_data_); | |
1008 | |
1009 // Set the main password element to autocomplete='off' | |
1010 password_element_.setAttribute(WebString::fromUTF8("autocomplete"), | |
1011 WebString::fromUTF8("off")); | |
1012 | |
1013 // Simulate the user changing the username to some known username. | |
1014 SimulateUsernameChange(kAliceUsername, true); | |
1015 | |
1016 ExpectNoSuggestionsPopup(); | |
1017 } | |
1018 | |
1019 // Regression test for http://crbug.com/326679 | |
1020 TEST_F(PasswordAutofillAgentTest, | |
1021 SelectUnknownUsernameWithPasswordAutofillOff) { | |
1022 // Simulate the browser sending back the login info. | |
1023 SimulateOnFillPasswordForm(fill_data_); | |
1024 | |
1025 // Set the main password element to autocomplete='off' | |
1026 password_element_.setAttribute(WebString::fromUTF8("autocomplete"), | |
1027 WebString::fromUTF8("off")); | |
1028 | |
1029 // Simulate the user changing the username to some unknown username. | |
1030 SimulateUsernameChange("foo", true); | |
1031 | |
1032 ExpectNoSuggestionsPopup(); | |
1033 } | |
1034 | |
1035 // Verifies that password autofill triggers onChange events in JavaScript for | 941 // Verifies that password autofill triggers onChange events in JavaScript for |
1036 // forms that are filled on page load. | 942 // forms that are filled on page load. |
1037 TEST_F(PasswordAutofillAgentTest, | 943 TEST_F(PasswordAutofillAgentTest, |
1038 PasswordAutofillTriggersOnChangeEventsOnLoad) { | 944 PasswordAutofillTriggersOnChangeEventsOnLoad) { |
1039 std::string html = std::string(kFormHTML) + kOnChangeDetectionScript; | 945 std::string html = std::string(kFormHTML) + kOnChangeDetectionScript; |
1040 LoadHTML(html.c_str()); | 946 LoadHTML(html.c_str()); |
1041 UpdateOriginForHTML(html); | 947 UpdateOriginForHTML(html); |
1042 UpdateUsernameAndPasswordElements(); | 948 UpdateUsernameAndPasswordElements(); |
1043 | 949 |
1044 // Simulate the browser sending back the login info, it triggers the | 950 // Simulate the browser sending back the login info, it triggers the |
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1626 password_element_, | 1532 password_element_, |
1627 /*is_user_input=*/true); | 1533 /*is_user_input=*/true); |
1628 | 1534 |
1629 // Simulate the user typing a stored username. | 1535 // Simulate the user typing a stored username. |
1630 SimulateUsernameChange(kAliceUsername, true); | 1536 SimulateUsernameChange(kAliceUsername, true); |
1631 // The autofileld password should replace the typed one. | 1537 // The autofileld password should replace the typed one. |
1632 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); | 1538 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); |
1633 } | 1539 } |
1634 | 1540 |
1635 } // namespace autofill | 1541 } // namespace autofill |
OLD | NEW |