blob: b7e2b426ffb68c5c891967c5f9209ee5cdd9b955 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/functional/callback_helpers.h"
#include "base/strings/strcat.h"
#include "build/build_config.h"
#include "chrome/browser/enterprise/browser_management/management_service_factory.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/test/test_browser_ui.h"
#include "chrome/browser/ui/views/profiles/first_run_flow_controller.h"
#include "chrome/browser/ui/views/profiles/profile_management_step_controller.h"
#include "chrome/browser/ui/views/profiles/profile_picker_view_test_utils.h"
#include "chrome/browser/ui/views/profiles/profiles_pixel_test_utils.h"
#include "components/policy/core/common/management/scoped_management_service_override_for_testing.h"
#include "components/signin/public/base/signin_buildflags.h"
#include "base/test/scoped_feature_list.h"
#include "components/signin/public/base/signin_switches.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/compositor/scoped_animation_duration_scale_mode.h"
// Tests for the chrome://intro WebUI page. They live here and not in the webui
// directory because they manipulate views.
namespace {
struct FirstRunTestParam {
PixelTestParam pixel_test_param;
bool use_fixed_size = false;
bool use_longer_strings = false;
bool decline_signin_cta_experiment_enabled = false;
};
// To be passed as 4th argument to `INSTANTIATE_TEST_SUITE_P()`, allows the test
// to be named like `<TestClassName>.InvokeUi_default/<TestSuffix>` instead
// of using the index of the param in `TestParam` as suffix.
std::string ParamToTestSuffix(
const ::testing::TestParamInfo<FirstRunTestParam>& info) {
return info.param.pixel_test_param.test_suffix;
}
// Permutations of supported parameters.
const FirstRunTestParam kTestParams[] = {
{.pixel_test_param = {.test_suffix = "DarkThemeFixedSize",
.use_dark_theme = true},
.use_fixed_size = true},
{.pixel_test_param = {.test_suffix = "DarkThemeDeclineSigninCTAExperiment",
.use_dark_theme = true},
.decline_signin_cta_experiment_enabled = true},
#if !BUILDFLAG(IS_WIN)
// TODO(https://crbug.com/40261456): The following test has been frequently
// flaking on "Win10 Tests x64" since 2024-05-09:
// FirstRunIntroPixelTest.InvokeUi_default/LightTheme
{.pixel_test_param = {.test_suffix = "LightTheme"}},
#endif
{.pixel_test_param = {.test_suffix = "LongerStringsFixedSize"},
.use_fixed_size = true,
.use_longer_strings = true},
{.pixel_test_param = {.test_suffix = "RightToLeftLanguage",
.use_right_to_left_language = true}},
};
const char kMakeCardDescriptionLongerJsString[] =
"(() => {"
" const introApp = document.querySelector('intro-app');"
" const signInPromo = introApp.shadowRoot.querySelector('sign-in-promo');"
" const cardDescriptions = signInPromo.shadowRoot.querySelectorAll("
" '.benefit-card-description');"
" cardDescriptions[0].textContent = "
" cardDescriptions[0].textContent.repeat(20);"
" return true;"
"})();";
} // namespace
class FirstRunIntroPixelTest
: public ProfilesPixelTestBaseT<UiBrowserTest>,
public testing::WithParamInterface<FirstRunTestParam> {
public:
FirstRunIntroPixelTest()
: ProfilesPixelTestBaseT<UiBrowserTest>(GetParam().pixel_test_param) {
scoped_feature_list_.InitWithFeatureState(
switches::kProfileCreationDeclineSigninCTAExperiment,
GetParam().decline_signin_cta_experiment_enabled);
}
void ShowUi(const std::string& name) override {
ui::ScopedAnimationDurationScaleMode disable_animation(
ui::ScopedAnimationDurationScaleMode::ZERO_DURATION);
policy::ScopedManagementServiceOverrideForTesting browser_management(
policy::ManagementServiceFactory::GetForPlatform(),
policy::EnterpriseManagementAuthority::NONE);
profile_picker_view_ = new ProfileManagementStepTestView(
ProfilePicker::Params::ForFirstRun(browser()->profile()->GetPath(),
base::DoNothing()),
ProfileManagementFlowController::Step::kIntro,
/*step_controller_factory=*/
base::BindRepeating([](ProfilePickerWebContentsHost* host) {
return CreateIntroStep(host, base::DoNothing(),
/*enable_animations=*/false);
}));
profile_picker_view_->ShowAndWait(
GetParam().use_fixed_size
? std::optional<gfx::Size>(gfx::Size(840, 630))
: std::nullopt);
if (GetParam().use_longer_strings) {
EXPECT_EQ(true, content::EvalJs(profile_picker_view_->GetPickerContents(),
kMakeCardDescriptionLongerJsString));
}
}
bool VerifyUi() override {
views::Widget* widget = GetWidgetForScreenshot();
auto* test_info = testing::UnitTest::GetInstance()->current_test_info();
const std::string screenshot_name =
base::StrCat({test_info->test_suite_name(), "_", test_info->name()});
return VerifyPixelUi(widget, "FirstRunIntroPixelTest", screenshot_name) !=
ui::test::ActionResult::kFailed;
}
void WaitForUserDismissal() override {
DCHECK(GetWidgetForScreenshot());
ViewDeletedWaiter(profile_picker_view_).Wait();
}
private:
views::Widget* GetWidgetForScreenshot() {
return profile_picker_view_->GetWidget();
}
raw_ptr<ProfileManagementStepTestView, DanglingUntriaged>
profile_picker_view_;
base::test::ScopedFeatureList scoped_feature_list_;
};
IN_PROC_BROWSER_TEST_P(FirstRunIntroPixelTest, InvokeUi_default) {
ShowAndVerifyUi();
}
INSTANTIATE_TEST_SUITE_P(,
FirstRunIntroPixelTest,
testing::ValuesIn(kTestParams),
&ParamToTestSuffix);