blob: 3e9fd39473e9590e270857fb9e5053b4e93c179f [file] [log] [blame]
// Copyright 2018 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_AUTOFILL_MANUAL_FILLING_CONTROLLER_IMPL_H_
#define CHROME_BROWSER_AUTOFILL_MANUAL_FILLING_CONTROLLER_IMPL_H_
#include <memory>
#include "base/containers/flat_set.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/autofill/manual_filling_controller.h"
#include "chrome/browser/autofill/manual_filling_view_interface.h"
#include "components/autofill/core/common/mojom/autofill_types.mojom-shared.h"
#include "content/public/browser/web_contents_user_data.h"
namespace autofill {
class AddressAccessoryController;
class CreditCardAccessoryController;
}
class AccessoryController;
class PasswordAccessoryController;
class TouchToFillController;
// Use ManualFillingController::GetOrCreate to obtain instances of this class.
class ManualFillingControllerImpl
: public ManualFillingController,
public content::WebContentsUserData<ManualFillingControllerImpl> {
public:
~ManualFillingControllerImpl() override;
// ManualFillingController:
void RefreshSuggestions(
const autofill::AccessorySheetData& accessory_sheet_data) override;
void NotifyFocusedInputChanged(
autofill::mojom::FocusedFieldType focused_field_type) override;
void UpdateSourceAvailability(FillingSource source,
bool has_suggestions) override;
void Hide() override;
void OnAutomaticGenerationStatusChanged(bool available) override;
void OnFillingTriggered(autofill::AccessoryTabType type,
const autofill::UserInfo::Field& selection) override;
void OnOptionSelected(
autofill::AccessoryAction selected_action) const override;
void GetFavicon(
int desired_size_in_pixel,
base::OnceCallback<void(const gfx::Image&)> icon_callback) override;
gfx::NativeView container_view() const override;
// Returns a weak pointer for this object.
base::WeakPtr<ManualFillingController> AsWeakPtr();
// Like |CreateForWebContents|, it creates the controller and attaches it to
// the given |web_contents|. Additionally, it allows injecting a fake/mock
// view and type-specific controllers.
static void CreateForWebContentsForTesting(
content::WebContents* web_contents,
base::WeakPtr<PasswordAccessoryController> pwd_controller,
base::WeakPtr<autofill::AddressAccessoryController> address_controller,
base::WeakPtr<autofill::CreditCardAccessoryController> cc_controller,
std::unique_ptr<ManualFillingViewInterface> test_view);
#if defined(UNIT_TEST)
// Returns the held view for testing.
ManualFillingViewInterface* view() const { return view_.get(); }
#endif // defined(UNIT_TEST)
protected:
friend class ManualFillingController; // Allow protected access in factories.
// Enables calling initialization code that relies on a fully constructed
// ManualFillingController that is attached to a WebContents instance.
// This is matters for subcomponents which lazily trigger the creation of this
// class. If called in constructors, it would cause an infinite creation loop.
void Initialize();
private:
friend class content::WebContentsUserData<ManualFillingControllerImpl>;
// Required for construction via |CreateForWebContents|:
explicit ManualFillingControllerImpl(content::WebContents* contents);
// Constructor that allows to inject a mock or fake view.
ManualFillingControllerImpl(
content::WebContents* web_contents,
base::WeakPtr<PasswordAccessoryController> pwd_controller,
base::WeakPtr<autofill::AddressAccessoryController> address_controller,
base::WeakPtr<autofill::CreditCardAccessoryController> cc_controller,
std::unique_ptr<ManualFillingViewInterface> view);
// Returns true if the keyboard accessory needs to be shown.
bool ShouldShowAccessory() const;
// Adjusts visibility based on focused field type and available suggestions.
void UpdateVisibility();
// Returns the controller that is responsible for a tab of given |type|.
AccessoryController* GetControllerForTab(autofill::AccessoryTabType type);
// Returns the controller that is responsible for a given |action|.
AccessoryController* GetControllerForAction(
autofill::AccessoryAction action) const;
// Returns the controller that is responsible for a given |action|.
PasswordAccessoryController* GetPasswordController() const;
// The tab for which this class is scoped.
content::WebContents* web_contents_;
// This set contains sources to be shown to the user.
base::flat_set<FillingSource> available_sources_;
// Type of the last known selected field. Helps to determine UI visibility.
autofill::mojom::FocusedFieldType focused_field_type_ =
autofill::mojom::FocusedFieldType::kUnknown;
// Controllers which handle events relating to a specific tab and the
// associated data.
base::WeakPtr<PasswordAccessoryController> pwd_controller_for_testing_;
base::WeakPtr<autofill::AddressAccessoryController> address_controller_;
base::WeakPtr<autofill::CreditCardAccessoryController> cc_controller_;
base::WeakPtr<TouchToFillController> touch_to_fill_controller_;
// Hold the native instance of the view. Must be last declared and initialized
// member so the view can be created in the constructor with a fully set up
// controller instance.
std::unique_ptr<ManualFillingViewInterface> view_ =
ManualFillingViewInterface::Create(this);
base::WeakPtrFactory<ManualFillingControllerImpl> weak_factory_{this};
WEB_CONTENTS_USER_DATA_KEY_DECL();
DISALLOW_COPY_AND_ASSIGN(ManualFillingControllerImpl);
};
#endif // CHROME_BROWSER_AUTOFILL_MANUAL_FILLING_CONTROLLER_IMPL_H_