OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/content/browser/credential_manager_dispatc
her.h" | 5 #include "components/password_manager/content/browser/credential_manager_dispatc
her.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/prefs/pref_registry_simple.h" | 9 #include "base/prefs/pref_registry_simple.h" |
10 #include "base/prefs/testing_pref_service.h" | 10 #include "base/prefs/testing_pref_service.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 using testing::_; | 30 using testing::_; |
31 | 31 |
32 namespace { | 32 namespace { |
33 | 33 |
34 // Chosen by fair dice roll. Guaranteed to be random. | 34 // Chosen by fair dice roll. Guaranteed to be random. |
35 const int kRequestId = 4; | 35 const int kRequestId = 4; |
36 | 36 |
37 class MockPasswordManagerClient | 37 class MockPasswordManagerClient |
38 : public password_manager::StubPasswordManagerClient { | 38 : public password_manager::StubPasswordManagerClient { |
39 public: | 39 public: |
| 40 MOCK_CONST_METHOD0(IsPasswordManagerEnabledForCurrentPage, bool()); |
40 MOCK_CONST_METHOD0(IsOffTheRecord, bool()); | 41 MOCK_CONST_METHOD0(IsOffTheRecord, bool()); |
| 42 MOCK_CONST_METHOD0(DidLastPageLoadEncounterSSLErrors, bool()); |
41 MOCK_METHOD1(NotifyUserAutoSigninPtr, | 43 MOCK_METHOD1(NotifyUserAutoSigninPtr, |
42 bool(const std::vector<autofill::PasswordForm*>& local_forms)); | 44 bool(const std::vector<autofill::PasswordForm*>& local_forms)); |
43 MOCK_METHOD2(PromptUserToSavePasswordPtr, | 45 MOCK_METHOD2(PromptUserToSavePasswordPtr, |
44 void(password_manager::PasswordFormManager*, | 46 void(password_manager::PasswordFormManager*, |
45 password_manager::CredentialSourceType type)); | 47 password_manager::CredentialSourceType type)); |
46 MOCK_METHOD4(PromptUserToChooseCredentialsPtr, | 48 MOCK_METHOD4(PromptUserToChooseCredentialsPtr, |
47 bool(const std::vector<autofill::PasswordForm*>& local_forms, | 49 bool(const std::vector<autofill::PasswordForm*>& local_forms, |
48 const std::vector<autofill::PasswordForm*>& federated_forms, | 50 const std::vector<autofill::PasswordForm*>& federated_forms, |
49 const GURL& origin, | 51 const GURL& origin, |
50 base::Callback<void( | 52 base::Callback<void( |
51 const password_manager::CredentialInfo&)> callback)); | 53 const password_manager::CredentialInfo&)> callback)); |
52 | 54 |
53 MockPasswordManagerClient(password_manager::PasswordStore* store) | 55 MockPasswordManagerClient(password_manager::PasswordStore* store) |
54 : store_(store) { | 56 : store_(store) { |
55 prefs_.registry()->RegisterBooleanPref( | 57 prefs_.registry()->RegisterBooleanPref( |
56 password_manager::prefs::kPasswordManagerAutoSignin, true); | 58 password_manager::prefs::kPasswordManagerAutoSignin, true); |
| 59 prefs_.registry()->RegisterBooleanPref( |
| 60 password_manager::prefs::kPasswordManagerSavingEnabled, true); |
57 } | 61 } |
58 ~MockPasswordManagerClient() override {} | 62 ~MockPasswordManagerClient() override {} |
59 | 63 |
60 bool PromptUserToSavePassword( | 64 bool PromptUserToSavePassword( |
61 scoped_ptr<password_manager::PasswordFormManager> manager, | 65 scoped_ptr<password_manager::PasswordFormManager> manager, |
62 password_manager::CredentialSourceType type) override { | 66 password_manager::CredentialSourceType type) override { |
63 manager_.swap(manager); | 67 manager_.swap(manager); |
64 PromptUserToSavePasswordPtr(manager_.get(), type); | 68 PromptUserToSavePasswordPtr(manager_.get(), type); |
65 return true; | 69 return true; |
66 } | 70 } |
(...skipping 25 matching lines...) Expand all Loading... |
92 void NotifyUserAutoSignin( | 96 void NotifyUserAutoSignin( |
93 ScopedVector<autofill::PasswordForm> local_forms) override { | 97 ScopedVector<autofill::PasswordForm> local_forms) override { |
94 EXPECT_FALSE(local_forms.empty()); | 98 EXPECT_FALSE(local_forms.empty()); |
95 NotifyUserAutoSigninPtr(local_forms.get()); | 99 NotifyUserAutoSigninPtr(local_forms.get()); |
96 } | 100 } |
97 | 101 |
98 password_manager::PasswordFormManager* pending_manager() const { | 102 password_manager::PasswordFormManager* pending_manager() const { |
99 return manager_.get(); | 103 return manager_.get(); |
100 } | 104 } |
101 | 105 |
| 106 void set_password_manager_saving_enabled(bool is_enabled) { |
| 107 prefs_.SetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled, |
| 108 is_enabled); |
| 109 } |
| 110 |
102 void set_zero_click_enabled(bool zero_click_enabled) { | 111 void set_zero_click_enabled(bool zero_click_enabled) { |
103 prefs_.SetBoolean(password_manager::prefs::kPasswordManagerAutoSignin, | 112 prefs_.SetBoolean(password_manager::prefs::kPasswordManagerAutoSignin, |
104 zero_click_enabled); | 113 zero_click_enabled); |
105 } | 114 } |
106 | 115 |
107 private: | 116 private: |
108 TestingPrefServiceSimple prefs_; | 117 TestingPrefServiceSimple prefs_; |
109 password_manager::PasswordStore* store_; | 118 password_manager::PasswordStore* store_; |
110 scoped_ptr<password_manager::PasswordFormManager> manager_; | 119 scoped_ptr<password_manager::PasswordFormManager> manager_; |
111 | 120 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 public: | 164 public: |
156 CredentialManagerDispatcherTest() {} | 165 CredentialManagerDispatcherTest() {} |
157 | 166 |
158 void SetUp() override { | 167 void SetUp() override { |
159 content::RenderViewHostTestHarness::SetUp(); | 168 content::RenderViewHostTestHarness::SetUp(); |
160 store_ = new TestPasswordStore; | 169 store_ = new TestPasswordStore; |
161 client_.reset(new MockPasswordManagerClient(store_.get())); | 170 client_.reset(new MockPasswordManagerClient(store_.get())); |
162 dispatcher_.reset(new TestCredentialManagerDispatcher( | 171 dispatcher_.reset(new TestCredentialManagerDispatcher( |
163 web_contents(), client_.get(), &stub_driver_)); | 172 web_contents(), client_.get(), &stub_driver_)); |
164 ON_CALL(*client_, IsOffTheRecord()).WillByDefault(testing::Return(false)); | 173 ON_CALL(*client_, IsOffTheRecord()).WillByDefault(testing::Return(false)); |
| 174 ON_CALL(*client_, DidLastPageLoadEncounterSSLErrors()) |
| 175 .WillByDefault(testing::Return(false)); |
| 176 ON_CALL(*client_, IsPasswordManagerEnabledForCurrentPage()) |
| 177 .WillByDefault(testing::Return(true)); |
165 | 178 |
166 NavigateAndCommit(GURL("https://example.com/test.html")); | 179 NavigateAndCommit(GURL("https://example.com/test.html")); |
167 | 180 |
168 form_.username_value = base::ASCIIToUTF16("Username"); | 181 form_.username_value = base::ASCIIToUTF16("Username"); |
169 form_.display_name = base::ASCIIToUTF16("Display Name"); | 182 form_.display_name = base::ASCIIToUTF16("Display Name"); |
170 form_.password_value = base::ASCIIToUTF16("Password"); | 183 form_.password_value = base::ASCIIToUTF16("Password"); |
171 form_.origin = web_contents()->GetLastCommittedURL().GetOrigin(); | 184 form_.origin = web_contents()->GetLastCommittedURL().GetOrigin(); |
172 form_.signon_realm = form_.origin.spec(); | 185 form_.signon_realm = form_.origin.spec(); |
173 form_.scheme = autofill::PasswordForm::SCHEME_HTML; | 186 form_.scheme = autofill::PasswordForm::SCHEME_HTML; |
174 form_.skip_zero_click = false; | 187 form_.skip_zero_click = false; |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 const IPC::Message* message = | 283 const IPC::Message* message = |
271 process()->sink().GetFirstMessageMatching(kMsgID); | 284 process()->sink().GetFirstMessageMatching(kMsgID); |
272 EXPECT_TRUE(message); | 285 EXPECT_TRUE(message); |
273 process()->sink().ClearMessages(); | 286 process()->sink().ClearMessages(); |
274 | 287 |
275 RunAllPendingTasks(); | 288 RunAllPendingTasks(); |
276 | 289 |
277 EXPECT_FALSE(client_->pending_manager()); | 290 EXPECT_FALSE(client_->pending_manager()); |
278 } | 291 } |
279 | 292 |
| 293 TEST_F(CredentialManagerDispatcherTest, CredentialManagerSignInWithSSLErrors) { |
| 294 CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_LOCAL); |
| 295 EXPECT_CALL(*client_, DidLastPageLoadEncounterSSLErrors()) |
| 296 .WillRepeatedly(testing::Return(true)); |
| 297 EXPECT_CALL( |
| 298 *client_, |
| 299 PromptUserToSavePasswordPtr( |
| 300 _, password_manager::CredentialSourceType::CREDENTIAL_SOURCE_API)) |
| 301 .Times(testing::Exactly(0)); |
| 302 |
| 303 dispatcher()->OnNotifySignedIn(kRequestId, info); |
| 304 |
| 305 const uint32 kMsgID = CredentialManagerMsg_AcknowledgeSignedIn::ID; |
| 306 const IPC::Message* message = |
| 307 process()->sink().GetFirstMessageMatching(kMsgID); |
| 308 EXPECT_TRUE(message); |
| 309 process()->sink().ClearMessages(); |
| 310 |
| 311 RunAllPendingTasks(); |
| 312 |
| 313 EXPECT_FALSE(client_->pending_manager()); |
| 314 } |
| 315 |
| 316 TEST_F(CredentialManagerDispatcherTest, |
| 317 CredentialManagerSignInWithDisabledPasswordManager) { |
| 318 CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_LOCAL); |
| 319 client_->set_password_manager_saving_enabled(false); |
| 320 EXPECT_CALL( |
| 321 *client_, |
| 322 PromptUserToSavePasswordPtr( |
| 323 _, password_manager::CredentialSourceType::CREDENTIAL_SOURCE_API)) |
| 324 .Times(testing::Exactly(0)); |
| 325 |
| 326 dispatcher()->OnNotifySignedIn(kRequestId, info); |
| 327 |
| 328 const uint32 kMsgID = CredentialManagerMsg_AcknowledgeSignedIn::ID; |
| 329 const IPC::Message* message = |
| 330 process()->sink().GetFirstMessageMatching(kMsgID); |
| 331 EXPECT_TRUE(message); |
| 332 process()->sink().ClearMessages(); |
| 333 |
| 334 RunAllPendingTasks(); |
| 335 |
| 336 EXPECT_FALSE(client_->pending_manager()); |
| 337 } |
| 338 |
| 339 TEST_F(CredentialManagerDispatcherTest, |
| 340 CredentialManagerSignInWthPasswordManagerDisabledForCurrentPage) { |
| 341 CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_LOCAL); |
| 342 EXPECT_CALL(*client_, IsPasswordManagerEnabledForCurrentPage()) |
| 343 .WillRepeatedly(testing::Return(false)); |
| 344 EXPECT_CALL( |
| 345 *client_, |
| 346 PromptUserToSavePasswordPtr( |
| 347 _, password_manager::CredentialSourceType::CREDENTIAL_SOURCE_API)) |
| 348 .Times(testing::Exactly(0)); |
| 349 |
| 350 dispatcher()->OnNotifySignedIn(kRequestId, info); |
| 351 |
| 352 const uint32 kMsgID = CredentialManagerMsg_AcknowledgeSignedIn::ID; |
| 353 const IPC::Message* message = |
| 354 process()->sink().GetFirstMessageMatching(kMsgID); |
| 355 EXPECT_TRUE(message); |
| 356 process()->sink().ClearMessages(); |
| 357 |
| 358 RunAllPendingTasks(); |
| 359 |
| 360 EXPECT_FALSE(client_->pending_manager()); |
| 361 } |
| 362 |
280 TEST_F(CredentialManagerDispatcherTest, CredentialManagerOnNotifySignedOut) { | 363 TEST_F(CredentialManagerDispatcherTest, CredentialManagerOnNotifySignedOut) { |
281 store_->AddLogin(form_); | 364 store_->AddLogin(form_); |
282 store_->AddLogin(cross_origin_form_); | 365 store_->AddLogin(cross_origin_form_); |
283 RunAllPendingTasks(); | 366 RunAllPendingTasks(); |
284 | 367 |
285 TestPasswordStore::PasswordMap passwords = store_->stored_passwords(); | 368 TestPasswordStore::PasswordMap passwords = store_->stored_passwords(); |
286 EXPECT_EQ(2U, passwords.size()); | 369 EXPECT_EQ(2U, passwords.size()); |
287 EXPECT_EQ(1U, passwords[form_.signon_realm].size()); | 370 EXPECT_EQ(1U, passwords[form_.signon_realm].size()); |
288 EXPECT_EQ(1U, passwords[cross_origin_form_.signon_realm].size()); | 371 EXPECT_EQ(1U, passwords[cross_origin_form_.signon_realm].size()); |
289 EXPECT_FALSE(passwords[form_.signon_realm][0].skip_zero_click); | 372 EXPECT_FALSE(passwords[form_.signon_realm][0].skip_zero_click); |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 const uint32 kMsgID = CredentialManagerMsg_SendCredential::ID; | 690 const uint32 kMsgID = CredentialManagerMsg_SendCredential::ID; |
608 const IPC::Message* message = | 691 const IPC::Message* message = |
609 process()->sink().GetFirstMessageMatching(kMsgID); | 692 process()->sink().GetFirstMessageMatching(kMsgID); |
610 ASSERT_TRUE(message); | 693 ASSERT_TRUE(message); |
611 CredentialManagerMsg_SendCredential::Param param; | 694 CredentialManagerMsg_SendCredential::Param param; |
612 CredentialManagerMsg_SendCredential::Read(message, ¶m); | 695 CredentialManagerMsg_SendCredential::Read(message, ¶m); |
613 EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, get<1>(param).type); | 696 EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, get<1>(param).type); |
614 } | 697 } |
615 | 698 |
616 } // namespace password_manager | 699 } // namespace password_manager |
OLD | NEW |