Commit 206531ab authored by Aga Wronska's avatar Aga Wronska Committed by Commit Bot

Reland "Add skeleton of Demo Mode setup UI."

This is a reland of c618b6e7

Original change's description:
> Add skeleton of Demo Mode setup UI.
>
> Mocks:
> https://gallery.googleplex.com/projects/MCHbtQVoQ2HCZeqwFvuvKaZQ/files/MCGxzIhEyEZFkDOfw1G1Tu4Z
>
> Bug: 827376
> Cq-Include-Trybots: luci.chromium.try:closure_compilation
> Change-Id: I1206687fff441ec6be5a3bb9e6dddba7469f292b
> Reviewed-on: https://chromium-review.googlesource.com/1100237
> Commit-Queue: Aga Wronska <agawronska@chromium.org>
> Reviewed-by: Michael Giuffrida <michaelpg@chromium.org>
> Reviewed-by: Alexander Alekseev <alemate@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#571137}

Bug: 827376
Change-Id: I8f4d81e2e10437b23cd4c84eac95204600fb28ee
Cq-Include-Trybots: luci.chromium.try:closure_compilation
Reviewed-on: https://chromium-review.googlesource.com/1119268Reviewed-by: default avatarAlexander Alekseev <alemate@chromium.org>
Commit-Queue: Aga Wronska <agawronska@chromium.org>
Cr-Commit-Position: refs/heads/master@{#571659}
parent e73a8251
......@@ -2024,6 +2024,7 @@ source_set("unit_tests") {
"login/auth/cryptohome_authenticator_unittest.cc",
"login/demo_mode/demo_session_unittest.cc",
"login/demo_mode/demo_setup_controller_unittest.cc",
"login/demo_mode/demo_setup_test_utils.h",
"login/easy_unlock/easy_unlock_challenge_wrapper_unittest.cc",
"login/easy_unlock/easy_unlock_tpm_key_manager_unittest.cc",
"login/enrollment/enrollment_screen_unittest.cc",
......
......@@ -9,8 +9,7 @@
#include "base/optional.h"
#include "base/run_loop.h"
#include "base/test/scoped_task_environment.h"
#include "chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_mock.h"
#include "chrome/browser/chromeos/policy/enrollment_status_chromeos.h"
#include "chrome/browser/chromeos/login/demo_mode/demo_setup_test_utils.h"
#include "chrome/browser/chromeos/settings/device_settings_service.h"
#include "chromeos/cryptohome/system_salt_getter.h"
#include "chromeos/dbus/dbus_thread_manager.h"
......@@ -18,6 +17,9 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using chromeos::test::DemoModeSetupResult;
using chromeos::test::MockDemoModeOfflineEnrollmentHelperCreator;
using chromeos::test::MockDemoModeOnlineEnrollmentHelperCreator;
using testing::_;
namespace chromeos {
......@@ -104,56 +106,6 @@ bool SetupDummyOfflineDir(const std::string& account_id,
class DemoSetupControllerTest : public testing::Test {
protected:
enum class SetupResult { SUCCESS, ERROR };
template <SetupResult result>
static EnterpriseEnrollmentHelper* MockOnlineEnrollmentHelperCreator(
EnterpriseEnrollmentHelper::EnrollmentStatusConsumer* status_consumer,
const policy::EnrollmentConfig& enrollment_config,
const std::string& enrolling_user_domain) {
EnterpriseEnrollmentHelperMock* mock =
new EnterpriseEnrollmentHelperMock(status_consumer);
EXPECT_EQ(enrollment_config.mode,
policy::EnrollmentConfig::MODE_ATTESTATION);
EXPECT_CALL(*mock, EnrollUsingAttestation())
.WillRepeatedly(testing::Invoke([mock]() {
if (result == SetupResult::SUCCESS) {
mock->status_consumer()->OnDeviceEnrolled("");
} else {
// TODO(agawronska): Test different error types.
mock->status_consumer()->OnEnrollmentError(
policy::EnrollmentStatus::ForStatus(
policy::EnrollmentStatus::REGISTRATION_FAILED));
}
}));
return mock;
}
template <SetupResult result>
static EnterpriseEnrollmentHelper* MockOfflineEnrollmentHelperCreator(
EnterpriseEnrollmentHelper::EnrollmentStatusConsumer* status_consumer,
const policy::EnrollmentConfig& enrollment_config,
const std::string& enrolling_user_domain) {
EnterpriseEnrollmentHelperMock* mock =
new EnterpriseEnrollmentHelperMock(status_consumer);
EXPECT_EQ(enrollment_config.mode,
policy::EnrollmentConfig::MODE_OFFLINE_DEMO);
EXPECT_CALL(*mock, EnrollForOfflineDemo())
.WillRepeatedly(testing::Invoke([mock]() {
if (result == SetupResult::SUCCESS) {
mock->status_consumer()->OnDeviceEnrolled("");
} else {
// TODO(agawronska): Test different error types.
mock->status_consumer()->OnEnrollmentError(
policy::EnrollmentStatus::ForStatus(
policy::EnrollmentStatus::Status::LOCK_ERROR));
}
}));
return mock;
}
DemoSetupControllerTest() = default;
~DemoSetupControllerTest() override = default;
......@@ -185,7 +137,8 @@ TEST_F(DemoSetupControllerTest, OfflineSuccess) {
ASSERT_TRUE(SetupDummyOfflineDir("test", &temp_dir));
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockOfflineEnrollmentHelperCreator<SetupResult::SUCCESS>);
&MockDemoModeOfflineEnrollmentHelperCreator<
DemoModeSetupResult::SUCCESS>);
policy::MockCloudPolicyStore mock_store;
EXPECT_CALL(mock_store, Store(_))
.WillOnce(testing::InvokeWithoutArgs(
......@@ -198,7 +151,8 @@ TEST_F(DemoSetupControllerTest, OfflineSuccess) {
TEST_F(DemoSetupControllerTest, OfflineDeviceLocalAccountPolicyLoadFailure) {
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockOfflineEnrollmentHelperCreator<SetupResult::SUCCESS>);
&MockDemoModeOfflineEnrollmentHelperCreator<
DemoModeSetupResult::SUCCESS>);
policy::MockCloudPolicyStore mock_store;
EXPECT_CALL(mock_store, Store(_)).Times(0);
......@@ -215,7 +169,8 @@ TEST_F(DemoSetupControllerTest, OfflineDeviceLocalAccountPolicyStoreFailed) {
ASSERT_TRUE(SetupDummyOfflineDir("test", &temp_dir));
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockOfflineEnrollmentHelperCreator<SetupResult::SUCCESS>);
&MockDemoModeOfflineEnrollmentHelperCreator<
DemoModeSetupResult::SUCCESS>);
policy::MockCloudPolicyStore mock_store;
EXPECT_CALL(mock_store, Store(_))
.WillOnce(testing::InvokeWithoutArgs(
......@@ -232,7 +187,8 @@ TEST_F(DemoSetupControllerTest, OfflineInvalidDeviceLocalAccountPolicyBlob) {
ASSERT_TRUE(SetupDummyOfflineDir("", &temp_dir));
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockOfflineEnrollmentHelperCreator<SetupResult::SUCCESS>);
&MockDemoModeOfflineEnrollmentHelperCreator<
DemoModeSetupResult::SUCCESS>);
tested_controller_->EnrollOffline(temp_dir.GetPath());
EXPECT_TRUE(delegate_->WaitResult(false));
......@@ -244,7 +200,7 @@ TEST_F(DemoSetupControllerTest, OfflineError) {
ASSERT_TRUE(SetupDummyOfflineDir("test", &temp_dir));
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockOfflineEnrollmentHelperCreator<SetupResult::ERROR>);
&MockDemoModeOfflineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
policy::MockCloudPolicyStore mock_store;
EXPECT_CALL(mock_store, Store(_)).Times(0);
......@@ -257,7 +213,7 @@ TEST_F(DemoSetupControllerTest, OfflineError) {
TEST_F(DemoSetupControllerTest, OnlineSuccess) {
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockOnlineEnrollmentHelperCreator<SetupResult::SUCCESS>);
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::SUCCESS>);
tested_controller_->EnrollOnline();
EXPECT_TRUE(delegate_->WaitResult(true));
......@@ -265,7 +221,7 @@ TEST_F(DemoSetupControllerTest, OnlineSuccess) {
TEST_F(DemoSetupControllerTest, OnlineError) {
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockOnlineEnrollmentHelperCreator<SetupResult::ERROR>);
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
tested_controller_->EnrollOnline();
EXPECT_TRUE(delegate_->WaitResult(false));
......@@ -274,7 +230,7 @@ TEST_F(DemoSetupControllerTest, OnlineError) {
TEST_F(DemoSetupControllerTest, EnrollTwice) {
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockOnlineEnrollmentHelperCreator<SetupResult::ERROR>);
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
tested_controller_->EnrollOnline();
EXPECT_TRUE(delegate_->WaitResult(false));
......@@ -283,7 +239,7 @@ TEST_F(DemoSetupControllerTest, EnrollTwice) {
delegate_->Reset();
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockOnlineEnrollmentHelperCreator<SetupResult::SUCCESS>);
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::SUCCESS>);
tested_controller_->EnrollOnline();
EXPECT_TRUE(delegate_->WaitResult(true));
......
// Copyright 2018 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.
#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_DEMO_MODE_DEMO_SETUP_TEST_UTILS_H_
#define CHROME_BROWSER_CHROMEOS_LOGIN_DEMO_MODE_DEMO_SETUP_TEST_UTILS_H_
#include <string>
#include "chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper.h"
#include "chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_mock.h"
#include "chrome/browser/chromeos/policy/enrollment_config.h"
#include "chrome/browser/chromeos/policy/enrollment_status_chromeos.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chromeos {
namespace test {
// Result of Demo Mode setup.
enum class DemoModeSetupResult { SUCCESS, ERROR };
// Helper method that mocks EnterpriseEnrollmentHelper for online Demo Mode
// setup. It simulates specified Demo Mode enrollment |result|.
template <DemoModeSetupResult result>
EnterpriseEnrollmentHelper* MockDemoModeOnlineEnrollmentHelperCreator(
EnterpriseEnrollmentHelper::EnrollmentStatusConsumer* status_consumer,
const policy::EnrollmentConfig& enrollment_config,
const std::string& enrolling_user_domain) {
EnterpriseEnrollmentHelperMock* mock =
new EnterpriseEnrollmentHelperMock(status_consumer);
EXPECT_EQ(enrollment_config.mode, policy::EnrollmentConfig::MODE_ATTESTATION);
EXPECT_CALL(*mock, EnrollUsingAttestation())
.WillRepeatedly(testing::Invoke([mock]() {
if (result == DemoModeSetupResult::SUCCESS) {
mock->status_consumer()->OnDeviceEnrolled("");
} else {
// TODO(agawronska): Test different error types.
mock->status_consumer()->OnEnrollmentError(
policy::EnrollmentStatus::ForStatus(
policy::EnrollmentStatus::REGISTRATION_FAILED));
}
}));
return mock;
}
// Helper method that mocks EnterpriseEnrollmentHelper for offline Demo Mode
// setup. It simulates specified Demo Mode enrollment |result|.
template <DemoModeSetupResult result>
EnterpriseEnrollmentHelper* MockDemoModeOfflineEnrollmentHelperCreator(
EnterpriseEnrollmentHelper::EnrollmentStatusConsumer* status_consumer,
const policy::EnrollmentConfig& enrollment_config,
const std::string& enrolling_user_domain) {
EnterpriseEnrollmentHelperMock* mock =
new EnterpriseEnrollmentHelperMock(status_consumer);
EXPECT_EQ(enrollment_config.mode,
policy::EnrollmentConfig::MODE_OFFLINE_DEMO);
EXPECT_CALL(*mock, EnrollForOfflineDemo())
.WillRepeatedly(testing::Invoke([mock]() {
if (result == DemoModeSetupResult::SUCCESS) {
mock->status_consumer()->OnDeviceEnrolled("");
} else {
// TODO(agawronska): Test different error types.
mock->status_consumer()->OnEnrollmentError(
policy::EnrollmentStatus::ForStatus(
policy::EnrollmentStatus::Status::LOCK_ERROR));
}
}));
return mock;
}
} // namespace test
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_LOGIN_DEMO_MODE_DEMO_SETUP_TEST_UTILS_H_
......@@ -6,7 +6,9 @@
#include "base/command_line.h"
#include "base/run_loop.h"
#include "base/strings/strcat.h"
#include "base/timer/timer.h"
#include "chrome/browser/chromeos/login/demo_mode/demo_setup_test_utils.h"
#include "chrome/browser/chromeos/login/login_manager_test.h"
#include "chrome/browser/chromeos/login/screens/demo_setup_screen.h"
#include "chrome/browser/chromeos/login/test/js_checker.h"
......@@ -16,16 +18,59 @@
#include "chromeos/chromeos_switches.h"
#include "content/public/test/browser_test_utils.h"
using chromeos::test::DemoModeSetupResult;
using chromeos::test::MockDemoModeOfflineEnrollmentHelperCreator;
using chromeos::test::MockDemoModeOnlineEnrollmentHelperCreator;
namespace chromeos {
namespace {
constexpr char kIsConfirmationDialogHiddenQuery[] =
"!document.querySelector('.cr-dialog-container') || "
"!!document.querySelector('.cr-dialog-container').hidden";
constexpr char kDemoSetupContentQuery[] = "$('demo-setup-content')";
constexpr base::TimeDelta kJsConditionCheckFrequency =
base::TimeDelta::FromMilliseconds(200);
namespace {
// How js query is executed.
enum class JSExecution { kSync, kAsync };
// Buttons available on Demo Setup dialogs.
enum class OobeButton { kBack, kNext, kText };
// Dialogs that are a part of Demo Setup flow.
enum class DemoSetupDialog { kSettings, kProgress, kError };
// Returns js id of the given |button| type.
std::string OobeButtonToStringId(OobeButton button) {
switch (button) {
case OobeButton::kBack:
return "oobe-back-button";
case OobeButton::kNext:
return "oobe-next-button";
case OobeButton::kText:
return "oobe-text-button";
default:
NOTREACHED();
}
}
// Returns js id of the given |dialog|.
std::string DemoSetupDialogToStringId(DemoSetupDialog dialog) {
switch (dialog) {
case DemoSetupDialog::kSettings:
return "demoSetupSettingsDialog";
case DemoSetupDialog::kProgress:
return "demoSetupProgressDialog";
case DemoSetupDialog::kError:
return "demoSetupErrorDialog";
default:
NOTREACHED();
}
}
// Waits for js condition to be fulfilled.
class JsConditionWaiter {
......@@ -93,6 +138,13 @@ class DemoSetupTest : public LoginManagerTest {
return !js_checker().GetBool(kIsConfirmationDialogHiddenQuery);
}
bool IsDemoSetupDialogShown(DemoSetupDialog dialog) {
const std::string query =
base::StrCat({"!", kDemoSetupContentQuery, ".$.",
DemoSetupDialogToStringId(dialog), ".hidden"});
return js_checker().GetBool(query);
}
void InvokeDemoMode() {
EXPECT_TRUE(JSExecute("cr.ui.Oobe.handleAccelerator('demo_mode');"));
}
......@@ -106,6 +158,38 @@ class DemoSetupTest : public LoginManagerTest {
JSExecute("document.querySelector('.cr-dialog-cancel').click();"));
}
void ClickOobeButton(DemoSetupDialog dialog,
OobeButton button,
JSExecution execution) {
const std::string query = base::StrCat(
{kDemoSetupContentQuery, ".$.", DemoSetupDialogToStringId(dialog),
".querySelector('", OobeButtonToStringId(button), "').click();"});
switch (execution) {
case JSExecution::kAsync:
JSExecuteAsync(query);
return;
case JSExecution::kSync:
EXPECT_TRUE(JSExecute(query));
return;
default:
NOTREACHED();
}
}
void SkipToDialog(DemoSetupDialog dialog) {
InvokeDemoMode();
ClickOkOnConfirmationDialog();
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
EXPECT_TRUE(IsDemoSetupShown());
const std::string query =
base::StrCat({kDemoSetupContentQuery, ".showScreenForTesting('",
DemoSetupDialogToStringId(dialog), "')"});
EXPECT_TRUE(JSExecute(query));
EXPECT_TRUE(IsDemoSetupDialogShown(dialog));
}
DemoSetupScreen* GetDemoSetupScreen() {
return static_cast<DemoSetupScreen*>(
WizardController::default_controller()->screen_manager()->GetScreen(
......@@ -122,6 +206,10 @@ class DemoSetupTest : public LoginManagerTest {
return content::ExecuteScript(web_contents(), script);
}
void JSExecuteAsync(const std::string& script) {
content::ExecuteScriptAsync(web_contents(), script);
}
DISALLOW_COPY_AND_ASSIGN(DemoSetupTest);
};
......@@ -147,4 +235,75 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, ShowConfirmationDialogAndCancel) {
EXPECT_FALSE(IsDemoSetupShown());
}
IN_PROC_BROWSER_TEST_F(DemoSetupTest, ProceedThroughSetupFlowSetupSuccess) {
// Simulate successful online setup.
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::SUCCESS>);
InvokeDemoMode();
ClickOkOnConfirmationDialog();
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
EXPECT_TRUE(IsDemoSetupShown());
EXPECT_TRUE(IsDemoSetupDialogShown(DemoSetupDialog::kSettings));
ClickOobeButton(DemoSetupDialog::kSettings, OobeButton::kNext,
JSExecution::kAsync);
EXPECT_TRUE(IsDemoSetupDialogShown(DemoSetupDialog::kProgress));
OobeScreenWaiter(OobeScreen::SCREEN_GAIA_SIGNIN).Wait();
}
IN_PROC_BROWSER_TEST_F(DemoSetupTest, ProceedThroughSetupFlowSetupError) {
// Simulate online setup failure.
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
InvokeDemoMode();
ClickOkOnConfirmationDialog();
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
EXPECT_TRUE(IsDemoSetupShown());
EXPECT_TRUE(IsDemoSetupDialogShown(DemoSetupDialog::kSettings));
ClickOobeButton(DemoSetupDialog::kSettings, OobeButton::kNext,
JSExecution::kAsync);
EXPECT_TRUE(IsDemoSetupDialogShown(DemoSetupDialog::kProgress));
// Wait for progress dialog to be hidden.
const std::string progress_dialog_hidden_query = base::StrCat(
{"!!", kDemoSetupContentQuery, ".$.",
DemoSetupDialogToStringId(DemoSetupDialog::kProgress), ".hidden"});
JsConditionWaiter(js_checker(), progress_dialog_hidden_query).Wait();
EXPECT_TRUE(IsDemoSetupDialogShown(DemoSetupDialog::kError));
ClickOobeButton(DemoSetupDialog::kError, OobeButton::kBack,
JSExecution::kAsync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_WELCOME).Wait();
}
IN_PROC_BROWSER_TEST_F(DemoSetupTest, BackOnSettingsScreen) {
SkipToDialog(DemoSetupDialog::kSettings);
ClickOobeButton(DemoSetupDialog::kSettings, OobeButton::kBack,
JSExecution::kAsync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_WELCOME).Wait();
}
IN_PROC_BROWSER_TEST_F(DemoSetupTest, RetryOnErrorScreen) {
// Simulate successful online setup after retry.
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::SUCCESS>);
SkipToDialog(DemoSetupDialog::kError);
ClickOobeButton(DemoSetupDialog::kError, OobeButton::kText,
JSExecution::kAsync);
EXPECT_TRUE(IsDemoSetupDialogShown(DemoSetupDialog::kProgress));
OobeScreenWaiter(OobeScreen::SCREEN_GAIA_SIGNIN).Wait();
}
} // namespace chromeos
......@@ -64,6 +64,7 @@ void DemoSetupScreen::OnUserAction(const std::string& action_id) {
void DemoSetupScreen::OnSetupError(bool fatal) {
// TODO(mukai): propagate |fatal| information and change the error message.
view_->OnSetupFinished(false, std::string());
}
void DemoSetupScreen::OnSetupSuccess() {
......
......@@ -5,6 +5,8 @@
#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_DEMO_SETUP_SCREEN_VIEW_H_
#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_DEMO_SETUP_SCREEN_VIEW_H_
#include <string>
#include "chrome/browser/chromeos/login/oobe_screen.h"
namespace chromeos {
......@@ -26,6 +28,9 @@ class DemoSetupScreenView {
// Sets view and screen.
virtual void Bind(DemoSetupScreen* screen) = 0;
// Handles setup result.
virtual void OnSetupFinished(bool is_success, const std::string& message) = 0;
};
} // namespace chromeos
......
......@@ -26,6 +26,8 @@ class MockDemoSetupScreenView : public DemoSetupScreenView {
MOCK_METHOD0(Show, void());
MOCK_METHOD0(Hide, void());
MOCK_METHOD1(MockBind, void(DemoSetupScreen* screen));
MOCK_METHOD2(OnSetupFinished,
void(bool is_success, const std::string& message));
void Bind(DemoSetupScreen* screen) override;
......
......@@ -3,5 +3,5 @@
* found in the LICENSE file. */
[slot='bottom-buttons'] {
-webkit-padding-end: 24px;
padding: 0 6px;
}
......@@ -2,17 +2,42 @@
<template>
<link rel="stylesheet" href="demo_setup.css">
<link rel="stylesheet" href="oobe_flex_layout.css">
<oobe-dialog id="demo-setup-dialog" role="dialog" has-buttons>
<h1 slot="title">Demo mode setup dev</h1>
<div slot="bottom-buttons" class="flex layout horizontal">
<oobe-back-button inverse on-tap="onBackButtonClicked_"></oobe-back-button>
<div class="flex"></div>
<oobe-text-button inverse on-tap="onOfflineSetupClicked_">
Offline setup
</oobe-text-button>
<oobe-text-button inverse on-tap="onOnlineSetupClicked_">
Online setup
<oobe-dialog id="demoSetupSettingsDialog" role="dialog" has-buttons>
<h1 slot="title">Choose demo mode settings</h1>
<div slot="footer" class="flex layout vertical">
<paper-radio-group id="setupGroup"
selectable="cr-radio-button" selected="onlineSetup">
<cr-radio-button name="onlineSetup"
class="options-list-item flex layout horizontal center">
<div>Online setup</div>
</cr-radio-button>
<cr-radio-button name="offlineSetup"
class="options-list-item flex layout horizontal center">
<div>Offline setup</div>
</cr-radio-button>
</paper-radio-group>
</div>
<div slot="bottom-buttons" class="layout horizontal justified">
<oobe-back-button inverse on-tap="onCloseClicked_"></oobe-back-button>
<oobe-next-button inverse on-tap="onNextClicked_"></oobe-next-button>
</div>
</oobe-dialog>
<oobe-dialog id="demoSetupProgressDialog" role="dialog" has-buttons hidden>
<h1 slot="title">Starting demo mode</h1>
</oobe-dialog>
<oobe-dialog id="demoSetupErrorDialog" role="dialog" has-buttons hidden>
<h1 slot="title">Couldn't start demo mode</h1>
<div slot="subtitle">Please try again</div>
<div slot="bottom-buttons" class="layout horizontal justified">
<oobe-back-button inverse on-tap="onCloseClicked_"></oobe-back-button>
<oobe-text-button inverse on-tap="onRetryClicked_">
<div>OK</div>
</oobe-text-button>
</div>
</oobe-dialog>
</template>
</dom-module>
......@@ -10,30 +10,116 @@
Polymer({
is: 'demo-setup-md',
properties: {
/**
* Whether offline demo setup was selected. Available setup types: online
* and offline.
*/
is_offline_setup_: {
type: Boolean,
value: false,
},
/** Ordered array of screen ids that are a part of demo setup flow. */
screens_: {
type: Array,
readonly: true,
value: function() {
return [
'demoSetupSettingsDialog', 'demoSetupProgressDialog',
'demoSetupErrorDialog'
];
},
},
},
/** Resets demo setup flow to the initial screen. */
reset: function() {
this.showScreen_(this.screens_[0]);
},
/**
* Called when demo mode setup finished.
* @param {string} isSuccess Whether demo setup finished successfully.
* @param {boolean} message Error message to be displayed to the user if setup
* finished with an error.
*/
onSetupFinished: function(isSuccess, message) {
if (!isSuccess) {
this.showScreen_('demoSetupErrorDialog');
}
},
/**
* Shows screen with the given id. Method exposed for testing environment.
* @param {string} id Screen id.
*/
showScreenForTesting: function(id) {
this.showScreen_(id);
},
/**
* Shows progress dialog and starts demo setup.
* @private
*/
startSetup_: function() {
this.showScreen_('demoSetupProgressDialog');
if (this.is_offline_setup_) {
chrome.send('login.DemoSetupScreen.userActed', ['offline-setup']);
} else {
chrome.send('login.DemoSetupScreen.userActed', ['online-setup']);
}
},
/**
* Shows screen with the given id.
* @param {string} id Screen id.
* @private
*/
showScreen_: function(id) {
this.hideScreens_();
var screen = this.$[id];
assert(screen);
screen.hidden = false;
screen.show();
},
/**
* Hides all screens to help switching from one screen to another.
* @private
*/
hideScreens_: function() {
for (let id of this.screens_) {
var screen = this.$[id];
assert(screen);
screen.hidden = true;
}
},
/**
* Online setup button click handler.
* Next button click handler.
* @private
*/
onOnlineSetupClicked_: function(e) {
chrome.send('login.DemoSetupScreen.userActed', ['online-setup']);
e.stopPropagation();
onNextClicked_: function() {
const selected = this.$.setupGroup.selected;
this.is_offline_setup_ = (selected == 'offlineSetup');
this.startSetup_();
},
/**
* Offline setup button click handler.
* Retry button click handler.
* @private
*/
onOfflineSetupClicked_: function(e) {
chrome.send('login.DemoSetupScreen.userActed', ['offline-setup']);
e.stopPropagation();
onRetryClicked_: function() {
this.startSetup_();
},
/**
* Close button click handler.
* @private
*/
onBackButtonClicked_: function(e) {
onCloseClicked_: function() {
chrome.send('login.DemoSetupScreen.userActed', ['close-setup']);
e.stopPropagation();
},
});
......@@ -8,8 +8,7 @@
login.createScreen('DemoSetupScreen', 'demo-setup', function() {
return {
UI_STATE: {ERROR: -1, DEFAULT: 0, PROCESSING: 1},
EXTERNAL_API: ['setState'],
EXTERNAL_API: ['onSetupFinished'],
get defaultControl() {
return $('demo-setup-content');
......@@ -17,15 +16,17 @@ login.createScreen('DemoSetupScreen', 'demo-setup', function() {
/** @override */
onBeforeShow: function(data) {
this.setState(this.UI_STATE.DEFAULT);
$('demo-setup-content').reset();
},
/**
* Sets state of the UI.
* @param {number} state.
* Called when demo mode setup finished.
* @param {boolean} isSuccess Whether demo setup finished successfully.
* @param {string} message Error message to be displayed to the user,
* populated if setup finished with an error.
*/
setState: function(state) {
this.state_ = state;
onSetupFinished: function(isSuccess, message) {
$('demo-setup-content').onSetupFinished(isSuccess, message);
},
};
});
......@@ -37,6 +37,11 @@ void DemoSetupScreenHandler::Bind(DemoSetupScreen* screen) {
BaseScreenHandler::SetBaseScreen(screen);
}
void DemoSetupScreenHandler::OnSetupFinished(bool is_success,
const std::string& message) {
CallJS("onSetupFinished", is_success, message);
}
void DemoSetupScreenHandler::Initialize() {}
void DemoSetupScreenHandler::DeclareLocalizedValues(
......
......@@ -24,6 +24,7 @@ class DemoSetupScreenHandler : public BaseScreenHandler,
void Show() override;
void Hide() override;
void Bind(DemoSetupScreen* screen) override;
void OnSetupFinished(bool is_success, const std::string& message) override;
// BaseScreenHandler:
void Initialize() override;
......@@ -31,14 +32,6 @@ class DemoSetupScreenHandler : public BaseScreenHandler,
::login::LocalizedValuesBuilder* builder) override;
private:
// Enumeration for UI states. These values have to be kept in sync with JS
// code in oobe_screen_demo_setup.js.
enum class UiState : int {
kError = -1, // Displaying error.
kDefault = 0, // Displaying initial UI.
kProcessing = 1, // Displaying setup in progress.
};
DemoSetupScreen* screen_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(DemoSetupScreenHandler);
......
......@@ -1597,6 +1597,7 @@ test("browser_tests") {
"../browser/chromeos/login/bluetooth_host_pairing_browsertest.cc",
"../browser/chromeos/login/crash_restore_browsertest.cc",
"../browser/chromeos/login/demo_mode/demo_app_launcher_browsertest.cc",
"../browser/chromeos/login/demo_mode/demo_setup_test_utils.h",
"../browser/chromeos/login/demo_setup_browsertest.cc",
"../browser/chromeos/login/enable_debugging_browsertest.cc",
"../browser/chromeos/login/enrollment/enrollment_screen_browsertest.cc",
......
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