910e62b5创建于 1月15日历史提交
// Copyright 2018 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_WEBAUTHN_SHEET_MODELS_H_
#define CHROME_BROWSER_UI_WEBAUTHN_SHEET_MODELS_H_

#include <cstddef>
#include <memory>
#include <optional>
#include <string>
#include <vector>

#include "base/memory/raw_ptr.h"
#include "build/build_config.h"
#include "chrome/browser/ui/webauthn/authenticator_request_sheet_model.h"
#include "chrome/browser/webauthn/authenticator_request_dialog_model.h"
#include "chrome/browser/webauthn/local_authentication_token.h"
#include "device/fido/pin.h"
#include "ui/gfx/font_list.h"

namespace gfx {
class Image;
}  // namespace gfx

// Base class for sheets, implementing the shared behavior used on most sheets,
// as well as maintaining a weak pointer to the dialog model.
class AuthenticatorSheetModelBase
    : public AuthenticatorRequestSheetModel,
      public AuthenticatorRequestDialogModel::Observer {
 public:
  // Determines whether the button in the lower-left corner of the dialog, to
  // display other available mechanisms, is shown on a sheet.
  enum class OtherMechanismButtonVisibility {
    // The button is not shown (default).
    kHidden,
    // The button is shown if there is more than one mechanism to choose from.
    kVisible,
  };

  explicit AuthenticatorSheetModelBase(
      AuthenticatorRequestDialogModel* dialog_model);
  AuthenticatorSheetModelBase(
      AuthenticatorRequestDialogModel* dialog_model,
      OtherMechanismButtonVisibility other_mechanism_button_visibility);

  AuthenticatorSheetModelBase(const AuthenticatorSheetModelBase&) = delete;
  AuthenticatorSheetModelBase& operator=(const AuthenticatorSheetModelBase&) =
      delete;

  ~AuthenticatorSheetModelBase() override;

  AuthenticatorRequestDialogModel* dialog_model() const {
    return dialog_model_;
  }

  // Returns the preferred with for the contents of the dialog, i.e. the
  // preferred dialog width minus the padding.
  static int GetPreferredContentWidth();

  // Returns a string containing the RP ID, styled as an origin, truncated to a
  // reasonable width.
  static std::u16string GetRelyingPartyIdString(
      const AuthenticatorRequestDialogModel* dialog_model,
      gfx::FontList font_list);

  // Returns a string containing the RP ID, styled as an origin, truncated to a
  // reasonable width. Use this for default sized text, like labels.
  static std::u16string GetRelyingPartyIdStringLabel(
      const AuthenticatorRequestDialogModel* dialog_model);

  // Returns a string containing the RP ID, styled as an origin, truncated to a
  // reasonable width. Use this for title sized text.
  static std::u16string GetRelyingPartyIdStringTitle(
      const AuthenticatorRequestDialogModel* dialog_model);

 protected:
  // AuthenticatorRequestSheetModel:
  bool IsActivityIndicatorVisible() const override;
  bool IsCancelButtonVisible() const override;
  bool IsOtherMechanismButtonVisible() const override;
  std::u16string GetOtherMechanismButtonLabel() const override;
  std::u16string GetCancelButtonLabel() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  void OnBack() override;
  void OnAccept() override;
  void OnCancel() override;

  // AuthenticatorRequestDialogModel::Observer:
  void OnModelDestroyed(AuthenticatorRequestDialogModel* model) override;

 private:
  raw_ptr<AuthenticatorRequestDialogModel> dialog_model_;
  OtherMechanismButtonVisibility other_mechanism_button_visibility_ =
      OtherMechanismButtonVisibility::kHidden;
};

// The sheet shown for selecting the transport over which the security key
// should be accessed.
class AuthenticatorMechanismSelectorSheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorMechanismSelectorSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);

  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
};

class AuthenticatorInsertAndActivateUsbSheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorInsertAndActivateUsbSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);

  // AuthenticatorSheetModelBase:
  bool IsActivityIndicatorVisible() const override;
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  std::vector<std::u16string> GetAdditionalDescriptions() const override;
};

class AuthenticatorTimeoutErrorModel : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorTimeoutErrorModel(
      AuthenticatorRequestDialogModel* dialog_model);

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetCancelButtonLabel() const override;
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
};

class AuthenticatorNoAvailableTransportsErrorModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorNoAvailableTransportsErrorModel(
      AuthenticatorRequestDialogModel* dialog_model);

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetCancelButtonLabel() const override;
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
};

