Index: components/password_manager/content/browser/credential_manager_impl_unittest.cc |
diff --git a/components/password_manager/content/browser/credential_manager_impl_unittest.cc b/components/password_manager/content/browser/credential_manager_impl_unittest.cc |
index 377649611a2ec9f133f1d9ae1a3f39ad07bde1c9..4e5eb5d16822b87ba78f3e3ec48377baad0a652a 100644 |
--- a/components/password_manager/content/browser/credential_manager_impl_unittest.cc |
+++ b/components/password_manager/content/browser/credential_manager_impl_unittest.cc |
@@ -292,17 +292,17 @@ class CredentialManagerImplTest : public content::RenderViewHostTestHarness { |
content::RenderViewHostTestHarness::TearDown(); |
} |
- void ExpectZeroClickSignInFailure(bool zero_click_only, |
+ void ExpectZeroClickSignInFailure(CredentialMediationRequirement mediation, |
bool include_passwords, |
const std::vector<GURL>& federations) { |
bool called = false; |
mojom::CredentialManagerError error; |
base::Optional<CredentialInfo> credential; |
- CallGet(zero_click_only, include_passwords, federations, |
- base::Bind(&GetCredentialCallback, &called, &error, &credential)); |
EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _)) |
.Times(testing::Exactly(0)); |
EXPECT_CALL(*client_, NotifyUserAutoSigninPtr()).Times(testing::Exactly(0)); |
+ CallGet(mediation, include_passwords, federations, |
+ base::Bind(&GetCredentialCallback, &called, &error, &credential)); |
RunAllPendingTasks(); |
@@ -311,18 +311,18 @@ class CredentialManagerImplTest : public content::RenderViewHostTestHarness { |
EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_EMPTY, credential->type); |
} |
- void ExpectZeroClickSignInSuccess(bool zero_click_only, |
+ void ExpectZeroClickSignInSuccess(CredentialMediationRequirement mediation, |
bool include_passwords, |
const std::vector<GURL>& federations, |
CredentialType type) { |
bool called = false; |
mojom::CredentialManagerError error; |
base::Optional<CredentialInfo> credential; |
- CallGet(zero_click_only, include_passwords, federations, |
- base::Bind(&GetCredentialCallback, &called, &error, &credential)); |
EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _)) |
.Times(testing::Exactly(0)); |
EXPECT_CALL(*client_, NotifyUserAutoSigninPtr()).Times(testing::Exactly(1)); |
+ CallGet(mediation, include_passwords, federations, |
+ base::Bind(&GetCredentialCallback, &called, &error, &credential)); |
RunAllPendingTasks(); |
@@ -331,14 +331,14 @@ class CredentialManagerImplTest : public content::RenderViewHostTestHarness { |
EXPECT_EQ(type, credential->type); |
} |
- void ExpectCredentialType(bool zero_click_only, |
+ void ExpectCredentialType(CredentialMediationRequirement mediation, |
bool include_passwords, |
const std::vector<GURL>& federations, |
CredentialType type) { |
bool called = false; |
mojom::CredentialManagerError error; |
base::Optional<CredentialInfo> credential; |
- CallGet(zero_click_only, include_passwords, federations, |
+ CallGet(mediation, include_passwords, federations, |
base::Bind(&GetCredentialCallback, &called, &error, &credential)); |
RunAllPendingTasks(); |
@@ -361,11 +361,11 @@ class CredentialManagerImplTest : public content::RenderViewHostTestHarness { |
cm_service_impl_->RequireUserMediation(std::move(callback)); |
} |
- void CallGet(bool zero_click_only, |
+ void CallGet(CredentialMediationRequirement mediation, |
bool include_passwords, |
const std::vector<GURL>& federations, |
CredentialManagerImpl::GetCallback callback) { |
- cm_service_impl_->Get(zero_click_only, include_passwords, federations, |
+ cm_service_impl_->Get(mediation, include_passwords, federations, |
std::move(callback)); |
} |
@@ -680,7 +680,7 @@ TEST_F(CredentialManagerImplTest, CredentialManagerGetOverwriteZeroClick) { |
bool called = false; |
mojom::CredentialManagerError error; |
base::Optional<CredentialInfo> credential; |
- CallGet(false, true, federations, |
+ CallGet(CredentialMediationRequirement::kOptional, true, federations, |
base::Bind(&GetCredentialCallback, &called, &error, &credential)); |
RunAllPendingTasks(); |
@@ -813,8 +813,8 @@ TEST_F(CredentialManagerImplTest, |
.Times(testing::Exactly(0)); |
EXPECT_CALL(*client_, NotifyUserAutoSigninPtr()).Times(testing::Exactly(0)); |
- ExpectCredentialType(false, true, federations, |
- CredentialType::CREDENTIAL_TYPE_EMPTY); |
+ ExpectCredentialType(CredentialMediationRequirement::kOptional, true, |
+ federations, CredentialType::CREDENTIAL_TYPE_EMPTY); |
} |
TEST_F(CredentialManagerImplTest, |
@@ -826,8 +826,8 @@ TEST_F(CredentialManagerImplTest, |
EXPECT_CALL(*client_, NotifyUserAutoSigninPtr()).Times(testing::Exactly(0)); |
std::vector<GURL> federations; |
- ExpectCredentialType(false, true, federations, |
- CredentialType::CREDENTIAL_TYPE_EMPTY); |
+ ExpectCredentialType(CredentialMediationRequirement::kOptional, true, |
+ federations, CredentialType::CREDENTIAL_TYPE_EMPTY); |
} |
TEST_F(CredentialManagerImplTest, |
@@ -839,7 +839,8 @@ TEST_F(CredentialManagerImplTest, |
UnorderedElementsAre(Pointee(subdomain_form_)), _, _)); |
EXPECT_CALL(*client_, NotifyUserAutoSigninPtr()).Times(0); |
- ExpectCredentialType(false, true, std::vector<GURL>(), |
+ ExpectCredentialType(CredentialMediationRequirement::kOptional, true, |
+ std::vector<GURL>(), |
CredentialType::CREDENTIAL_TYPE_PASSWORD); |
} |
@@ -854,7 +855,8 @@ TEST_F(CredentialManagerImplTest, |
Pointee(form_)), |
_, _)); |
- ExpectCredentialType(false, true, std::vector<GURL>(), |
+ ExpectCredentialType(CredentialMediationRequirement::kOptional, true, |
+ std::vector<GURL>(), |
CredentialType::CREDENTIAL_TYPE_PASSWORD); |
} |
@@ -869,7 +871,8 @@ TEST_F(CredentialManagerImplTest, |
store_->AddLogin(duplicate); |
std::vector<GURL> federations; |
- ExpectZeroClickSignInSuccess(false, true, federations, |
+ ExpectZeroClickSignInSuccess(CredentialMediationRequirement::kOptional, true, |
+ federations, |
CredentialType::CREDENTIAL_TYPE_PASSWORD); |
} |
@@ -912,7 +915,7 @@ TEST_F(CredentialManagerImplTest, |
base::Optional<CredentialInfo> credential; |
std::vector<GURL> federations; |
federations.push_back(GURL("https://google.com/")); |
- CallGet(false, true, federations, |
+ CallGet(CredentialMediationRequirement::kOptional, true, federations, |
base::Bind(&GetCredentialCallback, &called, &error, &credential)); |
RunAllPendingTasks(); |
@@ -929,8 +932,8 @@ TEST_F(CredentialManagerImplTest, |
.Times(testing::Exactly(0)); |
EXPECT_CALL(*client_, NotifyUserAutoSigninPtr()).Times(testing::Exactly(0)); |
- ExpectCredentialType(false, true, federations, |
- CredentialType::CREDENTIAL_TYPE_EMPTY); |
+ ExpectCredentialType(CredentialMediationRequirement::kOptional, true, |
+ federations, CredentialType::CREDENTIAL_TYPE_EMPTY); |
} |
TEST_F(CredentialManagerImplTest, |
@@ -946,7 +949,7 @@ TEST_F(CredentialManagerImplTest, |
bool called = false; |
mojom::CredentialManagerError error; |
base::Optional<CredentialInfo> credential; |
- CallGet(false, true, federations, |
+ CallGet(CredentialMediationRequirement::kOptional, true, federations, |
base::Bind(&GetCredentialCallback, &called, &error, &credential)); |
RunAllPendingTasks(); |
@@ -963,7 +966,8 @@ TEST_F( |
.Times(testing::Exactly(0)); |
EXPECT_CALL(*client_, NotifyUserAutoSigninPtr()).Times(testing::Exactly(0)); |
- ExpectZeroClickSignInFailure(true, true, federations); |
+ ExpectZeroClickSignInFailure(CredentialMediationRequirement::kSilent, true, |
+ federations); |
} |
TEST_F(CredentialManagerImplTest, |
@@ -975,7 +979,8 @@ TEST_F(CredentialManagerImplTest, |
EXPECT_CALL(*client_, NotifyUserCouldBeAutoSignedInPtr(_)).Times(0); |
- ExpectZeroClickSignInSuccess(true, true, federations, |
+ ExpectZeroClickSignInSuccess(CredentialMediationRequirement::kSilent, true, |
+ federations, |
CredentialType::CREDENTIAL_TYPE_PASSWORD); |
} |
@@ -988,7 +993,8 @@ TEST_F(CredentialManagerImplTest, |
EXPECT_CALL(*client_, NotifyUserCouldBeAutoSignedInPtr(_)).Times(0); |
- ExpectZeroClickSignInFailure(true, false, federations); |
+ ExpectZeroClickSignInFailure(CredentialMediationRequirement::kSilent, false, |
+ federations); |
} |
TEST_F(CredentialManagerImplTest, |
@@ -1003,7 +1009,8 @@ TEST_F(CredentialManagerImplTest, |
EXPECT_CALL(*client_, NotifyUserCouldBeAutoSignedInPtr(_)).Times(0); |
- ExpectZeroClickSignInSuccess(true, true, federations, |
+ ExpectZeroClickSignInSuccess(CredentialMediationRequirement::kSilent, true, |
+ federations, |
CredentialType::CREDENTIAL_TYPE_FEDERATED); |
} |
@@ -1019,7 +1026,8 @@ TEST_F(CredentialManagerImplTest, |
EXPECT_CALL(*client_, NotifyUserCouldBeAutoSignedInPtr(_)).Times(0); |
- ExpectZeroClickSignInFailure(true, true, federations); |
+ ExpectZeroClickSignInFailure(CredentialMediationRequirement::kSilent, true, |
+ federations); |
} |
TEST_F(CredentialManagerImplTest, |
@@ -1038,7 +1046,8 @@ TEST_F(CredentialManagerImplTest, |
// We pass in 'true' for the 'include_passwords' argument to ensure that |
// password-type credentials are included as potential matches. |
- ExpectZeroClickSignInSuccess(true, true, federations, |
+ ExpectZeroClickSignInSuccess(CredentialMediationRequirement::kSilent, true, |
+ federations, |
CredentialType::CREDENTIAL_TYPE_PASSWORD); |
} |
@@ -1058,7 +1067,8 @@ TEST_F(CredentialManagerImplTest, |
// We pass in 'false' for the 'include_passwords' argument to ensure that |
// password-type credentials are excluded as potential matches. |
- ExpectZeroClickSignInFailure(true, false, federations); |
+ ExpectZeroClickSignInFailure(CredentialMediationRequirement::kSilent, false, |
+ federations); |
} |
TEST_F(CredentialManagerImplTest, |
@@ -1080,7 +1090,8 @@ TEST_F(CredentialManagerImplTest, |
->ExpectCallToGetAffiliatedAndroidRealms( |
cm_service_impl_->GetSynthesizedFormForOrigin(), affiliated_realms); |
- ExpectZeroClickSignInSuccess(true, true, federations, |
+ ExpectZeroClickSignInSuccess(CredentialMediationRequirement::kSilent, true, |
+ federations, |
CredentialType::CREDENTIAL_TYPE_FEDERATED); |
} |
@@ -1103,7 +1114,8 @@ TEST_F(CredentialManagerImplTest, |
->ExpectCallToGetAffiliatedAndroidRealms( |
cm_service_impl_->GetSynthesizedFormForOrigin(), affiliated_realms); |
- ExpectZeroClickSignInFailure(true, true, federations); |
+ ExpectZeroClickSignInFailure(CredentialMediationRequirement::kSilent, true, |
+ federations); |
} |
TEST_F(CredentialManagerImplTest, RequestCredentialWithoutFirstRun) { |
@@ -1116,7 +1128,8 @@ TEST_F(CredentialManagerImplTest, RequestCredentialWithoutFirstRun) { |
NotifyUserCouldBeAutoSignedInPtr(testing::Pointee(form_))) |
.Times(1); |
- ExpectZeroClickSignInFailure(true, true, federations); |
+ ExpectZeroClickSignInFailure(CredentialMediationRequirement::kSilent, true, |
+ federations); |
} |
TEST_F(CredentialManagerImplTest, RequestCredentialWithFirstRunAndSkip) { |
@@ -1130,7 +1143,8 @@ TEST_F(CredentialManagerImplTest, RequestCredentialWithFirstRunAndSkip) { |
NotifyUserCouldBeAutoSignedInPtr(testing::Pointee(form_))) |
.Times(1); |
- ExpectZeroClickSignInFailure(true, true, federations); |
+ ExpectZeroClickSignInFailure(CredentialMediationRequirement::kSilent, true, |
+ federations); |
} |
TEST_F(CredentialManagerImplTest, RequestCredentialWithTLSErrors) { |
@@ -1142,7 +1156,8 @@ TEST_F(CredentialManagerImplTest, RequestCredentialWithTLSErrors) { |
std::vector<GURL> federations; |
- ExpectZeroClickSignInFailure(true, true, federations); |
+ ExpectZeroClickSignInFailure(CredentialMediationRequirement::kSilent, true, |
+ federations); |
} |
TEST_F(CredentialManagerImplTest, RequestCredentialWhilePrerendering) { |
@@ -1154,7 +1169,8 @@ TEST_F(CredentialManagerImplTest, RequestCredentialWhilePrerendering) { |
std::vector<GURL> federations; |
- ExpectZeroClickSignInFailure(true, true, federations); |
+ ExpectZeroClickSignInFailure(CredentialMediationRequirement::kSilent, true, |
+ federations); |
} |
TEST_F(CredentialManagerImplTest, |
@@ -1168,8 +1184,8 @@ TEST_F(CredentialManagerImplTest, |
EXPECT_CALL(*client_, NotifyUserAutoSigninPtr()).Times(testing::Exactly(0)); |
// With two items in the password store, we shouldn't get credentials back. |
- ExpectCredentialType(true, true, federations, |
- CredentialType::CREDENTIAL_TYPE_EMPTY); |
+ ExpectCredentialType(CredentialMediationRequirement::kSilent, true, |
+ federations, CredentialType::CREDENTIAL_TYPE_EMPTY); |
} |
TEST_F(CredentialManagerImplTest, |
@@ -1185,8 +1201,8 @@ TEST_F(CredentialManagerImplTest, |
// With two items in the password store, we shouldn't get credentials back, |
// even though only one item has |skip_zero_click| set |false|. |
- ExpectCredentialType(true, true, federations, |
- CredentialType::CREDENTIAL_TYPE_EMPTY); |
+ ExpectCredentialType(CredentialMediationRequirement::kSilent, true, |
+ federations, CredentialType::CREDENTIAL_TYPE_EMPTY); |
} |
TEST_F(CredentialManagerImplTest, |
@@ -1203,8 +1219,8 @@ TEST_F(CredentialManagerImplTest, |
// We only have cross-origin zero-click credentials; they should not be |
// returned. |
- ExpectCredentialType(true, true, federations, |
- CredentialType::CREDENTIAL_TYPE_EMPTY); |
+ ExpectCredentialType(CredentialMediationRequirement::kSilent, true, |
+ federations, CredentialType::CREDENTIAL_TYPE_EMPTY); |
} |
TEST_F(CredentialManagerImplTest, |
@@ -1222,14 +1238,14 @@ TEST_F(CredentialManagerImplTest, |
mojom::CredentialManagerError error_1; |
base::Optional<CredentialInfo> credential_1; |
CallGet( |
- false, true, federations, |
+ CredentialMediationRequirement::kOptional, true, federations, |
base::Bind(&GetCredentialCallback, &called_1, &error_1, &credential_1)); |
// 2nd request. |
bool called_2 = false; |
mojom::CredentialManagerError error_2; |
base::Optional<CredentialInfo> credential_2; |
CallGet( |
- false, true, federations, |
+ CredentialMediationRequirement::kOptional, true, federations, |
base::Bind(&GetCredentialCallback, &called_2, &error_2, &credential_2)); |
EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _)) |
@@ -1286,7 +1302,7 @@ TEST_F(CredentialManagerImplTest, ResetSkipZeroClickAfterPrompt) { |
bool called = false; |
mojom::CredentialManagerError error; |
base::Optional<CredentialInfo> credential; |
- CallGet(false, true, federations, |
+ CallGet(CredentialMediationRequirement::kOptional, true, federations, |
base::Bind(&GetCredentialCallback, &called, &error, &credential)); |
RunAllPendingTasks(); |
@@ -1322,7 +1338,7 @@ TEST_F(CredentialManagerImplTest, NoResetSkipZeroClickAfterPromptInIncognito) { |
bool called = false; |
mojom::CredentialManagerError error; |
base::Optional<CredentialInfo> credential; |
- CallGet(false, true, std::vector<GURL>(), |
+ CallGet(CredentialMediationRequirement::kOptional, true, std::vector<GURL>(), |
base::Bind(&GetCredentialCallback, &called, &error, &credential)); |
RunAllPendingTasks(); |
@@ -1343,8 +1359,8 @@ TEST_F(CredentialManagerImplTest, IncognitoZeroClickRequestCredential) { |
.Times(testing::Exactly(0)); |
EXPECT_CALL(*client_, NotifyUserAutoSigninPtr()).Times(testing::Exactly(0)); |
- ExpectCredentialType(true, true, federations, |
- CredentialType::CREDENTIAL_TYPE_EMPTY); |
+ ExpectCredentialType(CredentialMediationRequirement::kSilent, true, |
+ federations, CredentialType::CREDENTIAL_TYPE_EMPTY); |
} |
TEST_F(CredentialManagerImplTest, ZeroClickWithAffiliatedFormInPasswordStore) { |
@@ -1363,7 +1379,8 @@ TEST_F(CredentialManagerImplTest, ZeroClickWithAffiliatedFormInPasswordStore) { |
->ExpectCallToGetAffiliatedAndroidRealms( |
cm_service_impl_->GetSynthesizedFormForOrigin(), affiliated_realms); |
- ExpectZeroClickSignInSuccess(true, true, federations, |
+ ExpectZeroClickSignInSuccess(CredentialMediationRequirement::kSilent, true, |
+ federations, |
CredentialType::CREDENTIAL_TYPE_PASSWORD); |
} |
@@ -1385,7 +1402,8 @@ TEST_F(CredentialManagerImplTest, |
->ExpectCallToGetAffiliatedAndroidRealms( |
cm_service_impl_->GetSynthesizedFormForOrigin(), affiliated_realms); |
- ExpectZeroClickSignInFailure(true, true, federations); |
+ ExpectZeroClickSignInFailure(CredentialMediationRequirement::kSilent, true, |
+ federations); |
} |
TEST_F(CredentialManagerImplTest, |
@@ -1412,7 +1430,8 @@ TEST_F(CredentialManagerImplTest, |
->ExpectCallToGetAffiliatedAndroidRealms(digest, affiliated_realms); |
std::vector<GURL> federations; |
- ExpectZeroClickSignInFailure(true, true, federations); |
+ ExpectZeroClickSignInFailure(CredentialMediationRequirement::kSilent, true, |
+ federations); |
} |
TEST_F(CredentialManagerImplTest, |
@@ -1432,7 +1451,8 @@ TEST_F(CredentialManagerImplTest, |
->ExpectCallToGetAffiliatedAndroidRealms( |
cm_service_impl_->GetSynthesizedFormForOrigin(), affiliated_realms); |
- ExpectZeroClickSignInSuccess(true, true, federations, |
+ ExpectZeroClickSignInSuccess(CredentialMediationRequirement::kSilent, true, |
+ federations, |
CredentialType::CREDENTIAL_TYPE_PASSWORD); |
} |
@@ -1440,7 +1460,8 @@ TEST_F(CredentialManagerImplTest, ZeroClickWithPSLCredential) { |
subdomain_form_.skip_zero_click = false; |
store_->AddLogin(subdomain_form_); |
- ExpectZeroClickSignInFailure(true, true, std::vector<GURL>()); |
+ ExpectZeroClickSignInFailure(CredentialMediationRequirement::kSilent, true, |
+ std::vector<GURL>()); |
} |
TEST_F(CredentialManagerImplTest, ZeroClickWithPSLAndNormalCredentials) { |
@@ -1452,7 +1473,8 @@ TEST_F(CredentialManagerImplTest, ZeroClickWithPSLAndNormalCredentials) { |
store_->AddLogin(subdomain_form_); |
std::vector<GURL> federations = {GURL("https://google.com/")}; |
- ExpectZeroClickSignInSuccess(true, true, federations, |
+ ExpectZeroClickSignInSuccess(CredentialMediationRequirement::kSilent, true, |
+ federations, |
CredentialType::CREDENTIAL_TYPE_FEDERATED); |
} |
@@ -1466,7 +1488,8 @@ TEST_F(CredentialManagerImplTest, ZeroClickAfterMigratingHttpCredential) { |
store_->AddLogin(form_); |
std::vector<GURL> federations; |
- ExpectZeroClickSignInSuccess(true, true, federations, |
+ ExpectZeroClickSignInSuccess(CredentialMediationRequirement::kSilent, true, |
+ federations, |
CredentialType::CREDENTIAL_TYPE_PASSWORD); |
} |
@@ -1475,7 +1498,30 @@ TEST_F(CredentialManagerImplTest, MigrateWithEmptyStore) { |
NavigateAndCommit(GURL("http://127.0.0.1:8000/")); |
std::vector<GURL> federations; |
- ExpectZeroClickSignInFailure(false, true, federations); |
+ ExpectZeroClickSignInFailure(CredentialMediationRequirement::kOptional, true, |
+ federations); |
+} |
+ |
+TEST_F(CredentialManagerImplTest, MediationRequiredPreventsAutoSignIn) { |
+ form_.skip_zero_click = false; |
+ store_->AddLogin(form_); |
+ |
+ std::vector<GURL> federations; |
+ bool called = false; |
+ mojom::CredentialManagerError error; |
+ base::Optional<CredentialInfo> credential; |
+ |
+ EXPECT_CALL(*client_, PromptUserToChooseCredentialsPtr(_, _, _)) |
+ .Times(testing::Exactly(1)); |
+ EXPECT_CALL(*client_, NotifyUserAutoSigninPtr()).Times(testing::Exactly(0)); |
+ CallGet(CredentialMediationRequirement::kRequired, true, federations, |
+ base::Bind(&GetCredentialCallback, &called, &error, &credential)); |
+ |
+ RunAllPendingTasks(); |
+ |
+ EXPECT_TRUE(called); |
+ EXPECT_EQ(mojom::CredentialManagerError::SUCCESS, error); |
+ EXPECT_EQ(CredentialType::CREDENTIAL_TYPE_PASSWORD, credential->type); |
} |
TEST_F(CredentialManagerImplTest, GetSynthesizedFormForOrigin) { |