blob: 0b018afe6a4646d41f29d89a203ca74747ddba5a [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <memory>
#include <vector>
#include "base/macros.h"
namespace autofill {
struct PasswordForm;
namespace password_manager {
struct InteractionsStats;
// This is an API for providing stored credentials to PasswordFormManager (PFM),
// so that PFM instances do not have to talk to PasswordStore directly. This
// indirection allows caching of identical requests from PFM on the same origin,
// as well as easier testing (no need to mock the whole PasswordStore when
// testing a PFM).
// TODO( Actually modify the API to support fetching in the
// FormFetcher instance.
class FormFetcher {
// State of waiting for a response from a PasswordStore. There might be
// multiple transitions between these states.
enum class State { WAITING, NOT_WAITING };
// API to be implemented by classes which want the results from FormFetcher.
class Consumer {
virtual ~Consumer() = default;
// FormFetcher calls this method every time the state changes from WAITING
// to UP_TO_DATE. It fills |non_federated| with pointers to non-federated
// matches (pointees stay owned by FormFetcher). To access the federated
// matches, the consumer can simply call GetFederatedMatches().
// |filtered_count| is the number of non-federated forms which were
// filtered out by CredentialsFilter and not included in |non_federated|.
virtual void ProcessMatches(
const std::vector<const autofill::PasswordForm*>& non_federated,
size_t filtered_count) = 0;
FormFetcher() = default;
virtual ~FormFetcher() = default;
// Adds |consumer|, which must not be null. If the current state is
// UP_TO_DATE, calls ProcessMatches on the consumer immediately. Assumes that
// |consumer| outlives |this|.
virtual void AddConsumer(Consumer* consumer) = 0;
// Call this to stop |consumer| from receiving updates from |this|.
virtual void RemoveConsumer(Consumer* consumer) = 0;
// Returns the current state of the FormFetcher
virtual State GetState() const = 0;
// Statistics for recent password bubble usage.
virtual const std::vector<InteractionsStats>& GetInteractionsStats()
const = 0;
// Non-federated matches obtained from the backend. Valid only if GetState()
// returns NOT_WAITING.
virtual const std::vector<const autofill::PasswordForm*>&
GetNonFederatedMatches() const = 0;
// Federated matches obtained from the backend. Valid only if GetState()
// returns NOT_WAITING.
virtual const std::vector<const autofill::PasswordForm*>&
GetFederatedMatches() const = 0;
// The following accessors return various kinds of `suppressed` credentials.
// These are stored credentials that are not (auto-)filled, because they are
// for an origin that is similar to, but not exactly matching the origin that
// this FormFetcher was created for. They are used for recording metrics on
// how often such -- potentially, but not necessarily related -- credentials
// are not offered to the user, unduly increasing log-in friction.
// There are currently three kinds of suppressed credentials:
// 1.) HTTPS credentials not filled on the HTTP version of the origin.
// 2.) PSL-matches that are not auto-filled (but filled on account select).
// 3.) Same-organization name credentials, not filled.
// Results below are queried on a best-effort basis, might be somewhat stale,
// and are available shortly after the Consumer::ProcessMatches callback.
// When this instance fetches forms for an HTTP origin: Returns saved
// credentials, if any, found for the HTTPS version of that origin. Empty
// otherwise.
virtual const std::vector<const autofill::PasswordForm*>&
GetSuppressedHTTPSForms() const = 0;
// Returns saved credentials, if any, for PSL-matching origins. Autofilling
// these is suppressed, however, they *can be* filled on account select.
virtual const std::vector<const autofill::PasswordForm*>&
GetSuppressedPSLMatchingForms() const = 0;
// Returns saved credentials, if any, found for HTTP/HTTPS origins with the
// same organization name as the origin this FormFetcher was created for.
virtual const std::vector<const autofill::PasswordForm*>&
GetSuppressedSameOrganizationNameForms() const = 0;
// Whether querying suppressed forms (of all flavors) was attempted and did
// complete at least once during the lifetime of this instance, regardless of
// whether there have been any results.
virtual bool DidCompleteQueryingSuppressedForms() const = 0;
// Fetches stored matching logins. In addition the statistics is fetched on
// platforms with the password bubble. This is called automatically during
// construction and can be called manually later as well to cause an update
// of the cached credentials.
virtual void Fetch() = 0;
// Creates a copy of |*this| with contains the same credentials without the
// need for calling Fetch().
virtual std::unique_ptr<FormFetcher> Clone() = 0;
} // namespace password_manager