class AuthenticatorNoPasskeysErrorModel : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorNoPasskeysErrorModel(
      AuthenticatorRequestDialogModel* dialog_model);

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetCancelButtonLabel() const override;
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
};

class AuthenticatorNotRegisteredErrorModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorNotRegisteredErrorModel(
      AuthenticatorRequestDialogModel* dialog_model);

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetCancelButtonLabel() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  void OnAccept() override;
};

class AuthenticatorAlreadyRegisteredErrorModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorAlreadyRegisteredErrorModel(
      AuthenticatorRequestDialogModel* dialog_model);

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetCancelButtonLabel() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  void OnAccept() override;
};

class AuthenticatorInternalUnrecognizedErrorSheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorInternalUnrecognizedErrorSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);

 private:
  // AuthenticatorSheetModelBase:
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  void OnAccept() override;
};

class AuthenticatorChallengeFetchErrorModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorChallengeFetchErrorModel(
      AuthenticatorRequestDialogModel* dialog_model);

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetCancelButtonLabel() const override;
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
};

class AuthenticatorBlePowerOnManualSheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorBlePowerOnManualSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  void OnAccept() override;

  // AuthenticatorRequestDialogModel::Observer:
  void OnBluetoothPoweredStateChanged() override;
};

class AuthenticatorBlePowerOnAutomaticSheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorBlePowerOnAutomaticSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);

 private:
  // AuthenticatorSheetModelBase:
  bool IsActivityIndicatorVisible() const override;
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  void OnAccept() override;

  bool busy_powering_on_ble_ = false;
};

#if BUILDFLAG(IS_MAC)

class AuthenticatorBlePermissionMacSheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorBlePermissionMacSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  bool IsCancelButtonVisible() const override;
  std::u16string GetAcceptButtonLabel() const override;
  void OnAccept() override;
};

class AuthenticatorTouchIdSheetModel : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorTouchIdSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);

  // Called after the user taps their Touch ID sensor.
  void OnTouchIDSensorTapped(
      std::optional<webauthn::LocalAuthenticationToken> local_auth_token);

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  bool IsCancelButtonVisible() const override;
  std::u16string GetAcceptButtonLabel() const override;
  std::u16string GetCancelButtonLabel() const override;
  void OnAccept() override;

  bool touch_id_completed_ = false;
};

#endif  // IS_MAC

class AuthenticatorOffTheRecordInterstitialSheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorOffTheRecordInterstitialSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);

  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  std::u16string GetCancelButtonLabel() const override;
  void OnAccept() override;
};

class AuthenticatorPaaskSheetModel : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorPaaskSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);
  ~AuthenticatorPaaskSheetModel() override;

 private:
  // AuthenticatorSheetModelBase:
  bool IsActivityIndicatorVisible() const override;
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
};

class AuthenticatorClientPinEntrySheetModel
    : public AuthenticatorSheetModelBase {
 public:
  // Indicates whether the view should accommodate changing an existing PIN,
  // setting up a new PIN or entering an existing one.
  enum class Mode { kPinChange, kPinEntry, kPinSetup };
  AuthenticatorClientPinEntrySheetModel(
      AuthenticatorRequestDialogModel* dialog_model,
      Mode mode,
      device::pin::PINEntryError error);
  ~AuthenticatorClientPinEntrySheetModel() override;

  void SetPinCode(std::u16string pin_code);
  void SetPinConfirmation(std::u16string pin_confirmation);

  Mode mode() const { return mode_; }

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  std::u16string GetError() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  void OnAccept() override;
  bool IsOtherMechanismButtonVisible() const override;

  std::u16string pin_code_;
  std::u16string pin_confirmation_;
  std::u16string error_;
  const Mode mode_;
};

class AuthenticatorClientPinTapAgainSheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorClientPinTapAgainSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);
  ~AuthenticatorClientPinTapAgainSheetModel() override;

 private:
  // AuthenticatorSheetModelBase:
  bool IsActivityIndicatorVisible() const override;
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  std::vector<std::u16string> GetAdditionalDescriptions() const override;
};

class AuthenticatorBioEnrollmentSheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorBioEnrollmentSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);
  ~AuthenticatorBioEnrollmentSheetModel() override;

  int max_bio_samples() { return dialog_model()->max_bio_samples.value_or(1); }
  int bio_samples_remaining() {
    return dialog_model()->bio_samples_remaining.value_or(1);
  }

 private:
  // AuthenticatorSheetModelBase:
  bool IsActivityIndicatorVisible() const override;
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  bool IsCancelButtonVisible() const override;
  std::u16string GetCancelButtonLabel() const override;
  void OnAccept() override;
  void OnCancel() override;

  bool HasBioSamplesRemaining() const;
};

