blob: e28cc4bba2a852d3e954c6483c950bf2071fb68d [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_CHROME_PAYMENTS_AUTOFILL_CLIENT_H_
#define CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_CHROME_PAYMENTS_AUTOFILL_CLIENT_H_
#include <memory>
#include <optional>
#include <vector>
#include "base/containers/span.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ref.h"
#include "components/autofill/core/browser/data_model/payments/credit_card.h"
#include "components/autofill/core/browser/payments/autofill_error_dialog_context.h"
#include "components/autofill/core/browser/payments/payments_autofill_client.h"
#include "components/autofill/core/browser/suggestions/suggestion.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/card_unmask_prompt_controller_impl.h"
#include "components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller_impl.h"
#include "content/public/browser/web_contents_observer.h"
#if BUILDFLAG(IS_ANDROID)
#include "chrome/browser/touch_to_fill/autofill/android/touch_to_fill_payment_method_controller_impl.h"
#include "components/autofill/core/browser/ui/payments/card_expiration_date_fix_flow_controller_impl.h"
#include "components/autofill/core/browser/ui/payments/card_name_fix_flow_controller_impl.h"
#endif // BUILDFLAG(IS_ANDROID)
class GURL;
namespace webauthn {
class InternalAuthenticator;
}
namespace autofill {
#if BUILDFLAG(IS_ANDROID)
class AutofillCvcSaveMessageDelegate;
#endif // BUILDFLAG(IS_ANDROID)
class AutofillDriver;
class AutofillErrorDialogControllerImpl;
#if BUILDFLAG(IS_ANDROID)
class AutofillMessageController;
#endif
class AutofillOfferData;
class AutofillOfferManager;
class AutofillSaveCardBottomSheetBridge;
class AutofillSaveIbanBottomSheetBridge;
class BnplIssuer;
class CardUnmaskAuthenticationSelectionDialogControllerImpl;
struct CardUnmaskChallengeOption;
class CardUnmaskOtpInputDialogControllerImpl;
class CreditCardCvcAuthenticator;
class CreditCardOtpAuthenticator;
class ContentAutofillClient;
class CreditCardRiskBasedAuthenticator;
struct FilledCardInformationBubbleOptions;
class IbanAccessManager;
class IbanManager;
class MerchantPromoCodeManager;
struct OfferNotificationOptions;
class OtpUnmaskDelegate;
enum class OtpUnmaskResult;
class PaymentsDataManager;
class SaveAndFillDialogControllerImpl;
class SaveAndFillManager;
class TouchToFillDelegate;
struct VirtualCardEnrollmentFields;
class VirtualCardEnrollmentManager;
namespace payments {
struct BnplIssuerContext;
class BnplStrategy;
class BnplUiDelegate;
class MandatoryReauthManager;
class MultipleRequestPaymentsNetworkInterface;
class PaymentsWindowManager;
// Chrome implementation of PaymentsAutofillClient. Used for Chrome Desktop
// and Clank. Owned by the ChromeAutofillClient. Created lazily in the
// ChromeAutofillClient when it is needed, and it observes the same
// WebContents as its owning ChromeAutofillClient.
class ChromePaymentsAutofillClient : public PaymentsAutofillClient,
public content::WebContentsObserver {
public:
explicit ChromePaymentsAutofillClient(ContentAutofillClient* client);
ChromePaymentsAutofillClient(const ChromePaymentsAutofillClient&) = delete;
ChromePaymentsAutofillClient& operator=(const ChromePaymentsAutofillClient&) =
delete;
~ChromePaymentsAutofillClient() override;
static constexpr base::TimeDelta kSaveCardConfirmationSnackbarDuration =
base::Seconds(3);
// RiskDataLoader:
void LoadRiskData(
base::OnceCallback<void(const std::string&)> callback) override;
// PaymentsAutofillClient:
#if BUILDFLAG(IS_ANDROID)
AutofillSaveCardBottomSheetBridge*
GetOrCreateAutofillSaveCardBottomSheetBridge() override;
AutofillSaveIbanBottomSheetBridge*
GetOrCreateAutofillSaveIbanBottomSheetBridge() override;
#else // !BUILDFLAG(IS_ANDROID)
void ShowWebauthnOfferDialog(
WebauthnDialogCallback offer_dialog_callback) override;
void ShowWebauthnVerifyPendingDialog(
WebauthnDialogCallback verify_pending_dialog_callback) override;
void UpdateWebauthnOfferDialogWithError() override;
bool CloseWebauthnDialog() override;
void HideVirtualCardEnrollBubbleAndIconIfVisible() override;
#endif // BUILDFLAG(IS_ANDROID)
#if BUILDFLAG(IS_ANDROID)
void ConfirmAccountNameFixFlow(
base::OnceCallback<void(const std::u16string&)> callback) override;
void ConfirmExpirationDateFixFlow(
const CreditCard& card,
base::OnceCallback<void(const std::u16string&, const std::u16string&)>
callback) override;
#endif
bool HasCreditCardScanFeature() const override;
void ScanCreditCard(CreditCardScanCallback callback) override;
bool LocalCardSaveIsSupported() override;
void ShowSaveCreditCardLocally(const CreditCard& card,
SaveCreditCardOptions options,
LocalSaveCardPromptCallback callback) override;
void ShowSaveCreditCardToCloud(
const CreditCard& card,
const LegalMessageLines& legal_message_lines,
SaveCreditCardOptions options,
UploadSaveCardPromptCallback callback) override;
void CreditCardUploadCompleted(PaymentsRpcResult result,
std::optional<OnConfirmationClosedCallback>
on_confirmation_closed_callback) override;
void HideSaveCardPrompt() override;
void ShowVirtualCardEnrollDialog(
const VirtualCardEnrollmentFields& virtual_card_enrollment_fields,
base::OnceClosure accept_virtual_card_callback,
base::OnceClosure decline_virtual_card_callback) override;
void VirtualCardEnrollCompleted(PaymentsRpcResult result) override;
void OnCardDataAvailable(
const FilledCardInformationBubbleOptions& options) override;
void ConfirmSaveIbanLocally(const Iban& iban,
bool should_show_prompt,
SaveIbanPromptCallback callback) override;
void ConfirmUploadIbanToCloud(const Iban& iban,
LegalMessageLines legal_message_lines,
bool should_show_prompt,
SaveIbanPromptCallback callback) override;
void IbanUploadCompleted(bool iban_saved, bool hit_max_strikes) override;
void ShowAutofillProgressDialog(
AutofillProgressDialogType autofill_progress_dialog_type,
base::OnceClosure cancel_callback) override;
void CloseAutofillProgressDialog(
bool show_confirmation_before_closing,
base::OnceClosure no_interactive_authentication_callback) override;
void ShowCardUnmaskOtpInputDialog(
CreditCard::RecordType card_type,
const CardUnmaskChallengeOption& challenge_option,
base::WeakPtr<OtpUnmaskDelegate> delegate) override;
void OnUnmaskOtpVerificationResult(OtpUnmaskResult unmask_result) override;
void ShowUnmaskAuthenticatorSelectionDialog(
const std::vector<CardUnmaskChallengeOption>& challenge_options,
base::OnceCallback<void(const std::string&)>
confirm_unmask_challenge_option_callback,
base::OnceClosure cancel_unmasking_closure) override;
void DismissUnmaskAuthenticatorSelectionDialog(bool server_success) override;
PaymentsNetworkInterface* GetPaymentsNetworkInterface() override;
MultipleRequestPaymentsNetworkInterface*
GetMultipleRequestPaymentsNetworkInterface() override;
void ShowAutofillErrorDialog(AutofillErrorDialogContext context) override;
PaymentsWindowManager* GetPaymentsWindowManager() override;
void ShowUnmaskPrompt(
const CreditCard& card,
const CardUnmaskPromptOptions& card_unmask_prompt_options,
base::WeakPtr<CardUnmaskDelegate> delegate) override;
void OnUnmaskVerificationResult(PaymentsRpcResult result) override;
VirtualCardEnrollmentManager* GetVirtualCardEnrollmentManager() override;
CreditCardCvcAuthenticator& GetCvcAuthenticator() override;
CreditCardOtpAuthenticator* GetOtpAuthenticator() override;
CreditCardRiskBasedAuthenticator* GetRiskBasedAuthenticator() override;
bool IsRiskBasedAuthEffectivelyAvailable() const override;
bool IsMandatoryReauthEnabled() override;
void ShowMandatoryReauthOptInPrompt(
base::OnceClosure accept_mandatory_reauth_callback,
base::OnceClosure cancel_mandatory_reauth_callback,
base::RepeatingClosure close_mandatory_reauth_callback) override;
void ShowMandatoryReauthOptInConfirmation() override;
IbanManager* GetIbanManager() override;
IbanAccessManager* GetIbanAccessManager() override;
MerchantPromoCodeManager* GetMerchantPromoCodeManager() override;
void OpenPromoCodeOfferDetailsURL(const GURL& url) override;
AutofillOfferManager* GetAutofillOfferManager() override;
void UpdateOfferNotification(
const AutofillOfferData& offer,
const OfferNotificationOptions& options) override;
void DismissOfferNotification() override;
bool ShowTouchToFillCreditCard(
base::WeakPtr<TouchToFillDelegate> delegate,
base::span<const Suggestion> suggestions) override;
bool ShowTouchToFillIban(
base::WeakPtr<TouchToFillDelegate> delegate,
base::span<const autofill::Iban> ibans_to_suggest) override;
bool ShowTouchToFillLoyaltyCard(
base::WeakPtr<TouchToFillDelegate> delegate,
std::vector<autofill::LoyaltyCard> loyalty_cards_to_suggest) override;
bool UpdateTouchToFillBnplPaymentMethod(
std::optional<int64_t> extracted_amount,
bool is_amount_supported_by_any_issuer) override;
bool ShowTouchToFillProgress(base::OnceClosure cancel_callback) override;
bool ShowTouchToFillBnplIssuers(
base::span<const payments::BnplIssuerContext> bnpl_issuer_contexts,
const std::string& app_locale,
base::OnceCallback<void(autofill::BnplIssuer)> selected_issuer_callback,
base::OnceClosure cancel_callback) override;
bool ShowTouchToFillError(const AutofillErrorDialogContext& context) override;
void HideTouchToFillPaymentMethod() override;
void SetTouchToFillVisible(bool visible) override;
PaymentsDataManager& GetPaymentsDataManager() final;
std::unique_ptr<webauthn::InternalAuthenticator>
CreateCreditCardInternalAuthenticator(AutofillDriver* driver) override;
payments::MandatoryReauthManager* GetOrCreatePaymentsMandatoryReauthManager()
override;
payments::SaveAndFillManager* GetSaveAndFillManager() override;
void ShowCreditCardLocalSaveAndFillDialog(
CardSaveAndFillDialogCallback callback) override;
void ShowCreditCardUploadSaveAndFillDialog(
const LegalMessageLines& legal_message_lines,
CardSaveAndFillDialogCallback callback) override;
void ShowCreditCardSaveAndFillPendingDialog() override;
void HideCreditCardSaveAndFillDialog() override;
bool IsTabModalPopupDeprecated() const override;
BnplStrategy* GetBnplStrategy() override;
BnplUiDelegate* GetBnplUiDelegate() override;
// Begin ChromePaymentsAutofillClient-specific section.
#if BUILDFLAG(IS_ANDROID)
// The AutofillMessageController is used to show a message notification
// on Android.
AutofillMessageController& GetAutofillMessageController();
TouchToFillPaymentMethodController* GetTouchToFillPaymentMethodController();
#endif
AutofillProgressDialogControllerImpl*
AutofillProgressDialogControllerForTesting();
std::unique_ptr<CardUnmaskPromptControllerImpl>
ExtractCardUnmaskControllerForTesting();
void SetCardUnmaskControllerForTesting(
std::unique_ptr<CardUnmaskPromptControllerImpl> test_controller);
#if BUILDFLAG(IS_ANDROID)
void SetAutofillSaveCardBottomSheetBridgeForTesting(
std::unique_ptr<AutofillSaveCardBottomSheetBridge>
autofill_save_card_bottom_sheet_bridge);
void SetAutofillSaveIbanBottomSheetBridgeForTesting(
std::unique_ptr<AutofillSaveIbanBottomSheetBridge>
autofill_save_iban_bottom_sheet_bridge);
void SetAutofillMessageControllerForTesting(
std::unique_ptr<AutofillMessageController> autofill_message_controller);
void SetTouchToFillPaymentMethodControllerForTesting(
std::unique_ptr<TouchToFillPaymentMethodController>
touch_to_fill_payment_method_controller);
#endif
void SetRiskDataForTesting(const std::string& risk_data);
void SetCachedRiskDataLoadedCallbackForTesting(
base::OnceCallback<void(const std::string&)>
cached_risk_data_loaded_callback_for_testing);
private:
std::u16string GetAccountHolderName() const;
const raw_ref<ContentAutofillClient> client_;
// The method takes `risk_data` and caches it in `risk_data_`, logs the start
// time and runs the callback with the risk_data.
void OnRiskDataLoaded(base::OnceCallback<void(const std::string&)> callback,
base::TimeTicks start_time,
const std::string& risk_data);
#if BUILDFLAG(IS_ANDROID)
std::unique_ptr<AutofillCvcSaveMessageDelegate>
autofill_cvc_save_message_delegate_;
std::unique_ptr<AutofillSaveCardBottomSheetBridge>
autofill_save_card_bottom_sheet_bridge_;
std::unique_ptr<AutofillSaveIbanBottomSheetBridge>
autofill_save_iban_bottom_sheet_bridge_;
std::unique_ptr<AutofillMessageController> autofill_message_controller_;
CardNameFixFlowControllerImpl card_name_fix_flow_controller_;
CardExpirationDateFixFlowControllerImpl
card_expiration_date_fix_flow_controller_;
std::unique_ptr<TouchToFillPaymentMethodController>
touch_to_fill_payment_method_controller_ =
std::make_unique<TouchToFillPaymentMethodControllerImpl>(
&client_.get());
#endif
std::unique_ptr<PaymentsNetworkInterface> payments_network_interface_;
std::unique_ptr<MultipleRequestPaymentsNetworkInterface>
multiple_request_payments_network_interface_;
std::unique_ptr<AutofillProgressDialogControllerImpl>
autofill_progress_dialog_controller_;
std::unique_ptr<AutofillErrorDialogControllerImpl>
autofill_error_dialog_controller_;
std::unique_ptr<CardUnmaskOtpInputDialogControllerImpl>
card_unmask_otp_input_dialog_controller_;
std::unique_ptr<PaymentsWindowManager> payments_window_manager_;
std::unique_ptr<CardUnmaskPromptControllerImpl> unmask_controller_;
// `virtual_card_enrollment_manager_` must be destroyed before
// `payments_network_interface_` because the former keeps a reference to the
// latter.
// TODO(crbug.com/41489024): Remove the reference to
// `payments_network_interface_` in `virtual_card_enrollment_manager_`.
std::unique_ptr<VirtualCardEnrollmentManager>
virtual_card_enrollment_manager_;
std::unique_ptr<CreditCardCvcAuthenticator> cvc_authenticator_;
std::unique_ptr<CreditCardOtpAuthenticator> otp_authenticator_;
std::unique_ptr<CreditCardRiskBasedAuthenticator> risk_based_authenticator_;
std::unique_ptr<CardUnmaskAuthenticationSelectionDialogControllerImpl>
card_unmask_authentication_selection_controller_;
std::unique_ptr<IbanAccessManager> iban_access_manager_;
std::unique_ptr<payments::MandatoryReauthManager>
payments_mandatory_reauth_manager_;
std::unique_ptr<SaveAndFillDialogControllerImpl>
save_and_fill_dialog_controller_;
std::unique_ptr<SaveAndFillManager> save_and_fill_manager_;
// The BnplStrategy used to determine the next step in a BNPL flow depending
// on the platform.
// Lazily initialized: access only through `GetBnplStrategy()`.
std::unique_ptr<BnplStrategy> bnpl_strategy_;
// The BnplUiDelegate used to handle the UI in the BNPL flow depending on the
// platform.
// Lazily initialized: access only through `GetBnplUiDelegate()`.
std::unique_ptr<BnplUiDelegate> bnpl_ui_delegate_;
// Used to cache client side risk data. The cache is invalidated when the
// chrome browser tab is closed.
std::string risk_data_;
base::OnceCallback<void(const std::string&)>
cached_risk_data_loaded_callback_for_testing_;
base::WeakPtrFactory<ChromePaymentsAutofillClient> weak_ptr_factory_{this};
};
} // namespace payments
} // namespace autofill
#endif // CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_CHROME_PAYMENTS_AUTOFILL_CLIENT_H_