| OLD | NEW | 
|    1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |    1 // Copyright (c) 2010 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 "app/keyboard_codes.h" |    5 #include "app/keyboard_codes.h" | 
|    6 #include "base/string_util.h" |    6 #include "base/string_util.h" | 
|    7 #include "base/utf_string_conversions.h" |    7 #include "base/utf_string_conversions.h" | 
|    8 #include "chrome/renderer/password_autocomplete_manager.h" |    8 #include "chrome/renderer/password_autocomplete_manager.h" | 
|    9 #include "chrome/test/render_view_test.h" |    9 #include "chrome/test/render_view_test.h" | 
|   10 #include "testing/gtest/include/gtest/gtest.h" |   10 #include "testing/gtest/include/gtest/gtest.h" | 
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  145   string16 password2_; |  145   string16 password2_; | 
|  146   PasswordFormFillData fill_data_; |  146   PasswordFormFillData fill_data_; | 
|  147  |  147  | 
|  148   WebInputElement username_element_; |  148   WebInputElement username_element_; | 
|  149   WebInputElement password_element_; |  149   WebInputElement password_element_; | 
|  150  |  150  | 
|  151  private: |  151  private: | 
|  152   DISALLOW_COPY_AND_ASSIGN(PasswordAutocompleteManagerTest); |  152   DISALLOW_COPY_AND_ASSIGN(PasswordAutocompleteManagerTest); | 
|  153 }; |  153 }; | 
|  154  |  154  | 
|  155 #if defined(WEBKIT_BUG_41283_IS_FIXED) |  | 
|  156 #define MAYBE_InitialAutocomplete InitialAutocomplete |  | 
|  157 #define MAYBE_NoInitialAutocompleteForReadOnly NoInitialAutocompleteForReadOnly |  | 
|  158 #define MAYBE_PasswordClearOnEdit PasswordClearOnEdit |  | 
|  159 #define MAYBE_WaitUsername WaitUsername |  | 
|  160 #define MAYBE_InlineAutocomplete InlineAutocomplete |  | 
|  161 #define MAYBE_SuggestionSelect SuggestionSelect |  | 
|  162 #else |  | 
|  163 #define MAYBE_InitialAutocomplete DISABLED_InitialAutocomplete |  | 
|  164 #define MAYBE_NoInitialAutocompleteForReadOnly \ |  | 
|  165     DISABLED_NoInitialAutocompleteForReadOnly |  | 
|  166 #define MAYBE_PasswordClearOnEdit DISABLED_PasswordClearOnEdit |  | 
|  167 #define MAYBE_WaitUsername DISABLED_WaitUsername |  | 
|  168 #define MAYBE_InlineAutocomplete DISABLED_InlineAutocomplete |  | 
|  169 #define MAYBE_SuggestionSelect DISABLED_SuggestionSelect |  | 
|  170 #endif |  | 
|  171  |  | 
|  172 // Tests that the password login is autocompleted as expected when the browser |  155 // Tests that the password login is autocompleted as expected when the browser | 
|  173 // sends back the password info. |  156 // sends back the password info. | 
|  174 TEST_F(PasswordAutocompleteManagerTest, MAYBE_InitialAutocomplete) { |  157 TEST_F(PasswordAutocompleteManagerTest, InitialAutocomplete) { | 
|  175   /* |  158   /* | 
|  176    * Right now we are not sending the message to the browser because we are |  159    * Right now we are not sending the message to the browser because we are | 
|  177    * loading a data URL and the security origin canAccessPasswordManager() |  160    * loading a data URL and the security origin canAccessPasswordManager() | 
|  178    * returns false.  May be we should mock URL loading to cirmcuvent this? |  161    * returns false.  May be we should mock URL loading to cirmcuvent this? | 
|  179    TODO(jcivelli): find a way to make the security origin not deny access to the |  162    TODO(jcivelli): find a way to make the security origin not deny access to the | 
|  180                    password manager and then reenable this code. |  163                    password manager and then reenable this code. | 
|  181  |  164  | 
|  182   // The form has been loaded, we should have sent the browser a message about |  165   // The form has been loaded, we should have sent the browser a message about | 
|  183   // the form. |  166   // the form. | 
|  184   const IPC::Message* msg = render_thread_.sink().GetFirstMessageMatching( |  167   const IPC::Message* msg = render_thread_.sink().GetFirstMessageMatching( | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
|  196  |  179  | 
|  197   // Simulate the browser sending back the login info, it triggers the |  180   // Simulate the browser sending back the login info, it triggers the | 
|  198   // autocomplete. |  181   // autocomplete. | 
|  199   SimulateOnFillPasswordForm(fill_data_); |  182   SimulateOnFillPasswordForm(fill_data_); | 
|  200  |  183  | 
|  201   // The username and password should have been autocompleted. |  184   // The username and password should have been autocompleted. | 
|  202   CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); |  185   CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); | 
|  203 } |  186 } | 
|  204  |  187  | 
|  205 // Tests that changing the username does not fill a read-only password field. |  188 // Tests that changing the username does not fill a read-only password field. | 
|  206 TEST_F(PasswordAutocompleteManagerTest, |  189 TEST_F(PasswordAutocompleteManagerTest, NoInitialAutocompleteForReadOnly) { | 
|  207        MAYBE_NoInitialAutocompleteForReadOnly) { |  | 
|  208   password_element_.setAttribute(WebString::fromUTF8("readonly"), |  190   password_element_.setAttribute(WebString::fromUTF8("readonly"), | 
|  209                                  WebString::fromUTF8("true")); |  191                                  WebString::fromUTF8("true")); | 
|  210  |  192  | 
|  211   // Simulate the browser sending back the login info, it triggers the |  193   // Simulate the browser sending back the login info, it triggers the | 
|  212   // autocompleted. |  194   // autocompleted. | 
|  213   SimulateOnFillPasswordForm(fill_data_); |  195   SimulateOnFillPasswordForm(fill_data_); | 
|  214  |  196  | 
|  215   // Only the username should have been autocompleted. |  197   // Only the username should have been autocompleted. | 
|  216   // TODO(jcivelli): may be we should not event fill the username? |  198   // TODO(jcivelli): may be we should not event fill the username? | 
|  217   CheckTextFieldsState(kAliceUsername, true, "", false); |  199   CheckTextFieldsState(kAliceUsername, true, "", false); | 
|  218 } |  200 } | 
|  219  |  201  | 
|  220 // Tests that editing the password clears the autocompleted password field. |  202 // Tests that editing the password clears the autocompleted password field. | 
|  221 TEST_F(PasswordAutocompleteManagerTest, MAYBE_PasswordClearOnEdit) { |  203 TEST_F(PasswordAutocompleteManagerTest, PasswordClearOnEdit) { | 
|  222   // Simulate the browser sending back the login info, it triggers the |  204   // Simulate the browser sending back the login info, it triggers the | 
|  223   // autocomplete. |  205   // autocomplete. | 
|  224   SimulateOnFillPasswordForm(fill_data_); |  206   SimulateOnFillPasswordForm(fill_data_); | 
|  225  |  207  | 
|  226   // Simulate the user changing the username to some unknown username. |  208   // Simulate the user changing the username to some unknown username. | 
|  227   SimulateUsernameChange("alicia", true); |  209   SimulateUsernameChange("alicia", true); | 
|  228  |  210  | 
|  229   // The password should have been cleared. |  211   // The password should have been cleared. | 
|  230   CheckTextFieldsState("alicia", false, "", false); |  212   CheckTextFieldsState("alicia", false, "", false); | 
|  231 } |  213 } | 
|  232  |  214  | 
|  233 // Tests that we only autocomplete on focus lost and with a full username match |  215 // Tests that we only autocomplete on focus lost and with a full username match | 
|  234 // when |wait_for_username| is true. |  216 // when |wait_for_username| is true. | 
|  235 TEST_F(PasswordAutocompleteManagerTest, MAYBE_WaitUsername) { |  217 TEST_F(PasswordAutocompleteManagerTest, WaitUsername) { | 
|  236   // Simulate the browser sending back the login info. |  218   // Simulate the browser sending back the login info. | 
|  237   fill_data_.wait_for_username = true; |  219   fill_data_.wait_for_username = true; | 
|  238   SimulateOnFillPasswordForm(fill_data_); |  220   SimulateOnFillPasswordForm(fill_data_); | 
|  239  |  221  | 
|  240   // No auto-fill should have taken place. |  222   // No auto-fill should have taken place. | 
|  241   CheckTextFieldsState("", false, "", false); |  223   CheckTextFieldsState("", false, "", false); | 
|  242  |  224  | 
|  243   // No autocomplete should happen when text is entered in the username. |  225   // No autocomplete should happen when text is entered in the username. | 
|  244   SimulateUsernameChange("a", true); |  226   SimulateUsernameChange("a", true); | 
|  245   CheckTextFieldsState("a", false, "", false); |  227   CheckTextFieldsState("a", false, "", false); | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
|  258   CheckTextFieldsState("al", false, "", false); |  240   CheckTextFieldsState("al", false, "", false); | 
|  259   username_element_.setValue("alices"); |  241   username_element_.setValue("alices"); | 
|  260   view_->textFieldDidEndEditing(username_element_); |  242   view_->textFieldDidEndEditing(username_element_); | 
|  261   CheckTextFieldsState("alices", false, "", false); |  243   CheckTextFieldsState("alices", false, "", false); | 
|  262   username_element_.setValue(ASCIIToUTF16(kAliceUsername)); |  244   username_element_.setValue(ASCIIToUTF16(kAliceUsername)); | 
|  263   view_->textFieldDidEndEditing(username_element_); |  245   view_->textFieldDidEndEditing(username_element_); | 
|  264   CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); |  246   CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); | 
|  265 } |  247 } | 
|  266  |  248  | 
|  267 // Tests that inline autocompletion works properly. |  249 // Tests that inline autocompletion works properly. | 
|  268 TEST_F(PasswordAutocompleteManagerTest, MAYBE_InlineAutocomplete) { |  250 TEST_F(PasswordAutocompleteManagerTest, InlineAutocomplete) { | 
|  269   // Simulate the browser sending back the login info. |  251   // Simulate the browser sending back the login info. | 
|  270   SimulateOnFillPasswordForm(fill_data_); |  252   SimulateOnFillPasswordForm(fill_data_); | 
|  271  |  253  | 
|  272   // Clear the textfields to start fresh. |  254   // Clear the textfields to start fresh. | 
|  273   ClearUsernameAndPasswordFields(); |  255   ClearUsernameAndPasswordFields(); | 
|  274  |  256  | 
|  275   // Simulate the user typing in the first letter of 'alice', a stored username. |  257   // Simulate the user typing in the first letter of 'alice', a stored username. | 
|  276   SimulateUsernameChange("a", true); |  258   SimulateUsernameChange("a", true); | 
|  277   // Both the username and password textfields should reflect selection of the |  259   // Both the username and password textfields should reflect selection of the | 
|  278   // stored login. |  260   // stored login. | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
|  304   CheckUsernameSelection(3, 3);  // No selection. |  286   CheckUsernameSelection(3, 3);  // No selection. | 
|  305  |  287  | 
|  306   // Ok, so now the user removes all the text and enters the letter 'b'. |  288   // Ok, so now the user removes all the text and enters the letter 'b'. | 
|  307   SimulateUsernameChange("b", true); |  289   SimulateUsernameChange("b", true); | 
|  308   // The username and password fields should match the 'bob' entry. |  290   // The username and password fields should match the 'bob' entry. | 
|  309   CheckTextFieldsState(kBobUsername, true, kBobPassword, true); |  291   CheckTextFieldsState(kBobUsername, true, kBobPassword, true); | 
|  310   CheckUsernameSelection(1, 3); |  292   CheckUsernameSelection(1, 3); | 
|  311 } |  293 } | 
|  312  |  294  | 
|  313 // Tests that selecting and item in the suggestion drop-down works. |  295 // Tests that selecting and item in the suggestion drop-down works. | 
|  314 TEST_F(PasswordAutocompleteManagerTest, MAYBE_SuggestionSelect) { |  296 TEST_F(PasswordAutocompleteManagerTest, SuggestionSelect) { | 
|  315   // Simulate the browser sending back the login info. |  297   // Simulate the browser sending back the login info. | 
|  316   SimulateOnFillPasswordForm(fill_data_); |  298   SimulateOnFillPasswordForm(fill_data_); | 
|  317  |  299  | 
|  318   // Clear the textfields to start fresh. |  300   // Clear the textfields to start fresh. | 
|  319   ClearUsernameAndPasswordFields(); |  301   ClearUsernameAndPasswordFields(); | 
|  320  |  302  | 
|  321   // To simulate a selection in the suggestion drop-down we just mimick what the |  303   // To simulate a selection in the suggestion drop-down we just mimick what the | 
|  322   // WebView does: it sets the element value then calls |  304   // WebView does: it sets the element value then calls | 
|  323   // didAcceptAutocompleteSuggestion on the renderer. |  305   // didAcceptAutocompleteSuggestion on the renderer. | 
|  324   username_element_.setValue(ASCIIToUTF16(kAliceUsername)); |  306   username_element_.setValue(ASCIIToUTF16(kAliceUsername)); | 
|  325   view_->didAcceptAutocompleteSuggestion(username_element_); |  307   view_->didAcceptAutocompleteSuggestion(username_element_); | 
|  326  |  308  | 
|  327   // Autocomplete should have kicked in. |  309   // Autocomplete should have kicked in. | 
|  328   CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); |  310   CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true); | 
|  329 } |  311 } | 
|  330  |  312  | 
|  331 }  // namespace |  313 }  // namespace | 
| OLD | NEW |