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( ...@@ -84,7 +84,7 @@ bool AddressAccessoryController::AllowedForWebContents(
content::WebContents* web_contents) { content::WebContents* web_contents) {
DCHECK(web_contents) << "Need valid WebContents to attach controller to!"; DCHECK(web_contents) << "Need valid WebContents to attach controller to!";
if (vr::VrTabHelper::IsInVr(web_contents)) { 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( return base::FeatureList::IsEnabled(
autofill::features::kAutofillKeyboardAccessory); autofill::features::kAutofillKeyboardAccessory);
......
...@@ -7,6 +7,10 @@ ...@@ -7,6 +7,10 @@
#include "chrome/browser/autofill/accessory_controller.h" #include "chrome/browser/autofill/accessory_controller.h"
namespace content {
class WebContents;
}
namespace autofill { namespace autofill {
// Interface for credit card-specific keyboard accessory controller between the // Interface for credit card-specific keyboard accessory controller between the
...@@ -16,8 +20,24 @@ class CreditCardAccessoryController : public AccessoryController { ...@@ -16,8 +20,24 @@ class CreditCardAccessoryController : public AccessoryController {
CreditCardAccessoryController() = default; CreditCardAccessoryController() = default;
~CreditCardAccessoryController() override = 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. // Fetches suggestions and propagates to the frontend.
virtual void RefreshSuggestionsForField() = 0; virtual void RefreshSuggestions() = 0;
}; };
} // namespace autofill } // namespace autofill
......
...@@ -13,7 +13,11 @@ ...@@ -13,7 +13,11 @@
#include "chrome/browser/android/preferences/preferences_launcher.h" #include "chrome/browser/android/preferences/preferences_launcher.h"
#include "chrome/browser/autofill/manual_filling_controller.h" #include "chrome/browser/autofill/manual_filling_controller.h"
#include "chrome/browser/autofill/manual_filling_utils.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/browser/data_model/credit_card.h"
#include "components/autofill/core/common/autofill_features.h"
#include "components/strings/grit/components_strings.h" #include "components/strings/grit/components_strings.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
...@@ -53,12 +57,6 @@ UserInfo TranslateCard(const CreditCard* data) { ...@@ -53,12 +57,6 @@ UserInfo TranslateCard(const CreditCard* data) {
} // namespace } // namespace
CreditCardAccessoryControllerImpl::CreditCardAccessoryControllerImpl(
autofill::PersonalDataManager* personal_data_manager,
content::WebContents* web_contents)
: personal_data_manager_(personal_data_manager),
web_contents_(web_contents) {}
CreditCardAccessoryControllerImpl::~CreditCardAccessoryControllerImpl() = CreditCardAccessoryControllerImpl::~CreditCardAccessoryControllerImpl() =
default; default;
...@@ -73,7 +71,35 @@ void CreditCardAccessoryControllerImpl::OnOptionSelected( ...@@ -73,7 +71,35 @@ void CreditCardAccessoryControllerImpl::OnOptionSelected(
<< static_cast<int>(selected_action); << 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(); const std::vector<CreditCard*> suggestions = GetSuggestions();
std::vector<UserInfo> info_to_add; std::vector<UserInfo> info_to_add;
std::transform(suggestions.begin(), suggestions.end(), std::transform(suggestions.begin(), suggestions.end(),
...@@ -91,15 +117,46 @@ void CreditCardAccessoryControllerImpl::RefreshSuggestionsForField() { ...@@ -91,15 +117,46 @@ void CreditCardAccessoryControllerImpl::RefreshSuggestionsForField() {
std::move(info_to_add), std::move(footer_commands))); std::move(info_to_add), std::move(footer_commands)));
} }
void CreditCardAccessoryControllerImpl::SetManualFillingControllerForTesting( // static
base::WeakPtr<ManualFillingController> controller) { void CreditCardAccessoryControllerImpl::CreateForWebContentsForTesting(
mf_controller_ = controller; 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*> const std::vector<CreditCard*>
CreditCardAccessoryControllerImpl::GetSuggestions() { CreditCardAccessoryControllerImpl::GetSuggestions() {
DCHECK(personal_data_manager_); const PersonalDataManager* personal_data_manager =
return personal_data_manager_->GetCreditCardsToSuggest( 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); /*include_server_cards=*/true);
} }
...@@ -111,4 +168,6 @@ CreditCardAccessoryControllerImpl::GetManualFillingController() { ...@@ -111,4 +168,6 @@ CreditCardAccessoryControllerImpl::GetManualFillingController() {
return mf_controller_; return mf_controller_;
} }
WEB_CONTENTS_USER_DATA_KEY_IMPL(CreditCardAccessoryControllerImpl)
} // namespace autofill } // namespace autofill
...@@ -7,21 +7,22 @@ ...@@ -7,21 +7,22 @@
#include "chrome/browser/autofill/credit_card_accessory_controller.h" #include "chrome/browser/autofill/credit_card_accessory_controller.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "components/autofill/core/browser/personal_data_manager.h" #include "components/autofill/core/browser/personal_data_manager.h"
#include "content/public/browser/web_contents_user_data.h"
namespace content {
class WebContents;
}
class ManualFillingController; class ManualFillingController;
namespace autofill { 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: public:
CreditCardAccessoryControllerImpl(PersonalDataManager* personal_data_manager,
content::WebContents* web_contents);
~CreditCardAccessoryControllerImpl() override; ~CreditCardAccessoryControllerImpl() override;
// AccessoryController: // AccessoryController:
...@@ -30,18 +31,34 @@ class CreditCardAccessoryControllerImpl : public CreditCardAccessoryController { ...@@ -30,18 +31,34 @@ class CreditCardAccessoryControllerImpl : public CreditCardAccessoryController {
void OnOptionSelected(AccessoryAction selected_action) override; void OnOptionSelected(AccessoryAction selected_action) override;
// CreditCardAccessoryController: // CreditCardAccessoryController:
void RefreshSuggestionsForField() override; void RefreshSuggestions() override;
void SetManualFillingControllerForTesting( static void CreateForWebContentsForTesting(
base::WeakPtr<ManualFillingController> controller); content::WebContents* web_contents,
base::WeakPtr<ManualFillingController> mf_controller,
autofill::PersonalDataManager* personal_data_manager);
private: 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(); const std::vector<CreditCard*> GetSuggestions();
base::WeakPtr<ManualFillingController> GetManualFillingController(); base::WeakPtr<ManualFillingController> GetManualFillingController();
const PersonalDataManager* personal_data_manager_;
content::WebContents* web_contents_; content::WebContents* web_contents_;
base::WeakPtr<ManualFillingController> mf_controller_; 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 } // namespace autofill
......
...@@ -6,12 +6,12 @@ ...@@ -6,12 +6,12 @@
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "chrome/browser/autofill/mock_manual_filling_controller.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 "chrome/test/base/testing_profile.h"
#include "components/autofill/core/browser/autofill_test_utils.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/data_model/credit_card.h"
#include "components/autofill/core/browser/test_personal_data_manager.h" #include "components/autofill/core/browser/test_personal_data_manager.h"
#include "components/strings/grit/components_strings.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/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
...@@ -34,14 +34,17 @@ AccessorySheetData::Builder CreditCardAccessorySheetDataBuilder() { ...@@ -34,14 +34,17 @@ AccessorySheetData::Builder CreditCardAccessorySheetDataBuilder() {
} // namespace } // namespace
class CreditCardAccessoryControllerTest : public testing::Test { class CreditCardAccessoryControllerTest
: public ChromeRenderViewHostTestHarness {
public: public:
CreditCardAccessoryControllerTest() CreditCardAccessoryControllerTest() {}
: controller_(&data_manager_, /*web_contents=*/nullptr) {}
void SetUp() override { void SetUp() override {
controller_.SetManualFillingControllerForTesting( ChromeRenderViewHostTestHarness::SetUp();
mock_mf_controller_.AsWeakPtr());
CreditCardAccessoryControllerImpl::CreateForWebContentsForTesting(
web_contents(), mock_mf_controller_.AsWeakPtr(), &data_manager_);
data_manager_.SetPrefService(profile_.GetPrefs()); data_manager_.SetPrefService(profile_.GetPrefs());
} }
...@@ -50,10 +53,11 @@ class CreditCardAccessoryControllerTest : public testing::Test { ...@@ -50,10 +53,11 @@ class CreditCardAccessoryControllerTest : public testing::Test {
data_manager_.ClearCreditCards(); data_manager_.ClearCreditCards();
} }
CreditCardAccessoryController* controller() {
return CreditCardAccessoryControllerImpl::FromWebContents(web_contents());
}
protected: protected:
content::TestBrowserThreadBundle
test_browser_thread_bundle_; // for |profile_|
CreditCardAccessoryControllerImpl controller_;
testing::StrictMock<MockManualFillingController> mock_mf_controller_; testing::StrictMock<MockManualFillingController> mock_mf_controller_;
autofill::TestPersonalDataManager data_manager_; autofill::TestPersonalDataManager data_manager_;
TestingProfile profile_; TestingProfile profile_;
...@@ -71,7 +75,9 @@ TEST_F(CreditCardAccessoryControllerTest, RefreshSuggestionsForField) { ...@@ -71,7 +75,9 @@ TEST_F(CreditCardAccessoryControllerTest, RefreshSuggestionsForField) {
mojom::FocusedFieldType::kFillableTextField, _)) mojom::FocusedFieldType::kFillableTextField, _))
.WillOnce(SaveArg<1>(&result)); .WillOnce(SaveArg<1>(&result));
controller_.RefreshSuggestionsForField(); auto* cc_controller = controller();
ASSERT_TRUE(cc_controller);
cc_controller->RefreshSuggestions();
ASSERT_EQ(result, CreditCardAccessorySheetDataBuilder() ASSERT_EQ(result, CreditCardAccessorySheetDataBuilder()
.AddUserInfo() .AddUserInfo()
......
...@@ -104,7 +104,7 @@ bool PasswordAccessoryController::AllowedForWebContents( ...@@ -104,7 +104,7 @@ bool PasswordAccessoryController::AllowedForWebContents(
content::WebContents* web_contents) { content::WebContents* web_contents) {
DCHECK(web_contents) << "Need valid WebContents to attach controller to!"; DCHECK(web_contents) << "Need valid WebContents to attach controller to!";
if (vr::VrTabHelper::IsInVr(web_contents)) { 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( return base::FeatureList::IsEnabled(
password_manager::features::kPasswordsKeyboardAccessory); 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