blob: 9c2a4f4923bba4dc5718e32df75d1788e016c275 [file] [log] [blame]
// Copyright 2019 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.
#include <memory>
#include "base/test/scoped_path_override.h"
#include "base/test/task_environment.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
#include "chrome/browser/chromeos/accessibility/magnification_manager.h"
#include "chrome/browser/chromeos/login/login_wizard.h"
#include "chrome/browser/chromeos/login/screens/welcome_screen.h"
#include "chrome/browser/chromeos/login/test/js_checker.h"
#include "chrome/browser/chromeos/login/test/oobe_base_test.h"
#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
#include "chrome/browser/chromeos/login/test/test_predicate_waiter.h"
#include "chrome/browser/chromeos/login/ui/login_display_host.h"
#include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
#include "chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.h"
#include "chromeos/constants/chromeos_paths.h"
#include "chromeos/dbus/constants/dbus_switches.h"
#include "components/language/core/browser/pref_names.h"
#include "components/prefs/pref_service.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/accessibility/accessibility_switches.h"
#include "ui/base/ime/chromeos/extension_ime_util.h"
namespace chromeos {
namespace {
const char kStartupManifest[] =
R"({
"version": "1.0",
"initial_locale" : "en-US",
"initial_timezone" : "US/Pacific",
"keyboard_layout" : "xkb:us::eng",
})";
chromeos::OobeUI* GetOobeUI() {
auto* host = chromeos::LoginDisplayHost::default_host();
return host ? host->GetOobeUI() : nullptr;
}
void ToggleAccessibilityFeature(const std::string& feature_name,
bool new_value) {
test::JSChecker js = test::OobeJS();
std::string feature_toggle =
test::GetOobeElementPath({"connect", feature_name, "button"}) +
".checked";
js.set_polymer_ui(false);
if (!new_value)
feature_toggle = "!" + feature_toggle;
js.ExpectVisiblePath({"connect", feature_name, "button"});
EXPECT_FALSE(js.GetBool(feature_toggle));
js.TapOnPath({"connect", feature_name, "button"});
js.CreateWaiter(feature_toggle)->Wait();
}
class LanguageReloadObserver : public WelcomeScreen::Observer {
public:
explicit LanguageReloadObserver(WelcomeScreen* welcome_screen)
: welcome_screen_(welcome_screen) {
welcome_screen_->AddObserver(this);
}
// WelcomeScreen::Observer:
void OnLanguageListReloaded() override { run_loop_.Quit(); }
void Wait() { run_loop_.Run(); }
~LanguageReloadObserver() override { welcome_screen_->RemoveObserver(this); }
private:
WelcomeScreen* const welcome_screen_;
base::RunLoop run_loop_;
DISALLOW_COPY_AND_ASSIGN(LanguageReloadObserver);
};
} // namespace
class WelcomeScreenBrowserTest : public InProcessBrowserTest {
public:
WelcomeScreenBrowserTest() = default;
~WelcomeScreenBrowserTest() override = default;
// InProcessBrowserTest:
void SetUpOnMainThread() override {
ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
base::FilePath startup_manifest =
data_dir_.GetPath().AppendASCII("startup_manifest.json");
base::WriteFile(startup_manifest, kStartupManifest,
strlen(kStartupManifest));
path_override_ = std::make_unique<base::ScopedPathOverride>(
chromeos::FILE_STARTUP_CUSTOMIZATION_MANIFEST, startup_manifest);
ShowLoginWizard(OobeScreen::SCREEN_TEST_NO_WINDOW);
test::TestPredicateWaiter(base::BindRepeating([]() {
return WizardController::default_controller() != nullptr;
})).Wait();
WizardController::default_controller()
->screen_manager()
->DeleteScreenForTesting(WelcomeView::kScreenId);
auto welcome_screen = std::make_unique<WelcomeScreen>(
GetOobeUI()->GetView<WelcomeScreenHandler>(),
base::BindRepeating(&WelcomeScreenBrowserTest::OnWelcomeScreenExit,
base::Unretained(this)));
welcome_screen_ = welcome_screen.get();
observer_ = std::make_unique<LanguageReloadObserver>(welcome_screen_);
WizardController::default_controller()
->screen_manager()
->SetScreenForTesting(std::move(welcome_screen));
InProcessBrowserTest::SetUpOnMainThread();
}
void TearDownOnMainThread() override {
observer_.reset();
InProcessBrowserTest::TearDownOnMainThread();
}
void WaitForScreenExit() {
if (screen_exit_)
return;
base::RunLoop run_loop;
screen_exit_callback_ = run_loop.QuitClosure();
run_loop.Run();
}
void OnWelcomeScreenExit() {
screen_exit_ = true;
if (screen_exit_callback_) {
std::move(screen_exit_callback_).Run();
}
}
WelcomeScreen* welcome_screen_ = nullptr;
std::unique_ptr<LanguageReloadObserver> observer_;
private:
std::unique_ptr<base::ScopedPathOverride> path_override_;
base::ScopedTempDir data_dir_;
bool screen_exit_ = false;
base::OnceClosure screen_exit_callback_;
};
class WelcomeScreenSystemDevModeBrowserTest : public WelcomeScreenBrowserTest {
public:
WelcomeScreenSystemDevModeBrowserTest() = default;
~WelcomeScreenSystemDevModeBrowserTest() override = default;
// WelcomeScreenBrowserTest:
void SetUpCommandLine(base::CommandLine* command_line) override {
WelcomeScreenBrowserTest::SetUpCommandLine(command_line);
command_line->AppendSwitch(chromeos::switches::kSystemDevMode);
}
};
class WelcomeScreenWithExperimentalAccessibilityFeaturesTest
: public WelcomeScreenBrowserTest {
public:
WelcomeScreenWithExperimentalAccessibilityFeaturesTest() = default;
~WelcomeScreenWithExperimentalAccessibilityFeaturesTest() override = default;
// WelcomeScreenBrowserTest:
void SetUpCommandLine(base::CommandLine* command_line) override {
command_line->AppendSwitch(
::switches::kEnableExperimentalAccessibilityFeatures);
WelcomeScreenBrowserTest::SetUpCommandLine(command_line);
}
};
IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest, WelcomeScreenElements) {
welcome_screen_->Show();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().ExpectVisiblePath({"connect", "welcomeScreen"});
test::OobeJS().ExpectHiddenPath({"connect", "accessibilityScreen"});
test::OobeJS().ExpectHiddenPath({"connect", "languageScreen"});
test::OobeJS().ExpectHiddenPath({"connect", "timezoneScreen"});
test::OobeJS().ExpectVisiblePath(
{"connect", "welcomeScreen", "welcomeNextButton"});
test::OobeJS().ExpectVisiblePath(
{"connect", "welcomeScreen", "languageSelectionButton"});
test::OobeJS().ExpectVisiblePath(
{"connect", "welcomeScreen", "accessibilitySettingsButton"});
test::OobeJS().ExpectVisiblePath(
{"connect", "welcomeScreen", "enableDebuggingLink"});
}
// Flaky: crbug.com/1014952
IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest, DISABLED_WelcomeScreenNext) {
welcome_screen_->Show();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().TapOnPath({"connect", "welcomeScreen", "welcomeNextButton"});
WaitForScreenExit();
}
// Set of browser tests for Welcome Screen Language options.
IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest, WelcomeScreenLanguageFlow) {
welcome_screen_->Show();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().TapOnPath(
{"connect", "welcomeScreen", "languageSelectionButton"});
test::OobeJS().TapOnPath({"connect", "ok-button-language"});
test::OobeJS().TapOnPath({"connect", "welcomeScreen", "welcomeNextButton"});
WaitForScreenExit();
}
IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
WelcomeScreenLanguageElements) {
welcome_screen_->Show();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().TapOnPath(
{"connect", "welcomeScreen", "languageSelectionButton"});
test::OobeJS().ExpectVisiblePath({"connect", "languageDropdownContainer"});
test::OobeJS().ExpectVisiblePath({"connect", "keyboardDropdownContainer"});
test::OobeJS().ExpectVisiblePath({"connect", "languageSelect"});
test::OobeJS().ExpectVisiblePath({"connect", "keyboardSelect"});
}
IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
WelcomeScreenLanguageSelection) {
welcome_screen_->Show();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().TapOnPath(
{"connect", "welcomeScreen", "languageSelectionButton"});
ASSERT_TRUE(g_browser_process->GetApplicationLocale() == "en-US");
test::OobeJS().GetBool(
"document.getElementById('connect').$.welcomeScreen.currentLanguage == "
"'English (United States)'");
test::OobeJS().SelectElementInPath("fr",
{"connect", "languageSelect", "select"});
test::OobeJS().GetBool(
"document.getElementById('connect').$.welcomeScreen.currentLanguage == "
"'français'");
ASSERT_TRUE(g_browser_process->GetApplicationLocale() == "fr");
test::OobeJS().SelectElementInPath("en-US",
{"connect", "languageSelect", "select"});
test::OobeJS().GetBool(
"document.getElementById('connect').$.welcomeScreen.currentLanguage == "
"'English (United States)'");
ASSERT_TRUE(g_browser_process->GetApplicationLocale() == "en-US");
}
IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
WelcomeScreenKeyboardSelection) {
welcome_screen_->Show();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().TapOnPath(
{"connect", "welcomeScreen", "languageSelectionButton"});
std::string extension_id_prefix =
std::string("_comp_ime_") + extension_ime_util::kXkbExtensionId;
test::OobeJS().SelectElementInPath(extension_id_prefix + "xkb:us:intl:eng",
{"connect", "keyboardSelect", "select"});
test::OobeJS().GetBool(
"document.getElementById('connect').$.welcomeScreen.currentKeyboard=="
"'US'");
ASSERT_TRUE(welcome_screen_->GetInputMethod() ==
extension_id_prefix + "xkb:us:intl:eng");
test::OobeJS().SelectElementInPath(extension_id_prefix + "xkb:us:workman:eng",
{"connect", "keyboardSelect", "select"});
test::OobeJS().GetBool(
std::string(
"document.getElementById('connect').$.welcomeScreen.currentKeyboard=="
"'") +
extension_id_prefix + "xkb:us:workman:eng'");
ASSERT_TRUE(welcome_screen_->GetInputMethod() ==
extension_id_prefix + "xkb:us:workman:eng");
}
// Set of browser tests for Welcome Screen Accessibility options.
IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
WelcomeScreenAccessibilityFlow) {
welcome_screen_->Show();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().TapOnPath(
{"connect", "welcomeScreen", "accessibilitySettingsButton"});
test::OobeJS().TapOnPath({"connect", "ok-button-accessibility"});
test::OobeJS().TapOnPath({"connect", "welcomeScreen", "welcomeNextButton"});
WaitForScreenExit();
}
IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
WelcomeScreenAccessibilitySpokenFeedback) {
welcome_screen_->Show();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().TapOnPath(
{"connect", "welcomeScreen", "accessibilitySettingsButton"});
ASSERT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
ToggleAccessibilityFeature("accessibility-spoken-feedback", true);
ASSERT_TRUE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
ToggleAccessibilityFeature("accessibility-spoken-feedback", false);
ASSERT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
}
IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
WelcomeScreenAccessibilityLargeCursor) {
welcome_screen_->Show();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().TapOnPath(
{"connect", "welcomeScreen", "accessibilitySettingsButton"});
ASSERT_FALSE(AccessibilityManager::Get()->IsLargeCursorEnabled());
ToggleAccessibilityFeature("accessibility-large-cursor", true);
ASSERT_TRUE(AccessibilityManager::Get()->IsLargeCursorEnabled());
ToggleAccessibilityFeature("accessibility-large-cursor", false);
ASSERT_FALSE(AccessibilityManager::Get()->IsLargeCursorEnabled());
}
IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
WelcomeScreenAccessibilityHighContrast) {
welcome_screen_->Show();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().TapOnPath(
{"connect", "welcomeScreen", "accessibilitySettingsButton"});
ASSERT_FALSE(AccessibilityManager::Get()->IsHighContrastEnabled());
ToggleAccessibilityFeature("accessibility-high-contrast", true);
ASSERT_TRUE(AccessibilityManager::Get()->IsHighContrastEnabled());
ToggleAccessibilityFeature("accessibility-high-contrast", false);
ASSERT_FALSE(AccessibilityManager::Get()->IsHighContrastEnabled());
}
IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
WelcomeScreenAccessibilitySelectToSpeak) {
welcome_screen_->Show();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().TapOnPath(
{"connect", "welcomeScreen", "accessibilitySettingsButton"});
ASSERT_FALSE(AccessibilityManager::Get()->IsSelectToSpeakEnabled());
ToggleAccessibilityFeature("accessibility-select-to-speak", true);
ASSERT_TRUE(AccessibilityManager::Get()->IsSelectToSpeakEnabled());
ToggleAccessibilityFeature("accessibility-select-to-speak", false);
ASSERT_FALSE(AccessibilityManager::Get()->IsSelectToSpeakEnabled());
}
IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
WelcomeScreenAccessibilityScreenMagnifier) {
welcome_screen_->Show();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().TapOnPath(
{"connect", "welcomeScreen", "accessibilitySettingsButton"});
ASSERT_FALSE(MagnificationManager::Get()->IsMagnifierEnabled());
ToggleAccessibilityFeature("accessibility-screen-magnifier", true);
ASSERT_TRUE(MagnificationManager::Get()->IsMagnifierEnabled());
ToggleAccessibilityFeature("accessibility-screen-magnifier", false);
ASSERT_FALSE(MagnificationManager::Get()->IsMagnifierEnabled());
}
IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest, A11yDockedMagnifierDisabled) {
welcome_screen_->Show();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().ExpectHiddenPath({"connect", "dockedMagnifierOobeOption"});
}
IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest, PRE_SelectedLanguage) {
EXPECT_EQ(
StartupCustomizationDocument::GetInstance()->initial_locale_default(),
"en-US");
welcome_screen_->Show();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
const std::string locale = "ru";
welcome_screen_->SetApplicationLocale(locale);
test::OobeJS().TapOnPath({"connect", "welcomeScreen", "welcomeNextButton"});
WaitForScreenExit();
EXPECT_EQ(g_browser_process->local_state()->GetString(
language::prefs::kApplicationLocale),
locale);
}
IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest, SelectedLanguage) {
observer_->Wait();
const std::string locale = "ru";
EXPECT_EQ(g_browser_process->local_state()->GetString(
language::prefs::kApplicationLocale),
locale);
}
IN_PROC_BROWSER_TEST_F(WelcomeScreenWithExperimentalAccessibilityFeaturesTest,
A11yDockedMagnifierEnabled) {
welcome_screen_->Show();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().TapOnPath(
{"connect", "welcomeScreen", "accessibilitySettingsButton"});
ASSERT_FALSE(MagnificationManager::Get()->IsDockedMagnifierEnabled());
ToggleAccessibilityFeature("dockedMagnifierOobeOption", true);
ASSERT_TRUE(MagnificationManager::Get()->IsDockedMagnifierEnabled());
ToggleAccessibilityFeature("dockedMagnifierOobeOption", false);
ASSERT_FALSE(MagnificationManager::Get()->IsDockedMagnifierEnabled());
}
IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest, A11yVirtualKeyboard) {
welcome_screen_->Show();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().TapOnPath(
{"connect", "welcomeScreen", "accessibilitySettingsButton"});
ASSERT_FALSE(AccessibilityManager::Get()->IsVirtualKeyboardEnabled());
ToggleAccessibilityFeature("accessibility-virtual-keyboard", true);
ASSERT_TRUE(AccessibilityManager::Get()->IsVirtualKeyboardEnabled());
ToggleAccessibilityFeature("accessibility-virtual-keyboard", false);
ASSERT_FALSE(AccessibilityManager::Get()->IsVirtualKeyboardEnabled());
}
IN_PROC_BROWSER_TEST_F(WelcomeScreenSystemDevModeBrowserTest,
DebuggerModeTest) {
welcome_screen_->Show();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().ClickOnPath(
{"connect", "welcomeScreen", "enableDebuggingLink"});
test::OobeJS().ExpectVisiblePath({"debugging-remove-protection-button"});
test::OobeJS().ExpectVisiblePath({"debugging-cancel-button"});
test::OobeJS().ExpectVisiblePath({"enable-debugging-help-link"});
test::OobeJS().ClickOnPath({"debugging-cancel-button"});
}
} // namespace chromeos