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 "components/password_manager/core/browser/password_form_manager.h" | 5 #include "components/password_manager/core/browser/password_form_manager.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
334 | 334 |
335 void TearDown() override { | 335 void TearDown() override { |
336 if (mock_store_.get()) | 336 if (mock_store_.get()) |
337 mock_store_->ShutdownOnUIThread(); | 337 mock_store_->ShutdownOnUIThread(); |
338 } | 338 } |
339 | 339 |
340 MockPasswordStore* mock_store() const { return mock_store_.get(); } | 340 MockPasswordStore* mock_store() const { return mock_store_.get(); } |
341 | 341 |
342 void SimulateMatchingPhase(PasswordFormManager* p, | 342 void SimulateMatchingPhase(PasswordFormManager* p, |
343 ResultOfSimulatedMatchingMask result) { | 343 ResultOfSimulatedMatchingMask result) { |
344 const PasswordStore::AuthorizationPromptPolicy auth_policy = | 344 EXPECT_CALL(*mock_store(), GetLogins(p->observed_form(), p)); |
345 PasswordStore::DISALLOW_PROMPT; | 345 p->FetchDataFromPasswordStore(); |
346 EXPECT_CALL(*mock_store(), GetLogins(p->observed_form(), auth_policy, p)); | |
347 p->FetchDataFromPasswordStore(auth_policy); | |
348 if (result == RESULT_NO_MATCH) { | 346 if (result == RESULT_NO_MATCH) { |
349 p->OnGetPasswordStoreResults(ScopedVector<PasswordForm>()); | 347 p->OnGetPasswordStoreResults(ScopedVector<PasswordForm>()); |
350 return; | 348 return; |
351 } | 349 } |
352 | 350 |
353 ScopedVector<PasswordForm> result_form; | 351 ScopedVector<PasswordForm> result_form; |
354 if (result & RESULT_SAVED_MATCH) { | 352 if (result & RESULT_SAVED_MATCH) { |
355 result_form.push_back(new PasswordForm(saved_match_)); | 353 result_form.push_back(new PasswordForm(saved_match_)); |
356 } | 354 } |
357 if (result & RESULT_PSL_MATCH) { | 355 if (result & RESULT_PSL_MATCH) { |
(...skipping 1024 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1382 encountered_form.action = GURL("http://accounts.google.com/Login"); | 1380 encountered_form.action = GURL("http://accounts.google.com/Login"); |
1383 encountered_form.username_element = ASCIIToUTF16("Email"); | 1381 encountered_form.username_element = ASCIIToUTF16("Email"); |
1384 encountered_form.password_element = ASCIIToUTF16("Passwd"); | 1382 encountered_form.password_element = ASCIIToUTF16("Passwd"); |
1385 encountered_form.submit_element = ASCIIToUTF16("signIn"); | 1383 encountered_form.submit_element = ASCIIToUTF16("signIn"); |
1386 | 1384 |
1387 EXPECT_CALL(*(client()->mock_driver()), AllowPasswordGenerationForForm(_)); | 1385 EXPECT_CALL(*(client()->mock_driver()), AllowPasswordGenerationForForm(_)); |
1388 | 1386 |
1389 PasswordFormManager form_manager(password_manager(), client(), | 1387 PasswordFormManager form_manager(password_manager(), client(), |
1390 client()->driver(), encountered_form, false); | 1388 client()->driver(), encountered_form, false); |
1391 | 1389 |
1392 const PasswordStore::AuthorizationPromptPolicy auth_policy = | 1390 EXPECT_CALL(*mock_store(), GetLogins(encountered_form, &form_manager)); |
1393 PasswordStore::DISALLOW_PROMPT; | 1391 form_manager.FetchDataFromPasswordStore(); |
1394 EXPECT_CALL(*mock_store(), | |
1395 GetLogins(encountered_form, auth_policy, &form_manager)); | |
1396 form_manager.FetchDataFromPasswordStore(auth_policy); | |
1397 | 1392 |
1398 // Password store only has these incomplete credentials. | 1393 // Password store only has these incomplete credentials. |
1399 scoped_ptr<PasswordForm> incomplete_form(new PasswordForm()); | 1394 scoped_ptr<PasswordForm> incomplete_form(new PasswordForm()); |
1400 incomplete_form->origin = GURL("http://accounts.google.com/LoginAuth"); | 1395 incomplete_form->origin = GURL("http://accounts.google.com/LoginAuth"); |
1401 incomplete_form->signon_realm = "http://accounts.google.com/"; | 1396 incomplete_form->signon_realm = "http://accounts.google.com/"; |
1402 incomplete_form->password_value = ASCIIToUTF16("my_password"); | 1397 incomplete_form->password_value = ASCIIToUTF16("my_password"); |
1403 incomplete_form->username_value = ASCIIToUTF16("my_username"); | 1398 incomplete_form->username_value = ASCIIToUTF16("my_username"); |
1404 incomplete_form->preferred = true; | 1399 incomplete_form->preferred = true; |
1405 incomplete_form->ssl_valid = false; | 1400 incomplete_form->ssl_valid = false; |
1406 incomplete_form->scheme = PasswordForm::SCHEME_HTML; | 1401 incomplete_form->scheme = PasswordForm::SCHEME_HTML; |
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1842 form->origin = GURL(example_url); | 1837 form->origin = GURL(example_url); |
1843 form->signon_realm = example_url; | 1838 form->signon_realm = example_url; |
1844 form->action = GURL(example_url); | 1839 form->action = GURL(example_url); |
1845 form->username_element = ASCIIToUTF16("u"); | 1840 form->username_element = ASCIIToUTF16("u"); |
1846 form->password_element = ASCIIToUTF16("p"); | 1841 form->password_element = ASCIIToUTF16("p"); |
1847 form->submit_element = ASCIIToUTF16("s"); | 1842 form->submit_element = ASCIIToUTF16("s"); |
1848 | 1843 |
1849 PasswordFormManager form_manager(password_manager(), client(), | 1844 PasswordFormManager form_manager(password_manager(), client(), |
1850 client()->driver(), *form, false); | 1845 client()->driver(), *form, false); |
1851 | 1846 |
1852 const PasswordStore::AuthorizationPromptPolicy auth_policy = | 1847 EXPECT_CALL(*mock_store(), GetLogins(*form, &form_manager)); |
1853 PasswordStore::DISALLOW_PROMPT; | 1848 form_manager.FetchDataFromPasswordStore(); |
1854 EXPECT_CALL(*mock_store(), GetLogins(*form, auth_policy, &form_manager)); | |
1855 form_manager.FetchDataFromPasswordStore(auth_policy); | |
1856 | 1849 |
1857 // Suddenly, the frame and its driver disappear. | 1850 // Suddenly, the frame and its driver disappear. |
1858 client()->KillDriver(); | 1851 client()->KillDriver(); |
1859 | 1852 |
1860 ScopedVector<PasswordForm> simulated_results; | 1853 ScopedVector<PasswordForm> simulated_results; |
1861 simulated_results.push_back(std::move(form)); | 1854 simulated_results.push_back(std::move(form)); |
1862 form_manager.OnGetPasswordStoreResults(std::move(simulated_results)); | 1855 form_manager.OnGetPasswordStoreResults(std::move(simulated_results)); |
1863 } | 1856 } |
1864 | 1857 |
1865 TEST_F(PasswordFormManagerTest, PreferredMatchIsUpToDate) { | 1858 TEST_F(PasswordFormManagerTest, PreferredMatchIsUpToDate) { |
1866 // Check that preferred_match() is always a member of best_matches(). | 1859 // Check that preferred_match() is always a member of best_matches(). |
1867 const PasswordStore::AuthorizationPromptPolicy auth_policy = | 1860 EXPECT_CALL(*mock_store(), GetLogins(*observed_form(), form_manager())); |
1868 PasswordStore::DISALLOW_PROMPT; | 1861 form_manager()->FetchDataFromPasswordStore(); |
1869 EXPECT_CALL(*mock_store(), | |
1870 GetLogins(*observed_form(), auth_policy, form_manager())); | |
1871 form_manager()->FetchDataFromPasswordStore(auth_policy); | |
1872 | 1862 |
1873 ScopedVector<PasswordForm> simulated_results; | 1863 ScopedVector<PasswordForm> simulated_results; |
1874 scoped_ptr<PasswordForm> form(new PasswordForm(*observed_form())); | 1864 scoped_ptr<PasswordForm> form(new PasswordForm(*observed_form())); |
1875 form->username_value = ASCIIToUTF16("username"); | 1865 form->username_value = ASCIIToUTF16("username"); |
1876 form->password_value = ASCIIToUTF16("password1"); | 1866 form->password_value = ASCIIToUTF16("password1"); |
1877 form->preferred = false; | 1867 form->preferred = false; |
1878 | 1868 |
1879 scoped_ptr<PasswordForm> generated_form(new PasswordForm(*form)); | 1869 scoped_ptr<PasswordForm> generated_form(new PasswordForm(*form)); |
1880 generated_form->type = PasswordForm::TYPE_GENERATED; | 1870 generated_form->type = PasswordForm::TYPE_GENERATED; |
1881 generated_form->password_value = ASCIIToUTF16("password2"); | 1871 generated_form->password_value = ASCIIToUTF16("password2"); |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2140 } | 2130 } |
2141 | 2131 |
2142 TEST_F(PasswordFormManagerTest, WipeStoreCopyIfOutdated_BeforeStoreCallback) { | 2132 TEST_F(PasswordFormManagerTest, WipeStoreCopyIfOutdated_BeforeStoreCallback) { |
2143 PasswordForm form(*saved_match()); | 2133 PasswordForm form(*saved_match()); |
2144 ASSERT_FALSE(form.password_value.empty()); | 2134 ASSERT_FALSE(form.password_value.empty()); |
2145 | 2135 |
2146 PasswordFormManager form_manager(password_manager(), client(), | 2136 PasswordFormManager form_manager(password_manager(), client(), |
2147 client()->driver(), form, false); | 2137 client()->driver(), form, false); |
2148 | 2138 |
2149 // Do not notify the store observer after this GetLogins call. | 2139 // Do not notify the store observer after this GetLogins call. |
2150 EXPECT_CALL(*mock_store(), GetLogins(_, _, _)); | 2140 EXPECT_CALL(*mock_store(), GetLogins(_, _)); |
2151 form_manager.FetchDataFromPasswordStore(PasswordStore::DISALLOW_PROMPT); | 2141 form_manager.FetchDataFromPasswordStore(); |
2152 | 2142 |
2153 PasswordForm submitted_form(form); | 2143 PasswordForm submitted_form(form); |
2154 submitted_form.password_value += ASCIIToUTF16("add stuff, make it different"); | 2144 submitted_form.password_value += ASCIIToUTF16("add stuff, make it different"); |
2155 form_manager.ProvisionallySave( | 2145 form_manager.ProvisionallySave( |
2156 submitted_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); | 2146 submitted_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
2157 | 2147 |
2158 base::HistogramTester histogram_tester; | 2148 base::HistogramTester histogram_tester; |
2159 EXPECT_CALL(*mock_store(), RemoveLogin(_)).Times(0); | 2149 EXPECT_CALL(*mock_store(), RemoveLogin(_)).Times(0); |
2160 form_manager.WipeStoreCopyIfOutdated(); | 2150 form_manager.WipeStoreCopyIfOutdated(); |
2161 histogram_tester.ExpectUniqueSample("PasswordManager.StoreReadyWhenWiping", 0, | 2151 histogram_tester.ExpectUniqueSample("PasswordManager.StoreReadyWhenWiping", 0, |
2162 1); | 2152 1); |
2163 } | 2153 } |
2164 | 2154 |
2165 TEST_F(PasswordFormManagerTest, WipeStoreCopyIfOutdated_NotOutdated) { | 2155 TEST_F(PasswordFormManagerTest, WipeStoreCopyIfOutdated_NotOutdated) { |
2166 PasswordForm form(*saved_match()); | 2156 PasswordForm form(*saved_match()); |
2167 form.username_value = ASCIIToUTF16("test@gmail.com"); | 2157 form.username_value = ASCIIToUTF16("test@gmail.com"); |
2168 ASSERT_FALSE(form.password_value.empty()); | 2158 ASSERT_FALSE(form.password_value.empty()); |
2169 | 2159 |
2170 PasswordFormManager form_manager(password_manager(), client(), | 2160 PasswordFormManager form_manager(password_manager(), client(), |
2171 client()->driver(), form, false); | 2161 client()->driver(), form, false); |
2172 | 2162 |
2173 // For GAIA authentication, the first two usernames are equivalent to | 2163 // For GAIA authentication, the first two usernames are equivalent to |
2174 // test@gmail.com, but the third is not. | 2164 // test@gmail.com, but the third is not. |
2175 PasswordForm form_related(form); | 2165 PasswordForm form_related(form); |
2176 form_related.username_value = ASCIIToUTF16("test@googlemail.com"); | 2166 form_related.username_value = ASCIIToUTF16("test@googlemail.com"); |
2177 PasswordForm form_related2(form); | 2167 PasswordForm form_related2(form); |
2178 form_related2.username_value = ASCIIToUTF16("test"); | 2168 form_related2.username_value = ASCIIToUTF16("test"); |
2179 PasswordForm form_unrelated(form); | 2169 PasswordForm form_unrelated(form); |
2180 form_unrelated.username_value = ASCIIToUTF16("test.else"); | 2170 form_unrelated.username_value = ASCIIToUTF16("test.else"); |
2181 EXPECT_CALL(*mock_store(), GetLogins(_, _, _)) | 2171 EXPECT_CALL(*mock_store(), GetLogins(_, _)) |
2182 .WillOnce(testing::WithArg<2>( | 2172 .WillOnce(testing::WithArg<1>( |
2183 InvokeConsumer(form, form_related, form_related2, form_unrelated))); | 2173 InvokeConsumer(form, form_related, form_related2, form_unrelated))); |
2184 form_manager.FetchDataFromPasswordStore(PasswordStore::DISALLOW_PROMPT); | 2174 form_manager.FetchDataFromPasswordStore(); |
2185 | 2175 |
2186 form_manager.ProvisionallySave( | 2176 form_manager.ProvisionallySave( |
2187 form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); | 2177 form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
2188 | 2178 |
2189 base::HistogramTester histogram_tester; | 2179 base::HistogramTester histogram_tester; |
2190 EXPECT_CALL(*mock_store(), RemoveLogin(_)).Times(0); | 2180 EXPECT_CALL(*mock_store(), RemoveLogin(_)).Times(0); |
2191 form_manager.WipeStoreCopyIfOutdated(); | 2181 form_manager.WipeStoreCopyIfOutdated(); |
2192 histogram_tester.ExpectUniqueSample("PasswordManager.StoreReadyWhenWiping", 1, | 2182 histogram_tester.ExpectUniqueSample("PasswordManager.StoreReadyWhenWiping", 1, |
2193 1); | 2183 1); |
2194 } | 2184 } |
2195 | 2185 |
2196 TEST_F(PasswordFormManagerTest, WipeStoreCopyIfOutdated_Outdated) { | 2186 TEST_F(PasswordFormManagerTest, WipeStoreCopyIfOutdated_Outdated) { |
2197 PasswordForm form(*saved_match()); | 2187 PasswordForm form(*saved_match()); |
2198 ASSERT_FALSE(form.password_value.empty()); | 2188 ASSERT_FALSE(form.password_value.empty()); |
2199 | 2189 |
2200 PasswordFormManager form_manager(password_manager(), client(), | 2190 PasswordFormManager form_manager(password_manager(), client(), |
2201 client()->driver(), form, false); | 2191 client()->driver(), form, false); |
2202 | 2192 |
2203 // For GAIA authentication, the first two usernames are equivalent to | 2193 // For GAIA authentication, the first two usernames are equivalent to |
2204 // test@gmail.com, but the third is not. | 2194 // test@gmail.com, but the third is not. |
2205 PasswordForm form_related(form); | 2195 PasswordForm form_related(form); |
2206 form_related.username_value = ASCIIToUTF16("test@googlemail.com"); | 2196 form_related.username_value = ASCIIToUTF16("test@googlemail.com"); |
2207 PasswordForm form_related2(form); | 2197 PasswordForm form_related2(form); |
2208 form_related2.username_value = ASCIIToUTF16("test"); | 2198 form_related2.username_value = ASCIIToUTF16("test"); |
2209 PasswordForm form_unrelated(form); | 2199 PasswordForm form_unrelated(form); |
2210 form_unrelated.username_value = ASCIIToUTF16("test.else"); | 2200 form_unrelated.username_value = ASCIIToUTF16("test.else"); |
2211 EXPECT_CALL(*mock_store(), GetLogins(_, _, _)) | 2201 EXPECT_CALL(*mock_store(), GetLogins(_, _)) |
2212 .WillOnce(testing::WithArg<2>( | 2202 .WillOnce(testing::WithArg<1>( |
2213 InvokeConsumer(form, form_related, form_related2, form_unrelated))); | 2203 InvokeConsumer(form, form_related, form_related2, form_unrelated))); |
2214 form_manager.FetchDataFromPasswordStore(PasswordStore::DISALLOW_PROMPT); | 2204 form_manager.FetchDataFromPasswordStore(); |
2215 | 2205 |
2216 PasswordForm submitted_form(form); | 2206 PasswordForm submitted_form(form); |
2217 submitted_form.password_value += ASCIIToUTF16("add stuff, make it different"); | 2207 submitted_form.password_value += ASCIIToUTF16("add stuff, make it different"); |
2218 form_manager.ProvisionallySave( | 2208 form_manager.ProvisionallySave( |
2219 submitted_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); | 2209 submitted_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
2220 | 2210 |
2221 base::HistogramTester histogram_tester; | 2211 base::HistogramTester histogram_tester; |
2222 EXPECT_CALL(*mock_store(), RemoveLogin(form)); | 2212 EXPECT_CALL(*mock_store(), RemoveLogin(form)); |
2223 EXPECT_CALL(*mock_store(), RemoveLogin(form_related)); | 2213 EXPECT_CALL(*mock_store(), RemoveLogin(form_related)); |
2224 EXPECT_CALL(*mock_store(), RemoveLogin(form_related2)); | 2214 EXPECT_CALL(*mock_store(), RemoveLogin(form_related2)); |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2359 EXPECT_CALL(*mock_store(), RemoveLogin(_)).Times(0); | 2349 EXPECT_CALL(*mock_store(), RemoveLogin(_)).Times(0); |
2360 EXPECT_CALL(*client()->mock_driver()->mock_autofill_download_manager(), | 2350 EXPECT_CALL(*client()->mock_driver()->mock_autofill_download_manager(), |
2361 StartUploadRequest(_, false, _, _, true)); | 2351 StartUploadRequest(_, false, _, _, true)); |
2362 | 2352 |
2363 form_manager()->ProvisionallySave( | 2353 form_manager()->ProvisionallySave( |
2364 submitted_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); | 2354 submitted_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
2365 form_manager()->Save(); | 2355 form_manager()->Save(); |
2366 } | 2356 } |
2367 | 2357 |
2368 TEST_F(PasswordFormManagerTest, GenerationStatusChangedWithPassword) { | 2358 TEST_F(PasswordFormManagerTest, GenerationStatusChangedWithPassword) { |
2369 const PasswordStore::AuthorizationPromptPolicy auth_policy = | 2359 EXPECT_CALL(*mock_store(), GetLogins(*observed_form(), form_manager())); |
2370 PasswordStore::DISALLOW_PROMPT; | 2360 form_manager()->FetchDataFromPasswordStore(); |
2371 EXPECT_CALL(*mock_store(), | |
2372 GetLogins(*observed_form(), auth_policy, form_manager())); | |
2373 form_manager()->FetchDataFromPasswordStore(auth_policy); | |
2374 | 2361 |
2375 scoped_ptr<PasswordForm> generated_form(new PasswordForm(*observed_form())); | 2362 scoped_ptr<PasswordForm> generated_form(new PasswordForm(*observed_form())); |
2376 generated_form->type = PasswordForm::TYPE_GENERATED; | 2363 generated_form->type = PasswordForm::TYPE_GENERATED; |
2377 generated_form->username_value = ASCIIToUTF16("username"); | 2364 generated_form->username_value = ASCIIToUTF16("username"); |
2378 generated_form->password_value = ASCIIToUTF16("password2"); | 2365 generated_form->password_value = ASCIIToUTF16("password2"); |
2379 generated_form->preferred = true; | 2366 generated_form->preferred = true; |
2380 | 2367 |
2381 PasswordForm submitted_form(*generated_form); | 2368 PasswordForm submitted_form(*generated_form); |
2382 submitted_form.password_value = ASCIIToUTF16("password3"); | 2369 submitted_form.password_value = ASCIIToUTF16("password3"); |
2383 | 2370 |
2384 ScopedVector<PasswordForm> simulated_results; | 2371 ScopedVector<PasswordForm> simulated_results; |
2385 simulated_results.push_back(std::move(generated_form)); | 2372 simulated_results.push_back(std::move(generated_form)); |
2386 form_manager()->OnGetPasswordStoreResults(std::move(simulated_results)); | 2373 form_manager()->OnGetPasswordStoreResults(std::move(simulated_results)); |
2387 | 2374 |
2388 form_manager()->ProvisionallySave( | 2375 form_manager()->ProvisionallySave( |
2389 submitted_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); | 2376 submitted_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
2390 | 2377 |
2391 PasswordForm new_credentials; | 2378 PasswordForm new_credentials; |
2392 EXPECT_CALL(*mock_store(), UpdateLogin(_)) | 2379 EXPECT_CALL(*mock_store(), UpdateLogin(_)) |
2393 .WillOnce(testing::SaveArg<0>(&new_credentials)); | 2380 .WillOnce(testing::SaveArg<0>(&new_credentials)); |
2394 form_manager()->Save(); | 2381 form_manager()->Save(); |
2395 | 2382 |
2396 EXPECT_EQ(PasswordForm::TYPE_MANUAL, new_credentials.type); | 2383 EXPECT_EQ(PasswordForm::TYPE_MANUAL, new_credentials.type); |
2397 } | 2384 } |
2398 | 2385 |
2399 TEST_F(PasswordFormManagerTest, GenerationStatusNotUpdatedIfPasswordUnchanged) { | 2386 TEST_F(PasswordFormManagerTest, GenerationStatusNotUpdatedIfPasswordUnchanged) { |
2400 base::HistogramTester histogram_tester; | 2387 base::HistogramTester histogram_tester; |
2401 | 2388 |
2402 const PasswordStore::AuthorizationPromptPolicy auth_policy = | 2389 EXPECT_CALL(*mock_store(), GetLogins(*observed_form(), form_manager())); |
2403 PasswordStore::DISALLOW_PROMPT; | 2390 form_manager()->FetchDataFromPasswordStore(); |
2404 EXPECT_CALL(*mock_store(), | |
2405 GetLogins(*observed_form(), auth_policy, form_manager())); | |
2406 form_manager()->FetchDataFromPasswordStore(auth_policy); | |
2407 | 2391 |
2408 scoped_ptr<PasswordForm> generated_form(new PasswordForm(*observed_form())); | 2392 scoped_ptr<PasswordForm> generated_form(new PasswordForm(*observed_form())); |
2409 generated_form->type = PasswordForm::TYPE_GENERATED; | 2393 generated_form->type = PasswordForm::TYPE_GENERATED; |
2410 generated_form->username_value = ASCIIToUTF16("username"); | 2394 generated_form->username_value = ASCIIToUTF16("username"); |
2411 generated_form->password_value = ASCIIToUTF16("password2"); | 2395 generated_form->password_value = ASCIIToUTF16("password2"); |
2412 generated_form->preferred = true; | 2396 generated_form->preferred = true; |
2413 | 2397 |
2414 PasswordForm submitted_form(*generated_form); | 2398 PasswordForm submitted_form(*generated_form); |
2415 | 2399 |
2416 ScopedVector<PasswordForm> simulated_results; | 2400 ScopedVector<PasswordForm> simulated_results; |
2417 simulated_results.push_back(std::move(generated_form)); | 2401 simulated_results.push_back(std::move(generated_form)); |
2418 form_manager()->OnGetPasswordStoreResults(std::move(simulated_results)); | 2402 form_manager()->OnGetPasswordStoreResults(std::move(simulated_results)); |
2419 | 2403 |
2420 form_manager()->ProvisionallySave( | 2404 form_manager()->ProvisionallySave( |
2421 submitted_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); | 2405 submitted_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
2422 | 2406 |
2423 PasswordForm new_credentials; | 2407 PasswordForm new_credentials; |
2424 EXPECT_CALL(*mock_store(), UpdateLogin(_)) | 2408 EXPECT_CALL(*mock_store(), UpdateLogin(_)) |
2425 .WillOnce(testing::SaveArg<0>(&new_credentials)); | 2409 .WillOnce(testing::SaveArg<0>(&new_credentials)); |
2426 form_manager()->Save(); | 2410 form_manager()->Save(); |
2427 | 2411 |
2428 EXPECT_EQ(PasswordForm::TYPE_GENERATED, new_credentials.type); | 2412 EXPECT_EQ(PasswordForm::TYPE_GENERATED, new_credentials.type); |
2429 histogram_tester.ExpectBucketCount("PasswordGeneration.SubmissionEvent", | 2413 histogram_tester.ExpectBucketCount("PasswordGeneration.SubmissionEvent", |
2430 metrics_util::PASSWORD_USED, 1); | 2414 metrics_util::PASSWORD_USED, 1); |
2431 } | 2415 } |
2432 | 2416 |
2433 TEST_F(PasswordFormManagerTest, | 2417 TEST_F(PasswordFormManagerTest, |
2434 FetchMatchingLoginsFromPasswordStore_Reentrance) { | 2418 FetchMatchingLoginsFromPasswordStore_Reentrance) { |
2435 const PasswordStore::AuthorizationPromptPolicy auth_policy = | 2419 EXPECT_CALL(*mock_store(), |
2436 PasswordStore::DISALLOW_PROMPT; | 2420 GetLogins(form_manager()->observed_form(), form_manager())) |
2437 EXPECT_CALL(*mock_store(), GetLogins(form_manager()->observed_form(), | |
2438 auth_policy, form_manager())) | |
2439 .Times(2); | 2421 .Times(2); |
2440 form_manager()->FetchDataFromPasswordStore(auth_policy); | 2422 form_manager()->FetchDataFromPasswordStore(); |
2441 form_manager()->FetchDataFromPasswordStore(auth_policy); | 2423 form_manager()->FetchDataFromPasswordStore(); |
2442 | 2424 |
2443 // First response from the store, should be ignored. | 2425 // First response from the store, should be ignored. |
2444 scoped_ptr<PasswordForm> saved_form(new PasswordForm(*saved_match())); | 2426 scoped_ptr<PasswordForm> saved_form(new PasswordForm(*saved_match())); |
2445 saved_form->username_value = ASCIIToUTF16("a@gmail.com"); | 2427 saved_form->username_value = ASCIIToUTF16("a@gmail.com"); |
2446 ScopedVector<PasswordForm> results; | 2428 ScopedVector<PasswordForm> results; |
2447 results.push_back(std::move(saved_form)); | 2429 results.push_back(std::move(saved_form)); |
2448 form_manager()->OnGetPasswordStoreResults(std::move(results)); | 2430 form_manager()->OnGetPasswordStoreResults(std::move(results)); |
2449 EXPECT_TRUE(form_manager()->best_matches().empty()); | 2431 EXPECT_TRUE(form_manager()->best_matches().empty()); |
2450 | 2432 |
2451 // Second response from the store should not be ignored. | 2433 // Second response from the store should not be ignored. |
(...skipping 27 matching lines...) Expand all Loading... |
2479 form_manager()->ProcessFrame(second_driver.AsWeakPtr()); | 2461 form_manager()->ProcessFrame(second_driver.AsWeakPtr()); |
2480 } | 2462 } |
2481 | 2463 |
2482 TEST_F(PasswordFormManagerTest, ProcessFrame_DriverBeforeMatching) { | 2464 TEST_F(PasswordFormManagerTest, ProcessFrame_DriverBeforeMatching) { |
2483 NiceMock<MockPasswordManagerDriver> extra_driver; | 2465 NiceMock<MockPasswordManagerDriver> extra_driver; |
2484 | 2466 |
2485 EXPECT_CALL(extra_driver, FillPasswordForm(_)); | 2467 EXPECT_CALL(extra_driver, FillPasswordForm(_)); |
2486 | 2468 |
2487 // Ask store for logins, but store should not respond yet. | 2469 // Ask store for logins, but store should not respond yet. |
2488 EXPECT_CALL(*mock_store(), | 2470 EXPECT_CALL(*mock_store(), |
2489 GetLogins(form_manager()->observed_form(), _, form_manager())); | 2471 GetLogins(form_manager()->observed_form(), form_manager())); |
2490 form_manager()->FetchDataFromPasswordStore(PasswordStore::DISALLOW_PROMPT); | 2472 form_manager()->FetchDataFromPasswordStore(); |
2491 | 2473 |
2492 // Now add the extra driver. | 2474 // Now add the extra driver. |
2493 form_manager()->ProcessFrame(extra_driver.AsWeakPtr()); | 2475 form_manager()->ProcessFrame(extra_driver.AsWeakPtr()); |
2494 | 2476 |
2495 // Password store responds. | 2477 // Password store responds. |
2496 scoped_ptr<PasswordForm> match(new PasswordForm(*saved_match())); | 2478 scoped_ptr<PasswordForm> match(new PasswordForm(*saved_match())); |
2497 ScopedVector<PasswordForm> result_form; | 2479 ScopedVector<PasswordForm> result_form; |
2498 result_form.push_back(std::move(match)); | 2480 result_form.push_back(std::move(match)); |
2499 form_manager()->OnGetPasswordStoreResults(std::move(result_form)); | 2481 form_manager()->OnGetPasswordStoreResults(std::move(result_form)); |
2500 } | 2482 } |
2501 | 2483 |
2502 TEST_F(PasswordFormManagerTest, ProcessFrame_StoreUpdatesCausesAutofill) { | 2484 TEST_F(PasswordFormManagerTest, ProcessFrame_StoreUpdatesCausesAutofill) { |
2503 EXPECT_CALL(*client()->mock_driver(), FillPasswordForm(_)).Times(2); | 2485 EXPECT_CALL(*client()->mock_driver(), FillPasswordForm(_)).Times(2); |
2504 SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); | 2486 SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); |
2505 SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); | 2487 SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); |
2506 } | 2488 } |
2507 | 2489 |
2508 TEST_F(PasswordFormManagerTest, UpdateFormManagers_IsCalled) { | 2490 TEST_F(PasswordFormManagerTest, UpdateFormManagers_IsCalled) { |
2509 // Let |password_manager()| create one additional PasswordFormManager. | 2491 // Let |password_manager()| create one additional PasswordFormManager. |
2510 PasswordStoreConsumer* consumer = nullptr; // Will point to the new PFM. | 2492 PasswordStoreConsumer* consumer = nullptr; // Will point to the new PFM. |
2511 EXPECT_CALL(*mock_store(), GetLogins(_, _, _)) | 2493 EXPECT_CALL(*mock_store(), GetLogins(_, _)).WillOnce(SaveArg<1>(&consumer)); |
2512 .WillOnce(SaveArg<2>(&consumer)); | |
2513 PasswordForm form; | 2494 PasswordForm form; |
2514 std::vector<PasswordForm> observed; | 2495 std::vector<PasswordForm> observed; |
2515 observed.push_back(form); | 2496 observed.push_back(form); |
2516 password_manager()->OnPasswordFormsParsed(client()->mock_driver(), observed); | 2497 password_manager()->OnPasswordFormsParsed(client()->mock_driver(), observed); |
2517 // Make sure that the additional PFM is in POST_MATCHING phase. | 2498 // Make sure that the additional PFM is in POST_MATCHING phase. |
2518 ASSERT_TRUE(consumer); | 2499 ASSERT_TRUE(consumer); |
2519 consumer->OnGetPasswordStoreResults(ScopedVector<PasswordForm>()); | 2500 consumer->OnGetPasswordStoreResults(ScopedVector<PasswordForm>()); |
2520 | 2501 |
2521 // Now prepare |form_manager()| for saving. | 2502 // Now prepare |form_manager()| for saving. |
2522 SimulateMatchingPhase(form_manager(), RESULT_NO_MATCH); | 2503 SimulateMatchingPhase(form_manager(), RESULT_NO_MATCH); |
2523 PasswordForm saved_form(*observed_form()); | 2504 PasswordForm saved_form(*observed_form()); |
2524 saved_form.preferred = true; | 2505 saved_form.preferred = true; |
2525 form_manager()->ProvisionallySave( | 2506 form_manager()->ProvisionallySave( |
2526 saved_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); | 2507 saved_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
2527 | 2508 |
2528 // Firing Save() should cause PasswordManager::UpdateFormManagers to make the | 2509 // Firing Save() should cause PasswordManager::UpdateFormManagers to make the |
2529 // additional PFM to call the password store again. | 2510 // additional PFM to call the password store again. |
2530 EXPECT_CALL(*mock_store(), GetLogins(_, _, _)); | 2511 EXPECT_CALL(*mock_store(), GetLogins(_, _)); |
2531 form_manager()->Save(); | 2512 form_manager()->Save(); |
2532 } | 2513 } |
2533 | 2514 |
2534 TEST_F(PasswordFormManagerTest, UploadChangePasswordForm_NEW_PASSWORD) { | 2515 TEST_F(PasswordFormManagerTest, UploadChangePasswordForm_NEW_PASSWORD) { |
2535 ChangePasswordUploadTest(autofill::NEW_PASSWORD); | 2516 ChangePasswordUploadTest(autofill::NEW_PASSWORD); |
2536 } | 2517 } |
2537 | 2518 |
2538 TEST_F(PasswordFormManagerTest, | 2519 TEST_F(PasswordFormManagerTest, |
2539 UploadChangePasswordForm_PROBABLY_NEW_PASSWORD) { | 2520 UploadChangePasswordForm_PROBABLY_NEW_PASSWORD) { |
2540 ChangePasswordUploadTest(autofill::PROBABLY_NEW_PASSWORD); | 2521 ChangePasswordUploadTest(autofill::PROBABLY_NEW_PASSWORD); |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2695 | 2676 |
2696 EXPECT_EQ(credentials.password_value, new_credentials.password_value); | 2677 EXPECT_EQ(credentials.password_value, new_credentials.password_value); |
2697 EXPECT_EQ(credentials.username_value, new_credentials.username_value); | 2678 EXPECT_EQ(credentials.username_value, new_credentials.username_value); |
2698 EXPECT_EQ(credentials.password_element, new_credentials.password_element); | 2679 EXPECT_EQ(credentials.password_element, new_credentials.password_element); |
2699 EXPECT_EQ(credentials.username_element, new_credentials.username_element); | 2680 EXPECT_EQ(credentials.username_element, new_credentials.username_element); |
2700 EXPECT_EQ(credentials.origin, new_credentials.origin); | 2681 EXPECT_EQ(credentials.origin, new_credentials.origin); |
2701 } | 2682 } |
2702 | 2683 |
2703 #if !defined(OS_IOS) && !defined(OS_ANDROID) | 2684 #if !defined(OS_IOS) && !defined(OS_ANDROID) |
2704 TEST_F(PasswordFormManagerTest, FetchStatistics) { | 2685 TEST_F(PasswordFormManagerTest, FetchStatistics) { |
2705 const PasswordStore::AuthorizationPromptPolicy auth_policy = | |
2706 PasswordStore::DISALLOW_PROMPT; | |
2707 InteractionsStats stats; | 2686 InteractionsStats stats; |
2708 stats.origin_domain = observed_form()->origin.GetOrigin(); | 2687 stats.origin_domain = observed_form()->origin.GetOrigin(); |
2709 stats.username_value = saved_match()->username_value; | 2688 stats.username_value = saved_match()->username_value; |
2710 stats.dismissal_count = 5; | 2689 stats.dismissal_count = 5; |
2711 EXPECT_CALL(*mock_store(), | 2690 EXPECT_CALL(*mock_store(), GetLogins(*observed_form(), form_manager())); |
2712 GetLogins(*observed_form(), auth_policy, form_manager())); | |
2713 std::vector<InteractionsStats*> db_stats; | 2691 std::vector<InteractionsStats*> db_stats; |
2714 db_stats.push_back(new InteractionsStats(stats)); | 2692 db_stats.push_back(new InteractionsStats(stats)); |
2715 EXPECT_CALL(*mock_store(), GetSiteStatsMock(stats.origin_domain)) | 2693 EXPECT_CALL(*mock_store(), GetSiteStatsMock(stats.origin_domain)) |
2716 .WillOnce(Return(db_stats)); | 2694 .WillOnce(Return(db_stats)); |
2717 form_manager()->FetchDataFromPasswordStore(auth_policy); | 2695 form_manager()->FetchDataFromPasswordStore(); |
2718 base::RunLoop().RunUntilIdle(); | 2696 base::RunLoop().RunUntilIdle(); |
2719 | 2697 |
2720 EXPECT_THAT(form_manager()->interactions_stats(), | 2698 EXPECT_THAT(form_manager()->interactions_stats(), |
2721 ElementsAre(Pointee(stats))); | 2699 ElementsAre(Pointee(stats))); |
2722 } | 2700 } |
2723 #else | 2701 #else |
2724 TEST_F(PasswordFormManagerTest, DontFetchStatistics) { | 2702 TEST_F(PasswordFormManagerTest, DontFetchStatistics) { |
2725 const PasswordStore::AuthorizationPromptPolicy auth_policy = | 2703 EXPECT_CALL(*mock_store(), GetLogins(*observed_form(), form_manager())); |
2726 PasswordStore::DISALLOW_PROMPT; | |
2727 EXPECT_CALL(*mock_store(), | |
2728 GetLogins(*observed_form(), auth_policy, form_manager())); | |
2729 EXPECT_CALL(*mock_store(), GetSiteStatsMock(_)).Times(0); | 2704 EXPECT_CALL(*mock_store(), GetSiteStatsMock(_)).Times(0); |
2730 form_manager()->FetchDataFromPasswordStore(auth_policy); | 2705 form_manager()->FetchDataFromPasswordStore(); |
2731 base::RunLoop().RunUntilIdle(); | 2706 base::RunLoop().RunUntilIdle(); |
2732 } | 2707 } |
2733 #endif | 2708 #endif |
2734 | 2709 |
2735 TEST_F(PasswordFormManagerTest, | 2710 TEST_F(PasswordFormManagerTest, |
2736 TestSavingOnChangePasswordFormGenerationNoStoredForms) { | 2711 TestSavingOnChangePasswordFormGenerationNoStoredForms) { |
2737 client()->set_is_update_password_ui_enabled(true); | 2712 client()->set_is_update_password_ui_enabled(true); |
2738 SimulateMatchingPhase(form_manager(), RESULT_NO_MATCH); | 2713 SimulateMatchingPhase(form_manager(), RESULT_NO_MATCH); |
2739 form_manager()->set_has_generated_password(true); | 2714 form_manager()->set_has_generated_password(true); |
2740 | 2715 |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2957 Mock::VerifyAndClearExpectations(mock_store()); | 2932 Mock::VerifyAndClearExpectations(mock_store()); |
2958 | 2933 |
2959 EXPECT_EQ(saved_match()->username_value + ASCIIToUTF16("1"), | 2934 EXPECT_EQ(saved_match()->username_value + ASCIIToUTF16("1"), |
2960 new_credentials.username_value); | 2935 new_credentials.username_value); |
2961 EXPECT_EQ(saved_match()->password_value, new_credentials.password_value); | 2936 EXPECT_EQ(saved_match()->password_value, new_credentials.password_value); |
2962 EXPECT_EQ(base::string16(), new_credentials.username_element); | 2937 EXPECT_EQ(base::string16(), new_credentials.username_element); |
2963 EXPECT_EQ(autofill::PasswordForm::TYPE_API, new_credentials.type); | 2938 EXPECT_EQ(autofill::PasswordForm::TYPE_API, new_credentials.type); |
2964 } | 2939 } |
2965 | 2940 |
2966 } // namespace password_manager | 2941 } // namespace password_manager |
OLD | NEW |