class AuthenticatorRetryUvSheetModel : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorRetryUvSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);
  ~AuthenticatorRetryUvSheetModel() override;

 private:
  // AuthenticatorSheetModelBase:
  bool IsActivityIndicatorVisible() const override;
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  std::u16string GetError() const override;
};

// Generic error dialog that allows starting the request over.
class AuthenticatorGenericErrorSheetModel : public AuthenticatorSheetModelBase {
 public:
  static std::unique_ptr<AuthenticatorGenericErrorSheetModel>
  ForClientPinErrorSoftBlock(AuthenticatorRequestDialogModel* dialog_model);
  static std::unique_ptr<AuthenticatorGenericErrorSheetModel>
  ForClientPinErrorHardBlock(AuthenticatorRequestDialogModel* dialog_model);
  static std::unique_ptr<AuthenticatorGenericErrorSheetModel>
  ForClientPinErrorAuthenticatorRemoved(
      AuthenticatorRequestDialogModel* dialog_model);
  static std::unique_ptr<AuthenticatorGenericErrorSheetModel>
  ForMissingCapability(AuthenticatorRequestDialogModel* dialog_model);
  static std::unique_ptr<AuthenticatorGenericErrorSheetModel> ForStorageFull(
      AuthenticatorRequestDialogModel* dialog_model);
  static std::unique_ptr<AuthenticatorGenericErrorSheetModel>
  ForWindowsHelloNotEnabled(AuthenticatorRequestDialogModel* dialog_model);

 private:
  AuthenticatorGenericErrorSheetModel(
      AuthenticatorRequestDialogModel* dialog_model,
      std::u16string title,
      std::u16string description);

  // AuthenticatorSheetModelBase:
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  std::u16string GetCancelButtonLabel() const override;
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  void OnAccept() override;

  std::u16string title_;
  std::u16string description_;
};

class AuthenticatorResidentCredentialConfirmationSheetView
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorResidentCredentialConfirmationSheetView(
      AuthenticatorRequestDialogModel* dialog_model);
  ~AuthenticatorResidentCredentialConfirmationSheetView() override;

 private:
  // AuthenticatorSheetModelBase:
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  void OnAccept() override;
};

// The sheet shown when the user needs to select an account.
class AuthenticatorSelectAccountSheetModel
    : public AuthenticatorSheetModelBase {
 public:
  // Indicates whether the corresponding view is presented before or after
  // gathering user verification and generating an assertion signature.
  // `kPreUserVerification` is only possible with platform authenticators
  // for which we can silently enumerate credentials.
  enum UserVerificationMode {
    kPreUserVerification,
    kPostUserVerification,
  };

  AuthenticatorSelectAccountSheetModel(
      AuthenticatorRequestDialogModel* dialog_model,
      UserVerificationMode mode);
  ~AuthenticatorSelectAccountSheetModel() override;

  // Set the index of the currently selected row. Only valid to call for
  // `kMultipleAccount`.
  void SetCurrentSelection(int selected);

  // AuthenticatorSheetModelBase:
  void OnAccept() override;

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;

  const UserVerificationMode user_verification_mode_;
  size_t selected_ = 0;
};

class AuthenticatorHybridAndSecurityKeySheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorHybridAndSecurityKeySheetModel(
      AuthenticatorRequestDialogModel* dialog_model);
  ~AuthenticatorHybridAndSecurityKeySheetModel() override;

  // Returns the attestation warning for the security key.
  std::optional<std::u16string> GetAttestationWarning() const;

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  std::u16string GetOtherMechanismButtonLabel() const override;
};

class AuthenticatorConnectingSheetModel : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorConnectingSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);
  ~AuthenticatorConnectingSheetModel() override;

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
};

class AuthenticatorConnectedSheetModel : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorConnectedSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);
  ~AuthenticatorConnectedSheetModel() override;

 private:
  // AuthenticatorSheetModelBase:
  bool IsActivityIndicatorVisible() const override;
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
};

class AuthenticatorCableErrorSheetModel : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorCableErrorSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);
  ~AuthenticatorCableErrorSheetModel() override;

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  std::u16string GetCancelButtonLabel() const override;
};

class AuthenticatorCreatePasskeySheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorCreatePasskeySheetModel(
      AuthenticatorRequestDialogModel* dialog_model);
  ~AuthenticatorCreatePasskeySheetModel() override;

  // An additional label that `AuthenticatorCreatePasskeySheetView` includes in
  // the `BuildStepSpecificContent()` view.
  std::u16string passkey_storage_description() const;

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  void OnAccept() override;
  std::u16string GetAcceptButtonLabel() const override;
};

class AuthenticatorGPMErrorSheetModel : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorGPMErrorSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);
  ~AuthenticatorGPMErrorSheetModel() override;

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
};

class AuthenticatorGPMConnectingSheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorGPMConnectingSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);
  ~AuthenticatorGPMConnectingSheetModel() override;

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
};

// An account and mechanism picker that combines passkeys from multiple sources.
// Passkeys are grouped in two lists:
// * "Primary" passkeys. These are local passkeys if available, or GPM passkeys
//   if no local passkeys are available. Can be empty.
// * "Secondary" passkeys. These are all the other passkeys & mechanisms.
// AuthenticatorMultiSourcePickerSheetModel will filter these lists and
// present them as indices of AuthenticatorRequestDialogModel's
// `mechanisms()` member.
class AuthenticatorMultiSourcePickerSheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorMultiSourcePickerSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);
  ~AuthenticatorMultiSourcePickerSheetModel() override;

  // Returns a vector of indices to the "Primary" passkey mechanisms. Indices
  // correspond to AuthenticatorRequestDialogModel's mechanisms().
  std::vector<int>& primary_passkey_indices() {
    return primary_passkey_indices_;
  }

  // Returns a vector of indices to the "Secondary" passkey mechanisms. Indices
  // correspond to AuthenticatorRequestDialogModel's mechanisms().
  std::vector<int>& secondary_passkey_indices() {
    return secondary_passkey_indices_;
  }

  // Returns the user-visible label for the "Primary" passkey mechanisms.
  std::u16string& primary_passkeys_label() { return primary_passkeys_label_; }

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;

  std::vector<int> primary_passkey_indices_;
  std::vector<int> secondary_passkey_indices_;
  std::u16string primary_passkeys_label_;
  bool has_passwords_ = false;
};

class AuthenticatorPriorityMechanismSheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorPriorityMechanismSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);
  ~AuthenticatorPriorityMechanismSheetModel() override;

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  void OnAccept() override;
};

class AuthenticatorGpmPinSheetModelBase : public AuthenticatorSheetModelBase {
 public:
  // Indicates whether the view should accommodate creating a new pin or
  // entering an existing one.
  enum class Mode { kPinCreate, kPinEntry };

  explicit AuthenticatorGpmPinSheetModelBase(
      AuthenticatorRequestDialogModel* dialog_model,
      Mode mode);
  ~AuthenticatorGpmPinSheetModelBase() override;

  std::u16string GetGpmAccountEmail() const;
  std::u16string GetGpmAccountName() const;
  gfx::Image GetGpmAccountImage() const;
  std::u16string GetAccessibleDescription() const;

  std::u16string pin() const { return pin_; }
  Mode mode() const { return mode_; }
  bool ui_disabled() const;

  // Sets currently typed pin in the sheet.
  virtual void SetPin(std::u16string pin) = 0;

  // Returns the accessibility label of the pin view based on its type and mode.
  virtual std::u16string GetAccessibleName() const = 0;

 protected:
  std::u16string pin_;
  const Mode mode_;

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  std::u16string GetError() const override;
  bool IsForgotGPMPinButtonVisible() const override;
  bool IsGPMPinOptionsButtonVisible() const override;
  void OnAccept() override;
  void OnCancel() override;
  void OnForgotGPMPin() const override;
  void OnGPMPinOptionChosen(bool is_arbitrary) const override;
};

// The sheet shown when the user is entering a digit-only GPM pin.
class AuthenticatorGpmPinSheetModel : public AuthenticatorGpmPinSheetModelBase {
 public:
  explicit AuthenticatorGpmPinSheetModel(
      AuthenticatorRequestDialogModel* dialog_model,
      int pin_digits_count,
      Mode mode);
  ~AuthenticatorGpmPinSheetModel() override;

  void PinCharTyped(bool is_digit);

  int pin_digits_count() const;

