Add skeleton for Supervision Onboarding page.
This new OOBE/Login page will handle custom setup needed for
supervised/child accounts. At the moment this version does nothing and
simply shows a placeholder screen. It will only be shown if the user
has the "EnableSupervisionOnboardingScreens" feature enabled.
Bug: 958995
Change-Id: I2ddec65ddd25d7850a04b166ba332a86e47688e2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1594112
Commit-Queue: Lucas Tenório <ltenorio@chromium.org>
Reviewed-by: Alexander Alekseev <alemate@chromium.org>
Reviewed-by: Toni Baržić <tbarzic@chromium.org>
Cr-Commit-Position: refs/heads/master@{#657423}
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 4e602bc5..9d0e96e8d4 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -1309,6 +1309,8 @@
"login/screens/recommend_apps_screen.h",
"login/screens/reset_screen.cc",
"login/screens/reset_screen.h",
+ "login/screens/supervision_onboarding_screen.cc",
+ "login/screens/supervision_onboarding_screen.h",
"login/screens/supervision_transition_screen.cc",
"login/screens/supervision_transition_screen.h",
"login/screens/sync_consent_screen.cc",
diff --git a/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.cc b/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.cc
new file mode 100644
index 0000000..51b0410
--- /dev/null
+++ b/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.cc
@@ -0,0 +1,68 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/login/screens/supervision_onboarding_screen.h"
+
+#include "base/logging.h"
+#include "chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h"
+#include "chromeos/constants/chromeos_features.h"
+
+namespace chromeos {
+namespace {
+
+constexpr const char kFinishedUserAction[] = "setup-finished";
+
+} // namespace
+
+SupervisionOnboardingScreen::SupervisionOnboardingScreen(
+ SupervisionOnboardingScreenView* view,
+ const base::RepeatingClosure& exit_callback)
+ : BaseScreen(SupervisionOnboardingScreenView::kScreenId),
+ view_(view),
+ exit_callback_(exit_callback) {
+ if (view_)
+ view_->Bind(this);
+}
+
+SupervisionOnboardingScreen::~SupervisionOnboardingScreen() {
+ if (view_)
+ view_->Unbind();
+}
+
+void SupervisionOnboardingScreen::Show() {
+ // TODO(ltenorio): Show this screen only for supervised accounts when the
+ // test support is improved by b/959244.
+ if (view_ && base::FeatureList::IsEnabled(
+ features::kEnableSupervisionOnboardingScreens)) {
+ view_->Show();
+ return;
+ }
+
+ Exit();
+}
+
+void SupervisionOnboardingScreen::Hide() {
+ if (view_)
+ view_->Hide();
+}
+
+void SupervisionOnboardingScreen::OnUserAction(const std::string& action_id) {
+ if (action_id == kFinishedUserAction) {
+ Exit();
+ return;
+ }
+ BaseScreen::OnUserAction(action_id);
+}
+
+void SupervisionOnboardingScreen::OnViewDestroyed(
+ SupervisionOnboardingScreenView* view) {
+ if (view_ == view)
+ view_ = nullptr;
+}
+
+void SupervisionOnboardingScreen::Exit() {
+ exit_callback_.Run();
+}
+
+} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.h b/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.h
new file mode 100644
index 0000000..3a681c3
--- /dev/null
+++ b/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.h
@@ -0,0 +1,44 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_SUPERVISION_ONBOARDING_SCREEN_H_
+#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_SUPERVISION_ONBOARDING_SCREEN_H_
+
+#include <string>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "chrome/browser/chromeos/login/screens/base_screen.h"
+
+namespace chromeos {
+
+class SupervisionOnboardingScreenView;
+
+class SupervisionOnboardingScreen : public BaseScreen {
+ public:
+ SupervisionOnboardingScreen(SupervisionOnboardingScreenView* view,
+ const base::RepeatingClosure& exit_callback);
+ ~SupervisionOnboardingScreen() override;
+
+ // BaseScreen:
+ void Show() override;
+ void Hide() override;
+ void OnUserAction(const std::string& action_id) override;
+
+ // Called when view is destroyed so there's no dead reference to it.
+ void OnViewDestroyed(SupervisionOnboardingScreenView* view);
+
+ // Called when supervision onboarding has finished, exits the screen.
+ void Exit();
+
+ private:
+ SupervisionOnboardingScreenView* view_;
+ base::RepeatingClosure exit_callback_;
+
+ DISALLOW_COPY_AND_ASSIGN(SupervisionOnboardingScreen);
+};
+
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_SUPERVISION_ONBOARDING_SCREEN_H_
diff --git a/chrome/browser/chromeos/login/screens/supervision_onboarding_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/supervision_onboarding_screen_browsertest.cc
new file mode 100644
index 0000000..e9cb3b1
--- /dev/null
+++ b/chrome/browser/chromeos/login/screens/supervision_onboarding_screen_browsertest.cc
@@ -0,0 +1,144 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/login/screens/supervision_onboarding_screen.h"
+
+#include <initializer_list>
+#include <memory>
+
+#include "base/bind.h"
+#include "base/run_loop.h"
+#include "base/strings/string_piece.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/chromeos/login/login_wizard.h"
+#include "chrome/browser/chromeos/login/mixin_based_in_process_browser_test.h"
+#include "chrome/browser/chromeos/login/oobe_screen.h"
+#include "chrome/browser/chromeos/login/test/js_checker.h"
+#include "chrome/browser/chromeos/login/test/login_manager_mixin.h"
+#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
+#include "chrome/browser/chromeos/login/ui/login_display_host.h"
+#include "chrome/browser/chromeos/login/wizard_controller.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h"
+#include "chromeos/constants/chromeos_features.h"
+
+namespace chromeos {
+
+namespace {
+
+constexpr char kTestUser[] = "test-user1@gmail.com";
+
+chromeos::OobeUI* GetOobeUI() {
+ auto* host = chromeos::LoginDisplayHost::default_host();
+ return host ? host->GetOobeUI() : nullptr;
+}
+
+} // namespace
+
+class SupervisionOnboardingTest : public MixinBasedInProcessBrowserTest {
+ public:
+ SupervisionOnboardingTest() = default;
+ ~SupervisionOnboardingTest() override = default;
+
+ void SetUpOnMainThread() override {
+ login_manager_.LoginAndWaitForActiveSession(
+ LoginManagerMixin::CreateDefaultUserContext(test_user_));
+
+ ShowLoginWizard(OobeScreen::SCREEN_TEST_NO_WINDOW);
+ WizardController::default_controller()
+ ->screen_manager()
+ ->DeleteScreenForTesting(SupervisionOnboardingScreenView::kScreenId);
+ auto supervision_onboarding_screen =
+ std::make_unique<SupervisionOnboardingScreen>(
+ GetOobeUI()->GetView<SupervisionOnboardingScreenHandler>(),
+ base::BindRepeating(&SupervisionOnboardingTest::HandleScreenExit,
+ base::Unretained(this)));
+ supervision_onboarding_screen_ = supervision_onboarding_screen.get();
+ WizardController::default_controller()
+ ->screen_manager()
+ ->SetScreenForTesting(std::move(supervision_onboarding_screen));
+
+ MixinBasedInProcessBrowserTest::SetUpOnMainThread();
+ }
+
+ void TurnOnFeature() {
+ feature_list_.InitAndEnableFeature(
+ features::kEnableSupervisionOnboardingScreens);
+ }
+
+ void ShowAndWaitForScreen() {
+ supervision_onboarding_screen_->Show();
+
+ OobeScreenWaiter screen_waiter(SupervisionOnboardingScreenView::kScreenId);
+ screen_waiter.set_assert_next_screen();
+ screen_waiter.Wait();
+ }
+
+ void ClickButton(const std::string& button_id) {
+ std::initializer_list<base::StringPiece> button_path = {
+ "supervision-onboarding", button_id};
+ test::OobeJS().CreateEnabledWaiter(true, button_path)->Wait();
+ test::OobeJS().TapOnPath(button_path);
+ }
+
+ void WaitForScreenExit() {
+ if (screen_exited_)
+ return;
+
+ base::RunLoop run_loop;
+ screen_exit_callback_ = run_loop.QuitClosure();
+ run_loop.Run();
+ }
+
+ SupervisionOnboardingScreen* supervision_onboarding_screen_;
+ base::test::ScopedFeatureList feature_list_;
+
+ private:
+ void HandleScreenExit() {
+ ASSERT_FALSE(screen_exited_);
+ screen_exited_ = true;
+ if (screen_exit_callback_)
+ std::move(screen_exit_callback_).Run();
+ }
+
+ bool screen_exited_ = false;
+ base::OnceClosure screen_exit_callback_;
+
+ const LoginManagerMixin::TestUserInfo test_user_{
+ AccountId::FromUserEmailGaiaId(kTestUser, kTestUser)};
+ LoginManagerMixin login_manager_{&mixin_host_, {test_user_}};
+};
+
+IN_PROC_BROWSER_TEST_F(SupervisionOnboardingTest,
+ ExitImmediatelyWhenFeatureIsOff) {
+ supervision_onboarding_screen_->Show();
+ WaitForScreenExit();
+}
+
+IN_PROC_BROWSER_TEST_F(SupervisionOnboardingTest, NextButtonExitsScreen) {
+ TurnOnFeature();
+ ShowAndWaitForScreen();
+
+ ClickButton("next-button");
+ WaitForScreenExit();
+}
+
+IN_PROC_BROWSER_TEST_F(SupervisionOnboardingTest, BackButtonExitsScreen) {
+ TurnOnFeature();
+ ShowAndWaitForScreen();
+
+ ClickButton("back-button");
+ WaitForScreenExit();
+}
+
+IN_PROC_BROWSER_TEST_F(SupervisionOnboardingTest, SkipButtonExitsScreen) {
+ TurnOnFeature();
+ ShowAndWaitForScreen();
+
+ ClickButton("skip-button");
+ WaitForScreenExit();
+}
+
+} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc
index d521e29..0ce1a49 100644
--- a/chrome/browser/chromeos/login/wizard_controller.cc
+++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -64,6 +64,7 @@
#include "chrome/browser/chromeos/login/screens/network_screen.h"
#include "chrome/browser/chromeos/login/screens/recommend_apps_screen.h"
#include "chrome/browser/chromeos/login/screens/reset_screen.h"
+#include "chrome/browser/chromeos/login/screens/supervision_onboarding_screen.h"
#include "chrome/browser/chromeos/login/screens/supervision_transition_screen.h"
#include "chrome/browser/chromeos/login/screens/sync_consent_screen.h"
#include "chrome/browser/chromeos/login/screens/update_required_screen.h"
@@ -115,6 +116,7 @@
#include "chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/reset_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
+#include "chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h"
@@ -507,6 +509,10 @@
oobe_ui->GetView<DeviceDisabledScreenHandler>()));
append(std::make_unique<EncryptionMigrationScreen>(
oobe_ui->GetView<EncryptionMigrationScreenHandler>()));
+ append(std::make_unique<SupervisionOnboardingScreen>(
+ oobe_ui->GetView<SupervisionOnboardingScreenHandler>(),
+ base::BindRepeating(&WizardController::OnSupervisionOnboardingScreenExit,
+ weak_factory_.GetWeakPtr())));
append(std::make_unique<SupervisionTransitionScreen>(
oobe_ui->GetView<SupervisionTransitionScreenHandler>(),
base::BindRepeating(&WizardController::OnSupervisionTransitionScreenExit,
@@ -673,6 +679,10 @@
SetCurrentScreen(GetScreen(EncryptionMigrationScreenView::kScreenId));
}
+void WizardController::ShowSupervisionOnboardingScreen() {
+ SetCurrentScreen(GetScreen(SupervisionOnboardingScreenView::kScreenId));
+}
+
void WizardController::ShowSupervisionTransitionScreen() {
SetCurrentScreen(GetScreen(SupervisionTransitionScreenView::kScreenId));
}
@@ -1110,7 +1120,7 @@
void WizardController::OnMultiDeviceSetupScreenExit() {
OnScreenExit(MultiDeviceSetupScreenView::kScreenId, 0 /* exit_code */);
- OnOobeFlowFinished();
+ ShowSupervisionOnboardingScreen();
}
void WizardController::OnResetScreenExit() {
@@ -1138,6 +1148,12 @@
}
}
+void WizardController::OnSupervisionOnboardingScreenExit() {
+ OnScreenExit(SupervisionOnboardingScreenView::kScreenId, 0 /* exit_code */);
+
+ OnOobeFlowFinished();
+}
+
void WizardController::OnSupervisionTransitionScreenExit() {
OnScreenExit(SupervisionTransitionScreenView::kScreenId, 0 /* exit_code */);
@@ -1451,6 +1467,8 @@
ShowFingerprintSetupScreen();
} else if (screen == MarketingOptInScreenView::kScreenId) {
ShowMarketingOptInScreen();
+ } else if (screen == SupervisionOnboardingScreenView::kScreenId) {
+ ShowSupervisionOnboardingScreen();
} else if (screen == SupervisionTransitionScreenView::kScreenId) {
ShowSupervisionTransitionScreen();
} else if (screen != OobeScreen::SCREEN_TEST_NO_WINDOW) {
diff --git a/chrome/browser/chromeos/login/wizard_controller.h b/chrome/browser/chromeos/login/wizard_controller.h
index 0885efc..d8392d4 100644
--- a/chrome/browser/chromeos/login/wizard_controller.h
+++ b/chrome/browser/chromeos/login/wizard_controller.h
@@ -179,6 +179,7 @@
void ShowHIDDetectionScreen();
void ShowDeviceDisabledScreen();
void ShowEncryptionMigrationScreen();
+ void ShowSupervisionOnboardingScreen();
void ShowSupervisionTransitionScreen();
void ShowUpdateRequiredScreen();
void ShowAssistantOptInFlowScreen();
@@ -227,6 +228,7 @@
void OnMultiDeviceSetupScreenExit();
void OnResetScreenExit();
void OnDeviceModificationCanceled();
+ void OnSupervisionOnboardingScreenExit();
void OnSupervisionTransitionScreenExit();
void OnOobeFlowFinished();
diff --git a/chrome/browser/resources/chromeos/login/custom_elements_login.html b/chrome/browser/resources/chromeos/login/custom_elements_login.html
index 36d9825..8d4a561 100644
--- a/chrome/browser/resources/chromeos/login/custom_elements_login.html
+++ b/chrome/browser/resources/chromeos/login/custom_elements_login.html
@@ -31,5 +31,6 @@
<include src="marketing_opt_in.html">
<include src="../assistant_optin/assistant_optin_flow.html">
<include src="multidevice_setup_first_run.html">
+<include src="supervision_onboarding.html">
<script src="chrome://oobe/custom_elements.js"></script>
diff --git a/chrome/browser/resources/chromeos/login/custom_elements_login.js b/chrome/browser/resources/chromeos/login/custom_elements_login.js
index a1ade1a..7b2213f2 100644
--- a/chrome/browser/resources/chromeos/login/custom_elements_login.js
+++ b/chrome/browser/resources/chromeos/login/custom_elements_login.js
@@ -37,3 +37,4 @@
// <include src="marketing_opt_in.js">
// <include src="../assistant_optin/assistant_optin_flow.js">
// <include src="multidevice_setup_first_run.js">
+// <include src="supervision_onboarding.js">
diff --git a/chrome/browser/resources/chromeos/login/custom_elements_oobe.html b/chrome/browser/resources/chromeos/login/custom_elements_oobe.html
index 7a171df1..0253c63d 100644
--- a/chrome/browser/resources/chromeos/login/custom_elements_oobe.html
+++ b/chrome/browser/resources/chromeos/login/custom_elements_oobe.html
@@ -43,5 +43,6 @@
<include src="marketing_opt_in.html">
<include src="../assistant_optin/assistant_optin_flow.html">
<include src="multidevice_setup_first_run.html">
+<include src="supervision_onboarding.html">
<script src="chrome://oobe/custom_elements.js"></script>
diff --git a/chrome/browser/resources/chromeos/login/custom_elements_oobe.js b/chrome/browser/resources/chromeos/login/custom_elements_oobe.js
index ede58cd..9a2c065 100644
--- a/chrome/browser/resources/chromeos/login/custom_elements_oobe.js
+++ b/chrome/browser/resources/chromeos/login/custom_elements_oobe.js
@@ -54,3 +54,4 @@
// <include src="marketing_opt_in.js">
// <include src="../assistant_optin/assistant_optin_flow.js">
// <include src="multidevice_setup_first_run.js">
+// <include src="supervision_onboarding.js">
diff --git a/chrome/browser/resources/chromeos/login/md_login_screens.html b/chrome/browser/resources/chromeos/login/md_login_screens.html
index 50b8ee40..1cc43759 100644
--- a/chrome/browser/resources/chromeos/login/md_login_screens.html
+++ b/chrome/browser/resources/chromeos/login/md_login_screens.html
@@ -26,3 +26,6 @@
<include src="screen_discover.html">
<include src="screen_marketing_opt_in.html">
<include src="screen_multidevice_setup.html">
+<supervision-onboarding id="supervision-onboarding" class="step right hidden"
+ full-screen-dialog hidden>
+</supervision-onboarding>
diff --git a/chrome/browser/resources/chromeos/login/oobe_screens.html b/chrome/browser/resources/chromeos/login/oobe_screens.html
index 20498ab..2d23d58 100644
--- a/chrome/browser/resources/chromeos/login/oobe_screens.html
+++ b/chrome/browser/resources/chromeos/login/oobe_screens.html
@@ -36,3 +36,6 @@
<include src="screen_discover.html">
<include src="screen_marketing_opt_in.html">
<include src="screen_multidevice_setup.html">
+<supervision-onboarding id="supervision-onboarding" class="step right hidden"
+ full-screen-dialog hidden>
+</supervision-onboarding>
diff --git a/chrome/browser/resources/chromeos/login/supervision_onboarding.html b/chrome/browser/resources/chromeos/login/supervision_onboarding.html
new file mode 100644
index 0000000..71b426a
--- /dev/null
+++ b/chrome/browser/resources/chromeos/login/supervision_onboarding.html
@@ -0,0 +1,38 @@
+<!-- Copyright 2019 The Chromium Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file. -->
+
+<link rel="import" href="chrome://resources/html/polymer.html">
+
+<link rel="import" href="chrome://oobe/custom_elements.html">
+
+<!--
+ UI for the Supervision Onboarding flow that's displayed for the first login
+ or OOBE of supervised users. -->
+<dom-module id="supervision-onboarding">
+ <template>
+ <link rel="stylesheet" href="oobe_flex_layout.css">
+ <oobe-dialog id="supervision-onboarding-dialog" has-buttons>
+ <iron-icon src="chrome://oobe/supervision_icon.png" slot="oobe-icon"
+ aria-hidden="true">
+ </iron-icon>
+ <h1 slot="title">Placeholder Supervision Onboarding flow</h1>
+ <div slot="bottom-buttons" class="flex layout horizontal">
+ <oobe-back-button id="back-button"
+ on-tap="onBack_">
+ Back
+ </oobe-back-button>
+ <div class="flex">
+ </div>
+ <oobe-text-button id="skip-button"
+ border on-tap="onSkip_">
+ Skip
+ </oobe-text-button>
+ <oobe-text-button id="next-button"
+ inverse on-tap="onNext_">
+ Next
+ </oobe-text-button>
+ </div>
+ </oobe-dialog>
+ </template>
+</dom-module>
diff --git a/chrome/browser/resources/chromeos/login/supervision_onboarding.js b/chrome/browser/resources/chromeos/login/supervision_onboarding.js
new file mode 100644
index 0000000..79a48026
--- /dev/null
+++ b/chrome/browser/resources/chromeos/login/supervision_onboarding.js
@@ -0,0 +1,42 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview Supervision Onboarding polymer element. It forwards user input
+ * to the C++ handler.
+ */
+Polymer({
+ is: 'supervision-onboarding',
+
+ behaviors: [LoginScreenBehavior],
+
+ /** @override */
+ ready: function() {
+ this.initializeLoginScreen('SupervisionOnboardingScreen', {
+ commonScreenSize: true,
+ resetAllowed: true,
+ });
+ },
+
+ /** @private */
+ onBack_: function() {
+ this.exitSetupFlow_();
+ },
+
+ /** @private */
+ onSkip_: function() {
+ this.exitSetupFlow_();
+ },
+
+ /** @private */
+ onNext_: function() {
+ this.exitSetupFlow_();
+ },
+
+ /** @private */
+ exitSetupFlow_: function() {
+ chrome.send('login.SupervisionOnboardingScreen.userActed',
+ ['setup-finished']);
+ }
+});
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index fdb2a62..5f82efc 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1676,6 +1676,8 @@
"webui/chromeos/login/reset_screen_handler.h",
"webui/chromeos/login/signin_screen_handler.cc",
"webui/chromeos/login/signin_screen_handler.h",
+ "webui/chromeos/login/supervision_onboarding_screen_handler.cc",
+ "webui/chromeos/login/supervision_onboarding_screen_handler.h",
"webui/chromeos/login/supervision_transition_screen_handler.cc",
"webui/chromeos/login/supervision_transition_screen_handler.h",
"webui/chromeos/login/sync_consent_screen_handler.cc",
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
index 8e2a4e5..af629ff 100644
--- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -67,6 +67,7 @@
#include "chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/reset_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
+#include "chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h"
@@ -417,6 +418,9 @@
AddScreenHandler(std::make_unique<EncryptionMigrationScreenHandler>(
js_calls_container_.get()));
+ AddScreenHandler(std::make_unique<SupervisionOnboardingScreenHandler>(
+ js_calls_container_.get()));
+
AddScreenHandler(std::make_unique<SupervisionTransitionScreenHandler>(
js_calls_container_.get()));
diff --git a/chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.cc
new file mode 100644
index 0000000..13a8c15
--- /dev/null
+++ b/chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.cc
@@ -0,0 +1,54 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h"
+
+#include "base/bind.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/login/oobe_screen.h"
+#include "chrome/browser/chromeos/login/screens/supervision_onboarding_screen.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/ash/login_screen_client.h"
+#include "components/login/localized_values_builder.h"
+
+namespace chromeos {
+
+constexpr StaticOobeScreenId SupervisionOnboardingScreenView::kScreenId;
+
+SupervisionOnboardingScreenHandler::SupervisionOnboardingScreenHandler(
+ JSCallsContainer* js_calls_container)
+ : BaseScreenHandler(kScreenId, js_calls_container) {
+ set_user_acted_method_path("login.SupervisionOnboardingScreen.userActed");
+}
+
+SupervisionOnboardingScreenHandler::~SupervisionOnboardingScreenHandler() {
+ if (screen_)
+ screen_->OnViewDestroyed(this);
+}
+
+void SupervisionOnboardingScreenHandler::DeclareLocalizedValues(
+ ::login::LocalizedValuesBuilder* builder) {
+ // TODO(ltenorio): Add the strings for the back/next buttons here.
+}
+
+void SupervisionOnboardingScreenHandler::Bind(
+ SupervisionOnboardingScreen* screen) {
+ BaseScreenHandler::SetBaseScreen(screen);
+ screen_ = screen;
+}
+
+void SupervisionOnboardingScreenHandler::Unbind() {
+ screen_ = nullptr;
+ BaseScreenHandler::SetBaseScreen(nullptr);
+}
+
+void SupervisionOnboardingScreenHandler::Show() {
+ ShowScreen(kScreenId);
+}
+
+void SupervisionOnboardingScreenHandler::Hide() {}
+
+void SupervisionOnboardingScreenHandler::Initialize() {}
+
+} // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h
new file mode 100644
index 0000000..1464d653
--- /dev/null
+++ b/chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h
@@ -0,0 +1,73 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SUPERVISION_ONBOARDING_SCREEN_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SUPERVISION_ONBOARDING_SCREEN_HANDLER_H_
+
+#include <memory>
+#include <string>
+
+#include "base/macros.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
+#include "components/prefs/pref_change_registrar.h"
+
+namespace chromeos {
+
+class SupervisionOnboardingScreen;
+
+// Interface for dependency injection between SupervisionOnboardingScreen
+// and its WebUI representation.
+class SupervisionOnboardingScreenView {
+ public:
+ constexpr static StaticOobeScreenId kScreenId{"supervision-onboarding"};
+
+ virtual ~SupervisionOnboardingScreenView() {}
+
+ virtual void Bind(SupervisionOnboardingScreen* screen) = 0;
+ virtual void Unbind() = 0;
+ virtual void Show() = 0;
+ virtual void Hide() = 0;
+
+ protected:
+ SupervisionOnboardingScreenView() = default;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(SupervisionOnboardingScreenView);
+};
+
+class SupervisionOnboardingScreenHandler
+ : public BaseScreenHandler,
+ public SupervisionOnboardingScreenView {
+ public:
+ using TView = SupervisionOnboardingScreenView;
+
+ explicit SupervisionOnboardingScreenHandler(
+ JSCallsContainer* js_calls_container);
+ ~SupervisionOnboardingScreenHandler() override;
+
+ // BaseScreenHandler:
+ void DeclareLocalizedValues(
+ ::login::LocalizedValuesBuilder* builder) override;
+
+ // SupervisionOnboardingScreenView:
+ void Bind(SupervisionOnboardingScreen* screen) override;
+ void Unbind() override;
+ void Show() override;
+ void Hide() override;
+
+ private:
+ // BaseScreenHandler:
+ void Initialize() override;
+
+ SupervisionOnboardingScreen* screen_ = nullptr;
+
+ DISALLOW_COPY_AND_ASSIGN(SupervisionOnboardingScreenHandler);
+};
+
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SUPERVISION_ONBOARDING_SCREEN_HANDLER_H_
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 779e536..912e5cd 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1893,6 +1893,7 @@
"../browser/chromeos/login/screens/recommend_apps/scoped_test_recommend_apps_fetcher_factory.cc",
"../browser/chromeos/login/screens/recommend_apps/scoped_test_recommend_apps_fetcher_factory.h",
"../browser/chromeos/login/screens/recommend_apps_screen_browsertest.cc",
+ "../browser/chromeos/login/screens/supervision_onboarding_screen_browsertest.cc",
"../browser/chromeos/login/screens/update_screen_browsertest.cc",
"../browser/chromeos/login/screens/user_selection_screen_browsertest.cc",
"../browser/chromeos/login/screens/welcome_screen_browsertest.cc",
diff --git a/chromeos/constants/chromeos_features.cc b/chromeos/constants/chromeos_features.cc
index 8c98d08..e5d8204 100644
--- a/chromeos/constants/chromeos_features.cc
+++ b/chromeos/constants/chromeos_features.cc
@@ -67,6 +67,11 @@
const base::Feature kMyFilesVolume{"MyFilesVolume",
base::FEATURE_ENABLED_BY_DEFAULT};
+// If enabled, will display screens responsible for additional setup for
+// supervised users.
+const base::Feature kEnableSupervisionOnboardingScreens{
+ "EnableSupervisionOnboardingScreens", base::FEATURE_DISABLED_BY_DEFAULT};
+
// If enabled, will display blocking screens during re-authentication after a
// supervision transition occurred.
const base::Feature kEnableSupervisionTransitionScreens{
diff --git a/chromeos/constants/chromeos_features.h b/chromeos/constants/chromeos_features.h
index 18463f0..18e1512 100644
--- a/chromeos/constants/chromeos_features.h
+++ b/chromeos/constants/chromeos_features.h
@@ -39,6 +39,8 @@
COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const base::Feature kMojoDBusRelay;
COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const base::Feature kMyFilesVolume;
COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
+extern const base::Feature kEnableSupervisionOnboardingScreens;
+COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
extern const base::Feature kEnableSupervisionTransitionScreens;
COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const base::Feature kFsNosymfollow;
COMPONENT_EXPORT(CHROMEOS_CONSTANTS)