| 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 |