Commit e42f7e47 authored by Tommy Martino's avatar Tommy Martino Committed by Commit Bot

[MF Android] Attach credit card controller to WebContents

This CL allows the CreditCardAccessoryController to be instantiated by
making it a WebContentsUserData. It also includes a few small updates
for consistency with https://chromium-review.googlesource.com/c/chromium/src/+/1614200

TBR=vasilii@chromium.org

Change-Id: I0363a6ec2b9d610b5f21b71f8a0f869170958d42
Bug: 902425
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1627922
Commit-Queue: Tommy Martino <tmartino@chromium.org>
Reviewed-by: default avatarFriedrich [CET] <fhorschig@chromium.org>
Cr-Commit-Position: refs/heads/master@{#663598}
parent 107d08bc
......@@ -84,7 +84,7 @@ bool AddressAccessoryController::AllowedForWebContents(
content::WebContents* web_contents) {
DCHECK(web_contents) << "Need valid WebContents to attach controller to!";
if (vr::VrTabHelper::IsInVr(web_contents)) {
return false; // TODO(crbug.com/865749): Re-Enable if possible.
return false; // TODO(crbug.com/902305): Re-Enable if possible.
}
return base::FeatureList::IsEnabled(
autofill::features::kAutofillKeyboardAccessory);
......
......@@ -7,6 +7,10 @@
#include "chrome/browser/autofill/accessory_controller.h"
namespace content {
class WebContents;
}
namespace autofill {
// Interface for credit card-specific keyboard accessory controller between the
......@@ -16,8 +20,24 @@ class CreditCardAccessoryController : public AccessoryController {
CreditCardAccessoryController() = default;
~CreditCardAccessoryController() override = default;
// Returns true if the accessory controller may exist for |web_contents|.
// Otherwise it returns false.
static bool AllowedForWebContents(content::WebContents* web_contents);
// Returns a reference to the unique controller associated with
// |web_contents|. A new instance is created if the first time this function
// is called. Should only be called if AllowedForWebContents returns true for
// |web_contents|.
static CreditCardAccessoryController* GetOrCreate(
content::WebContents* web_contents);
// Returns a reference to the unique controller associated with
// |web_contents|. Returns null if no such instance exists.
static CreditCardAccessoryController* GetIfExisting(
content::WebContents* web_contents);
// Fetches suggestions and propagates to the frontend.
virtual void RefreshSuggestionsForField() = 0;
virtual void RefreshSuggestions() = 0;
};
} // namespace autofill
......
......@@ -13,7 +13,11 @@
#include "chrome/browser/android/preferences/preferences_launcher.h"
#include "chrome/browser/autofill/manual_filling_controller.h"
#include "chrome/browser/autofill/manual_filling_utils.h"
#include "chrome/browser/autofill/personal_data_manager_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/vr/vr_tab_helper.h"
#include "components/autofill/core/browser/data_model/credit_card.h"
#include "components/autofill/core/common/autofill_features.h"
#include "components/strings/grit/components_strings.h"
#include "ui/base/l10n/l10n_util.h"
......@@ -53,12 +57,6 @@ UserInfo TranslateCard(const CreditCard* data) {
} // namespace
CreditCardAccessoryControllerImpl::CreditCardAccessoryControllerImpl(
autofill::PersonalDataManager* personal_data_manager,
content::WebContents* web_contents)
: personal_data_manager_(personal_data_manager),
web_contents_(web_contents) {}
CreditCardAccessoryControllerImpl::~CreditCardAccessoryControllerImpl() =
default;
......@@ -73,7 +71,35 @@ void CreditCardAccessoryControllerImpl::OnOptionSelected(
<< static_cast<int>(selected_action);
}
void CreditCardAccessoryControllerImpl::RefreshSuggestionsForField() {
// static
bool CreditCardAccessoryController::AllowedForWebContents(
content::WebContents* web_contents) {
DCHECK(web_contents) << "Need valid WebContents to attach controller to!";
if (vr::VrTabHelper::IsInVr(web_contents)) {
return false; // TODO(crbug.com/902305): Re-enable if possible.
}
return base::FeatureList::IsEnabled(
autofill::features::kAutofillKeyboardAccessory) &&
base::FeatureList::IsEnabled(
autofill::features::kAutofillManualFallbackAndroid);
}
// static
CreditCardAccessoryController* CreditCardAccessoryController::GetOrCreate(
content::WebContents* web_contents) {
DCHECK(CreditCardAccessoryController::AllowedForWebContents(web_contents));
CreditCardAccessoryControllerImpl::CreateForWebContents(web_contents);
return CreditCardAccessoryControllerImpl::FromWebContents(web_contents);
}
// static
CreditCardAccessoryController* CreditCardAccessoryController::GetIfExisting(
content::WebContents* web_contents) {
return CreditCardAccessoryControllerImpl::FromWebContents(web_contents);
}
void CreditCardAccessoryControllerImpl::RefreshSuggestions() {
const std::vector<CreditCard*> suggestions = GetSuggestions();
std::vector<UserInfo> info_to_add;
std::transform(suggestions.begin(), suggestions.end(),
......@@ -91,15 +117,46 @@ void CreditCardAccessoryControllerImpl::RefreshSuggestionsForField() {
std::move(info_to_add), std::move(footer_commands)));
}
void CreditCardAccessoryControllerImpl::SetManualFillingControllerForTesting(
base::WeakPtr<ManualFillingController> controller) {
mf_controller_ = controller;
// static
void CreditCardAccessoryControllerImpl::CreateForWebContentsForTesting(
content::WebContents* web_contents,
base::WeakPtr<ManualFillingController> mf_controller,
autofill::PersonalDataManager* personal_data_manager) {
DCHECK(web_contents) << "Need valid WebContents to attach controller to!";
DCHECK(!FromWebContents(web_contents)) << "Controller already attached!";
DCHECK(mf_controller);
web_contents->SetUserData(
UserDataKey(),
base::WrapUnique(new CreditCardAccessoryControllerImpl(
web_contents, std::move(mf_controller), personal_data_manager)));
}
CreditCardAccessoryControllerImpl::CreditCardAccessoryControllerImpl(
content::WebContents* web_contents)
: web_contents_(web_contents),
personal_data_manager_for_testing_(nullptr) {}
CreditCardAccessoryControllerImpl::CreditCardAccessoryControllerImpl(
content::WebContents* web_contents,
base::WeakPtr<ManualFillingController> mf_controller,
PersonalDataManager* personal_data_manager)
: web_contents_(web_contents),
mf_controller_(mf_controller),
personal_data_manager_for_testing_(personal_data_manager) {}
const std::vector<CreditCard*>
CreditCardAccessoryControllerImpl::GetSuggestions() {
DCHECK(personal_data_manager_);
return personal_data_manager_->GetCreditCardsToSuggest(
const PersonalDataManager* personal_data_manager =
personal_data_manager_for_testing_;
if (!personal_data_manager) {
personal_data_manager = autofill::PersonalDataManagerFactory::GetForProfile(
Profile::FromBrowserContext(web_contents_->GetBrowserContext()));
}
if (!personal_data_manager) {
return {}; // No data available.
}
return personal_data_manager->GetCreditCardsToSuggest(
/*include_server_cards=*/true);
}
......@@ -111,4 +168,6 @@ CreditCardAccessoryControllerImpl::GetManualFillingController() {
return mf_controller_;
}
WEB_CONTENTS_USER_DATA_KEY_IMPL(CreditCardAccessoryControllerImpl)
} // namespace autofill
......@@ -7,21 +7,22 @@
#include "chrome/browser/autofill/credit_card_accessory_controller.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "components/autofill/core/browser/personal_data_manager.h"
namespace content {
class WebContents;
}
#include "content/public/browser/web_contents_user_data.h"
class ManualFillingController;
namespace autofill {
class CreditCardAccessoryControllerImpl : public CreditCardAccessoryController {
// Use either CreditCardAccessoryController::GetOrCreate or
// CreditCardAccessoryController::GetIfExisting to obtain instances of this
// class.
class CreditCardAccessoryControllerImpl
: public CreditCardAccessoryController,
public content::WebContentsUserData<CreditCardAccessoryControllerImpl> {
public:
CreditCardAccessoryControllerImpl(PersonalDataManager* personal_data_manager,
content::WebContents* web_contents);
~CreditCardAccessoryControllerImpl() override;
// AccessoryController:
......@@ -30,18 +31,34 @@ class CreditCardAccessoryControllerImpl : public CreditCardAccessoryController {
void OnOptionSelected(AccessoryAction selected_action) override;
// CreditCardAccessoryController:
void RefreshSuggestionsForField() override;
void RefreshSuggestions() override;
void SetManualFillingControllerForTesting(
base::WeakPtr<ManualFillingController> controller);
static void CreateForWebContentsForTesting(
content::WebContents* web_contents,
base::WeakPtr<ManualFillingController> mf_controller,
autofill::PersonalDataManager* personal_data_manager);
private:
friend class content::WebContentsUserData<CreditCardAccessoryControllerImpl>;
// Required for construction via |CreateForWebContents|:
explicit CreditCardAccessoryControllerImpl(content::WebContents* contents);
// Used by CreateForWebContentsForTesting:
CreditCardAccessoryControllerImpl(
content::WebContents* web_contents,
base::WeakPtr<ManualFillingController> mf_controller,
PersonalDataManager* personal_data_manager);
const std::vector<CreditCard*> GetSuggestions();
base::WeakPtr<ManualFillingController> GetManualFillingController();
const PersonalDataManager* personal_data_manager_;
content::WebContents* web_contents_;
base::WeakPtr<ManualFillingController> mf_controller_;
const PersonalDataManager* personal_data_manager_for_testing_;
WEB_CONTENTS_USER_DATA_KEY_DECL();
DISALLOW_COPY_AND_ASSIGN(CreditCardAccessoryControllerImpl);
};
} // namespace autofill
......
......@@ -6,12 +6,12 @@
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/autofill/mock_manual_filling_controller.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "chrome/test/base/testing_profile.h"
#include "components/autofill/core/browser/autofill_test_utils.h"
#include "components/autofill/core/browser/data_model/credit_card.h"
#include "components/autofill/core/browser/test_personal_data_manager.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/l10n/l10n_util.h"
......@@ -34,14 +34,17 @@ AccessorySheetData::Builder CreditCardAccessorySheetDataBuilder() {
} // namespace
class CreditCardAccessoryControllerTest : public testing::Test {
class CreditCardAccessoryControllerTest
: public ChromeRenderViewHostTestHarness {
public:
CreditCardAccessoryControllerTest()
: controller_(&data_manager_, /*web_contents=*/nullptr) {}
CreditCardAccessoryControllerTest() {}
void SetUp() override {
controller_.SetManualFillingControllerForTesting(
mock_mf_controller_.AsWeakPtr());
ChromeRenderViewHostTestHarness::SetUp();
CreditCardAccessoryControllerImpl::CreateForWebContentsForTesting(
web_contents(), mock_mf_controller_.AsWeakPtr(), &data_manager_);
data_manager_.SetPrefService(profile_.GetPrefs());
}
......@@ -50,10 +53,11 @@ class CreditCardAccessoryControllerTest : public testing::Test {
data_manager_.ClearCreditCards();
}
CreditCardAccessoryController* controller() {
return CreditCardAccessoryControllerImpl::FromWebContents(web_contents());
}
protected:
content::TestBrowserThreadBundle
test_browser_thread_bundle_; // for |profile_|
CreditCardAccessoryControllerImpl controller_;
testing::StrictMock<MockManualFillingController> mock_mf_controller_;
autofill::TestPersonalDataManager data_manager_;
TestingProfile profile_;
......@@ -71,7 +75,9 @@ TEST_F(CreditCardAccessoryControllerTest, RefreshSuggestionsForField) {
mojom::FocusedFieldType::kFillableTextField, _))
.WillOnce(SaveArg<1>(&result));
controller_.RefreshSuggestionsForField();
auto* cc_controller = controller();
ASSERT_TRUE(cc_controller);
cc_controller->RefreshSuggestions();
ASSERT_EQ(result, CreditCardAccessorySheetDataBuilder()
.AddUserInfo()
......
......@@ -104,7 +104,7 @@ bool PasswordAccessoryController::AllowedForWebContents(
content::WebContents* web_contents) {
DCHECK(web_contents) << "Need valid WebContents to attach controller to!";
if (vr::VrTabHelper::IsInVr(web_contents)) {
return false; // TODO(crbug.com/865749): Reenable if works for VR keyboard.
return false; // TODO(crbug.com/902305): Re-enable if possible.
}
return base::FeatureList::IsEnabled(
password_manager::features::kPasswordsKeyboardAccessory);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment