blob: 275833c253027b35f0b07a82723360f41623a7ee [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/autofill/address_bubbles_controller.h"
#include "base/functional/bind.h"
#include "build/buildflag.h"
#include "chrome/browser/ui/views/autofill/add_new_address_bubble_view.h"
#include "chrome/browser/ui/views/autofill/edit_address_profile_view.h"
#include "chrome/browser/ui/views/autofill/save_address_profile_view.h"
#include "chrome/browser/ui/views/autofill/update_address_profile_view.h"
#include "chrome/test/interaction/interactive_browser_test.h"
#include "components/autofill/content/browser/content_autofill_client.h"
#include "components/autofill/core/browser/autofill_client.h"
#include "components/autofill/core/browser/autofill_test_utils.h"
#include "components/autofill/core/browser/data_model/autofill_profile.h"
#include "content/public/test/browser_test.h"
#include "ui/base/interaction/element_identifier.h"
#include "ui/views/bubble/bubble_frame_view.h"
#include "ui/views/window/dialog_client_view.h"
namespace autofill {
constexpr char kSuppressedScreenshotError[] =
"Screenshot can only run in pixel_tests on Windows.";
class BaseAddressBubblesControllerTest
: public InteractiveBrowserTest {
protected:
content::WebContents* web_contents() {
return browser()->tab_strip_model()->GetActiveWebContents();
}
autofill::ContentAutofillClient* autofill_client() {
return autofill::ContentAutofillClient::FromWebContents(web_contents());
}
virtual void TriggerBubble() = 0;
InteractiveTestApi::StepBuilder ShowInitBubble() {
return Do([this]() {
user_decision_ = AutofillClient::AddressPromptUserDecision::kUndefined;
TriggerBubble();
});
}
InteractiveTestApi::StepBuilder EnsureClosedWithDecision(
AutofillClient::AddressPromptUserDecision expected_user_decision) {
return Do([this, expected_user_decision]() {
ASSERT_EQ(expected_user_decision, user_decision_);
});
}
void OnUserDecision(AutofillClient::AddressPromptUserDecision decision,
base::optional_ref<const AutofillProfile> profile) {
user_decision_ = decision;
}
private:
// The latest user decisive interaction with a popup, e.g. Save/Update
// or Cancel the prompt, it is set in the AddressProfileSavePromptCallback
// passed to the prompt.
AutofillClient::AddressPromptUserDecision user_decision_;
};
///////////////////////////////////////////////////////////////////////////////
// SaveAddressProfileTest
class SaveAddressProfileTest: public BaseAddressBubblesControllerTest {
void TriggerBubble() override {
autofill_client()->ConfirmSaveAddressProfile(
test::GetFullProfile(), nullptr,
AutofillClient::SaveAddressProfilePromptOptions{.show_prompt = true},
base::BindOnce(&SaveAddressProfileTest::OnUserDecision,
base::Unretained(this)));
}
};
IN_PROC_BROWSER_TEST_F(SaveAddressProfileTest, SaveAccept) {
RunTestSequence(ShowInitBubble(),
PressButton(views::DialogClientView::kOkButtonElementId),
EnsureClosedWithDecision(
AutofillClient::AddressPromptUserDecision::kAccepted));
}
IN_PROC_BROWSER_TEST_F(SaveAddressProfileTest, SaveDecline) {
RunTestSequence(ShowInitBubble(),
PressButton(views::DialogClientView::kCancelButtonElementId),
EnsureClosedWithDecision(
AutofillClient::AddressPromptUserDecision::kDeclined));
}
IN_PROC_BROWSER_TEST_F(SaveAddressProfileTest, SaveWithEdit) {
RunTestSequence(
ShowInitBubble(),
SetOnIncompatibleAction(OnIncompatibleAction::kIgnoreAndContinue,
kSuppressedScreenshotError),
Screenshot(SaveAddressProfileView::kTopViewId,
/*screenshot_name=*/"save_popup", /*baseline_cl=*/"4535916"),
PressButton(SaveAddressProfileView::kEditButtonViewId),
WaitForShow(EditAddressProfileView::kTopViewId),
Screenshot(EditAddressProfileView::kTopViewId,
/*screenshot_name=*/"edit_popup",
/*baseline_cl=*/"4535916"),
PressButton(views::DialogClientView::kCancelButtonElementId),
WaitForHide(EditAddressProfileView::kTopViewId), FlushEvents(),
WaitForShow(SaveAddressProfileView::kTopViewId),
PressButton(views::DialogClientView::kOkButtonElementId),
WaitForHide(SaveAddressProfileView::kTopViewId),
EnsureClosedWithDecision(
AutofillClient::AddressPromptUserDecision::kAccepted));
}
IN_PROC_BROWSER_TEST_F(SaveAddressProfileTest, SaveInEdit) {
RunTestSequence(
SetOnIncompatibleAction(OnIncompatibleAction::kIgnoreAndContinue,
kSuppressedScreenshotError),
ShowInitBubble(), PressButton(SaveAddressProfileView::kEditButtonViewId),
WaitForShow(EditAddressProfileView::kTopViewId),
PressButton(views::DialogClientView::kOkButtonElementId),
WaitForHide(EditAddressProfileView::kTopViewId), FlushEvents(),
EnsureClosedWithDecision(
AutofillClient::AddressPromptUserDecision::kEditAccepted));
}
IN_PROC_BROWSER_TEST_F(SaveAddressProfileTest, SaveCloseAndOpenAgain) {
RunTestSequence(
ShowInitBubble(),
SetOnIncompatibleAction(OnIncompatibleAction::kIgnoreAndContinue,
kSuppressedScreenshotError),
Screenshot(SaveAddressProfileView::kTopViewId,
/*screenshot_name=*/"save_popup", /*baseline_cl=*/"4535916"),
PressButton(views::BubbleFrameView::kCloseButtonElementId),
// Make sure the popup gets closed before subsequent reopening.
EnsureNotPresent(SaveAddressProfileView::kTopViewId),
ShowInitBubble(),
Screenshot(SaveAddressProfileView::kTopViewId,
/*screenshot_name=*/"reopened_save_popup",
/*baseline_cl=*/"4535916"));
}
IN_PROC_BROWSER_TEST_F(SaveAddressProfileTest, NoCrashesOnTabClose) {
RunTestSequence(
ShowInitBubble(), EnsurePresent(SaveAddressProfileView::kTopViewId),
Do([this]() {
browser()->tab_strip_model()->GetActiveWebContents()->Close();
}));
}
///////////////////////////////////////////////////////////////////////////////
// UpdateAddressProfileTest
class UpdateAddressProfileTest: public BaseAddressBubblesControllerTest {
protected:
void TriggerBubble() override {
autofill_client()->ConfirmSaveAddressProfile(
test::GetFullProfile(), &original_profile_,
AutofillClient::SaveAddressProfilePromptOptions{.show_prompt = true},
base::BindOnce(&UpdateAddressProfileTest::OnUserDecision,
base::Unretained(this)));
}
AutofillProfile original_profile_ = test::GetFullProfile2();
};
IN_PROC_BROWSER_TEST_F(UpdateAddressProfileTest, UpdateThroughEdit) {
RunTestSequence(
ShowInitBubble(),
SetOnIncompatibleAction(OnIncompatibleAction::kIgnoreAndContinue,
kSuppressedScreenshotError),
Screenshot(UpdateAddressProfileView::kTopViewId,
/*screenshot_name=*/"update_popup",
/*baseline_cl=*/"4535916"),
PressButton(UpdateAddressProfileView::kEditButtonViewId),
WaitForShow(EditAddressProfileView::kTopViewId),
Screenshot(EditAddressProfileView::kTopViewId,
/*screenshot_name=*/"edit_popup",
/*baseline_cl=*/"4535916"),
PressButton(views::DialogClientView::kCancelButtonElementId),
WaitForHide(EditAddressProfileView::kTopViewId), FlushEvents(),
WaitForShow(UpdateAddressProfileView::kTopViewId),
PressButton(views::DialogClientView::kOkButtonElementId),
WaitForHide(UpdateAddressProfileView::kTopViewId),
EnsureClosedWithDecision(
AutofillClient::AddressPromptUserDecision::kAccepted));
}
///////////////////////////////////////////////////////////////////////////////
// UpdateAccountAddressProfileTest
class UpdateAccountAddressProfileTest : public UpdateAddressProfileTest {
void TriggerBubble() override {
original_profile_.set_source_for_testing(AutofillProfile::Source::kAccount);
autofill_client()->ConfirmSaveAddressProfile(
test::GetFullProfile(), &original_profile_,
AutofillClient::SaveAddressProfilePromptOptions{.show_prompt = true},
base::BindOnce(&UpdateAccountAddressProfileTest::OnUserDecision,
base::Unretained(this)));
}
};
IN_PROC_BROWSER_TEST_F(UpdateAccountAddressProfileTest, UpdateThroughEdit) {
RunTestSequence(
ShowInitBubble(),
SetOnIncompatibleAction(OnIncompatibleAction::kIgnoreAndContinue,
kSuppressedScreenshotError),
Screenshot(UpdateAddressProfileView::kTopViewId,
/*screenshot_name=*/"update_popup",
/*baseline_cl=*/"4535916"),
PressButton(UpdateAddressProfileView::kEditButtonViewId),
WaitForShow(EditAddressProfileView::kTopViewId),
Screenshot(EditAddressProfileView::kTopViewId,
/*screenshot_name=*/"edit_popup",
/*baseline_cl=*/"4535916"),
PressButton(views::DialogClientView::kCancelButtonElementId),
WaitForHide(EditAddressProfileView::kTopViewId), FlushEvents(),
WaitForShow(UpdateAddressProfileView::kTopViewId),
PressButton(views::DialogClientView::kOkButtonElementId),
WaitForHide(UpdateAddressProfileView::kTopViewId),
EnsureClosedWithDecision(
AutofillClient::AddressPromptUserDecision::kAccepted));
}
///////////////////////////////////////////////////////////////////////////////
// SaveAddressProfileTest
class MigrateToProfileAddressProfileTest: public BaseAddressBubblesControllerTest {
void TriggerBubble() override {
autofill_client()->ConfirmSaveAddressProfile(
test::GetFullProfile(), nullptr,
AutofillClient::SaveAddressProfilePromptOptions{
.show_prompt = true, .is_migration_to_account = true},
base::BindOnce(&MigrateToProfileAddressProfileTest::OnUserDecision,
base::Unretained(this)));
}
};
IN_PROC_BROWSER_TEST_F(MigrateToProfileAddressProfileTest, SaveDecline) {
RunTestSequence(ShowInitBubble(),
PressButton(views::DialogClientView::kCancelButtonElementId),
EnsureClosedWithDecision(
AutofillClient::AddressPromptUserDecision::kNever));
}
IN_PROC_BROWSER_TEST_F(MigrateToProfileAddressProfileTest, SaveWithEdit) {
RunTestSequence(
ShowInitBubble(),
SetOnIncompatibleAction(OnIncompatibleAction::kIgnoreAndContinue,
kSuppressedScreenshotError),
Screenshot(SaveAddressProfileView::kTopViewId, "save_popup", "4535916"),
PressButton(SaveAddressProfileView::kEditButtonViewId),
WaitForShow(EditAddressProfileView::kTopViewId),
Screenshot(EditAddressProfileView::kTopViewId,
/*screenshot_name=*/"edit_popup",
/*baseline_cl=*/"4535916"),
PressButton(views::DialogClientView::kCancelButtonElementId),
WaitForHide(EditAddressProfileView::kTopViewId), FlushEvents(),
WaitForShow(SaveAddressProfileView::kTopViewId),
PressButton(views::DialogClientView::kOkButtonElementId),
WaitForHide(SaveAddressProfileView::kTopViewId),
EnsureClosedWithDecision(
AutofillClient::AddressPromptUserDecision::kAccepted));
}
//////////////////////////////////////////////////////////////////////////////
// AddNewAddressProfileTest
class AddNewAddressProfileTest : public BaseAddressBubblesControllerTest {
void TriggerBubble() override {
AddressBubblesController::SetUpAndShowAddNewAddressBubble(
web_contents(),
base::BindOnce(&AddNewAddressProfileTest::OnUserDecision,
base::Unretained(this)));
}
};
IN_PROC_BROWSER_TEST_F(AddNewAddressProfileTest, SaveDecline) {
RunTestSequence(ShowInitBubble(),
PressButton(views::DialogClientView::kCancelButtonElementId),
EnsureClosedWithDecision(
AutofillClient::AddressPromptUserDecision::kDeclined));
}
IN_PROC_BROWSER_TEST_F(AddNewAddressProfileTest, EditorCancel) {
RunTestSequence(ShowInitBubble(),
PressButton(views::DialogClientView::kOkButtonElementId),
WaitForShow(EditAddressProfileView::kTopViewId),
PressButton(views::DialogClientView::kCancelButtonElementId),
WaitForHide(EditAddressProfileView::kTopViewId),
FlushEvents(),
WaitForShow(AddNewAddressBubbleView::kTopViewId));
}
IN_PROC_BROWSER_TEST_F(AddNewAddressProfileTest, AddAddressAccept) {
RunTestSequence(
ShowInitBubble(),
SetOnIncompatibleAction(OnIncompatibleAction::kIgnoreAndContinue,
kSuppressedScreenshotError),
Screenshot(AddNewAddressBubbleView::kTopViewId,
/*screenshot_name=*/"add_new_address_popup",
/*baseline_cl=*/"5358737"),
PressButton(views::DialogClientView::kOkButtonElementId),
WaitForShow(EditAddressProfileView::kTopViewId),
Screenshot(EditAddressProfileView::kTopViewId,
/*screenshot_name=*/"edit_popup",
/*baseline_cl=*/"5358737"),
PressButton(views::DialogClientView::kOkButtonElementId),
WaitForHide(EditAddressProfileView::kTopViewId), FlushEvents(),
EnsureClosedWithDecision(
AutofillClient::AddressPromptUserDecision::kEditAccepted));
}
} // namespace autofill