blob: 93bbf706f9eac21a9d167f4d10a966981edd3865 [file] [log] [blame]
// Copyright 2013 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.
#ifndef CHROME_BROWSER_UI_PASSWORDS_PASSWORD_MANAGER_PRESENTER_H_
#define CHROME_BROWSER_UI_PASSWORDS_PASSWORD_MANAGER_PRESENTER_H_
#include <stddef.h>
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "base/macros.h"
#include "components/password_manager/core/browser/password_list_sorter.h"
#include "components/password_manager/core/browser/password_store.h"
#include "components/password_manager/core/browser/password_store_consumer.h"
#include "components/password_manager/core/browser/ui/credential_provider_interface.h"
#include "components/prefs/pref_member.h"
#include "components/undo/undo_manager.h"
#include "ui/shell_dialogs/select_file_dialog.h"
namespace autofill {
struct PasswordForm;
}
class PasswordUIView;
// Contains the common logic used by a PasswordUIView to
// interact with PasswordStore. It provides completion callbacks for
// PasswordStore operations and updates the view on PasswordStore changes.
class PasswordManagerPresenter
: public password_manager::PasswordStore::Observer,
public password_manager::CredentialProviderInterface {
public:
// |password_view| the UI view that owns this presenter, must not be NULL.
explicit PasswordManagerPresenter(PasswordUIView* password_view);
~PasswordManagerPresenter() override;
// PasswordStore::Observer implementation.
void OnLoginsChanged(
const password_manager::PasswordStoreChangeList& changes) override;
// Repopulates the password and exception entries.
void UpdatePasswordLists();
void Initialize();
// Gets the password entry at |index|.
const autofill::PasswordForm* GetPassword(size_t index);
// password::manager::CredentialProviderInterface:
std::vector<std::unique_ptr<autofill::PasswordForm>> GetAllPasswords()
override;
// Gets the password exception entry at |index|.
const autofill::PasswordForm* GetPasswordException(size_t index);
// Removes the saved password entry at |index|.
// |index| the entry index to be removed.
void RemoveSavedPassword(size_t index);
// Removes the saved password exception entry at |index|.
// |index| the entry index to be removed.
void RemovePasswordException(size_t index);
// Undoes the last saved password or exception removal.
void UndoRemoveSavedPasswordOrException();
// Requests the plain text password for entry at |index| to be revealed.
// |index| The index of the entry.
void RequestShowPassword(size_t index);
// Wrapper around |PasswordStore::AddLogin| that adds the corresponding undo
// action to |undo_manager_|.
void AddLogin(const autofill::PasswordForm& form);
// Wrapper around |PasswordStore::RemoveLogin| that adds the corresponding
// undo action to |undo_manager_|.
void RemoveLogin(const autofill::PasswordForm& form);
private:
friend class PasswordManagerPresenterTest;
// Sets the password and exception list of the UI view.
void SetPasswordList();
void SetPasswordExceptionList();
// Returns the password store associated with the currently active profile.
password_manager::PasswordStore* GetPasswordStore();
// A short class to mediate requests to the password store.
class ListPopulater : public password_manager::PasswordStoreConsumer {
public:
explicit ListPopulater(PasswordManagerPresenter* page);
~ListPopulater() override;
// Send a query to the password store to populate a list.
virtual void Populate() = 0;
protected:
PasswordManagerPresenter* page_;
};
// A short class to mediate requests to the password store for passwordlist.
class PasswordListPopulater : public ListPopulater {
public:
explicit PasswordListPopulater(PasswordManagerPresenter* page);
// Send a query to the password store to populate a password list.
void Populate() override;
// Send the password store's reply back to the handler.
void OnGetPasswordStoreResults(
std::vector<std::unique_ptr<autofill::PasswordForm>> results) override;
};
// A short class to mediate requests to the password store for exceptions.
class PasswordExceptionListPopulater : public ListPopulater {
public:
explicit PasswordExceptionListPopulater(PasswordManagerPresenter* page);
// Send a query to the password store to populate a passwordException list.
void Populate() override;
// Send the password store's reply back to the handler.
void OnGetPasswordStoreResults(
std::vector<std::unique_ptr<autofill::PasswordForm>> results) override;
};
// Password store consumer for populating the password list and exceptions.
PasswordListPopulater populater_;
PasswordExceptionListPopulater exception_populater_;
std::vector<std::unique_ptr<autofill::PasswordForm>> password_list_;
std::vector<std::unique_ptr<autofill::PasswordForm>> password_exception_list_;
password_manager::DuplicatesMap password_duplicates_;
password_manager::DuplicatesMap password_exception_duplicates_;
UndoManager undo_manager_;
// Whether to show stored passwords or not.
BooleanPrefMember show_passwords_;
// UI view that owns this presenter.
PasswordUIView* password_view_;
DISALLOW_COPY_AND_ASSIGN(PasswordManagerPresenter);
};
#endif // CHROME_BROWSER_UI_PASSWORDS_PASSWORD_MANAGER_PRESENTER_H_