OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "components/password_manager/core/browser/password_autofill_manager.h" | 5 #include "components/password_manager/core/browser/password_autofill_manager.h" |
6 | 6 |
7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "components/autofill/core/browser/popup_item_ids.h" | 10 #include "components/autofill/core/browser/popup_item_ids.h" |
| 11 #include "components/autofill/core/browser/suggestion_test_helpers.h" |
11 #include "components/autofill/core/browser/test_autofill_client.h" | 12 #include "components/autofill/core/browser/test_autofill_client.h" |
12 #include "components/autofill/core/browser/test_autofill_driver.h" | 13 #include "components/autofill/core/browser/test_autofill_driver.h" |
13 #include "components/autofill/core/common/autofill_constants.h" | 14 #include "components/autofill/core/common/autofill_constants.h" |
14 #include "components/autofill/core/common/form_field_data.h" | 15 #include "components/autofill/core/common/form_field_data.h" |
15 #include "components/autofill/core/common/password_form_fill_data.h" | 16 #include "components/autofill/core/common/password_form_fill_data.h" |
16 #include "components/password_manager/core/browser/stub_password_manager_client.
h" | 17 #include "components/password_manager/core/browser/stub_password_manager_client.
h" |
17 #include "components/password_manager/core/browser/stub_password_manager_driver.
h" | 18 #include "components/password_manager/core/browser/stub_password_manager_driver.
h" |
18 #include "components/strings/grit/components_strings.h" | 19 #include "components/strings/grit/components_strings.h" |
19 #include "testing/gmock/include/gmock/gmock.h" | 20 #include "testing/gmock/include/gmock/gmock.h" |
20 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
21 #include "ui/base/l10n/l10n_util.h" | 22 #include "ui/base/l10n/l10n_util.h" |
22 #include "ui/gfx/geometry/rect_f.h" | 23 #include "ui/gfx/geometry/rect_f.h" |
23 | 24 |
24 // The name of the username/password element in the form. | 25 // The name of the username/password element in the form. |
25 const char kUsernameName[] = "username"; | 26 const char kUsernameName[] = "username"; |
26 const char kInvalidUsername[] = "no-username"; | 27 const char kInvalidUsername[] = "no-username"; |
27 const char kPasswordName[] = "password"; | 28 const char kPasswordName[] = "password"; |
28 | 29 |
29 const char kAliceUsername[] = "alice"; | 30 const char kAliceUsername[] = "alice"; |
30 const char kAlicePassword[] = "password"; | 31 const char kAlicePassword[] = "password"; |
31 | 32 |
| 33 using autofill::Suggestion; |
| 34 using autofill::SuggestionVectorIdsAre; |
| 35 using autofill::SuggestionVectorValuesAre; |
32 using testing::_; | 36 using testing::_; |
33 | 37 |
34 namespace autofill { | 38 namespace autofill { |
35 class AutofillPopupDelegate; | 39 class AutofillPopupDelegate; |
36 } | 40 } |
37 | 41 |
38 namespace password_manager { | 42 namespace password_manager { |
39 | 43 |
40 namespace { | 44 namespace { |
41 | 45 |
42 class MockPasswordManagerDriver : public StubPasswordManagerDriver { | 46 class MockPasswordManagerDriver : public StubPasswordManagerDriver { |
43 public: | 47 public: |
44 MOCK_METHOD2(FillSuggestion, | 48 MOCK_METHOD2(FillSuggestion, |
45 void(const base::string16&, const base::string16&)); | 49 void(const base::string16&, const base::string16&)); |
46 MOCK_METHOD2(PreviewSuggestion, | 50 MOCK_METHOD2(PreviewSuggestion, |
47 void(const base::string16&, const base::string16&)); | 51 void(const base::string16&, const base::string16&)); |
48 }; | 52 }; |
49 | 53 |
50 class TestPasswordManagerClient : public StubPasswordManagerClient { | 54 class TestPasswordManagerClient : public StubPasswordManagerClient { |
51 public: | 55 public: |
52 MockPasswordManagerDriver* mock_driver() { return &driver_; } | 56 MockPasswordManagerDriver* mock_driver() { return &driver_; } |
53 | 57 |
54 private: | 58 private: |
55 MockPasswordManagerDriver driver_; | 59 MockPasswordManagerDriver driver_; |
56 }; | 60 }; |
57 | 61 |
58 class MockAutofillClient : public autofill::TestAutofillClient { | 62 class MockAutofillClient : public autofill::TestAutofillClient { |
59 public: | 63 public: |
60 MOCK_METHOD7(ShowAutofillPopup, | 64 MOCK_METHOD4(ShowAutofillPopup, |
61 void(const gfx::RectF& element_bounds, | 65 void(const gfx::RectF& element_bounds, |
62 base::i18n::TextDirection text_direction, | 66 base::i18n::TextDirection text_direction, |
63 const std::vector<base::string16>& values, | 67 const std::vector<Suggestion>& suggestions, |
64 const std::vector<base::string16>& labels, | |
65 const std::vector<base::string16>& icons, | |
66 const std::vector<int>& identifiers, | |
67 base::WeakPtr<autofill::AutofillPopupDelegate> delegate)); | 68 base::WeakPtr<autofill::AutofillPopupDelegate> delegate)); |
68 MOCK_METHOD0(HideAutofillPopup, void()); | 69 MOCK_METHOD0(HideAutofillPopup, void()); |
69 }; | 70 }; |
70 | 71 |
71 } // namespace | 72 } // namespace |
72 | 73 |
73 class PasswordAutofillManagerTest : public testing::Test { | 74 class PasswordAutofillManagerTest : public testing::Test { |
74 protected: | 75 protected: |
75 PasswordAutofillManagerTest() | 76 PasswordAutofillManagerTest() |
76 : test_username_(base::ASCIIToUTF16(kAliceUsername)), | 77 : test_username_(base::ASCIIToUTF16(kAliceUsername)), |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 password_autofill_manager_->OnAddPasswordFormMapping(dummy_key, data); | 182 password_autofill_manager_->OnAddPasswordFormMapping(dummy_key, data); |
182 | 183 |
183 EXPECT_CALL(*client->mock_driver(), | 184 EXPECT_CALL(*client->mock_driver(), |
184 FillSuggestion(test_username_, test_password_)); | 185 FillSuggestion(test_username_, test_password_)); |
185 | 186 |
186 // The enums must be cast to ints to prevent compile errors on linux_rel. | 187 // The enums must be cast to ints to prevent compile errors on linux_rel. |
187 EXPECT_CALL(*autofill_client, | 188 EXPECT_CALL(*autofill_client, |
188 ShowAutofillPopup( | 189 ShowAutofillPopup( |
189 _, | 190 _, |
190 _, | 191 _, |
191 _, | 192 SuggestionVectorIdsAre(testing::ElementsAre( |
192 _, | 193 autofill::POPUP_ITEM_ID_PASSWORD_ENTRY)), |
193 _, | |
194 testing::ElementsAre(autofill::POPUP_ITEM_ID_PASSWORD_ENTRY), | |
195 _)); | 194 _)); |
196 password_autofill_manager_->OnShowPasswordSuggestions( | 195 password_autofill_manager_->OnShowPasswordSuggestions( |
197 dummy_key, base::i18n::RIGHT_TO_LEFT, base::string16(), false, | 196 dummy_key, base::i18n::RIGHT_TO_LEFT, base::string16(), false, |
198 element_bounds); | 197 element_bounds); |
199 | 198 |
200 // Accepting a suggestion should trigger a call to hide the popup. | 199 // Accepting a suggestion should trigger a call to hide the popup. |
201 EXPECT_CALL(*autofill_client, HideAutofillPopup()); | 200 EXPECT_CALL(*autofill_client, HideAutofillPopup()); |
202 password_autofill_manager_->DidAcceptSuggestion( | 201 password_autofill_manager_->DidAcceptSuggestion( |
203 test_username_, autofill::POPUP_ITEM_ID_PASSWORD_ENTRY); | 202 test_username_, autofill::POPUP_ITEM_ID_PASSWORD_ENTRY); |
204 } | 203 } |
(...skipping 23 matching lines...) Expand all Loading... |
228 other_names.push_back(other_username); | 227 other_names.push_back(other_username); |
229 data.other_possible_usernames[usernames_key] = other_names; | 228 data.other_possible_usernames[usernames_key] = other_names; |
230 | 229 |
231 int dummy_key = 0; | 230 int dummy_key = 0; |
232 password_autofill_manager_->OnAddPasswordFormMapping(dummy_key, data); | 231 password_autofill_manager_->OnAddPasswordFormMapping(dummy_key, data); |
233 | 232 |
234 // First, simulate displaying suggestions matching an empty prefix. | 233 // First, simulate displaying suggestions matching an empty prefix. |
235 EXPECT_CALL(*autofill_client, | 234 EXPECT_CALL(*autofill_client, |
236 ShowAutofillPopup( | 235 ShowAutofillPopup( |
237 element_bounds, _, | 236 element_bounds, _, |
238 testing::UnorderedElementsAre( | 237 SuggestionVectorValuesAre(testing::UnorderedElementsAre( |
239 test_username_, additional_username, other_username), | 238 test_username_, additional_username, other_username)), |
240 _, _, _, _)); | 239 _)); |
241 password_autofill_manager_->OnShowPasswordSuggestions( | 240 password_autofill_manager_->OnShowPasswordSuggestions( |
242 dummy_key, base::i18n::RIGHT_TO_LEFT, base::string16(), false, | 241 dummy_key, base::i18n::RIGHT_TO_LEFT, base::string16(), false, |
243 element_bounds); | 242 element_bounds); |
244 | 243 |
245 // Now simulate displaying suggestions matching "John". | 244 // Now simulate displaying suggestions matching "John". |
246 EXPECT_CALL(*autofill_client, | 245 EXPECT_CALL(*autofill_client, |
247 ShowAutofillPopup(element_bounds, _, | 246 ShowAutofillPopup( |
248 testing::UnorderedElementsAre( | 247 element_bounds, _, |
249 additional_username, other_username), | 248 SuggestionVectorValuesAre(testing::UnorderedElementsAre( |
250 _, _, _, _)); | 249 additional_username, |
| 250 other_username)), |
| 251 _)); |
251 password_autofill_manager_->OnShowPasswordSuggestions( | 252 password_autofill_manager_->OnShowPasswordSuggestions( |
252 dummy_key, base::i18n::RIGHT_TO_LEFT, base::ASCIIToUTF16("John"), false, | 253 dummy_key, base::i18n::RIGHT_TO_LEFT, base::ASCIIToUTF16("John"), false, |
253 element_bounds); | 254 element_bounds); |
254 | 255 |
255 // Finally, simulate displaying all suggestions, without any prefix matching. | 256 // Finally, simulate displaying all suggestions, without any prefix matching. |
256 EXPECT_CALL(*autofill_client, | 257 EXPECT_CALL(*autofill_client, |
257 ShowAutofillPopup( | 258 ShowAutofillPopup( |
258 element_bounds, _, | 259 element_bounds, _, |
259 testing::UnorderedElementsAre( | 260 SuggestionVectorValuesAre(testing::UnorderedElementsAre( |
260 test_username_, additional_username, other_username), | 261 test_username_, additional_username, other_username)), |
261 _, _, _, _)); | 262 _)); |
262 password_autofill_manager_->OnShowPasswordSuggestions( | 263 password_autofill_manager_->OnShowPasswordSuggestions( |
263 dummy_key, base::i18n::RIGHT_TO_LEFT, base::ASCIIToUTF16("xyz"), true, | 264 dummy_key, base::i18n::RIGHT_TO_LEFT, base::ASCIIToUTF16("xyz"), true, |
264 element_bounds); | 265 element_bounds); |
265 } | 266 } |
266 | 267 |
267 TEST_F(PasswordAutofillManagerTest, FillSuggestionPasswordField) { | 268 TEST_F(PasswordAutofillManagerTest, FillSuggestionPasswordField) { |
268 scoped_ptr<TestPasswordManagerClient> client(new TestPasswordManagerClient); | 269 scoped_ptr<TestPasswordManagerClient> client(new TestPasswordManagerClient); |
269 scoped_ptr<MockAutofillClient> autofill_client(new MockAutofillClient); | 270 scoped_ptr<MockAutofillClient> autofill_client(new MockAutofillClient); |
270 InitializePasswordAutofillManager(client.get(), autofill_client.get()); | 271 InitializePasswordAutofillManager(client.get(), autofill_client.get()); |
271 | 272 |
(...skipping 18 matching lines...) Expand all Loading... |
290 int dummy_key = 0; | 291 int dummy_key = 0; |
291 password_autofill_manager_->OnAddPasswordFormMapping(dummy_key, data); | 292 password_autofill_manager_->OnAddPasswordFormMapping(dummy_key, data); |
292 | 293 |
293 // Simulate displaying suggestions matching a username and specifying that the | 294 // Simulate displaying suggestions matching a username and specifying that the |
294 // field is a password field. | 295 // field is a password field. |
295 base::string16 title = l10n_util::GetStringUTF16( | 296 base::string16 title = l10n_util::GetStringUTF16( |
296 IDS_AUTOFILL_PASSWORD_FIELD_SUGGESTIONS_TITLE); | 297 IDS_AUTOFILL_PASSWORD_FIELD_SUGGESTIONS_TITLE); |
297 EXPECT_CALL(*autofill_client, | 298 EXPECT_CALL(*autofill_client, |
298 ShowAutofillPopup( | 299 ShowAutofillPopup( |
299 element_bounds, _, | 300 element_bounds, _, |
300 testing::UnorderedElementsAre(title, test_username_), | 301 SuggestionVectorValuesAre(testing::UnorderedElementsAre( |
301 _, _, _, _)); | 302 title, |
| 303 test_username_)), |
| 304 _)); |
302 password_autofill_manager_->OnShowPasswordSuggestions( | 305 password_autofill_manager_->OnShowPasswordSuggestions( |
303 dummy_key, base::i18n::RIGHT_TO_LEFT, test_username_, | 306 dummy_key, base::i18n::RIGHT_TO_LEFT, test_username_, |
304 autofill::IS_PASSWORD_FIELD, element_bounds); | 307 autofill::IS_PASSWORD_FIELD, element_bounds); |
305 } | 308 } |
306 | 309 |
307 } // namespace password_manager | 310 } // namespace password_manager |
OLD | NEW |