Commit 92aa9e0b authored by Siyu An's avatar Siyu An Committed by Commit Bot

[AF][Nickname] Update card unmask dialog to show nickname if applicable

This CL updates the unmask dialog on Desktop&Clank (in the window title)
and iOS (in the instruction).

Bug: 1059087
Change-Id: Ia33fab4eaa7cc35dcb08e7d1c5fe87e33556fb2e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2144738
Commit-Queue: Siyu An <siyua@chromium.org>
Reviewed-by: default avatarJared Saul <jsaul@google.com>
Reviewed-by: default avatarDominic Battré <battre@chromium.org>
Cr-Commit-Position: refs/heads/master@{#759073}
parent c940ee12
...@@ -437,6 +437,15 @@ CreditCard GetMaskedServerCardWithNickname() { ...@@ -437,6 +437,15 @@ CreditCard GetMaskedServerCardWithNickname() {
return credit_card; return credit_card;
} }
CreditCard GetMaskedServerCardWithInvalidNickname() {
CreditCard credit_card(CreditCard::MASKED_SERVER_CARD, "c789");
test::SetCreditCardInfo(&credit_card, "Test user", "1111" /* Visa */,
NextMonth().c_str(), NextYear().c_str(), "1");
credit_card.SetNetworkForMaskedCard(kVisaCard);
credit_card.SetNickname(ASCIIToUTF16("Invalid nickname which is too long"));
return credit_card;
}
CreditCard GetFullServerCard() { CreditCard GetFullServerCard() {
CreditCard credit_card(CreditCard::FULL_SERVER_CARD, "c123"); CreditCard credit_card(CreditCard::FULL_SERVER_CARD, "c123");
test::SetCreditCardInfo(&credit_card, "Full Carter", test::SetCreditCardInfo(&credit_card, "Full Carter",
......
...@@ -136,6 +136,7 @@ CreditCard GetIncompleteCreditCard(); ...@@ -136,6 +136,7 @@ CreditCard GetIncompleteCreditCard();
CreditCard GetMaskedServerCard(); CreditCard GetMaskedServerCard();
CreditCard GetMaskedServerCardAmex(); CreditCard GetMaskedServerCardAmex();
CreditCard GetMaskedServerCardWithNickname(); CreditCard GetMaskedServerCardWithNickname();
CreditCard GetMaskedServerCardWithInvalidNickname();
// Returns a full server card full of dummy info. // Returns a full server card full of dummy info.
CreditCard GetFullServerCard(); CreditCard GetFullServerCard();
......
...@@ -164,7 +164,7 @@ base::string16 CardUnmaskPromptControllerImpl::GetWindowTitle() const { ...@@ -164,7 +164,7 @@ base::string16 CardUnmaskPromptControllerImpl::GetWindowTitle() const {
ShouldRequestExpirationDate() ShouldRequestExpirationDate()
? IDS_AUTOFILL_CARD_UNMASK_PROMPT_EXPIRED_TITLE ? IDS_AUTOFILL_CARD_UNMASK_PROMPT_EXPIRED_TITLE
: IDS_AUTOFILL_CARD_UNMASK_PROMPT_TITLE, : IDS_AUTOFILL_CARD_UNMASK_PROMPT_TITLE,
card_.NetworkAndLastFourDigits()); card_.NicknameOrNetworkAndLastFourDigits());
#endif #endif
} }
...@@ -185,7 +185,8 @@ base::string16 CardUnmaskPromptControllerImpl::GetInstructionsMessage() const { ...@@ -185,7 +185,8 @@ base::string16 CardUnmaskPromptControllerImpl::GetInstructionsMessage() const {
} }
// The iOS UI shows the card details in the instructions text since they // The iOS UI shows the card details in the instructions text since they
// don't fit in the title. // don't fit in the title.
return l10n_util::GetStringFUTF16(ids, card_.NetworkAndLastFourDigits()); return l10n_util::GetStringFUTF16(ids,
card_.NicknameOrNetworkAndLastFourDigits());
#else #else
return l10n_util::GetStringUTF16( return l10n_util::GetStringUTF16(
card_.record_type() == autofill::CreditCard::LOCAL_CARD card_.record_type() == autofill::CreditCard::LOCAL_CARD
......
...@@ -70,7 +70,6 @@ class CardUnmaskPromptControllerImpl : public CardUnmaskPromptController { ...@@ -70,7 +70,6 @@ class CardUnmaskPromptControllerImpl : public CardUnmaskPromptController {
protected: protected:
// Exposed for testing. // Exposed for testing.
CardUnmaskPromptView* view() { return card_unmask_view_; } CardUnmaskPromptView* view() { return card_unmask_view_; }
void SetCreditCardForTesting(CreditCard test_card) { card_ = test_card; }
private: private:
bool AllowsRetry(AutofillClient::PaymentsRpcResult result); bool AllowsRetry(AutofillClient::PaymentsRpcResult result);
......
...@@ -82,10 +82,6 @@ class TestCardUnmaskPromptController : public CardUnmaskPromptControllerImpl { ...@@ -82,10 +82,6 @@ class TestCardUnmaskPromptController : public CardUnmaskPromptControllerImpl {
should_offer_webauthn_ = should; should_offer_webauthn_ = should;
} }
void SetCreditCardForTesting(CreditCard card) {
CardUnmaskPromptControllerImpl::SetCreditCardForTesting(card);
}
base::WeakPtr<TestCardUnmaskPromptController> GetWeakPtr() { base::WeakPtr<TestCardUnmaskPromptController> GetWeakPtr() {
return weak_factory_.GetWeakPtr(); return weak_factory_.GetWeakPtr();
} }
...@@ -107,17 +103,7 @@ class CardUnmaskPromptControllerImplGenericTest { ...@@ -107,17 +103,7 @@ class CardUnmaskPromptControllerImplGenericTest {
base::BindOnce( base::BindOnce(
&CardUnmaskPromptControllerImplGenericTest::GetCardUnmaskPromptView, &CardUnmaskPromptControllerImplGenericTest::GetCardUnmaskPromptView,
base::Unretained(this)), base::Unretained(this)),
test::GetMaskedServerCard(), AutofillClient::UNMASK_FOR_AUTOFILL, card_, AutofillClient::UNMASK_FOR_AUTOFILL, delegate_->GetWeakPtr());
delegate_->GetWeakPtr());
}
void ShowPromptAmex() {
controller_->ShowPrompt(
base::BindOnce(
&CardUnmaskPromptControllerImplGenericTest::GetCardUnmaskPromptView,
base::Unretained(this)),
test::GetMaskedServerCardAmex(), AutofillClient::UNMASK_FOR_AUTOFILL,
delegate_->GetWeakPtr());
} }
void ShowPromptAndSimulateResponse(bool should_store_pan, void ShowPromptAndSimulateResponse(bool should_store_pan,
...@@ -137,6 +123,9 @@ class CardUnmaskPromptControllerImplGenericTest { ...@@ -137,6 +123,9 @@ class CardUnmaskPromptControllerImplGenericTest {
value); value);
} }
void SetCreditCardForTesting(CreditCard card) { card_ = card; }
CreditCard card_ = test::GetMaskedServerCard();
base::test::ScopedFeatureList scoped_feature_list_; base::test::ScopedFeatureList scoped_feature_list_;
std::unique_ptr<TestCardUnmaskPromptView> test_unmask_prompt_view_; std::unique_ptr<TestCardUnmaskPromptView> test_unmask_prompt_view_;
std::unique_ptr<TestingPrefServiceSimple> pref_service_; std::unique_ptr<TestingPrefServiceSimple> pref_service_;
...@@ -467,6 +456,90 @@ TEST_F(CardUnmaskPromptControllerImplTest, ...@@ -467,6 +456,90 @@ TEST_F(CardUnmaskPromptControllerImplTest,
"Autofill.UnmaskPrompt.UnmaskingDuration.Failure", 1); "Autofill.UnmaskPrompt.UnmaskingDuration.Failure", 1);
} }
// Ensures the card information is shown correctly in the instruction message on
// iOS and in the title on other platforms.
TEST_F(CardUnmaskPromptControllerImplTest, DisplayCardInformation) {
ShowPrompt();
#if defined(OS_IOS)
EXPECT_TRUE(base::UTF16ToUTF8(controller_->GetInstructionsMessage())
.find("Mastercard " + test::ObfuscatedCardDigitsAsUTF8(
"2109")) != std::string::npos);
#else
EXPECT_TRUE(base::UTF16ToUTF8(controller_->GetWindowTitle())
.find("Mastercard " + test::ObfuscatedCardDigitsAsUTF8(
"2109")) != std::string::npos);
#endif
}
// Ensures to fallback to network name in the instruction message on iOS and in
// the title on other platforms when the experiment is disabled, even though the
// nickname is valid.
TEST_F(CardUnmaskPromptControllerImplTest, Nickname_ExpOffNicknameValid) {
scoped_feature_list_.InitAndDisableFeature(
features::kAutofillEnableSurfacingServerCardNickname);
SetCreditCardForTesting(test::GetMaskedServerCardWithNickname());
ShowPrompt();
#if defined(OS_IOS)
EXPECT_TRUE(
base::UTF16ToUTF8(controller_->GetInstructionsMessage()).find("Visa") !=
std::string::npos);
EXPECT_FALSE(base::UTF16ToUTF8(controller_->GetInstructionsMessage())
.find("Test nickname") != std::string::npos);
#else
EXPECT_TRUE(base::UTF16ToUTF8(controller_->GetWindowTitle()).find("Visa") !=
std::string::npos);
EXPECT_FALSE(
base::UTF16ToUTF8(controller_->GetWindowTitle()).find("Test nickname") !=
std::string::npos);
#endif
}
// Ensures to fallback to network name in the instruction message on iOS and in
// the title on other platforms when the nickname is invalid.
TEST_F(CardUnmaskPromptControllerImplTest, Nickname_ExpOnNicknameInvalid) {
scoped_feature_list_.InitAndEnableFeature(
features::kAutofillEnableSurfacingServerCardNickname);
SetCreditCardForTesting(test::GetMaskedServerCardWithInvalidNickname());
ShowPrompt();
#if defined(OS_IOS)
EXPECT_TRUE(
base::UTF16ToUTF8(controller_->GetInstructionsMessage()).find("Visa") !=
std::string::npos);
EXPECT_FALSE(base::UTF16ToUTF8(controller_->GetInstructionsMessage())
.find("Invalid nickname which is too long") !=
std::string::npos);
#else
EXPECT_TRUE(base::UTF16ToUTF8(controller_->GetWindowTitle()).find("Visa") !=
std::string::npos);
EXPECT_FALSE(base::UTF16ToUTF8(controller_->GetWindowTitle())
.find("Invalid nickname which is too long") !=
std::string::npos);
#endif
}
// Ensures the nickname is displayed (instead of network) in the instruction
// message on iOS and in the title on other platforms when experiment is enabled
// and the nickname is valid.
TEST_F(CardUnmaskPromptControllerImplTest, Nickname_ExpOnNicknameValid) {
scoped_feature_list_.InitAndEnableFeature(
features::kAutofillEnableSurfacingServerCardNickname);
SetCreditCardForTesting(test::GetMaskedServerCardWithNickname());
ShowPrompt();
#if defined(OS_IOS)
EXPECT_FALSE(
base::UTF16ToUTF8(controller_->GetInstructionsMessage()).find("Visa") !=
std::string::npos);
EXPECT_TRUE(base::UTF16ToUTF8(controller_->GetInstructionsMessage())
.find("Test nickname") != std::string::npos);
#else
EXPECT_FALSE(base::UTF16ToUTF8(controller_->GetWindowTitle()).find("Visa") !=
std::string::npos);
EXPECT_TRUE(
base::UTF16ToUTF8(controller_->GetWindowTitle()).find("Test nickname") !=
std::string::npos);
#endif
}
struct CvcCase { struct CvcCase {
const char* input; const char* input;
bool valid; bool valid;
...@@ -537,7 +610,8 @@ class CvcInputAmexValidationTest ...@@ -537,7 +610,8 @@ class CvcInputAmexValidationTest
TEST_P(CvcInputAmexValidationTest, CvcInputValidation) { TEST_P(CvcInputAmexValidationTest, CvcInputValidation) {
auto cvc_case_amex = GetParam(); auto cvc_case_amex = GetParam();
ShowPromptAmex(); SetCreditCardForTesting(test::GetMaskedServerCardAmex());
ShowPrompt();
EXPECT_EQ(cvc_case_amex.valid, EXPECT_EQ(cvc_case_amex.valid,
controller_->InputCvcIsValid(ASCIIToUTF16(cvc_case_amex.input))); controller_->InputCvcIsValid(ASCIIToUTF16(cvc_case_amex.input)));
if (!cvc_case_amex.valid) if (!cvc_case_amex.valid)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment