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 "chrome/browser/password_manager/chrome_password_manager_client.h" | 5 #include "chrome/browser/password_manager/chrome_password_manager_client.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/metrics/field_trial.h" | 8 #include "base/metrics/field_trial.h" |
9 #include "base/prefs/pref_registry_simple.h" | 9 #include "base/prefs/pref_registry_simple.h" |
10 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
11 #include "base/prefs/testing_pref_service.h" | 11 #include "base/prefs/testing_pref_service.h" |
12 #include "base/strings/string16.h" | 12 #include "base/strings/string16.h" |
13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
14 #include "chrome/browser/sync/profile_sync_service_factory.h" | 14 #include "chrome/browser/sync/profile_sync_service_factory.h" |
15 #include "chrome/browser/sync/profile_sync_service_mock.h" | 15 #include "chrome/browser/sync/profile_sync_service_mock.h" |
16 #include "chrome/common/channel_info.h" | 16 #include "chrome/common/channel_info.h" |
17 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | 17 #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
18 #include "chrome/test/base/testing_profile.h" | 18 #include "chrome/test/base/testing_profile.h" |
19 #include "components/autofill/content/common/autofill_messages.h" | 19 #include "components/autofill/content/common/autofill_messages.h" |
20 #include "components/password_manager/content/browser/password_manager_internals
_service_factory.h" | 20 #include "components/password_manager/content/browser/password_manager_internals
_service_factory.h" |
21 #include "components/password_manager/content/common/credential_manager_messages
.h" | 21 #include "components/password_manager/content/common/credential_manager_messages
.h" |
22 #include "components/password_manager/core/browser/credentials_filter.h" | 22 #include "components/password_manager/core/browser/credentials_filter.h" |
| 23 #include "components/password_manager/core/browser/log_manager.h" |
23 #include "components/password_manager/core/browser/log_receiver.h" | 24 #include "components/password_manager/core/browser/log_receiver.h" |
| 25 #include "components/password_manager/core/browser/log_router.h" |
24 #include "components/password_manager/core/browser/password_manager_internals_se
rvice.h" | 26 #include "components/password_manager/core/browser/password_manager_internals_se
rvice.h" |
25 #include "components/password_manager/core/common/credential_manager_types.h" | 27 #include "components/password_manager/core/common/credential_manager_types.h" |
26 #include "components/password_manager/core/common/password_manager_pref_names.h" | 28 #include "components/password_manager/core/common/password_manager_pref_names.h" |
27 #include "components/password_manager/core/common/password_manager_switches.h" | 29 #include "components/password_manager/core/common/password_manager_switches.h" |
28 #include "components/syncable_prefs/testing_pref_service_syncable.h" | 30 #include "components/syncable_prefs/testing_pref_service_syncable.h" |
29 #include "components/version_info/version_info.h" | 31 #include "components/version_info/version_info.h" |
30 #include "content/public/browser/browser_context.h" | 32 #include "content/public/browser/browser_context.h" |
31 #include "content/public/browser/web_contents.h" | 33 #include "content/public/browser/web_contents.h" |
32 #include "content/public/test/mock_render_process_host.h" | 34 #include "content/public/test/mock_render_process_host.h" |
33 #include "testing/gmock/include/gmock/gmock.h" | 35 #include "testing/gmock/include/gmock/gmock.h" |
34 #include "testing/gtest/include/gtest/gtest.h" | 36 #include "testing/gtest/include/gtest/gtest.h" |
35 | 37 |
36 using content::BrowserContext; | 38 using content::BrowserContext; |
37 using content::WebContents; | 39 using content::WebContents; |
38 using testing::Return; | 40 using testing::Return; |
39 using testing::_; | 41 using testing::_; |
40 | 42 |
41 namespace { | 43 namespace { |
42 | 44 |
43 const char kPasswordManagerSettingsBehaviourChangeFieldTrialName[] = | 45 const char kPasswordManagerSettingsBehaviourChangeFieldTrialName[] = |
44 "PasswordManagerSettingsBehaviourChange"; | 46 "PasswordManagerSettingsBehaviourChange"; |
45 const char kPasswordManagerSettingsBehaviourChangeEnabledGroupName[] = | 47 const char kPasswordManagerSettingsBehaviourChangeEnabledGroupName[] = |
46 "PasswordManagerSettingsBehaviourChange.Active"; | 48 "PasswordManagerSettingsBehaviourChange.Active"; |
47 const char kPasswordManagerSettingsBehaviourChangeDisabledGroupName[] = | 49 const char kPasswordManagerSettingsBehaviourChangeDisabledGroupName[] = |
48 "PasswordManagerSettingsBehaviourChange.NotActive"; | 50 "PasswordManagerSettingsBehaviourChange.NotActive"; |
49 | 51 |
50 const char kTestText[] = "abcd1234"; | |
51 | |
52 class MockLogReceiver : public password_manager::LogReceiver { | |
53 public: | |
54 MOCK_METHOD1(LogSavePasswordProgress, void(const std::string&)); | |
55 }; | |
56 | |
57 // TODO(vabr): Get rid of the mocked client in the client's own test, see | 52 // TODO(vabr): Get rid of the mocked client in the client's own test, see |
58 // http://crbug.com/474577. | 53 // http://crbug.com/474577. |
59 class MockChromePasswordManagerClient : public ChromePasswordManagerClient { | 54 class MockChromePasswordManagerClient : public ChromePasswordManagerClient { |
60 public: | 55 public: |
61 MOCK_CONST_METHOD0(DidLastPageLoadEncounterSSLErrors, bool()); | 56 MOCK_CONST_METHOD0(DidLastPageLoadEncounterSSLErrors, bool()); |
62 | 57 |
63 explicit MockChromePasswordManagerClient(content::WebContents* web_contents) | 58 explicit MockChromePasswordManagerClient(content::WebContents* web_contents) |
64 : ChromePasswordManagerClient(web_contents, nullptr) { | 59 : ChromePasswordManagerClient(web_contents, nullptr) { |
65 ON_CALL(*this, DidLastPageLoadEncounterSSLErrors()) | 60 ON_CALL(*this, DidLastPageLoadEncounterSSLErrors()) |
66 .WillByDefault(testing::Return(false)); | 61 .WillByDefault(testing::Return(false)); |
67 } | 62 } |
68 ~MockChromePasswordManagerClient() override {} | 63 ~MockChromePasswordManagerClient() override {} |
69 | 64 |
70 private: | 65 private: |
71 DISALLOW_COPY_AND_ASSIGN(MockChromePasswordManagerClient); | 66 DISALLOW_COPY_AND_ASSIGN(MockChromePasswordManagerClient); |
72 }; | 67 }; |
73 | 68 |
| 69 class DummyLogReceiver : public password_manager::LogReceiver { |
| 70 public: |
| 71 DummyLogReceiver() = default; |
| 72 |
| 73 void LogSavePasswordProgress(const std::string& text) override {} |
| 74 |
| 75 private: |
| 76 DISALLOW_COPY_AND_ASSIGN(DummyLogReceiver); |
| 77 }; |
| 78 |
74 } // namespace | 79 } // namespace |
75 | 80 |
76 class ChromePasswordManagerClientTest : public ChromeRenderViewHostTestHarness { | 81 class ChromePasswordManagerClientTest : public ChromeRenderViewHostTestHarness { |
77 public: | 82 public: |
78 ChromePasswordManagerClientTest() | 83 ChromePasswordManagerClientTest() : field_trial_list_(nullptr) {} |
79 : service_(nullptr), field_trial_list_(nullptr) {} | |
80 void SetUp() override; | 84 void SetUp() override; |
81 | 85 |
82 syncable_prefs::TestingPrefServiceSyncable* prefs() { | 86 syncable_prefs::TestingPrefServiceSyncable* prefs() { |
83 return profile()->GetTestingPrefService(); | 87 return profile()->GetTestingPrefService(); |
84 } | 88 } |
85 | 89 |
86 void EnforcePasswordManagerSettingsBehaviourChangeExperimentGroup( | 90 void EnforcePasswordManagerSettingsBehaviourChangeExperimentGroup( |
87 const char* name) { | 91 const char* name) { |
88 ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( | 92 ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( |
89 kPasswordManagerSettingsBehaviourChangeFieldTrialName, name)); | 93 kPasswordManagerSettingsBehaviourChangeFieldTrialName, name)); |
90 } | 94 } |
91 | 95 |
92 protected: | 96 protected: |
93 ChromePasswordManagerClient* GetClient(); | 97 ChromePasswordManagerClient* GetClient(); |
94 | 98 |
95 // If the test IPC sink contains an AutofillMsg_SetLoggingState message, then | 99 // If the test IPC sink contains an AutofillMsg_SetLoggingState message, then |
96 // copies its argument into |activation_flag| and returns true. Otherwise | 100 // copies its argument into |activation_flag| and returns true. Otherwise |
97 // returns false. | 101 // returns false. |
98 bool WasLoggingActivationMessageSent(bool* activation_flag); | 102 bool WasLoggingActivationMessageSent(bool* activation_flag); |
99 | 103 |
100 password_manager::PasswordManagerInternalsService* service_; | |
101 | |
102 testing::StrictMock<MockLogReceiver> receiver_; | |
103 TestingPrefServiceSimple prefs_; | 104 TestingPrefServiceSimple prefs_; |
104 base::FieldTrialList field_trial_list_; | 105 base::FieldTrialList field_trial_list_; |
105 }; | 106 }; |
106 | 107 |
107 void ChromePasswordManagerClientTest::SetUp() { | 108 void ChromePasswordManagerClientTest::SetUp() { |
108 ChromeRenderViewHostTestHarness::SetUp(); | 109 ChromeRenderViewHostTestHarness::SetUp(); |
109 prefs_.registry()->RegisterBooleanPref( | 110 prefs_.registry()->RegisterBooleanPref( |
110 password_manager::prefs::kPasswordManagerSavingEnabled, true); | 111 password_manager::prefs::kPasswordManagerSavingEnabled, true); |
111 ChromePasswordManagerClient::CreateForWebContentsWithAutofillClient( | 112 ChromePasswordManagerClient::CreateForWebContentsWithAutofillClient( |
112 web_contents(), nullptr); | 113 web_contents(), nullptr); |
113 service_ = password_manager::PasswordManagerInternalsServiceFactory:: | |
114 GetForBrowserContext(profile()); | |
115 ASSERT_TRUE(service_); | |
116 } | 114 } |
117 | 115 |
118 ChromePasswordManagerClient* ChromePasswordManagerClientTest::GetClient() { | 116 ChromePasswordManagerClient* ChromePasswordManagerClientTest::GetClient() { |
119 return ChromePasswordManagerClient::FromWebContents(web_contents()); | 117 return ChromePasswordManagerClient::FromWebContents(web_contents()); |
120 } | 118 } |
121 | 119 |
122 bool ChromePasswordManagerClientTest::WasLoggingActivationMessageSent( | 120 bool ChromePasswordManagerClientTest::WasLoggingActivationMessageSent( |
123 bool* activation_flag) { | 121 bool* activation_flag) { |
124 const uint32 kMsgID = AutofillMsg_SetLoggingState::ID; | 122 const uint32 kMsgID = AutofillMsg_SetLoggingState::ID; |
125 const IPC::Message* message = | 123 const IPC::Message* message = |
126 process()->sink().GetFirstMessageMatching(kMsgID); | 124 process()->sink().GetFirstMessageMatching(kMsgID); |
127 if (!message) | 125 if (!message) |
128 return false; | 126 return false; |
129 base::Tuple<bool> param; | 127 base::Tuple<bool> param; |
130 AutofillMsg_SetLoggingState::Read(message, ¶m); | 128 AutofillMsg_SetLoggingState::Read(message, ¶m); |
131 *activation_flag = base::get<0>(param); | 129 *activation_flag = base::get<0>(param); |
132 process()->sink().ClearMessages(); | 130 process()->sink().ClearMessages(); |
133 return true; | 131 return true; |
134 } | 132 } |
135 | 133 |
136 TEST_F(ChromePasswordManagerClientTest, LogSavePasswordProgressNoReceiver) { | |
137 ChromePasswordManagerClient* client = GetClient(); | |
138 | |
139 EXPECT_CALL(receiver_, LogSavePasswordProgress(kTestText)).Times(0); | |
140 // Before attaching the receiver, no text should be passed. | |
141 client->LogSavePasswordProgress(kTestText); | |
142 EXPECT_FALSE(client->IsLoggingActive()); | |
143 } | |
144 | |
145 TEST_F(ChromePasswordManagerClientTest, LogSavePasswordProgressAttachReceiver) { | |
146 ChromePasswordManagerClient* client = GetClient(); | |
147 EXPECT_FALSE(client->IsLoggingActive()); | |
148 | |
149 // After attaching the logger, text should be passed. | |
150 service_->RegisterReceiver(&receiver_); | |
151 EXPECT_TRUE(client->IsLoggingActive()); | |
152 EXPECT_CALL(receiver_, LogSavePasswordProgress(kTestText)).Times(1); | |
153 client->LogSavePasswordProgress(kTestText); | |
154 service_->UnregisterReceiver(&receiver_); | |
155 EXPECT_FALSE(client->IsLoggingActive()); | |
156 } | |
157 | |
158 TEST_F(ChromePasswordManagerClientTest, LogSavePasswordProgressDetachReceiver) { | |
159 ChromePasswordManagerClient* client = GetClient(); | |
160 | |
161 service_->RegisterReceiver(&receiver_); | |
162 EXPECT_TRUE(client->IsLoggingActive()); | |
163 service_->UnregisterReceiver(&receiver_); | |
164 EXPECT_FALSE(client->IsLoggingActive()); | |
165 | |
166 // After detaching the logger, no text should be passed. | |
167 EXPECT_CALL(receiver_, LogSavePasswordProgress(kTestText)).Times(0); | |
168 client->LogSavePasswordProgress(kTestText); | |
169 } | |
170 | |
171 TEST_F(ChromePasswordManagerClientTest, LogSavePasswordProgressNotifyRenderer) { | 134 TEST_F(ChromePasswordManagerClientTest, LogSavePasswordProgressNotifyRenderer) { |
172 ChromePasswordManagerClient* client = GetClient(); | 135 bool logging_active = true; |
173 bool logging_active = false; | 136 // Ensure the existence of a driver, which will send the IPCs we listen for |
| 137 // below. |
| 138 NavigateAndCommit(GURL("about:blank")); |
174 | 139 |
175 // Initially, the logging should be off, so no IPC messages. | 140 // Initially, the logging should be off, so no IPC messages. |
176 EXPECT_FALSE(WasLoggingActivationMessageSent(&logging_active)); | 141 EXPECT_TRUE(!WasLoggingActivationMessageSent(&logging_active) || |
| 142 !logging_active) |
| 143 << "logging_active=" << logging_active; |
177 | 144 |
178 service_->RegisterReceiver(&receiver_); | 145 DummyLogReceiver log_receiver; |
179 EXPECT_TRUE(client->IsLoggingActive()); | 146 password_manager::LogRouter* log_router = password_manager:: |
| 147 PasswordManagerInternalsServiceFactory::GetForBrowserContext(profile()); |
| 148 EXPECT_EQ(std::string(), log_router->RegisterReceiver(&log_receiver)); |
180 EXPECT_TRUE(WasLoggingActivationMessageSent(&logging_active)); | 149 EXPECT_TRUE(WasLoggingActivationMessageSent(&logging_active)); |
181 EXPECT_TRUE(logging_active); | 150 EXPECT_TRUE(logging_active); |
182 | 151 |
183 service_->UnregisterReceiver(&receiver_); | 152 log_router->UnregisterReceiver(&log_receiver); |
184 EXPECT_FALSE(client->IsLoggingActive()); | |
185 EXPECT_TRUE(WasLoggingActivationMessageSent(&logging_active)); | 153 EXPECT_TRUE(WasLoggingActivationMessageSent(&logging_active)); |
186 EXPECT_FALSE(logging_active); | 154 EXPECT_FALSE(logging_active); |
187 } | 155 } |
188 | |
189 TEST_F(ChromePasswordManagerClientTest, AnswerToPingsAboutLoggingState_Active) { | |
190 service_->RegisterReceiver(&receiver_); | |
191 | |
192 process()->sink().ClearMessages(); | |
193 | |
194 // Ping the client for logging activity update. | |
195 AutofillHostMsg_PasswordAutofillAgentConstructed msg(0); | |
196 static_cast<content::WebContentsObserver*>(GetClient())->OnMessageReceived( | |
197 msg, web_contents()->GetMainFrame()); | |
198 | |
199 bool logging_active = false; | |
200 EXPECT_TRUE(WasLoggingActivationMessageSent(&logging_active)); | |
201 EXPECT_TRUE(logging_active); | |
202 | |
203 service_->UnregisterReceiver(&receiver_); | |
204 } | |
205 | |
206 TEST_F(ChromePasswordManagerClientTest, | |
207 AnswerToPingsAboutLoggingState_Inactive) { | |
208 process()->sink().ClearMessages(); | |
209 | |
210 // Ping the client for logging activity update. | |
211 AutofillHostMsg_PasswordAutofillAgentConstructed msg(0); | |
212 static_cast<content::WebContentsObserver*>(GetClient())->OnMessageReceived( | |
213 msg, web_contents()->GetMainFrame()); | |
214 | |
215 bool logging_active = true; | |
216 EXPECT_TRUE(WasLoggingActivationMessageSent(&logging_active)); | |
217 EXPECT_FALSE(logging_active); | |
218 } | |
219 | 156 |
220 TEST_F(ChromePasswordManagerClientTest, | 157 TEST_F(ChromePasswordManagerClientTest, |
221 IsAutomaticPasswordSavingEnabledDefaultBehaviourTest) { | 158 IsAutomaticPasswordSavingEnabledDefaultBehaviourTest) { |
222 EXPECT_FALSE(GetClient()->IsAutomaticPasswordSavingEnabled()); | 159 EXPECT_FALSE(GetClient()->IsAutomaticPasswordSavingEnabled()); |
223 } | 160 } |
224 | 161 |
225 TEST_F(ChromePasswordManagerClientTest, | 162 TEST_F(ChromePasswordManagerClientTest, |
226 IsAutomaticPasswordSavingEnabledWhenFlagIsSetTest) { | 163 IsAutomaticPasswordSavingEnabledWhenFlagIsSetTest) { |
227 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 164 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
228 password_manager::switches::kEnableAutomaticPasswordSaving); | 165 password_manager::switches::kEnableAutomaticPasswordSaving); |
229 if (chrome::GetChannel() == version_info::Channel::UNKNOWN) | 166 if (chrome::GetChannel() == version_info::Channel::UNKNOWN) |
230 EXPECT_TRUE(GetClient()->IsAutomaticPasswordSavingEnabled()); | 167 EXPECT_TRUE(GetClient()->IsAutomaticPasswordSavingEnabled()); |
231 else | 168 else |
232 EXPECT_FALSE(GetClient()->IsAutomaticPasswordSavingEnabled()); | 169 EXPECT_FALSE(GetClient()->IsAutomaticPasswordSavingEnabled()); |
233 } | 170 } |
234 | 171 |
235 TEST_F(ChromePasswordManagerClientTest, LogToAReceiver) { | |
236 ChromePasswordManagerClient* client = GetClient(); | |
237 service_->RegisterReceiver(&receiver_); | |
238 EXPECT_TRUE(client->IsLoggingActive()); | |
239 | |
240 EXPECT_CALL(receiver_, LogSavePasswordProgress(kTestText)).Times(1); | |
241 client->LogSavePasswordProgress(kTestText); | |
242 | |
243 service_->UnregisterReceiver(&receiver_); | |
244 EXPECT_FALSE(client->IsLoggingActive()); | |
245 } | |
246 | |
247 TEST_F(ChromePasswordManagerClientTest, GetPasswordSyncState) { | 172 TEST_F(ChromePasswordManagerClientTest, GetPasswordSyncState) { |
248 ChromePasswordManagerClient* client = GetClient(); | 173 ChromePasswordManagerClient* client = GetClient(); |
249 | 174 |
250 ProfileSyncServiceMock* mock_sync_service = | 175 ProfileSyncServiceMock* mock_sync_service = |
251 static_cast<ProfileSyncServiceMock*>( | 176 static_cast<ProfileSyncServiceMock*>( |
252 ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse( | 177 ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse( |
253 profile(), ProfileSyncServiceMock::BuildMockProfileSyncService)); | 178 profile(), ProfileSyncServiceMock::BuildMockProfileSyncService)); |
254 | 179 |
255 syncer::ModelTypeSet active_types; | 180 syncer::ModelTypeSet active_types; |
256 active_types.Put(syncer::PASSWORDS); | 181 active_types.Put(syncer::PASSWORDS); |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 EXPECT_EQ(GURL::EmptyGURL(), GetClient()->GetLastCommittedEntryURL()); | 322 EXPECT_EQ(GURL::EmptyGURL(), GetClient()->GetLastCommittedEntryURL()); |
398 } | 323 } |
399 | 324 |
400 TEST_F(ChromePasswordManagerClientTest, GetLastCommittedEntryURL) { | 325 TEST_F(ChromePasswordManagerClientTest, GetLastCommittedEntryURL) { |
401 GURL kUrl( | 326 GURL kUrl( |
402 "https://accounts.google.com/ServiceLogin?continue=" | 327 "https://accounts.google.com/ServiceLogin?continue=" |
403 "https://passwords.google.com/settings"); | 328 "https://passwords.google.com/settings"); |
404 NavigateAndCommit(kUrl); | 329 NavigateAndCommit(kUrl); |
405 EXPECT_EQ(kUrl, GetClient()->GetLastCommittedEntryURL()); | 330 EXPECT_EQ(kUrl, GetClient()->GetLastCommittedEntryURL()); |
406 } | 331 } |
| 332 |
| 333 TEST_F(ChromePasswordManagerClientTest, WebUINoLogging) { |
| 334 // Make sure that logging is active. |
| 335 password_manager::LogRouter* log_router = password_manager:: |
| 336 PasswordManagerInternalsServiceFactory::GetForBrowserContext(profile()); |
| 337 DummyLogReceiver log_receiver; |
| 338 EXPECT_EQ(std::string(), log_router->RegisterReceiver(&log_receiver)); |
| 339 |
| 340 // But then navigate to a WebUI, there the logging should not be active. |
| 341 NavigateAndCommit(GURL("about:password-manager-internals")); |
| 342 EXPECT_FALSE(GetClient()->GetLogManager()->IsLoggingActive()); |
| 343 |
| 344 log_router->UnregisterReceiver(&log_receiver); |
| 345 } |
OLD | NEW |