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)