blob: b88ddb079cdaea00569a927630571ec3c40b96df [file] [log] [blame]
// Copyright 2024 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_PASSWORD_MANAGER_PASSWORD_CHANGE_DELEGATE_H_
#define CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_CHANGE_DELEGATE_H_
#include "base/observer_list_types.h"
namespace content {
class WebContents;
}
// This class is responsible for controlling password change process.
class PasswordChangeDelegate {
public:
// Internal state of a password change flow. Corresponds to
// `PasswordChangeFlowState` in enums.xml. These values are persisted to logs.
// Entries should not be renumbered and numeric values should never be reused.
// LINT.IfChange(State)
enum class State {
// Password change is being offered to the user, waiting from the to accept
// or reject it.
kOfferingPasswordChange = 0,
// Waiting for the user to accept privacy notice.
kWaitingForAgreement = 1,
// Delegate is waiting for change password form to appear.
kWaitingForChangePasswordForm = 2,
// Change password form wasn't found.
kChangePasswordFormNotFound = 3,
// Change password form is detected. Generating and filling password fields.
// Delegate waits for submission confirmation.
kChangingPassword = 4,
// Password is successfully updated.
kPasswordSuccessfullyChanged = 5,
// Password change failed.
kPasswordChangeFailed = 6,
// One time password (OTP) was detected on a page. The flow is stopped, user
// input is required.
kOtpDetected = 7,
// Password change was canceled by the user.
kCanceled = 8,
// The initial state before any UI is displayed. Transitions automatically
// into kOfferingPasswordChange or kWaitingForAgreement after no OTP is
// present on a main page.
kNoState = 9,
// Login form was detected on a page during an ongoing password change flow.
// The flow is not stopped, but the user action is required.
kLoginFormDetected = 10,
kMaxValue = kLoginFormDetected,
};
// LINT.ThenChange(/tools/metrics/histograms/metadata/password/enums.xml:PasswordChangeFlowState)
// Password change flow state used for UMA and UKM. Corresponds to
// `CoarseFinalPasswordChangeState` in enums.xml.
//
// These values are persisted to logs.
// Entries should not be renumbered and numeric values should never be reused.
// LINT.IfChange(CoarseFinalPasswordChangeState)
enum class CoarseFinalPasswordChangeState {
// Password change is being offered to the user, waiting for the user to
// accept or reject it or waiting for the user to accept privacy notice.
kOffered = 0,
// Password change was canceled by the user.
kCanceled = 1,
// Password is successfully updated.
kSuccessful = 2,
// Password change failed.
kFailed = 3,
// Change password form wasn't found.
kFormNotDetected = 4,
// One time password (OTP) was detected on a page. The flow is stopped, user
// input is required.
kOtpDetected = 5,
kMaxValue = kOtpDetected,
};
// LINT.ThenChange(/tools/metrics/histograms/metadata/password/enums.xml:CoarseFinalPasswordChangeState)
// An interface used to notify clients (observers) of delegate state. Register
// the observer via `PasswordChangeDelegate::AddObserver`.
class Observer : public base::CheckedObserver {
public:
// Notifies listeners about new state.
virtual void OnStateChanged(State new_state) {}
// Invoked before `delegate` is destroyed. Should be used to stop observing.
virtual void OnPasswordChangeStopped(PasswordChangeDelegate* delegate) {}
};
virtual ~PasswordChangeDelegate() = default;
// Starts performing password change by looking for a change password form in
// a hidden tab.
virtual void StartPasswordChangeFlow() = 0;
// Cancels any password change operation.
virtual void CancelPasswordChangeFlow() = 0;
// Responds whether password change is ongoing for a given `web_contents`.
// This is true both for originator and a tab where password change is
// performed.
virtual bool IsPasswordChangeOngoing(content::WebContents* web_contents) = 0;
// Returns current state.
virtual State GetCurrentState() const = 0;
// Terminates password change operation immediately. Delegate shouldn't be
// invoked after this function is called as the object will soon be destroyed.
virtual void Stop() = 0;
// Brings a tab where password change is ongoing. Does nothing if the tab
// doesn't exist anymore.
virtual void OpenPasswordChangeTab() = 0;
// Displays password change confirmation bubble. If the user navigated away
// from the page, then navigates to password details in password settings.
virtual void OpenPasswordDetails() = 0;
// To be executed after a password form was submitted
virtual void OnPasswordFormSubmission(content::WebContents* web_contents) = 0;
virtual void OnPrivacyNoticeAccepted() = 0;
// Called when the user declines the initial dialog offering password change.
virtual void OnPasswordChangeDeclined() = 0;
// Adds/removes an observer.
virtual void AddObserver(Observer* observer) = 0;
virtual void RemoveObserver(Observer* observer) = 0;
virtual base::WeakPtr<PasswordChangeDelegate> AsWeakPtr() = 0;
};
#endif // CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_CHANGE_DELEGATE_H_