  // AuthenticatorGpmPinSheetModelBase:
  void SetPin(std::u16string pin) override;
  std::u16string GetAccessibleName() const override;

 private:
  bool FullPinTyped() const;

  // AuthenticatorSheetModelBase:
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  std::u16string GetHint() const override;

  const int pin_digits_count_;

  // Whether a hint explaining that only digits are allowed should be shown.
  bool show_digit_hint_ = false;
};

// The sheet shown when the user is entering an arbitrary (alphanumeric) pin.
class AuthenticatorGpmArbitraryPinSheetModel
    : public AuthenticatorGpmPinSheetModelBase {
 public:
  explicit AuthenticatorGpmArbitraryPinSheetModel(
      AuthenticatorRequestDialogModel* dialog_model,
      Mode mode);
  ~AuthenticatorGpmArbitraryPinSheetModel() override;

  // AuthenticatorGpmPinSheetModelBase:
  void SetPin(std::u16string pin) override;
  std::u16string GetAccessibleName() const override;

 private:
  // AuthenticatorSheetModelBase:
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  std::u16string GetHint() const override;
};

// The sheet shown for bootstrapping Google Password Manager passkeys during
// sign-in.
class AuthenticatorTrustThisComputerAssertionSheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorTrustThisComputerAssertionSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);

  ~AuthenticatorTrustThisComputerAssertionSheetModel() override;

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  bool IsCancelButtonVisible() const override;
  std::u16string GetCancelButtonLabel() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  bool IsOtherMechanismButtonVisible() const override;
  std::u16string GetOtherMechanismButtonLabel() const override;
  void OnAccept() override;
};

// The sheet shown for creating a passkey in Google Password Manager.
class AuthenticatorCreateGpmPasskeySheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorCreateGpmPasskeySheetModel(
      AuthenticatorRequestDialogModel* dialog_model);

  ~AuthenticatorCreateGpmPasskeySheetModel() override;

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  bool IsCancelButtonVisible() const override;
  std::u16string GetCancelButtonLabel() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  void OnAccept() override;
  // "Save another way" button handler.
  void OnBack() override;
  void OnCancel() override;
};

// The sheet shown for warning a user about creating a Google Password Manager
// passkey in incognito mode.
class AuthenticatorGpmIncognitoCreateSheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorGpmIncognitoCreateSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);

  ~AuthenticatorGpmIncognitoCreateSheetModel() override;

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  bool IsCancelButtonVisible() const override;
  std::u16string GetCancelButtonLabel() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  void OnAccept() override;
};

// The sheet shown for bootstrapping Google Password Manager passkeys during
// passkey creation.
class AuthenticatorTrustThisComputerCreationSheetModel
    : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorTrustThisComputerCreationSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);

  ~AuthenticatorTrustThisComputerCreationSheetModel() override;

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  bool IsCancelButtonVisible() const override;
  std::u16string GetCancelButtonLabel() const override;
  std::u16string GetOtherMechanismButtonLabel() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  void OnAccept() override;
};

// The sheet shown when the maximum amount of GPM pin entry attempts has been
// reached informing that the PIN needs to be reset.
class AuthenticatorGPMLockedPinSheetModel : public AuthenticatorSheetModelBase {
 public:
  explicit AuthenticatorGPMLockedPinSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);

  ~AuthenticatorGPMLockedPinSheetModel() override;

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  std::u16string GetAcceptButtonLabel() const override;
  void OnAccept() override;
};

class CombinedSelectorSheetModel : public AuthenticatorSheetModelBase {
 public:
  enum class SelectionStatus {
    kNone,
    kNotSelected,
    kSelected,
  };
  explicit CombinedSelectorSheetModel(
      AuthenticatorRequestDialogModel* dialog_model);

  SelectionStatus GetSelectionStatus(size_t index) const;
  size_t GetSelectionIndex() const;
  void SetSelectionIndex(size_t index);

 private:
  // AuthenticatorSheetModelBase:
  std::u16string GetStepTitle() const override;
  std::u16string GetStepDescription() const override;
  AcceptButtonState GetAcceptButtonState() const override;
  bool IsCancelButtonVisible() const override;
  bool IsActivityIndicatorVisible() const override;
  std::u16string GetCancelButtonLabel() const override;
  std::u16string GetAcceptButtonLabel() const override;
  void OnAccept() override;
  void OnCancel() override;

  size_t selection_index_ = 0;
};

#endif  // CHROME_BROWSER_UI_WEBAUTHN_SHEET_MODELS_H_