Commit f765e8e3 authored by Renato Silva's avatar Renato Silva Committed by Commit Bot

Reland "OOBE - Improve reset screen confirmation dialog"

This is a reland of 8411cc66

Original change's description:
> OOBE - Improve reset screen confirmation dialog
> 
> - Replace the dialog on the reset screen with the oobe-help-dialog
>   that complies with UX specs and reuses available code.
> 
> - Refactor the confirmation dialog logic so that it lives in the
>   main element 'oobe-reset'.
> 
> - Remove the intermediate oobe_reset_screen by using LoginScreenBehavior
> 
> - Add a waiter to test::OobeJS for waiting upon the presence of an
>   attribute. Such as waiting on the 'open' attribute of dialogs.
> 
> - Add constants and modifications to the browser tests of the reset
>   screen.
> 
> Fixed: 933310
> Change-Id: I54001745326b60ab5a0a19519923c54dffa5baec
> Bug: 933310
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2041474
> Commit-Queue: Renato Silva <rrsilva@google.com>
> Reviewed-by: Denis Kuznetsov [CET] <antrim@chromium.org>
> Auto-Submit: Renato Silva <rrsilva@google.com>
> Cr-Commit-Position: refs/heads/master@{#744288}

Bug: 933310
Change-Id: I12aca96e98373beda746fc92f3d06cb6d1e86c72
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2072383
Commit-Queue: Roman Sorokin [CET] <rsorokin@chromium.org>
Reviewed-by: default avatarRoman Sorokin [CET] <rsorokin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#744604}
parent 41ab5275
...@@ -47,15 +47,28 @@ namespace { ...@@ -47,15 +47,28 @@ namespace {
constexpr char kTestUser1[] = "test-user1@gmail.com"; constexpr char kTestUser1[] = "test-user1@gmail.com";
constexpr char kTestUser1GaiaId[] = "test-user1@gmail.com"; constexpr char kTestUser1GaiaId[] = "test-user1@gmail.com";
// HTML Elements
constexpr char kResetScreen[] = "reset";
constexpr char kConfirmationDialog[] = "confirmationDialog";
constexpr char kHelpDialog[] = "helpDialog";
constexpr char kTpmUpdate[] = "tpmFirmwareUpdate";
constexpr char kTpmUpdateCheckbox[] = "tpmFirmwareUpdateCheckbox";
void InvokeRollbackOption() { void InvokeRollbackOption() {
test::ExecuteOobeJS("cr.ui.Oobe.handleAccelerator('reset');"); test::ExecuteOobeJS("cr.ui.Oobe.handleAccelerator('reset');");
} }
void CloseResetScreen() { void RequestCloseResetScreen() {
test::ExecuteOobeJS( test::ExecuteOobeJS(
"chrome.send('login.ResetScreen.userActed', ['cancel-reset']);"); "chrome.send('login.ResetScreen.userActed', ['cancel-reset']);");
} }
void CloseResetScreen() {
RequestCloseResetScreen();
OobeScreenExitWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
}
void ClickResetButton() { void ClickResetButton() {
test::ExecuteOobeJS( test::ExecuteOobeJS(
"chrome.send('login.ResetScreen.userActed', ['powerwash-pressed']);"); "chrome.send('login.ResetScreen.userActed', ['powerwash-pressed']);");
...@@ -77,6 +90,27 @@ void ClickDismissConfirmationButton() { ...@@ -77,6 +90,27 @@ void ClickDismissConfirmationButton() {
"['reset-confirm-dismissed']);"); "['reset-confirm-dismissed']);");
} }
void WaitForConfirmationDialogToOpen() {
test::OobeJS()
.CreateAttributePresenceWaiter(
"open", true /*present*/,
{kResetScreen, kConfirmationDialog, kHelpDialog})
->Wait();
}
void WaitForConfirmationDialogToClose() {
test::OobeJS()
.CreateAttributePresenceWaiter(
"open", false /*present*/,
{kResetScreen, kConfirmationDialog, kHelpDialog})
->Wait();
}
void ExpectConfirmationDialogClosed() {
test::OobeJS().ExpectHasNoAttribute(
"open", {kResetScreen, kConfirmationDialog, kHelpDialog});
}
// Helper class that tracks whether 'login-prompt-visible' signal was requested // Helper class that tracks whether 'login-prompt-visible' signal was requested
// from the session manager service. // from the session manager service.
class LoginPromptVisibleObserver : public SessionManagerClient::Observer { class LoginPromptVisibleObserver : public SessionManagerClient::Observer {
...@@ -135,7 +169,10 @@ class ResetTest : public MixinBasedInProcessBrowserTest { ...@@ -135,7 +169,10 @@ class ResetTest : public MixinBasedInProcessBrowserTest {
// Simulates reset screen request from views based login. // Simulates reset screen request from views based login.
void InvokeResetScreen() { void InvokeResetScreen() {
chromeos::LoginDisplayHost::default_host()->ShowResetScreen(); chromeos::LoginDisplayHost::default_host()->ShowResetScreen();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
OobeScreenWaiter(ResetView::kScreenId).Wait(); OobeScreenWaiter(ResetView::kScreenId).Wait();
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
ExpectConfirmationDialogClosed();
} }
FakeUpdateEngineClient* update_engine_client_ = nullptr; FakeUpdateEngineClient* update_engine_client_ = nullptr;
...@@ -174,6 +211,8 @@ class ResetOobeTest : public OobeBaseTest { ...@@ -174,6 +211,8 @@ class ResetOobeTest : public OobeBaseTest {
void InvokeResetScreen() { void InvokeResetScreen() {
test::ExecuteOobeJS("cr.ui.Oobe.handleAccelerator('reset');"); test::ExecuteOobeJS("cr.ui.Oobe.handleAccelerator('reset');");
OobeScreenWaiter(ResetView::kScreenId).Wait(); OobeScreenWaiter(ResetView::kScreenId).Wait();
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
ExpectConfirmationDialogClosed();
} }
FakeUpdateEngineClient* update_engine_client_ = nullptr; FakeUpdateEngineClient* update_engine_client_ = nullptr;
...@@ -268,14 +307,7 @@ class ResetTestWithTpmFirmwareUpdate : public ResetTest { ...@@ -268,14 +307,7 @@ class ResetTestWithTpmFirmwareUpdate : public ResetTest {
IN_PROC_BROWSER_TEST_F(ResetTest, ShowAndCancel) { IN_PROC_BROWSER_TEST_F(ResetTest, ShowAndCancel) {
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown()); EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
InvokeResetScreen(); InvokeResetScreen();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
test::OobeJS().ExpectVisible("reset");
CloseResetScreen(); CloseResetScreen();
test::OobeJS().CreateVisibilityWaiter(false, {"reset"})->Wait();
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
} }
IN_PROC_BROWSER_TEST_F(ResetTest, RestartBeforePowerwash) { IN_PROC_BROWSER_TEST_F(ResetTest, RestartBeforePowerwash) {
...@@ -283,8 +315,6 @@ IN_PROC_BROWSER_TEST_F(ResetTest, RestartBeforePowerwash) { ...@@ -283,8 +315,6 @@ IN_PROC_BROWSER_TEST_F(ResetTest, RestartBeforePowerwash) {
PrefService* prefs = g_browser_process->local_state(); PrefService* prefs = g_browser_process->local_state();
InvokeResetScreen(); InvokeResetScreen();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls()); EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
...@@ -301,10 +331,6 @@ IN_PROC_BROWSER_TEST_F(ResetOobeTest, ResetOnWelcomeScreen) { ...@@ -301,10 +331,6 @@ IN_PROC_BROWSER_TEST_F(ResetOobeTest, ResetOnWelcomeScreen) {
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown()); EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
InvokeResetScreen(); InvokeResetScreen();
OobeScreenWaiter(ResetView::kScreenId).Wait();
test::OobeJS().ExpectVisible("reset");
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
ClickResetButton(); ClickResetButton();
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls()); EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(1, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); EXPECT_EQ(1, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
...@@ -316,13 +342,9 @@ IN_PROC_BROWSER_TEST_F(ResetOobeTest, RequestAndCancleResetOnWelcomeScreen) { ...@@ -316,13 +342,9 @@ IN_PROC_BROWSER_TEST_F(ResetOobeTest, RequestAndCancleResetOnWelcomeScreen) {
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown()); EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
InvokeResetScreen(); InvokeResetScreen();
OobeScreenWaiter(ResetView::kScreenId).Wait(); RequestCloseResetScreen();
test::OobeJS().ExpectVisible("reset");
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
CloseResetScreen();
OobeScreenWaiter(WelcomeView::kScreenId).Wait(); OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().ExpectHidden("reset"); test::OobeJS().ExpectHidden(kResetScreen);
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown()); EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls()); EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
...@@ -351,43 +373,36 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, DISABLED_ViewsLogic) { ...@@ -351,43 +373,36 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, DISABLED_ViewsLogic) {
// Rollback unavailable. Show and cancel. // Rollback unavailable. Show and cancel.
update_engine_client_->set_can_rollback_check_result(false); update_engine_client_->set_can_rollback_check_result(false);
InvokeResetScreen(); InvokeResetScreen();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
test::OobeJS().CreateVisibilityWaiter(true, {"reset"})->Wait();
test::OobeJS().ExpectHidden("overlay-reset");
CloseResetScreen(); CloseResetScreen();
test::OobeJS().CreateVisibilityWaiter(false, {"reset"})->Wait();
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
// Go to confirmation phase, cancel from there in 2 steps. // Go to confirmation phase, cancel from there in 2 steps.
prefs->SetBoolean(prefs::kFactoryResetRequested, true); prefs->SetBoolean(prefs::kFactoryResetRequested, true);
InvokeResetScreen(); InvokeResetScreen();
test::OobeJS().CreateVisibilityWaiter(false, {"overlay-reset"})->Wait();
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
ClickToConfirmButton(); ClickToConfirmButton();
test::OobeJS().CreateVisibilityWaiter(true, {"overlay-reset"})->Wait(); WaitForConfirmationDialogToOpen();
ClickDismissConfirmationButton(); ClickDismissConfirmationButton();
test::OobeJS().CreateVisibilityWaiter(false, {"overlay-reset"})->Wait(); WaitForConfirmationDialogToClose();
test::OobeJS().CreateVisibilityWaiter(true, {"reset"})->Wait();
test::OobeJS().ExpectVisible(kResetScreen);
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown()); EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
CloseResetScreen(); CloseResetScreen();
test::OobeJS().CreateVisibilityWaiter(false, {"reset"})->Wait();
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
// Rollback available. Show and cancel from confirmation screen. // Rollback available. Show and cancel from confirmation screen.
update_engine_client_->set_can_rollback_check_result(true); update_engine_client_->set_can_rollback_check_result(true);
prefs->SetBoolean(prefs::kFactoryResetRequested, true); prefs->SetBoolean(prefs::kFactoryResetRequested, true);
InvokeResetScreen(); InvokeResetScreen();
InvokeRollbackOption(); InvokeRollbackOption();
test::OobeJS().ExpectHidden("overlay-reset");
ClickToConfirmButton(); ClickToConfirmButton();
test::OobeJS().CreateVisibilityWaiter(true, {"overlay-reset"})->Wait(); WaitForConfirmationDialogToOpen();
ClickDismissConfirmationButton(); ClickDismissConfirmationButton();
test::OobeJS().CreateVisibilityWaiter(false, {"overlay-reset"})->Wait(); WaitForConfirmationDialogToClose();
test::OobeJS().ExpectVisible("reset");
test::OobeJS().ExpectVisible(kResetScreen);
CloseResetScreen(); CloseResetScreen();
test::OobeJS().CreateVisibilityWaiter(false, {"reset"})->Wait();
} }
IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, PRE_ShowAfterBootIfRequested) { IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, PRE_ShowAfterBootIfRequested) {
...@@ -400,11 +415,9 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, ShowAfterBootIfRequested) { ...@@ -400,11 +415,9 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, ShowAfterBootIfRequested) {
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted()); EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown()); EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
test::OobeJS().CreateVisibilityWaiter(true, {"reset"})->Wait(); test::OobeJS().CreateVisibilityWaiter(true, {kResetScreen})->Wait();
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown()); EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
CloseResetScreen(); CloseResetScreen();
test::OobeJS().CreateVisibilityWaiter(false, {"reset"})->Wait();
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
} }
IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, PRE_RollbackUnavailable) { IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, PRE_RollbackUnavailable) {
...@@ -414,8 +427,6 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, PRE_RollbackUnavailable) { ...@@ -414,8 +427,6 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, PRE_RollbackUnavailable) {
IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, RollbackUnavailable) { IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, RollbackUnavailable) {
InvokeResetScreen(); InvokeResetScreen();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls()); EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
...@@ -427,8 +438,6 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, RollbackUnavailable) { ...@@ -427,8 +438,6 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, RollbackUnavailable) {
EXPECT_EQ(1, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); EXPECT_EQ(1, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(0, update_engine_client_->rollback_call_count()); EXPECT_EQ(0, update_engine_client_->rollback_call_count());
CloseResetScreen(); CloseResetScreen();
OobeScreenExitWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
// Next invocation leads to rollback view. // Next invocation leads to rollback view.
PrefService* prefs = g_browser_process->local_state(); PrefService* prefs = g_browser_process->local_state();
...@@ -470,21 +479,15 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback, ...@@ -470,21 +479,15 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback,
EXPECT_EQ(1, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); EXPECT_EQ(1, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(0, update_engine_client_->rollback_call_count()); EXPECT_EQ(0, update_engine_client_->rollback_call_count());
CloseResetScreen(); CloseResetScreen();
OobeScreenExitWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
// Next invocation leads to simple reset, not rollback view. // Next invocation leads to simple reset, not rollback view.
prefs->SetBoolean(prefs::kFactoryResetRequested, true); prefs->SetBoolean(prefs::kFactoryResetRequested, true);
InvokeResetScreen(); InvokeResetScreen();
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
InvokeRollbackOption(); // Shows rollback. InvokeRollbackOption(); // Shows rollback.
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown()); EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
ClickDismissConfirmationButton(); ClickDismissConfirmationButton();
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown()); EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
CloseResetScreen(); CloseResetScreen();
OobeScreenExitWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
InvokeResetScreen(); InvokeResetScreen();
ClickToConfirmButton(); ClickToConfirmButton();
ClickResetButton(); ClickResetButton();
...@@ -492,8 +495,6 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback, ...@@ -492,8 +495,6 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback,
EXPECT_EQ(2, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); EXPECT_EQ(2, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(0, update_engine_client_->rollback_call_count()); EXPECT_EQ(0, update_engine_client_->rollback_call_count());
CloseResetScreen(); CloseResetScreen();
OobeScreenExitWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
prefs->SetBoolean(prefs::kFactoryResetRequested, true); prefs->SetBoolean(prefs::kFactoryResetRequested, true);
InvokeResetScreen(); InvokeResetScreen();
...@@ -519,7 +520,7 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback, ...@@ -519,7 +520,7 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback,
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls()); EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(0, update_engine_client_->rollback_call_count()); EXPECT_EQ(0, update_engine_client_->rollback_call_count());
test::OobeJS().ExpectHasNoClass("revert-promise-view", {"reset"}); test::OobeJS().ExpectHasNoClass("revert-promise-view", {kResetScreen});
InvokeRollbackOption(); InvokeRollbackOption();
ClickToConfirmButton(); ClickToConfirmButton();
...@@ -528,7 +529,7 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback, ...@@ -528,7 +529,7 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback,
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls()); EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(1, update_engine_client_->rollback_call_count()); EXPECT_EQ(1, update_engine_client_->rollback_call_count());
test::OobeJS().ExpectHasClass("revert-promise-view", {"reset"}); test::OobeJS().ExpectHasClass("revert-promise-view", {kResetScreen});
update_engine::StatusResult error_update_status; update_engine::StatusResult error_update_status;
error_update_status.set_current_operation(update_engine::Operation::ERROR); error_update_status.set_current_operation(update_engine::Operation::ERROR);
...@@ -560,36 +561,32 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback, ...@@ -560,36 +561,32 @@ IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback,
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(0, update_engine_client_->rollback_call_count()); EXPECT_EQ(0, update_engine_client_->rollback_call_count());
test::OobeJS().ExpectVisible("reset"); test::OobeJS().ExpectVisible(kResetScreen);
test::OobeJS().ExpectHasNoClass("rollback-proposal-view", {"reset"}); test::OobeJS().ExpectHasNoClass("rollback-proposal-view", {kResetScreen});
InvokeRollbackOption(); InvokeRollbackOption();
test::OobeJS() test::OobeJS()
.CreateHasClassWaiter(true, "rollback-proposal-view", {"reset"}) .CreateHasClassWaiter(true, "rollback-proposal-view", {kResetScreen})
->Wait(); ->Wait();
CloseResetScreen(); CloseResetScreen();
OobeScreenExitWaiter(ResetView::kScreenId).Wait();
InvokeResetScreen(); InvokeResetScreen();
OobeScreenWaiter(ResetView::kScreenId).Wait();
InvokeRollbackOption(); InvokeRollbackOption();
test::OobeJS() test::OobeJS()
.CreateHasClassWaiter(true, "rollback-proposal-view", {"reset"}) .CreateHasClassWaiter(true, "rollback-proposal-view", {kResetScreen})
->Wait(); ->Wait();
} }
IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate,
PRE_ResetFromSigninWithFirmwareUpdate) { PRE_ResetFromSigninWithFirmwareUpdate) {
InvokeResetScreen(); InvokeResetScreen();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
test::OobeJS().ExpectHiddenPath({"oobe-reset-md", "tpmFirmwareUpdate"}); test::OobeJS().ExpectHiddenPath({kResetScreen, kTpmUpdate});
ASSERT_TRUE(HasPendingTpmFirmwareUpdateCheck()); ASSERT_TRUE(HasPendingTpmFirmwareUpdateCheck());
FinishPendingTpmFirmwareUpdateCheck({tpm_firmware_update::Mode::kPowerwash}); FinishPendingTpmFirmwareUpdateCheck({tpm_firmware_update::Mode::kPowerwash});
test::OobeJS().ExpectHiddenPath({"oobe-reset-md", "tpmFirmwareUpdate"}); test::OobeJS().ExpectHiddenPath({kResetScreen, kTpmUpdate});
ClickRestartButton(); ClickRestartButton();
} }
...@@ -602,11 +599,10 @@ IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, ...@@ -602,11 +599,10 @@ IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate,
FinishPendingTpmFirmwareUpdateCheck({tpm_firmware_update::Mode::kPowerwash}); FinishPendingTpmFirmwareUpdateCheck({tpm_firmware_update::Mode::kPowerwash});
test::OobeJS() test::OobeJS()
.CreateVisibilityWaiter(true, {"oobe-reset-md", "tpmFirmwareUpdate"}) .CreateVisibilityWaiter(true, {kResetScreen, kTpmUpdate})
->Wait(); ->Wait();
test::OobeJS().Evaluate(
test::GetOobeElementPath({"oobe-reset-md", "tpmFirmwareUpdateCheckbox"}) + test::OobeJS().ClickOnPath({kResetScreen, kTpmUpdateCheckbox});
".fire('click')");
ClickResetButton(); ClickResetButton();
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
...@@ -640,7 +636,7 @@ IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, ...@@ -640,7 +636,7 @@ IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate,
FinishPendingTpmFirmwareUpdateCheck({tpm_firmware_update::Mode::kPowerwash}); FinishPendingTpmFirmwareUpdateCheck({tpm_firmware_update::Mode::kPowerwash});
test::OobeJS() test::OobeJS()
.CreateVisibilityWaiter(true, {"oobe-reset-md", "tpmFirmwareUpdate"}) .CreateVisibilityWaiter(true, {kResetScreen, kTpmUpdate})
->Wait(); ->Wait();
ClickResetButton(); ClickResetButton();
...@@ -666,7 +662,7 @@ IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, ResetWithTpmCleanUp) { ...@@ -666,7 +662,7 @@ IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, ResetWithTpmCleanUp) {
EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck()); EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck());
test::OobeJS() test::OobeJS()
.CreateVisibilityWaiter(true, {"oobe-reset-md", "tpmFirmwareUpdate"}) .CreateVisibilityWaiter(true, {kResetScreen, kTpmUpdate})
->Wait(); ->Wait();
ClickResetButton(); ClickResetButton();
...@@ -702,7 +698,7 @@ IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, ...@@ -702,7 +698,7 @@ IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate,
EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck()); EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck());
test::OobeJS() test::OobeJS()
.CreateVisibilityWaiter(true, {"oobe-reset-md", "tpmFirmwareUpdate"}) .CreateVisibilityWaiter(true, {kResetScreen, kTpmUpdate})
->Wait(); ->Wait();
ClickResetButton(); ClickResetButton();
...@@ -742,12 +738,10 @@ IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, ...@@ -742,12 +738,10 @@ IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate,
EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck()); EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck());
test::OobeJS() test::OobeJS()
.CreateVisibilityWaiter(true, {"oobe-reset-md", "tpmFirmwareUpdate"}) .CreateVisibilityWaiter(true, {kResetScreen, kTpmUpdate})
->Wait(); ->Wait();
test::OobeJS().Evaluate( test::OobeJS().ClickOnPath({kResetScreen, kTpmUpdateCheckbox});
test::GetOobeElementPath({"oobe-reset-md", "tpmFirmwareUpdateCheckbox"}) +
".fire('click')");
ClickResetButton(); ClickResetButton();
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
...@@ -783,7 +777,7 @@ IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, ...@@ -783,7 +777,7 @@ IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate,
EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck()); EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck());
test::OobeJS() test::OobeJS()
.CreateVisibilityWaiter(true, {"oobe-reset-md", "tpmFirmwareUpdate"}) .CreateVisibilityWaiter(true, {kResetScreen, kTpmUpdate})
->Wait(); ->Wait();
ClickResetButton(); ClickResetButton();
......
...@@ -165,17 +165,12 @@ ResetScreen::ResetScreen(ResetView* view, ...@@ -165,17 +165,12 @@ ResetScreen::ResetScreen(ResetView* view,
view_->Bind(this); view_->Bind(this);
view_->SetScreenState(ResetView::State::kRestartRequired); view_->SetScreenState(ResetView::State::kRestartRequired);
view_->SetIsRollbackAvailable(false); view_->SetIsRollbackAvailable(false);
view_->SetIsRollbackChecked(false); view_->SetIsRollbackRequested(false);
view_->SetIsTpmFirmwareUpdateAvailable(false); view_->SetIsTpmFirmwareUpdateAvailable(false);
view_->SetIsTpmFirmwareUpdateChecked(false); view_->SetIsTpmFirmwareUpdateChecked(false);
view_->SetIsTpmFirmwareUpdateEditable(true); view_->SetIsTpmFirmwareUpdateEditable(true);
view_->SetTpmFirmwareUpdateMode(tpm_firmware_update::Mode::kPowerwash); view_->SetTpmFirmwareUpdateMode(tpm_firmware_update::Mode::kPowerwash);
view_->SetIsConfirmational(false); view_->SetShouldShowConfirmationDialog(false);
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
view_->SetIsGoogleBrandedBuild(true);
#else
view_->SetIsGoogleBrandedBuild(false);
#endif
} }
} }
...@@ -312,8 +307,10 @@ void ResetScreen::OnCancel() { ...@@ -312,8 +307,10 @@ void ResetScreen::OnCancel() {
return; return;
} }
// Hide Rollback view for the next show. // Hide Rollback view for the next show.
if (view_ && view_->GetIsRollbackAvailable() && view_->GetIsRollbackChecked()) if (view_ && view_->GetIsRollbackAvailable() &&
view_->GetIsRollbackRequested()) {
OnToggleRollback(); OnToggleRollback();
}
DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this); DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this);
exit_callback_.Run(); exit_callback_.Run();
} }
...@@ -325,16 +322,16 @@ void ResetScreen::OnPowerwash() { ...@@ -325,16 +322,16 @@ void ResetScreen::OnPowerwash() {
} }
if (view_) if (view_)
view_->SetIsConfirmational(false); view_->SetShouldShowConfirmationDialog(false);
if (view_ && view_->GetIsRollbackChecked() && if (view_ && view_->GetIsRollbackRequested() &&
!view_->GetIsRollbackAvailable()) { !view_->GetIsRollbackAvailable()) {
NOTREACHED() NOTREACHED()
<< "Rollback was checked but not available. Starting powerwash."; << "Rollback was checked but not available. Starting powerwash.";
} }
if (view_ && view_->GetIsRollbackAvailable() && if (view_ && view_->GetIsRollbackAvailable() &&
view_->GetIsRollbackChecked()) { view_->GetIsRollbackRequested()) {
view_->SetScreenState(ResetView::State::kRevertPromise); view_->SetScreenState(ResetView::State::kRevertPromise);
DBusThreadManager::Get()->GetUpdateEngineClient()->AddObserver(this); DBusThreadManager::Get()->GetUpdateEngineClient()->AddObserver(this);
VLOG(1) << "Starting Rollback"; VLOG(1) << "Starting Rollback";
...@@ -372,37 +369,37 @@ void ResetScreen::OnRestart() { ...@@ -372,37 +369,37 @@ void ResetScreen::OnRestart() {
void ResetScreen::OnToggleRollback() { void ResetScreen::OnToggleRollback() {
// Hide Rollback if visible. // Hide Rollback if visible.
if (view_ && view_->GetIsRollbackAvailable() && if (view_ && view_->GetIsRollbackAvailable() &&
view_->GetIsRollbackChecked()) { view_->GetIsRollbackRequested()) {
VLOG(1) << "Hiding rollback view on reset screen"; VLOG(1) << "Hiding rollback view on reset screen";
view_->SetIsRollbackChecked(false); view_->SetIsRollbackRequested(false);
return; return;
} }
// Show Rollback if available. // Show Rollback if available.
VLOG(1) << "Requested rollback availability" VLOG(1) << "Requested rollback availability"
<< view_->GetIsRollbackAvailable(); << view_->GetIsRollbackAvailable();
if (view_->GetIsRollbackAvailable() && !view_->GetIsRollbackChecked()) { if (view_->GetIsRollbackAvailable() && !view_->GetIsRollbackRequested()) {
UMA_HISTOGRAM_ENUMERATION( UMA_HISTOGRAM_ENUMERATION(
"Reset.ChromeOS.PowerwashDialogShown", "Reset.ChromeOS.PowerwashDialogShown",
reset::DIALOG_SHORTCUT_OFFERING_ROLLBACK_AVAILABLE, reset::DIALOG_SHORTCUT_OFFERING_ROLLBACK_AVAILABLE,
reset::DIALOG_VIEW_TYPE_SIZE); reset::DIALOG_VIEW_TYPE_SIZE);
view_->SetIsRollbackChecked(true); view_->SetIsRollbackRequested(true);
} }
} }
void ResetScreen::OnShowConfirm() { void ResetScreen::OnShowConfirm() {
reset::DialogViewType dialog_type = reset::DialogViewType dialog_type =
view_->GetIsRollbackChecked() view_->GetIsRollbackRequested()
? reset::DIALOG_SHORTCUT_CONFIRMING_POWERWASH_AND_ROLLBACK ? reset::DIALOG_SHORTCUT_CONFIRMING_POWERWASH_AND_ROLLBACK
: reset::DIALOG_SHORTCUT_CONFIRMING_POWERWASH_ONLY; : reset::DIALOG_SHORTCUT_CONFIRMING_POWERWASH_ONLY;
UMA_HISTOGRAM_ENUMERATION("Reset.ChromeOS.PowerwashDialogShown", dialog_type, UMA_HISTOGRAM_ENUMERATION("Reset.ChromeOS.PowerwashDialogShown", dialog_type,
reset::DIALOG_VIEW_TYPE_SIZE); reset::DIALOG_VIEW_TYPE_SIZE);
view_->SetIsConfirmational(true); view_->SetShouldShowConfirmationDialog(true);
} }
void ResetScreen::OnConfirmationDismissed() { void ResetScreen::OnConfirmationDismissed() {
view_->SetIsConfirmational(false); view_->SetConfirmationDialogClosed();
} }
void ResetScreen::ShowHelpArticle(HelpAppLauncher::HelpTopic topic) { void ResetScreen::ShowHelpArticle(HelpAppLauncher::HelpTopic topic) {
......
...@@ -131,6 +131,17 @@ std::unique_ptr<TestConditionWaiter> JSChecker::CreateWaiter( ...@@ -131,6 +131,17 @@ std::unique_ptr<TestConditionWaiter> JSChecker::CreateWaiter(
return std::make_unique<TestPredicateWaiter>(predicate); return std::make_unique<TestPredicateWaiter>(predicate);
} }
std::unique_ptr<TestConditionWaiter> JSChecker::CreateAttributePresenceWaiter(
const std::string& attribute,
bool presence,
std::initializer_list<base::StringPiece> element_ids) {
std::string condition = ElementHasAttributeCondition(attribute, element_ids);
if (!presence) {
condition = "!(" + condition + ")";
}
return CreateWaiter(condition);
}
std::unique_ptr<TestConditionWaiter> JSChecker::CreateVisibilityWaiter( std::unique_ptr<TestConditionWaiter> JSChecker::CreateVisibilityWaiter(
bool visibility, bool visibility,
std::initializer_list<base::StringPiece> element_ids) { std::initializer_list<base::StringPiece> element_ids) {
......
...@@ -61,6 +61,15 @@ class JSChecker { ...@@ -61,6 +61,15 @@ class JSChecker {
WARN_UNUSED_RESULT std::unique_ptr<TestConditionWaiter> CreateWaiter( WARN_UNUSED_RESULT std::unique_ptr<TestConditionWaiter> CreateWaiter(
const std::string& js_condition); const std::string& js_condition);
// Waiter that waits until the given attribute is (not) present.
// WARNING! This does not cover the case where ATTRIBUTE=false.
// Should only be used for boolean attributes.
WARN_UNUSED_RESULT std::unique_ptr<TestConditionWaiter>
CreateAttributePresenceWaiter(
const std::string& attribute,
bool presence,
std::initializer_list<base::StringPiece> element_ids);
// Waiter that waits until specified element is (not) hidden. // Waiter that waits until specified element is (not) hidden.
WARN_UNUSED_RESULT std::unique_ptr<TestConditionWaiter> WARN_UNUSED_RESULT std::unique_ptr<TestConditionWaiter>
CreateVisibilityWaiter(bool visibility, CreateVisibilityWaiter(bool visibility,
......
...@@ -35,11 +35,11 @@ js_type_check("closure_compile") { ...@@ -35,11 +35,11 @@ js_type_check("closure_compile") {
":oobe_dialog", ":oobe_dialog",
":oobe_enable_kiosk", ":oobe_enable_kiosk",
":oobe_eula", ":oobe_eula",
":oobe_help_dialog",
":oobe_i18n_behavior", ":oobe_i18n_behavior",
":oobe_i18n_dropdown", ":oobe_i18n_dropdown",
":oobe_network", ":oobe_network",
":oobe_reset", ":oobe_reset",
":oobe_reset_confirmation_overlay",
":oobe_select", ":oobe_select",
":oobe_supervision_transition", ":oobe_supervision_transition",
":oobe_update", ":oobe_update",
...@@ -252,6 +252,10 @@ js_library("oobe_eula") { ...@@ -252,6 +252,10 @@ js_library("oobe_eula") {
] ]
} }
js_library("oobe_help_dialog") {
deps = [ ":oobe_i18n_behavior" ]
}
js_library("oobe_i18n_dropdown") { js_library("oobe_i18n_dropdown") {
deps = [ ":oobe_types" ] deps = [ ":oobe_types" ]
} }
...@@ -263,10 +267,6 @@ js_library("oobe_network") { ...@@ -263,10 +267,6 @@ js_library("oobe_network") {
] ]
} }
js_library("oobe_reset_confirmation_overlay") {
deps = [ ":oobe_i18n_behavior" ]
}
js_library("oobe_reset") { js_library("oobe_reset") {
deps = [ deps = [
":oobe_dialog_host_behavior", ":oobe_dialog_host_behavior",
......
...@@ -25,7 +25,6 @@ ...@@ -25,7 +25,6 @@
<include src="oobe_network_icons.html"> <include src="oobe_network_icons.html">
<include src="oobe_enable_kiosk.html"> <include src="oobe_enable_kiosk.html">
<include src="oobe_reset.html"> <include src="oobe_reset.html">
<include src="oobe_reset_confirmation_overlay.html">
<include src="oobe_supervision_transition.html"> <include src="oobe_supervision_transition.html">
<include src="oobe_terms_of_service.html"> <include src="oobe_terms_of_service.html">
<include src="encryption_migration.html"> <include src="encryption_migration.html">
......
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
// <include src="arc_terms_of_service.js"> // <include src="arc_terms_of_service.js">
// <include src="oobe_enable_kiosk.js"> // <include src="oobe_enable_kiosk.js">
// <include src="oobe_reset.js"> // <include src="oobe_reset.js">
// <include src="oobe_reset_confirmation_overlay.js">
// <include src="encryption_migration.js"> // <include src="encryption_migration.js">
// <include src="oobe_supervision_transition.js"> // <include src="oobe_supervision_transition.js">
// <include src="sync_consent.js"> // <include src="sync_consent.js">
......
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
<include src="oobe_enable_kiosk.html"> <include src="oobe_enable_kiosk.html">
<include src="oobe_hid_detection.html"> <include src="oobe_hid_detection.html">
<include src="oobe_reset.html"> <include src="oobe_reset.html">
<include src="oobe_reset_confirmation_overlay.html">
<include src="oobe_terms_of_service.html"> <include src="oobe_terms_of_service.html">
<include src="oobe_update.html"> <include src="oobe_update.html">
<include src="oobe_i18n_dropdown.html"> <include src="oobe_i18n_dropdown.html">
......
...@@ -37,7 +37,6 @@ ...@@ -37,7 +37,6 @@
// <include src="oobe_terms_of_service.js"> // <include src="oobe_terms_of_service.js">
// <include src="oobe_hid_detection.js"> // <include src="oobe_hid_detection.js">
// <include src="oobe_reset.js"> // <include src="oobe_reset.js">
// <include src="oobe_reset_confirmation_overlay.js">
// <include src="oobe_update.js"> // <include src="oobe_update.js">
// <include src="oobe_i18n_dropdown.js"> // <include src="oobe_i18n_dropdown.js">
// <include src="oobe_welcome_dialog.js"> // <include src="oobe_welcome_dialog.js">
......
...@@ -49,7 +49,6 @@ ...@@ -49,7 +49,6 @@
<script src="chrome://oobe/strings.js"></script> <script src="chrome://oobe/strings.js"></script>
<link rel="stylesheet" href="api_keys_notice.css"> <link rel="stylesheet" href="api_keys_notice.css">
<link rel="stylesheet" href="oobe_screen_enable_debugging.css"> <link rel="stylesheet" href="oobe_screen_enable_debugging.css">
<link rel="stylesheet" href="oobe_screen_reset.css">
<link rel="stylesheet" href="oobe_screen_autolaunch.css"> <link rel="stylesheet" href="oobe_screen_autolaunch.css">
<link rel="stylesheet" href="oobe_screen_auto_enrollment_check.css"> <link rel="stylesheet" href="oobe_screen_auto_enrollment_check.css">
<link rel="stylesheet" href="oobe_screen_supervision_transition.css"> <link rel="stylesheet" href="oobe_screen_supervision_transition.css">
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
// <include // <include
// src="../../../../../ui/login/account_picker/chromeos_user_pod_row.js"> // src="../../../../../ui/login/account_picker/chromeos_user_pod_row.js">
// <include src="cr_ui.js"> // <include src="cr_ui.js">
// <include src="oobe_screen_reset.js">
// <include src="oobe_screen_autolaunch.js"> // <include src="oobe_screen_autolaunch.js">
// <include src="oobe_screen_supervision_transition.js"> // <include src="oobe_screen_supervision_transition.js">
// <include src="oobe_screen_assistant_optin_flow.js"> // <include src="oobe_screen_assistant_optin_flow.js">
...@@ -69,7 +68,6 @@ cr.define('cr.ui.Oobe', function() { ...@@ -69,7 +68,6 @@ cr.define('cr.ui.Oobe', function() {
cr.ui.login.DisplayManager.initialize(); cr.ui.login.DisplayManager.initialize();
login.WrongHWIDScreen.register(); login.WrongHWIDScreen.register();
login.AccountPickerScreen.register(); login.AccountPickerScreen.register();
login.ResetScreen.register();
login.AutolaunchScreen.register(); login.AutolaunchScreen.register();
login.ErrorMessageScreen.register(); login.ErrorMessageScreen.register();
login.TPMErrorMessageScreen.register(); login.TPMErrorMessageScreen.register();
......
<include src="oobe_screen_reset.html"> <oobe-reset id="reset" class="step" hidden></oobe-reset>
<include src="oobe_screen_autolaunch.html"> <include src="oobe_screen_autolaunch.html">
<oobe-adb-sideloading-screen id="adb-sideloading" class="step hidden"> <oobe-adb-sideloading-screen id="adb-sideloading" class="step hidden">
</oobe-adb-sideloading-screen> </oobe-adb-sideloading-screen>
......
...@@ -15,4 +15,3 @@ ...@@ -15,4 +15,3 @@
<div id="bubble" class="bubble faded" hidden></div> <div id="bubble" class="bubble faded" hidden></div>
<include src="md_top_header_bar.html"> <include src="md_top_header_bar.html">
<include src="../../../../../ui/login/account_picker/chromeos_user_pod_template.html"> <include src="../../../../../ui/login/account_picker/chromeos_user_pod_template.html">
<include src="oobe_screen_reset_confirmation_overlay.html">
...@@ -54,7 +54,6 @@ ...@@ -54,7 +54,6 @@
<link rel="stylesheet" href="api_keys_notice.css"> <link rel="stylesheet" href="api_keys_notice.css">
<link rel="stylesheet" href="oobe_screen_enable_debugging.css"> <link rel="stylesheet" href="oobe_screen_enable_debugging.css">
<link rel="stylesheet" href="oobe_screen_reset.css">
<link rel="stylesheet" href="oobe_screen_autolaunch.css"> <link rel="stylesheet" href="oobe_screen_autolaunch.css">
<link rel="stylesheet" href="oobe_screen_auto_enrollment_check.css"> <link rel="stylesheet" href="oobe_screen_auto_enrollment_check.css">
<link rel="stylesheet" href="oobe_screen_supervision_transition.css"> <link rel="stylesheet" href="oobe_screen_supervision_transition.css">
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
// <include // <include
// src="../../../../../ui/login/account_picker/chromeos_user_pod_row.js"> // src="../../../../../ui/login/account_picker/chromeos_user_pod_row.js">
// <include src="cr_ui.js"> // <include src="cr_ui.js">
// <include src="oobe_screen_reset.js">
// <include src="oobe_screen_autolaunch.js"> // <include src="oobe_screen_autolaunch.js">
// <include src="oobe_screen_supervision_transition.js"> // <include src="oobe_screen_supervision_transition.js">
// <include src="oobe_screen_assistant_optin_flow.js"> // <include src="oobe_screen_assistant_optin_flow.js">
...@@ -74,7 +73,6 @@ cr.define('cr.ui.Oobe', function() { ...@@ -74,7 +73,6 @@ cr.define('cr.ui.Oobe', function() {
login.UpdateScreen.register(); login.UpdateScreen.register();
login.AutoEnrollmentCheckScreen.register(); login.AutoEnrollmentCheckScreen.register();
login.EnableDebuggingScreen.register(); login.EnableDebuggingScreen.register();
login.ResetScreen.register();
login.AutolaunchScreen.register(); login.AutolaunchScreen.register();
login.AccountPickerScreen.register(); login.AccountPickerScreen.register();
login.OAuthEnrollmentScreen.register(); login.OAuthEnrollmentScreen.register();
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* found in the LICENSE file. */ * found in the LICENSE file. */
#help-dialog { #helpDialog {
border: 0; border: 0;
border-radius: 8px; border-radius: 8px;
box-shadow: 0 1px 3px 0 rgba(var(--google-grey-800-rgb), 0.3), box-shadow: 0 1px 3px 0 rgba(var(--google-grey-800-rgb), 0.3),
...@@ -14,8 +14,7 @@ ...@@ -14,8 +14,7 @@
width: 512px; width: 512px;
} }
#help-dialog-title ::slotted(h1), #helpDialogTitle {
#help-dialog-title .fallback {
color: var(--oobe-header-text-color); color: var(--oobe-header-text-color);
@apply --oobe-help-dialog-header-font; @apply --oobe-help-dialog-header-font;
margin: 0; margin: 0;
...@@ -23,13 +22,13 @@ ...@@ -23,13 +22,13 @@
user-select: none; user-select: none;
} }
#content-container { #contentContainer {
color: var(--oobe-text-color); color: var(--oobe-text-color);
@apply --oobe-default-font; @apply --oobe-default-font;
padding-bottom: 20px; padding-bottom: 20px;
} }
#button-container { #buttonContainer {
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
min-height: 0; min-height: 0;
......
...@@ -18,30 +18,34 @@ The dialog provides two properties that can be set directly from HTML. ...@@ -18,30 +18,34 @@ The dialog provides two properties that can be set directly from HTML.
Alternatively, one can set their own title and content into the 'title' Alternatively, one can set their own title and content into the 'title'
and 'content' slots. and 'content' slots.
Buttons are optional and go into the 'buttons' slot. If none are specified,
a default button with the text 'Close' will be shown. Users might want to
trigger some action on their side by using 'on-close=myMethod'.
--> -->
<dom-module id="oobe-help-dialog"> <dom-module id="oobe-help-dialog">
<template> <template>
<link rel="stylesheet" href="oobe_fonts.css"> <link rel="stylesheet" href="oobe_fonts.css">
<link rel="stylesheet" href="oobe_help_dialog.css"> <link rel="stylesheet" href="oobe_help_dialog.css">
<dialog id="help-dialog" part="dialog" aria-labelledby="help-dialog-title"> <dialog id="helpDialog" part="dialog" aria-labelledby="helpDialogTitle">
<!-- Title --> <!-- Title -->
<div id="help-dialog-title"> <div id="helpDialogTitle">
<slot name="title"> <slot name="title">[[i18nDynamic(locale, titleKey)]]</slot>
<h1 class="fallback">[[i18nDynamic(locale, titleKey)]]</h1>
</slot>
</div> </div>
<!-- Content to be shown --> <!-- Content to be shown -->
<div id="content-container" <div id="contentContainer"
class="flex-grow layout vertical not-resizable"> class="flex-grow layout vertical not-resizable">
<slot name="content"> <slot name="content">
<h1>[[i18nDynamic(locale, contentKey)]]</h1> [[i18nDynamic(locale, contentKey)]]
</slot> </slot>
</div> </div>
<!-- Close Button --> <!-- Close Button -->
<div id="button-container" class="layout horizontal"> <div id="buttonContainer" class="layout horizontal">
<oobe-text-button inverse id="closeButton" on-click="hideDialog" <slot name="buttons">
<oobe-text-button inverse id="closeButton" on-click="hideDialog"
text-key="oobeModalDialogClose"> text-key="oobeModalDialogClose">
</oobe-text-button> </oobe-text-button>
</slot>
</div> </div>
</dialog> </dialog>
</template> </template>
......
...@@ -26,12 +26,12 @@ Polymer({ ...@@ -26,12 +26,12 @@ Polymer({
/* Shows the help dialog and changes the focus to the close button. */ /* Shows the help dialog and changes the focus to the close button. */
showDialog: function() { showDialog: function() {
this.$['help-dialog'].showModal(); this.$.helpDialog.showModal();
this.$.closeButton.focus(); this.$.closeButton.focus();
}, },
hideDialog: function() { hideDialog: function() {
this.$['help-dialog'].close(); this.$.helpDialog.close();
}, },
}); });
...@@ -19,15 +19,13 @@ a { ...@@ -19,15 +19,13 @@ a {
} }
#tpmFirmwareUpdate { #tpmFirmwareUpdate {
margin-bottom: 20px; margin-top: 20px;
margin-inline-start: 20px;
margin-top: 23px; /* = 36 - font size */
width: 100%;
} }
#tpmFirmwareUpdateCheckbox { #illustration {
margin-top: 2px; max-height: 80%;
size: 16px; max-width: 100%;
object-fit: contain;
} }
#tpmFirmwareUpdateContainer { #tpmFirmwareUpdateContainer {
...@@ -35,8 +33,3 @@ a { ...@@ -35,8 +33,3 @@ a {
line-height: 20px; line-height: 20px;
pointer-events: auto; pointer-events: auto;
} }
#illustration {
height: 264px;
width: 264px;
}
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<link rel="import" href="chrome://resources/html/i18n_behavior.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
<dom-module id="oobe-reset-md"> <dom-module id="oobe-reset">
<template> <template>
<link rel="stylesheet" href="oobe_dialog_host.css"> <link rel="stylesheet" href="oobe_dialog_host.css">
<link rel="stylesheet" href="chrome://resources/css/throbber.css"> <link rel="stylesheet" href="chrome://resources/css/throbber.css">
...@@ -20,28 +20,25 @@ ...@@ -20,28 +20,25 @@
icon1x="oobe-32:alert" icon2x="oobe-64:alert"> icon1x="oobe-32:alert" icon2x="oobe-64:alert">
</hd-iron-icon> </hd-iron-icon>
<div slot="subtitle" class="powerwash-warning"> <div slot="subtitle" class="powerwash-warning">
<div hidden="[[!isState_(uiState_, 'powerwash-proposal-view')]]"> <!-- Subtitle: Restart required -->
[[i18nDynamic(locale, 'resetPowerwashWarningDetails')]] <div hidden="[[!inRestartRequiredState_]]">
</div>
<div hidden="[[!isState_(uiState_, 'powerwash-proposal-view')]]">
[[i18nDynamic(locale, 'resetWarningDataDetails')]]
</div>
<div hidden="[[!isState_(uiState_, 'rollback-proposal-view')]]">
[[i18nDynamic(locale, 'resetPowerwashRollbackWarningDetails')]]
</div>
<div hidden="[[!isState_(uiState_, 'rollback-proposal-view')]]">
[[i18nDynamic(locale, 'resetWarningDataDetails')]]
</div>
<div hidden="[[!isState_(uiState_, 'restart-required-view')]]">
[[i18nDynamic(locale, 'resetRestartMessage')]] [[i18nDynamic(locale, 'resetRestartMessage')]]
</div> </div>
<a id="powerwash-help-link-md" href="#" <!-- Subtitle: Powerwash state (depends on powerwash mode) -->
class="oobe-local-link" <div hidden="[[!inPowerwashState_]]">
hidden="[[isHelpLinkHidden_(uiState_, isGoogleBranded_)]]" <div>[[powerwashStateSubtitle_]]</div>
on-tap="onLearnMoreTap_"> <div>[[i18nDynamic(locale, 'resetWarningDataDetails')]]</div>
[[i18nDynamic(locale, 'learnMore')]] </div>
</a> <!-- Help Link - Hidden when reverting/rolling back. -->
<div hidden="[[!isState_(uiState_, 'revert-promise-view')]]"> <if expr="_google_chrome">
<a id="powerwash-help-link-md" href="#"
class="oobe-local-link"
hidden="[[inRevertState_]]"
on-tap="onLearnMoreTap_">[[i18nDynamic(locale, 'learnMore')]]
</a>
</if>
<!-- Spinner - Shown when the revert process is ongoing -->
<div hidden="[[!inRevertState_]]">
<div> <div>
[[i18nDynamic(locale, 'resetRevertPromise')]] [[i18nDynamic(locale, 'resetRevertPromise')]]
</div> </div>
...@@ -53,49 +50,62 @@ ...@@ -53,49 +50,62 @@
</div> </div>
</div> </div>
</div> </div>
<div slot="footer" class="flex layout vertical center center-justified"> <div slot="footer" class="flex layout vertical">
<!-- Reset screen illustration -->
<img id="illustration" srcset="images/1x/reset_illustration_1x.svg 1x, <img id="illustration" srcset="images/1x/reset_illustration_1x.svg 1x,
images/2x/reset_illustration_2x.svg 2x" images/2x/reset_illustration_2x.svg 2x"
i18n-values="alt:resetScreenIllustrationTitle" i18n-values="alt:resetScreenIllustrationTitle">
class="oobe-illustration"> <!-- TPM Update - Only shown during powerwash state -->
<div id="tpmFirmwareUpdate" class="layout horizontal" <div id="tpmFirmwareUpdate" class="layout horizontal"
hidden="[[!tpmFirmwareUpdateAvailable_]]"> hidden="[[!inPowerwashState_]]">
<cr-checkbox id="tpmFirmwareUpdateCheckbox" <cr-checkbox id="tpmFirmwareUpdateCheckbox"
checked="{{tpmFirmwareUpdateChecked_}}" checked="{{tpmUpdateChecked_}}"
disabled="[[!tpmFirmwareUpdateEditable_]]" disabled="[[!tpmUpdateEditable_]]"
hidden="[[!tpmUpdateAvailable_]]"
on-change="onTPMFirmwareUpdateChanged_"> on-change="onTPMFirmwareUpdateChanged_">
<div id="tpmFirmwareUpdateContainer"> <div id="tpmFirmwareUpdateContainer">
<span> <span>
[[i18nDynamic(locale, 'resetTPMFirmwareUpdate')]] [[i18nDynamic(locale, 'resetTPMFirmwareUpdate')]]
</span> </span>
<if expr="_google_chrome">
<a href="#" <a href="#"
hidden="[[isHelpLinkHidden_(uiState_, isGoogleBranded_)]]" class="oobe-local-link"
class="oobe-local-link" on-tap="onTPMFirmwareUpdateLearnMore_"
on-tap="onTPMFirmwareUpdateLearnMore_"> >[[i18nDynamic(locale, 'learnMore')]]</a>
[[i18nDynamic(locale, 'learnMore')]] </if>
</a> </div>
</div>
</cr-checkbox> </cr-checkbox>
</div> </div>
</div> </div>
<div slot="bottom-buttons" class="flex layout horizontal"> <div slot="bottom-buttons" class="flex layout horizontal">
<div class="flex"></div> <div class="flex"></div>
<!-- Cancel button, only disabled when reverting -->
<oobe-text-button border on-tap="onCancelTap_" text-key="cancelButton" <oobe-text-button border on-tap="onCancelTap_" text-key="cancelButton"
hidden="[[isCancelHidden_(uiState_)]]"></oobe-text-button> disabled="[[inRevertState_]]"></oobe-text-button>
<!-- Restart button -->
<oobe-text-button inverse on-tap="onRestartTap_" class="focus-on-show" <oobe-text-button inverse on-tap="onRestartTap_" class="focus-on-show"
text-key="resetButtonRestart" text-key="resetButtonRestart"
hidden="[[!isState_(uiState_, 'restart-required-view')]]"> hidden="[[!inRestartRequiredState_]]">
</oobe-text-button>
<oobe-text-button inverse on-tap="onPowerwashTap_" class="focus-on-show"
text-key="resetButtonPowerwashAndRollback"
hidden="[[!isState_(uiState_, 'rollback-proposal-view')]]"
disabled="[[tpmFirmwareUpdateChecked_]]">
</oobe-text-button> </oobe-text-button>
<!-- Powerwash button (depends on powerwash mode) -->
<oobe-text-button inverse on-tap="onPowerwashTap_" class="focus-on-show" <oobe-text-button inverse on-tap="onPowerwashTap_" class="focus-on-show"
text-key="resetButtonPowerwash" hidden="[[!inPowerwashState_]]"
hidden="[[!isState_(uiState_, 'powerwash-proposal-view')]]"> text-key="[[powerwashButtonTextKey_]]"
disabled="[[powerwashButtonDisabled_]]">
</oobe-text-button> </oobe-text-button>
</div> </div>
</oobe-dialog> </oobe-dialog>
<!-- Powerwash confirmation dialog (depends on powerwash mode) -->
<oobe-help-dialog id="confirmationDialog" on-close="onDialogClosed_">
<div slot="title">[[confirmationDialogTitle_]]</div>
<div slot="content">[[confirmationDialogText_]]</div>
<div slot="buttons">
<oobe-text-button id="cancelButton" border on-tap="onDialogCancelTap_"
text-key="cancel"></oobe-text-button>
<oobe-text-button inverse on-tap="onDialogContinueTap_"
text-key="confirmResetButton"></oobe-text-button>
</div>
</oobe-help-dialog>
</template> </template>
</dom-module> </dom-module>
...@@ -6,130 +6,392 @@ ...@@ -6,130 +6,392 @@
* @fileoverview Polymer element for displaying material design reset screen. * @fileoverview Polymer element for displaying material design reset screen.
*/ */
(function() {
/** @enum {number} */
const RESET_SCREEN_STATE = {
'RESTART_REQUIRED': 0,
'REVERT_PROMISE': 1,
'POWERWASH_PROPOSAL': 2, // supports 2 ui-states - With or without rollback
'ERROR': 3,
};
// When the screen is in the powerwash proposal state, it depends on the mode
/** @enum {number} */
const POWERWASH_MODE = {
'POWERWASH_WITH_ROLLBACK': 0,
'POWERWASH_ONLY': 1,
};
// Powerwash mode details. Used by the UI for the two different modes
/** @type {Map<POWERWASH_MODE, Object<string,string>>} */
const POWERWASH_MODE_DETAILS = new Map([
[
POWERWASH_MODE.POWERWASH_WITH_ROLLBACK, {
subtitleText: 'resetPowerwashRollbackWarningDetails',
dialogTitle: 'confirmRollbackTitle',
dialogContent: 'confirmRollbackMessage',
buttonTextKey: 'resetButtonPowerwashAndRollback',
}
],
[
POWERWASH_MODE.POWERWASH_ONLY, {
subtitleText: 'resetPowerwashWarningDetails',
dialogTitle: 'confirmPowerwashTitle',
dialogContent: 'confirmPowerwashMessage',
buttonTextKey: 'resetButtonPowerwash',
}
],
]);
Polymer({ Polymer({
is: 'oobe-reset-md', is: 'oobe-reset',
behaviors: [OobeI18nBehavior, OobeDialogHostBehavior], behaviors: [OobeI18nBehavior, OobeDialogHostBehavior, LoginScreenBehavior],
EXTERNAL_API: [
'setIsRollbackAvailable',
'setIsRollbackRequested',
'setIsTpmFirmwareUpdateAvailable',
'setIsTpmFirmwareUpdateChecked',
'setIsTpmFirmwareUpdateEditable',
'setTpmFirmwareUpdateMode',
'setShouldShowConfirmationDialog',
'setScreenState',
],
properties: { properties: {
/**
* State of the screen corresponding to the css style set by /* The current state of the screen as set from the C++ side. */
* oobe_screen_reset.js. /** @type {RESET_SCREEN_STATE} */
*/ screenState_: {
uiState_: String, type: Number,
value: RESET_SCREEN_STATE.RESTART_REQUIRED,
observer: 'onScreenStateChanged_',
},
/** @type {boolean} Whether rollback is available */
isRollbackAvailable_: {
type: Boolean,
value: false,
observer: 'updatePowerwashModeBasedOnRollbackOptions_',
},
/** /**
* Flag that determines whether help link is shown. * @type {boolean}
* Whether the rollback option was chosen by the user.
*/ */
isGoogleBranded_: Boolean, isRollbackRequested_: {
type: Boolean,
value: false,
observer: 'updatePowerwashModeBasedOnRollbackOptions_',
},
/** /**
* Whether to show the TPM firmware update checkbox. * Whether to show the TPM firmware update checkbox.
*/ */
tpmFirmwareUpdateAvailable_: Boolean, tpmUpdateAvailable_: Boolean,
/** /**
* If the checkbox to request a TPM firmware update is checked. * If the checkbox to request a TPM firmware update is checked.
*/ */
tpmFirmwareUpdateChecked_: Boolean, tpmUpdateChecked_: Boolean,
/** /**
* If the checkbox to request a TPM firmware update is editable. * If the checkbox to request a TPM firmware update is editable.
*/ */
tpmFirmwareUpdateEditable_: Boolean, tpmUpdateEditable_: Boolean,
/** /**
* Reference to OOBE screen object. * The current TPM update mode.
* @type {!OobeTypes.Screen}
*/ */
screen: { tpmUpdateMode_: String,
type: Object,
// Title to be shown on the confirmation dialog.
confirmationDialogTitle_: {
type: String,
computed: 'getConfirmationDialogTitle_(locale, powerwashMode_)',
},
// Content to be shown on the confirmation dialog.
confirmationDialogText_: {
type: String,
computed: 'getConfirmationDialogText_(locale, powerwashMode_)',
},
// The subtitle to be shown while the screen is in POWERWASH_PROPOSAL
powerwashStateSubtitle_: {
type: String,
computed: 'getPowerwashStateSubtitle_(locale, powerwashMode_)'
},
// The text shown on the powerwash button. (depends on powerwash mode)
powerwashButtonTextKey_: {
type: String,
computed: 'getPowerwashButtonTextKey_(locale, powerwashMode_)'
},
// Whether the powerwash button is disabled.
powerwashButtonDisabled_: {
type: Boolean,
computed: 'isPowerwashDisabled_(powerwashMode_, tpmUpdateChecked_)',
},
// The chosen powerwash mode
/**@type {POWERWASH_MODE} */
powerwashMode_: {
type: Number,
value: POWERWASH_MODE.POWERWASH_ONLY,
},
// Simple variables that reflect the current screen state
// Only modified by the observer of 'screenState_'
inRestartRequiredState_: {
type: Boolean,
value: true,
},
inRevertState_: {
type: Boolean,
value: false,
}, },
inPowerwashState_: {
type: Boolean,
value: false,
},
},
/** @override */
ready() {
this.initializeLoginScreen('ResetScreen', {
resetAllowed: false,
enableDebuggingAllowed: false,
});
}, },
focus() { focus() {
this.$.resetDialog.focus(); this.$.resetDialog.focus();
}, },
/** @private */ /* ---------- EXTERNAL API BEGIN ---------- */
isState_(uiState_, state_) { /** @param {boolean} rollbackAvailable */
return uiState_ == state_; setIsRollbackAvailable(rollbackAvailable) {
this.isRollbackAvailable_ = rollbackAvailable;
}, },
/** @private */ /**
isCancelHidden_(uiState_) { * @param {boolean} rollbackRequested
return uiState_ == 'revert-promise-view'; */
setIsRollbackRequested(rollbackRequested) {
this.isRollbackRequested_ = rollbackRequested;
}, },
/** @private */ /** @param {boolean} value */
isHelpLinkHidden_(uiState_, isGoogleBranded_) { setIsTpmFirmwareUpdateAvailable(value) {
return !isGoogleBranded_ || (uiState_ == 'revert-promise-view'); this.tpmUpdateAvailable_ = value;
},
/** @param {boolean} value */
setIsTpmFirmwareUpdateChecked(value) {
this.tpmUpdateChecked_ = value;
},
/** @param {boolean} value */
setIsTpmFirmwareUpdateEditable(value) {
this.tpmUpdateEditable_ = value;
},
/** @param {string} value */
setTpmFirmwareUpdateMode(value) {
this.tpmUpdateMode_ = value;
},
/** @param {boolean} should_show */
setShouldShowConfirmationDialog(should_show) {
if (should_show) {
this.$.confirmationDialog.showDialog();
} else {
this.$.confirmationDialog.hideDialog();
}
},
/** @param {RESET_SCREEN_STATE} state */
setScreenState(state) {
this.screenState_ = state;
},
/* ---------- EXTERNAL API END ---------- */
/**
* When rollback is available and requested, the powerwash mode changes
* to POWERWASH_WITH_ROLLBACK.
* @private
*/
updatePowerwashModeBasedOnRollbackOptions_() {
if (this.isRollbackAvailable_ && this.isRollbackRequested_) {
this.powerwashMode_ = POWERWASH_MODE.POWERWASH_WITH_ROLLBACK;
this.classList.add('rollback-proposal-view');
} else {
this.powerwashMode_ = POWERWASH_MODE.POWERWASH_ONLY;
this.classList.remove('rollback-proposal-view');
}
}, },
/** @private */ /** @private */
isTPMFirmwareUpdateHidden_(uiState_, tpmFirmwareUpdateAvailable_) { onScreenStateChanged_() {
var inProposalView = [ if (this.screenState_ == RESET_SCREEN_STATE.REVERT_PROMISE) {
'powerwash-proposal-view', 'rollback-proposal-view' announceAccessibleMessage(this.i18n('resetRevertSpinnerMessage'));
].includes(uiState_); this.classList.add('revert-promise-view');
return !(tpmFirmwareUpdateAvailable_ && inProposalView); } else {
this.classList.remove('revert-promise-view');
}
this.inRevertState_ =
(this.screenState_ == RESET_SCREEN_STATE.REVERT_PROMISE);
this.inRestartRequiredState_ =
(this.screenState_ == RESET_SCREEN_STATE.RESTART_REQUIRED);
this.inPowerwashState_ =
(this.screenState_ == RESET_SCREEN_STATE.POWERWASH_PROPOSAL);
},
/**
* Determines the subtitle based on the current powerwash mode
* @param {*} locale
* @param {POWERWASH_MODE} mode
* @private
*/
getPowerwashStateSubtitle_(locale, mode) {
if (this.powerwashMode_ === undefined)
return '';
const modeDetails = POWERWASH_MODE_DETAILS.get(this.powerwashMode_);
return this.i18n(modeDetails.subtitleText);
},
/**
* The powerwash button text depends on the powerwash mode
* @param {*} locale
* @param {POWERWASH_MODE} mode
* @private
*/
getPowerwashButtonTextKey_(locale, mode) {
if (this.powerwashMode_ === undefined)
return '';
return POWERWASH_MODE_DETAILS.get(this.powerwashMode_).buttonTextKey;
},
/**
* Cannot powerwash with rollback when the TPM update checkbox is checked
* @param {POWERWASH_MODE} mode
* @param {boolean} tpmUpdateChecked
* @private
*/
isPowerwashDisabled_(mode, tpmUpdateChecked) {
return this.tpmUpdateChecked_ &&
(this.powerwashMode_ == POWERWASH_MODE.POWERWASH_WITH_ROLLBACK);
},
/* ---------- CONFIRMATION DIALOG ---------- */
/**
* Determines the confirmation dialog title.
* @param {*} locale
* @param {POWERWASH_MODE} mode
* @private
*/
getConfirmationDialogTitle_(locale, mode) {
if (this.powerwashMode_ === undefined)
return '';
const modeDetails = POWERWASH_MODE_DETAILS.get(this.powerwashMode_);
return this.i18n(modeDetails.dialogTitle);
},
/**
* Determines the confirmation dialog content
* @param {*} locale
* @param {POWERWASH_MODE} mode
* @private
*/
getConfirmationDialogText_(locale, mode) {
if (this.powerwashMode_ === undefined)
return '';
const modeDetails = POWERWASH_MODE_DETAILS.get(this.powerwashMode_);
return this.i18n(modeDetails.dialogContent);
},
/**
* On-tap event handler for confirmation dialog continue button.
* @private
*/
onDialogContinueTap_() {
this.userActed('powerwash-pressed');
}, },
/**
* On-tap event handler for confirmation dialog cancel button.
* @private
*/
onDialogCancelTap_() {
this.$.confirmationDialog.hideDialog();
this.userActed('reset-confirm-dismissed');
},
/**
* Catch 'close' event through escape key
* @private
*/
onDialogClosed_() {
this.userActed('reset-confirm-dismissed');
},
/* ---------- SIMPLE EVENT HANDLERS ---------- */
/** /**
* On-tap event handler for cancel button. * On-tap event handler for cancel button.
*
* @private * @private
*/ */
onCancelTap_() { onCancelTap_() {
chrome.send('login.ResetScreen.userActed', ['cancel-reset']); this.userActed('cancel-reset');
}, },
/** /**
* On-tap event handler for restart button. * On-tap event handler for restart button.
*
* @private * @private
*/ */
onRestartTap_() { onRestartTap_() {
chrome.send('login.ResetScreen.userActed', ['restart-pressed']); this.userActed('restart-pressed');
}, },
/** /**
* On-tap event handler for powerwash button. * On-tap event handler for powerwash button.
*
* @private * @private
*/ */
onPowerwashTap_() { onPowerwashTap_() {
chrome.send('login.ResetScreen.userActed', ['show-confirmation']); this.userActed('show-confirmation');
}, },
/** /**
* On-tap event handler for learn more link. * On-tap event handler for learn more link.
*
* @private * @private
*/ */
onLearnMoreTap_() { onLearnMoreTap_() {
chrome.send('login.ResetScreen.userActed', ['learn-more-link']); this.userActed('learn-more-link');
}, },
/** /**
* Change handler for TPM firmware update checkbox. * Change handler for TPM firmware update checkbox.
*
* @private * @private
*/ */
onTPMFirmwareUpdateChanged_() { onTPMFirmwareUpdateChanged_() {
this.screen.onTPMFirmwareUpdateChanged_( const checked = this.$.tpmFirmwareUpdateCheckbox.checked;
this.$.tpmFirmwareUpdateCheckbox.checked); chrome.send('ResetScreen.setTpmFirmwareUpdateChecked', [checked]);
}, },
/** /**
* On-tap event handler for the TPM firmware update learn more link. * On-tap event handler for the TPM firmware update learn more link.
*
* @param {!Event} event * @param {!Event} event
* @private * @private
*/ */
onTPMFirmwareUpdateLearnMore_(event) { onTPMFirmwareUpdateLearnMore_(event) {
chrome.send( this.userActed('tpm-firmware-update-learn-more-link');
'login.ResetScreen.userActed', ['tpm-firmware-update-learn-more-link']);
event.stopPropagation(); event.stopPropagation();
}, },
}); });
})();
/* Copyright 2017 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. */
.reset-popup {
background: white;
border-radius: 2px;
border-width: 0;
box-shadow: 0 0 16px rgba(0, 0, 0, .12), 0 16px 16px rgba(0, 0, 0, .24);
min-height: 158px;
padding: 0;
position: relative;
width: 512px;
z-index: 10;
}
.reset-popup h1 {
color: var(--google-grey-900);
font-family: var(--oobe-button-font-family);
font-size: 15px;
margin-bottom: 0;
margin-top: 0;
padding: 16px 20px;
}
.reset-popup-content-area {
@apply --oobe-default-font;
color: rgba(0, 0, 0, .54);
line-height: 20px;
padding: 0 20px 20.5px;
}
oobe-text-button {
color: #5a5a5a;
margin-bottom: 16px;
margin-inline-end: 16px;
}
#cancelButton {
margin-inline-end: 4px;
}
<!-- Copyright 2017 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. -->
<dom-module id="reset-confirm-overlay-md">
<template>
<link rel="stylesheet" href="oobe_flex_layout.css">
<link rel="stylesheet" href="oobe_reset_confirmation_overlay.css">
<dialog id="dialog" class="reset-popup not-resizable">
<h1 hidden="[[!isPowerwashView_]]">
[[i18nDynamic(locale, 'confirmPowerwashTitle')]]
</h1>
<h1 hidden="[[isPowerwashView_]]">
[[i18nDynamic(locale, 'confirmRollbackTitle')]]
</h1>
<div class="reset-popup-content-area">
<div hidden="[[!isPowerwashView_]]">
[[i18nDynamic(locale, 'confirmPowerwashMessage')]]
</div>
<div hidden="[[isPowerwashView_]]">
[[i18nDynamic(locale, 'confirmRollbackMessage')]]
</div>
</div>
<div slot="bottom-buttons" class="flex layout horizontal">
<div class="flex"></div>
<oobe-text-button id="cancelButton" border on-tap="onCancelTap_"
text-key="cancel"></oobe-text-button>
<oobe-text-button inverse on-tap="onContinueTap_"
text-key="confirmResetButton"></oobe-text-button>
</div>
</dialog>
</template>
</dom-module>
// Copyright 2017 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.
/**
* @fileoverview Polymer element for displaying material design reset
* confirmation overlay screen.
*/
Polymer({
is: 'reset-confirm-overlay-md',
behaviors: [OobeI18nBehavior],
properties: {
isPowerwashView_: Boolean,
},
open() {
if (!this.$.dialog.open)
this.$.dialog.showModal();
},
close() {
if (this.$.dialog.open)
this.$.dialog.close();
},
/**
* On-tap event handler for continue button.
*/
onContinueTap_() {
this.close();
chrome.send('login.ResetScreen.userActed', ['powerwash-pressed']);
},
/**
* On-tap event handler for cancel button.
*/
onCancelTap_() {
this.close();
chrome.send('login.ResetScreen.userActed', ['reset-confirm-dismissed']);
},
});
/* Copyright 2013 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. */
#reset {
display: flex;
font-size: 16px;
min-height: 0;
text-align: start;
}
<div class="step faded hidden" id="reset" role="group"
i18n-values="aria-label:resetScreenAccessibleTitle" hidden>
<oobe-reset-md id="oobe-reset-md"></oobe-reset-md>
</div>
// Copyright (c) 2012 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.
/**
* @fileoverview Device reset screen implementation.
*/
login.createScreen('ResetScreen', 'reset', function() {
var USER_ACTION_CANCEL_RESET = 'cancel-reset';
var USER_ACTION_RESET_CONFIRM_DISMISSED = 'reset-confirm-dismissed';
/* Possible UI states of the reset screen. */
const RESET_SCREEN_UI_STATE = {
REVERT_PROMISE: 'ui-state-revert-promise',
RESTART_REQUIRED: 'ui-state-restart-required',
POWERWASH_PROPOSAL: 'ui-state-powerwash-proposal',
ROLLBACK_PROPOSAL: 'ui-state-rollback-proposal',
ERROR: 'ui-state-error',
};
const RESET_SCREEN_STATE = {
RESTART_REQUIRED: 0,
REVERT_PROMISE: 1,
POWERWASH_PROPOSAL: 2, // supports 2 ui-states
ERROR: 3,
};
return {
EXTERNAL_API: [
'setIsRollbackAvailable',
'setIsRollbackChecked',
'setIsTpmFirmwareUpdateAvailable',
'setIsTpmFirmwareUpdateChecked',
'setIsTpmFirmwareUpdateEditable',
'setTpmFirmwareUpdateMode',
'setIsConfirmational',
'setIsGoogleBrandedBuild',
'setScreenState',
],
/** @type {boolean} */
isRollbackAvailable_: false,
/** @type {boolean} */
isRollbackChecked_: false,
/** @type {boolean} */
isTpmFirmwareUpdateAvailable_: false,
/** @type {boolean} */
isTpmFirmwareUpdateChecked_: false,
/** @type {boolean} */
isTpmFirmwareUpdateEditable_: false,
/** @type {RESET_SCREEN_UI_STATE} */
tpmFirmwareUpdateMode_: RESET_SCREEN_UI_STATE.REVERT_PROMISE,
/** @type {boolean} */
isConfirmational_: false,
/** @type {RESET_SCREEN_STATE} */
screenState_: RESET_SCREEN_STATE.RESTART_REQUIRED,
setIsRollbackAvailable(rollbackAvailable) {
this.isRollbackAvailable_ = rollbackAvailable;
this.setRollbackOptionView();
},
setIsRollbackChecked(rollbackChecked) {
this.isRollbackChecked_ = rollbackChecked;
this.setRollbackOptionView();
},
setIsTpmFirmwareUpdateAvailable(value) {
this.isTpmFirmwareUpdateAvailable_ = value;
this.setTPMFirmwareUpdateView_();
},
setIsTpmFirmwareUpdateChecked(value) {
this.isTpmFirmwareUpdateChecked_ = value;
this.setTPMFirmwareUpdateView_();
},
setIsTpmFirmwareUpdateEditable(value) {
this.isTpmFirmwareUpdateEditable_ = value;
this.setTPMFirmwareUpdateView_();
},
setTpmFirmwareUpdateMode(value) {
this.tpmFirmwareUpdateMode_ = value;
},
setIsConfirmational(isConfirmational) {
this.isConfirmational_ = isConfirmational;
if (isConfirmational) {
if (this.screenState_ != RESET_SCREEN_STATE.POWERWASH_PROPOSAL)
return;
$('overlay-reset').removeAttribute('hidden');
$('reset-confirm-overlay-md').open();
} else {
$('overlay-reset').setAttribute('hidden', true);
$('reset-confirm-overlay-md').close();
}
},
setIsGoogleBrandedBuild(isGoogleBranded) {
$('oobe-reset-md').isGoogleBranded_ = isGoogleBranded;
},
setScreenState(state) {
this.screenState_ = state;
if (state == RESET_SCREEN_STATE.RESTART_REQUIRED)
this.ui_state = RESET_SCREEN_UI_STATE.RESTART_REQUIRED;
if (state == RESET_SCREEN_STATE.REVERT_PROMISE)
this.ui_state = RESET_SCREEN_UI_STATE.REVERT_PROMISE;
else if (state == RESET_SCREEN_STATE.POWERWASH_PROPOSAL)
this.ui_state = RESET_SCREEN_UI_STATE.POWERWASH_PROPOSAL;
this.setDialogView_();
if (state == RESET_SCREEN_STATE.REVERT_PROMISE) {
announceAccessibleMessage(
loadTimeData.getString('resetRevertSpinnerMessage'));
}
this.setTPMFirmwareUpdateView_();
},
/** @override */
decorate() {
$('oobe-reset-md').screen = this;
},
/**
* Returns a control which should receive an initial focus.
*/
get defaultControl() {
return $('oobe-reset-md');
},
/**
* Cancels the reset and drops the user back to the login screen.
*/
cancel() {
if (this.isConfirmational_) {
$('reset').send(
login.Screen.CALLBACK_USER_ACTED,
USER_ACTION_RESET_CONFIRM_DISMISSED);
return;
}
this.send(login.Screen.CALLBACK_USER_ACTED, USER_ACTION_CANCEL_RESET);
},
/**
* Event handler that is invoked just before the screen in shown.
* @param {Object} data Screen init payload.
*/
onBeforeShow(data) {},
/** Event handler that is invoked after the screen is shown. */
onAfterShow() {
Oobe.resetSigninUI(false);
},
/**
* Sets css style for corresponding state of the screen.
* @private
*/
setDialogView_(state) {
state = this.ui_state;
this.classList.toggle(
'revert-promise-view', state == RESET_SCREEN_UI_STATE.REVERT_PROMISE);
this.classList.toggle(
'restart-required-view',
state == RESET_SCREEN_UI_STATE.RESTART_REQUIRED);
this.classList.toggle(
'powerwash-proposal-view',
state == RESET_SCREEN_UI_STATE.POWERWASH_PROPOSAL);
this.classList.toggle(
'rollback-proposal-view',
state == RESET_SCREEN_UI_STATE.ROLLBACK_PROPOSAL);
var resetMd = $('oobe-reset-md');
var resetOverlayMd = $('reset-confirm-overlay-md');
if (state == RESET_SCREEN_UI_STATE.RESTART_REQUIRED) {
resetMd.uiState_ = 'restart-required-view';
}
if (state == RESET_SCREEN_UI_STATE.POWERWASH_PROPOSAL) {
resetMd.uiState_ = 'powerwash-proposal-view';
resetOverlayMd.isPowerwashView_ = true;
}
if (state == RESET_SCREEN_UI_STATE.ROLLBACK_PROPOSAL) {
resetMd.uiState_ = 'rollback-proposal-view';
resetOverlayMd.isPowerwashView_ = false;
}
if (state == RESET_SCREEN_UI_STATE.REVERT_PROMISE) {
resetMd.uiState_ = 'revert-promise-view';
}
},
setRollbackOptionView() {
if (this.isConfirmational_)
return;
if (this.screenState_ != RESET_SCREEN_STATE.POWERWASH_PROPOSAL)
return;
if (this.isRollbackAvailable_ && this.isRollbackChecked_) {
this.ui_state = RESET_SCREEN_UI_STATE.ROLLBACK_PROPOSAL;
} else {
this.ui_state = RESET_SCREEN_UI_STATE.POWERWASH_PROPOSAL;
}
this.setDialogView_();
this.setTPMFirmwareUpdateView_();
},
setTPMFirmwareUpdateView_() {
$('oobe-reset-md').tpmFirmwareUpdateAvailable_ =
this.ui_state == RESET_SCREEN_UI_STATE.POWERWASH_PROPOSAL &&
this.isTpmFirmwareUpdateAvailable_;
$('oobe-reset-md').tpmFirmwareUpdateChecked_ =
this.isTpmFirmwareUpdateChecked_;
$('oobe-reset-md').tpmFirmwareUpdateEditable_ =
this.isTpmFirmwareUpdateEditable_;
},
onTPMFirmwareUpdateChanged_(value) {
chrome.send('ResetScreen.setTpmFirmwareUpdateChecked', [value]);
},
/**
* Updates localized content of the screen that is not updated via template.
*/
updateLocalizedContent() {
$('oobe-reset-md').i18nUpdateLocale();
$('reset-confirm-overlay-md').i18nUpdateLocale();
},
};
});
<div id="overlay-reset" class="popup-overlay" hidden>
<reset-confirm-overlay-md id="reset-confirm-overlay-md">
</reset-confirm-overlay-md>
</div>
...@@ -5,7 +5,8 @@ ...@@ -5,7 +5,8 @@
<oobe-adb-sideloading-screen id="adb-sideloading" class="step hidden"> <oobe-adb-sideloading-screen id="adb-sideloading" class="step hidden">
</oobe-adb-sideloading-screen> </oobe-adb-sideloading-screen>
<include src="oobe_screen_enable_debugging.html"> <include src="oobe_screen_enable_debugging.html">
<include src="oobe_screen_reset.html"> <oobe-reset class="step" id="reset" hidden>
</oobe-reset>
<include src="oobe_screen_autolaunch.html"> <include src="oobe_screen_autolaunch.html">
<kiosk-enable id="kiosk-enable" class="step hidden"> <kiosk-enable id="kiosk-enable" class="step hidden">
</kiosk-enable> </kiosk-enable>
......
...@@ -119,9 +119,13 @@ void ResetScreenHandler::SetIsRollbackAvailable(bool value) { ...@@ -119,9 +119,13 @@ void ResetScreenHandler::SetIsRollbackAvailable(bool value) {
CallJS("login.ResetScreen.setIsRollbackAvailable", value); CallJS("login.ResetScreen.setIsRollbackAvailable", value);
} }
void ResetScreenHandler::SetIsRollbackChecked(bool value) { // Only serve the request if the confirmation dialog isn't being shown.
is_rollback_checked_ = value; void ResetScreenHandler::SetIsRollbackRequested(bool value) {
CallJS("login.ResetScreen.setIsRollbackChecked", value); if (is_showing_confirmation_dialog_)
return;
is_rollback_requested_ = value;
CallJS("login.ResetScreen.setIsRollbackRequested", value);
} }
void ResetScreenHandler::SetIsTpmFirmwareUpdateAvailable(bool value) { void ResetScreenHandler::SetIsTpmFirmwareUpdateAvailable(bool value) {
...@@ -143,12 +147,13 @@ void ResetScreenHandler::SetTpmFirmwareUpdateMode( ...@@ -143,12 +147,13 @@ void ResetScreenHandler::SetTpmFirmwareUpdateMode(
CallJS("login.ResetScreen.setTpmFirmwareUpdateMode", static_cast<int>(value)); CallJS("login.ResetScreen.setTpmFirmwareUpdateMode", static_cast<int>(value));
} }
void ResetScreenHandler::SetIsConfirmational(bool value) { void ResetScreenHandler::SetShouldShowConfirmationDialog(bool value) {
CallJS("login.ResetScreen.setIsConfirmational", value); is_showing_confirmation_dialog_ = value;
CallJS("login.ResetScreen.setShouldShowConfirmationDialog", value);
} }
void ResetScreenHandler::SetIsGoogleBrandedBuild(bool value) { void ResetScreenHandler::SetConfirmationDialogClosed() {
CallJS("login.ResetScreen.setIsGoogleBrandedBuild", value); is_showing_confirmation_dialog_ = false;
} }
void ResetScreenHandler::SetScreenState(State value) { void ResetScreenHandler::SetScreenState(State value) {
...@@ -168,8 +173,8 @@ bool ResetScreenHandler::GetIsRollbackAvailable() { ...@@ -168,8 +173,8 @@ bool ResetScreenHandler::GetIsRollbackAvailable() {
return is_rollback_available_; return is_rollback_available_;
} }
bool ResetScreenHandler::GetIsRollbackChecked() { bool ResetScreenHandler::GetIsRollbackRequested() {
return is_rollback_checked_; return is_rollback_requested_;
} }
bool ResetScreenHandler::GetIsTpmFirmwareUpdateChecked() { bool ResetScreenHandler::GetIsTpmFirmwareUpdateChecked() {
......
...@@ -36,19 +36,19 @@ class ResetView { ...@@ -36,19 +36,19 @@ class ResetView {
}; };
virtual void SetIsRollbackAvailable(bool value) = 0; virtual void SetIsRollbackAvailable(bool value) = 0;
virtual void SetIsRollbackChecked(bool value) = 0; virtual void SetIsRollbackRequested(bool value) = 0;
virtual void SetIsTpmFirmwareUpdateAvailable(bool value) = 0; virtual void SetIsTpmFirmwareUpdateAvailable(bool value) = 0;
virtual void SetIsTpmFirmwareUpdateChecked(bool value) = 0; virtual void SetIsTpmFirmwareUpdateChecked(bool value) = 0;
virtual void SetIsTpmFirmwareUpdateEditable(bool value) = 0; virtual void SetIsTpmFirmwareUpdateEditable(bool value) = 0;
virtual void SetTpmFirmwareUpdateMode(tpm_firmware_update::Mode value) = 0; virtual void SetTpmFirmwareUpdateMode(tpm_firmware_update::Mode value) = 0;
virtual void SetIsConfirmational(bool value) = 0; virtual void SetShouldShowConfirmationDialog(bool value) = 0;
virtual void SetIsGoogleBrandedBuild(bool value) = 0; virtual void SetConfirmationDialogClosed() = 0;
virtual void SetScreenState(State value) = 0; virtual void SetScreenState(State value) = 0;
virtual State GetScreenState() = 0; virtual State GetScreenState() = 0;
virtual tpm_firmware_update::Mode GetTpmFirmwareUpdateMode() = 0; virtual tpm_firmware_update::Mode GetTpmFirmwareUpdateMode() = 0;
virtual bool GetIsRollbackAvailable() = 0; virtual bool GetIsRollbackAvailable() = 0;
virtual bool GetIsRollbackChecked() = 0; virtual bool GetIsRollbackRequested() = 0;
virtual bool GetIsTpmFirmwareUpdateChecked() = 0; virtual bool GetIsTpmFirmwareUpdateChecked() = 0;
}; };
...@@ -73,18 +73,18 @@ class ResetScreenHandler : public ResetView, ...@@ -73,18 +73,18 @@ class ResetScreenHandler : public ResetView,
void DeclareJSCallbacks() override; void DeclareJSCallbacks() override;
void Initialize() override; void Initialize() override;
void SetIsRollbackAvailable(bool value) override; void SetIsRollbackAvailable(bool value) override;
void SetIsRollbackChecked(bool value) override; void SetIsRollbackRequested(bool value) override;
void SetIsTpmFirmwareUpdateAvailable(bool value) override; void SetIsTpmFirmwareUpdateAvailable(bool value) override;
void SetIsTpmFirmwareUpdateChecked(bool value) override; void SetIsTpmFirmwareUpdateChecked(bool value) override;
void SetIsTpmFirmwareUpdateEditable(bool value) override; void SetIsTpmFirmwareUpdateEditable(bool value) override;
void SetTpmFirmwareUpdateMode(tpm_firmware_update::Mode value) override; void SetTpmFirmwareUpdateMode(tpm_firmware_update::Mode value) override;
void SetIsConfirmational(bool value) override; void SetShouldShowConfirmationDialog(bool value) override;
void SetIsGoogleBrandedBuild(bool value) override; void SetConfirmationDialogClosed() override;
void SetScreenState(State value) override; void SetScreenState(State value) override;
State GetScreenState() override; State GetScreenState() override;
tpm_firmware_update::Mode GetTpmFirmwareUpdateMode() override; tpm_firmware_update::Mode GetTpmFirmwareUpdateMode() override;
bool GetIsRollbackAvailable() override; bool GetIsRollbackAvailable() override;
bool GetIsRollbackChecked() override; bool GetIsRollbackRequested() override;
bool GetIsTpmFirmwareUpdateChecked() override; bool GetIsTpmFirmwareUpdateChecked() override;
private: private:
...@@ -98,8 +98,9 @@ class ResetScreenHandler : public ResetView, ...@@ -98,8 +98,9 @@ class ResetScreenHandler : public ResetView,
ResetView::State state_ = ResetView::State::kRestartRequired; ResetView::State state_ = ResetView::State::kRestartRequired;
tpm_firmware_update::Mode mode_ = tpm_firmware_update::Mode::kNone; tpm_firmware_update::Mode mode_ = tpm_firmware_update::Mode::kNone;
bool is_rollback_available_ = false; bool is_rollback_available_ = false;
bool is_rollback_checked_ = false; bool is_rollback_requested_ = false;
bool is_tpm_firmware_update_checked_ = false; bool is_tpm_firmware_update_checked_ = false;
bool is_showing_confirmation_dialog_ = false;
DISALLOW_COPY_AND_ASSIGN(ResetScreenHandler); DISALLOW_COPY_AND_ASSIGN(ResetScreenHandler);
}; };
......
...@@ -418,8 +418,7 @@ cr.define('cr.ui.login', function() { ...@@ -418,8 +418,7 @@ cr.define('cr.ui.login', function() {
$('version-labels').hidden = !$('version-labels').hidden; $('version-labels').hidden = !$('version-labels').hidden;
} else if (name == ACCELERATOR_RESET) { } else if (name == ACCELERATOR_RESET) {
if (currentStepId == SCREEN_OOBE_RESET) { if (currentStepId == SCREEN_OOBE_RESET) {
$('reset').send( $('reset').userActed(USER_ACTION_ROLLBACK_TOGGLED);
login.Screen.CALLBACK_USER_ACTED, USER_ACTION_ROLLBACK_TOGGLED);
} else if (attributes.resetAllowed || } else if (attributes.resetAllowed ||
RESET_AVAILABLE_SCREEN_GROUP.indexOf(currentStepId) != -1) { RESET_AVAILABLE_SCREEN_GROUP.indexOf(currentStepId) != -1) {
chrome.send('toggleResetScreen'); chrome.send('toggleResetScreen');
......
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