#include "chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.h"
#include <optional>
#include <vector>
#include "base/check_deref.h"
#include "chrome/browser/autofill/autofill_offer_manager_factory.h"
#include "chrome/browser/autofill/iban_manager_factory.h"
#include "chrome/browser/autofill/merchant_promo_code_manager_factory.h"
#include "chrome/browser/keyboard_accessory/android/manual_filling_controller.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/ui/autofill/payments/create_card_unmask_prompt_view.h"
#include "chrome/browser/ui/autofill/payments/credit_card_scanner_controller.h"
#include "chrome/browser/ui/autofill/payments/iban_bubble_controller_impl.h"
#include "chrome/browser/ui/autofill/payments/mandatory_reauth_bubble_controller_impl.h"
#include "chrome/browser/ui/autofill/payments/view_factory.h"
#include "chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.h"
#include "chrome/browser/ui/autofill/risk_util.h"
#include "components/autofill/content/browser/content_autofill_client.h"
#include "components/autofill/content/browser/content_autofill_driver.h"
#include "components/autofill/core/browser/data_model/autofill_offer_data.h"
#include "components/autofill/core/browser/data_model/credit_card.h"
#include "components/autofill/core/browser/merchant_promo_code_manager.h"
#include "components/autofill/core/browser/metrics/payments/risk_data_metrics.h"
#include "components/autofill/core/browser/payments/autofill_error_dialog_context.h"
#include "components/autofill/core/browser/payments/autofill_offer_manager.h"
#include "components/autofill/core/browser/payments/card_unmask_challenge_option.h"
#include "components/autofill/core/browser/payments/credit_card_cvc_authenticator.h"
#include "components/autofill/core/browser/payments/credit_card_otp_authenticator.h"
#include "components/autofill/core/browser/payments/credit_card_risk_based_authenticator.h"
#include "components/autofill/core/browser/payments/iban_access_manager.h"
#include "components/autofill/core/browser/payments/mandatory_reauth_manager.h"
#include "components/autofill/core/browser/payments/offer_notification_options.h"
#include "components/autofill/core/browser/payments/otp_unmask_delegate.h"
#include "components/autofill/core/browser/payments/otp_unmask_result.h"
#include "components/autofill/core/browser/payments/payments_autofill_client.h"
#include "components/autofill/core/browser/payments/payments_network_interface.h"
#include "components/autofill/core/browser/payments/virtual_card_enrollment_manager.h"
#include "components/autofill/core/browser/personal_data_manager.h"
#include "components/autofill/core/browser/ui/payments/autofill_error_dialog_controller_impl.h"
#include "components/autofill/core/browser/ui/payments/autofill_progress_dialog_controller_impl.h"
#include "components/autofill/core/browser/ui/payments/bubble_show_options.h"
#include "components/autofill/core/browser/ui/payments/card_unmask_authentication_selection_dialog_controller_impl.h"
#include "components/autofill/core/browser/ui/payments/card_unmask_otp_input_dialog_controller_impl.h"
#include "components/autofill/core/browser/ui/payments/card_unmask_prompt_controller_impl.h"
#include "components/autofill/core/browser/ui/payments/card_unmask_prompt_view.h"
#include "components/autofill/core/browser/ui/suggestion.h"
#include "components/autofill/core/browser/ui/touch_to_fill_delegate.h"
#include "components/autofill/core/common/autofill_payments_features.h"
#include "components/signin/public/identity_manager/account_info.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "components/user_prefs/user_prefs.h"
#include "content/public/browser/page_navigator.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
#include "url/gurl.h"
#if BUILDFLAG(IS_ANDROID)
#include "chrome/browser/touch_to_fill/autofill/android/touch_to_fill_payment_method_controller.h"
#include "chrome/browser/touch_to_fill/autofill/android/touch_to_fill_payment_method_view_impl.h"
#include "chrome/browser/ui/android/autofill/autofill_cvc_save_message_delegate.h"
#include "chrome/browser/ui/android/autofill/autofill_save_card_bottom_sheet_bridge.h"
#include "chrome/browser/ui/android/autofill/autofill_save_card_delegate_android.h"
#include "chrome/browser/ui/android/autofill/autofill_save_iban_bottom_sheet_bridge.h"
#include "chrome/browser/ui/android/autofill/autofill_save_iban_delegate.h"
#include "chrome/browser/ui/android/autofill/card_expiration_date_fix_flow_view_android.h"
#include "chrome/browser/ui/android/autofill/card_name_fix_flow_view_android.h"
#include "chrome/browser/ui/android/tab_model/tab_model_list.h"
#include "chrome/browser/ui/autofill/payments/autofill_message_controller.h"
#include "chrome/browser/ui/autofill/payments/autofill_message_model.h"
#include "chrome/browser/ui/autofill/payments/autofill_snackbar_controller_impl.h"
#include "chrome/browser/ui/autofill/payments/offer_notification_controller_android.h"
#include "components/autofill/core/browser/payments/autofill_save_iban_ui_info.h"
#include "components/autofill/core/browser/ui/payments/card_expiration_date_fix_flow_view.h"
#include "components/autofill/core/browser/ui/payments/card_name_fix_flow_view.h"
#include "components/webauthn/android/internal_authenticator_android.h"
#else
#include "chrome/browser/ui/autofill/payments/desktop_payments_window_manager.h"
#include "chrome/browser/ui/autofill/payments/manage_migration_ui_controller.h"
#include "chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.h"
#include "chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h"
#include "chrome/browser/ui/autofill/payments/virtual_card_manual_fallback_bubble_controller_impl.h"
#include "chrome/browser/ui/autofill/payments/webauthn_dialog_controller_impl.h"
#include "chrome/browser/ui/autofill/payments/webauthn_dialog_state.h"
#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
#include "components/autofill/core/common/autofill_payments_features.h"
#include "components/webauthn/content/browser/internal_authenticator_impl.h"
#endif
namespace autofill::payments {
ChromePaymentsAutofillClient::ChromePaymentsAutofillClient(
ContentAutofillClient* client)
: … { … }
ChromePaymentsAutofillClient::~ChromePaymentsAutofillClient() = default;
void ChromePaymentsAutofillClient::LoadRiskData(
base::OnceCallback<void(const std::string&)> callback) { … }
#if BUILDFLAG(IS_ANDROID)
AutofillSaveCardBottomSheetBridge*
ChromePaymentsAutofillClient::GetOrCreateAutofillSaveCardBottomSheetBridge() {
if (!autofill_save_card_bottom_sheet_bridge_) {
auto* window_android = web_contents()->GetTopLevelNativeWindow();
TabModel* tab_model =
TabModelList::GetTabModelForWebContents(web_contents());
if (window_android && tab_model) {
autofill_save_card_bottom_sheet_bridge_ =
std::make_unique<AutofillSaveCardBottomSheetBridge>(window_android,
tab_model);
}
}
return autofill_save_card_bottom_sheet_bridge_.get();
}
AutofillSaveIbanBottomSheetBridge*
ChromePaymentsAutofillClient::GetOrCreateAutofillSaveIbanBottomSheetBridge() {
if (!autofill_save_iban_bottom_sheet_bridge_) {
auto* window_android = web_contents()->GetTopLevelNativeWindow();
TabModel* tab_model =
TabModelList::GetTabModelForWebContents(web_contents());
if (window_android && tab_model) {
autofill_save_iban_bottom_sheet_bridge_ =
std::make_unique<AutofillSaveIbanBottomSheetBridge>(window_android,
tab_model);
}
}
return autofill_save_iban_bottom_sheet_bridge_.get();
}
void ChromePaymentsAutofillClient::ConfirmAccountNameFixFlow(
base::OnceCallback<void(const std::u16string&)> callback) {
CardNameFixFlowViewAndroid* card_name_fix_flow_view_android =
new CardNameFixFlowViewAndroid(&card_name_fix_flow_controller_,
web_contents());
card_name_fix_flow_controller_.Show(
card_name_fix_flow_view_android, GetAccountHolderName(),
std::move(callback));
}
void ChromePaymentsAutofillClient::ConfirmExpirationDateFixFlow(
const CreditCard& card,
base::OnceCallback<void(const std::u16string&, const std::u16string&)>
callback) {
CardExpirationDateFixFlowViewAndroid*
card_expiration_date_fix_flow_view_android =
new CardExpirationDateFixFlowViewAndroid(
&card_expiration_date_fix_flow_controller_, web_contents());
card_expiration_date_fix_flow_controller_.Show(
card_expiration_date_fix_flow_view_android, card,
std::move(callback));
}
#else
void ChromePaymentsAutofillClient::ShowLocalCardMigrationDialog(
base::OnceClosure show_migration_dialog_closure) { … }
void ChromePaymentsAutofillClient::ConfirmMigrateLocalCardToCloud(
const LegalMessageLines& legal_message_lines,
const std::string& user_email,
const std::vector<MigratableCreditCard>& migratable_credit_cards,
LocalCardMigrationCallback start_migrating_cards_callback) { … }
void ChromePaymentsAutofillClient::ShowLocalCardMigrationResults(
bool has_server_error,
const std::u16string& tip_message,
const std::vector<MigratableCreditCard>& migratable_credit_cards,
MigrationDeleteCardCallback delete_local_card_callback) { … }
void ChromePaymentsAutofillClient::ShowWebauthnOfferDialog(
WebauthnDialogCallback offer_dialog_callback) { … }
void ChromePaymentsAutofillClient::ShowWebauthnVerifyPendingDialog(
WebauthnDialogCallback verify_pending_dialog_callback) { … }
void ChromePaymentsAutofillClient::UpdateWebauthnOfferDialogWithError() { … }
bool ChromePaymentsAutofillClient::CloseWebauthnDialog() { … }
void ChromePaymentsAutofillClient::
HideVirtualCardEnrollBubbleAndIconIfVisible() { … }
#endif
bool ChromePaymentsAutofillClient::HasCreditCardScanFeature() const { … }
void ChromePaymentsAutofillClient::ScanCreditCard(
ChromePaymentsAutofillClient::CreditCardScanCallback callback) { … }
void ChromePaymentsAutofillClient::ConfirmSaveCreditCardLocally(
const CreditCard& card,
SaveCreditCardOptions options,
LocalSaveCardPromptCallback callback) { … }
void ChromePaymentsAutofillClient::ConfirmSaveCreditCardToCloud(
const CreditCard& card,
const LegalMessageLines& legal_message_lines,
SaveCreditCardOptions options,
UploadSaveCardPromptCallback callback) { … }
void ChromePaymentsAutofillClient::CreditCardUploadCompleted(
PaymentsRpcResult result,
std::optional<OnConfirmationClosedCallback>
on_confirmation_closed_callback) { … }
void ChromePaymentsAutofillClient::HideSaveCardPrompt() { … }
void ChromePaymentsAutofillClient::ShowVirtualCardEnrollDialog(
const VirtualCardEnrollmentFields& virtual_card_enrollment_fields,
base::OnceClosure accept_virtual_card_callback,
base::OnceClosure decline_virtual_card_callback) { … }
void ChromePaymentsAutofillClient::VirtualCardEnrollCompleted(
PaymentsRpcResult result) { … }
void ChromePaymentsAutofillClient::OnVirtualCardDataAvailable(
const VirtualCardManualFallbackBubbleOptions& options) { … }
void ChromePaymentsAutofillClient::ConfirmSaveIbanLocally(
const Iban& iban,
bool should_show_prompt,
SaveIbanPromptCallback callback) { … }
void ChromePaymentsAutofillClient::ConfirmUploadIbanToCloud(
const Iban& iban,
LegalMessageLines legal_message_lines,
bool should_show_prompt,
SaveIbanPromptCallback callback) { … }
void ChromePaymentsAutofillClient::IbanUploadCompleted(bool iban_saved,
bool hit_max_strikes) { … }
void ChromePaymentsAutofillClient::ShowAutofillProgressDialog(
AutofillProgressDialogType autofill_progress_dialog_type,
base::OnceClosure cancel_callback) { … }
void ChromePaymentsAutofillClient::CloseAutofillProgressDialog(
bool show_confirmation_before_closing,
base::OnceClosure no_interactive_authentication_callback) { … }
void ChromePaymentsAutofillClient::ShowCardUnmaskOtpInputDialog(
const CardUnmaskChallengeOption& challenge_option,
base::WeakPtr<OtpUnmaskDelegate> delegate) { … }
void ChromePaymentsAutofillClient::OnUnmaskOtpVerificationResult(
OtpUnmaskResult unmask_result) { … }
PaymentsNetworkInterface*
ChromePaymentsAutofillClient::GetPaymentsNetworkInterface() { … }
void ChromePaymentsAutofillClient::ShowAutofillErrorDialog(
AutofillErrorDialogContext context) { … }
PaymentsWindowManager*
ChromePaymentsAutofillClient::GetPaymentsWindowManager() { … }
void ChromePaymentsAutofillClient::ShowUnmaskPrompt(
const CreditCard& card,
const CardUnmaskPromptOptions& card_unmask_prompt_options,
base::WeakPtr<CardUnmaskDelegate> delegate) { … }
void ChromePaymentsAutofillClient::ShowUnmaskAuthenticatorSelectionDialog(
const std::vector<CardUnmaskChallengeOption>& challenge_options,
base::OnceCallback<void(const std::string&)>
confirm_unmask_challenge_option_callback,
base::OnceClosure cancel_unmasking_closure) { … }
void ChromePaymentsAutofillClient::DismissUnmaskAuthenticatorSelectionDialog(
bool server_success) { … }
void ChromePaymentsAutofillClient::OnUnmaskVerificationResult(
PaymentsRpcResult result) { … }
VirtualCardEnrollmentManager*
ChromePaymentsAutofillClient::GetVirtualCardEnrollmentManager() { … }
CreditCardCvcAuthenticator&
ChromePaymentsAutofillClient::GetCvcAuthenticator() { … }
CreditCardOtpAuthenticator*
ChromePaymentsAutofillClient::GetOtpAuthenticator() { … }
CreditCardRiskBasedAuthenticator*
ChromePaymentsAutofillClient::GetRiskBasedAuthenticator() { … }
void ChromePaymentsAutofillClient::ShowMandatoryReauthOptInPrompt(
base::OnceClosure accept_mandatory_reauth_callback,
base::OnceClosure cancel_mandatory_reauth_callback,
base::RepeatingClosure close_mandatory_reauth_callback) { … }
IbanManager* ChromePaymentsAutofillClient::GetIbanManager() { … }
IbanAccessManager* ChromePaymentsAutofillClient::GetIbanAccessManager() { … }
void ChromePaymentsAutofillClient::ShowMandatoryReauthOptInConfirmation() { … }
void ChromePaymentsAutofillClient::UpdateOfferNotification(
const AutofillOfferData& offer,
const OfferNotificationOptions& options) { … }
void ChromePaymentsAutofillClient::DismissOfferNotification() { … }
void ChromePaymentsAutofillClient::OpenPromoCodeOfferDetailsURL(
const GURL& url) { … }
MerchantPromoCodeManager*
ChromePaymentsAutofillClient::GetMerchantPromoCodeManager() { … }
AutofillOfferManager* ChromePaymentsAutofillClient::GetAutofillOfferManager() { … }
bool ChromePaymentsAutofillClient::ShowTouchToFillCreditCard(
base::WeakPtr<TouchToFillDelegate> delegate,
base::span<const autofill::CreditCard> cards_to_suggest,
base::span<const Suggestion> suggestions) { … }
bool ChromePaymentsAutofillClient::ShowTouchToFillIban(
base::WeakPtr<TouchToFillDelegate> delegate,
base::span<const autofill::Iban> ibans_to_suggest) { … }
void ChromePaymentsAutofillClient::HideTouchToFillPaymentMethod() { … }
std::unique_ptr<webauthn::InternalAuthenticator>
ChromePaymentsAutofillClient::CreateCreditCardInternalAuthenticator(
AutofillDriver* driver) { … }
payments::MandatoryReauthManager*
ChromePaymentsAutofillClient::GetOrCreatePaymentsMandatoryReauthManager() { … }
#if BUILDFLAG(IS_ANDROID)
AutofillSnackbarControllerImpl&
ChromePaymentsAutofillClient::GetAutofillSnackbarController() {
if (!autofill_snackbar_controller_impl_) {
autofill_snackbar_controller_impl_ =
std::make_unique<AutofillSnackbarControllerImpl>(web_contents());
}
return *autofill_snackbar_controller_impl_;
}
AutofillMessageController&
ChromePaymentsAutofillClient::GetAutofillMessageController() {
if (!autofill_message_controller_) {
autofill_message_controller_ =
std::make_unique<AutofillMessageController>(web_contents());
}
return *autofill_message_controller_;
}
TouchToFillPaymentMethodController&
ChromePaymentsAutofillClient::GetTouchToFillPaymentMethodController() {
return touch_to_fill_payment_method_controller_;
}
void ChromePaymentsAutofillClient::
SetAutofillSaveCardBottomSheetBridgeForTesting(
std::unique_ptr<AutofillSaveCardBottomSheetBridge>
autofill_save_card_bottom_sheet_bridge) {
autofill_save_card_bottom_sheet_bridge_ =
std::move(autofill_save_card_bottom_sheet_bridge);
}
void ChromePaymentsAutofillClient::SetAutofillSnackbarControllerImplForTesting(
std::unique_ptr<AutofillSnackbarControllerImpl>
autofill_snackbar_controller_impl) {
autofill_snackbar_controller_impl_ =
std::move(autofill_snackbar_controller_impl);
}
void ChromePaymentsAutofillClient::SetAutofillMessageControllerForTesting(
std::unique_ptr<AutofillMessageController> autofill_message_controller) {
autofill_message_controller_ = std::move(autofill_message_controller);
}
#endif
std::u16string ChromePaymentsAutofillClient::GetAccountHolderName() const { … }
void ChromePaymentsAutofillClient::SetRiskDataForTesting(
const std::string& risk_data) { … }
void ChromePaymentsAutofillClient::SetCachedRiskDataLoadedCallbackForTesting(
base::OnceCallback<void(const std::string&)>
cached_risk_data_loaded_callback_for_testing) { … }
void ChromePaymentsAutofillClient::OnRiskDataLoaded(
base::OnceCallback<void(const std::string&)> callback,
base::TimeTicks start_time,
const std::string& risk_data) { … }
}