Commit 6f1cfb69 authored by Lucas Tenório's avatar Lucas Tenório Committed by Commit Bot

Skip other screens when finishing Supervision Onboarding.

With this change, we are showing the Supervision Onboarding screens right
after the ARC ToS screen. We are also skipping any screens that show after
a successful Supervision Onboarding.

This change also removes the ExitFlow() method for the WebviewHost
interface. Since this data was just looping back to the WebUI implementation,
we can just add a new C++ interface that bypasses the JS bridge.

TBR=ochang@chromium.org

Bug: 958995
Change-Id: I340c3899e8ca3d0bdb493ca487e682600467212a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1653388
Commit-Queue: Lucas Tenório <ltenorio@chromium.org>
Reviewed-by: default avatarMichael Giuffrida <michaelpg@chromium.org>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#668538}
parent 0e03d82f
...@@ -1968,6 +1968,7 @@ source_set("chromeos") { ...@@ -1968,6 +1968,7 @@ source_set("chromeos") {
"supervision/onboarding_constants.h", "supervision/onboarding_constants.h",
"supervision/onboarding_controller_impl.cc", "supervision/onboarding_controller_impl.cc",
"supervision/onboarding_controller_impl.h", "supervision/onboarding_controller_impl.h",
"supervision/onboarding_delegate.h",
"supervision/onboarding_flow_model.cc", "supervision/onboarding_flow_model.cc",
"supervision/onboarding_flow_model.h", "supervision/onboarding_flow_model.h",
"supervision/onboarding_logger.cc", "supervision/onboarding_logger.cc",
......
...@@ -12,15 +12,10 @@ ...@@ -12,15 +12,10 @@
#include "components/version_info/version_info.h" #include "components/version_info/version_info.h"
namespace chromeos { namespace chromeos {
namespace {
constexpr const char kFinishedUserAction[] = "setup-finished";
} // namespace
SupervisionOnboardingScreen::SupervisionOnboardingScreen( SupervisionOnboardingScreen::SupervisionOnboardingScreen(
SupervisionOnboardingScreenView* view, SupervisionOnboardingScreenView* view,
const base::RepeatingClosure& exit_callback) const ScreenExitCallback& exit_callback)
: BaseScreen(SupervisionOnboardingScreenView::kScreenId), : BaseScreen(SupervisionOnboardingScreenView::kScreenId),
view_(view), view_(view),
exit_callback_(exit_callback) { exit_callback_(exit_callback) {
...@@ -49,7 +44,7 @@ void SupervisionOnboardingScreen::Show() { ...@@ -49,7 +44,7 @@ void SupervisionOnboardingScreen::Show() {
} }
#endif #endif
Exit(); SkipOnboarding();
} }
void SupervisionOnboardingScreen::Hide() { void SupervisionOnboardingScreen::Hide() {
...@@ -57,22 +52,18 @@ void SupervisionOnboardingScreen::Hide() { ...@@ -57,22 +52,18 @@ void SupervisionOnboardingScreen::Hide() {
view_->Hide(); view_->Hide();
} }
void SupervisionOnboardingScreen::OnUserAction(const std::string& action_id) {
if (action_id == kFinishedUserAction) {
Exit();
return;
}
BaseScreen::OnUserAction(action_id);
}
void SupervisionOnboardingScreen::OnViewDestroyed( void SupervisionOnboardingScreen::OnViewDestroyed(
SupervisionOnboardingScreenView* view) { SupervisionOnboardingScreenView* view) {
if (view_ == view) if (view_ == view)
view_ = nullptr; view_ = nullptr;
} }
void SupervisionOnboardingScreen::Exit() { void SupervisionOnboardingScreen::SkipOnboarding() {
exit_callback_.Run(); exit_callback_.Run(Result::kSkipped);
}
void SupervisionOnboardingScreen::FinishOnboarding() {
exit_callback_.Run(Result::kFinished);
} }
} // namespace chromeos } // namespace chromeos
...@@ -10,31 +10,41 @@ ...@@ -10,31 +10,41 @@
#include "base/callback.h" #include "base/callback.h"
#include "base/macros.h" #include "base/macros.h"
#include "chrome/browser/chromeos/login/screens/base_screen.h" #include "chrome/browser/chromeos/login/screens/base_screen.h"
#include "chrome/browser/chromeos/supervision/onboarding_delegate.h"
namespace chromeos { namespace chromeos {
class SupervisionOnboardingScreenView; class SupervisionOnboardingScreenView;
class SupervisionOnboardingScreen : public BaseScreen { class SupervisionOnboardingScreen : public BaseScreen,
public supervision::OnboardingDelegate {
public: public:
enum class Result {
// User reached the end of the flow and exited successfully.
kFinished,
// User chose to skip the flow or we skipped the flow for internal reasons.
kSkipped,
};
using ScreenExitCallback = base::RepeatingCallback<void(Result result)>;
SupervisionOnboardingScreen(SupervisionOnboardingScreenView* view, SupervisionOnboardingScreen(SupervisionOnboardingScreenView* view,
const base::RepeatingClosure& exit_callback); const ScreenExitCallback& exit_callback);
~SupervisionOnboardingScreen() override; ~SupervisionOnboardingScreen() override;
// BaseScreen: // BaseScreen:
void Show() override; void Show() override;
void Hide() 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. // Called when view is destroyed so there's no dead reference to it.
void OnViewDestroyed(SupervisionOnboardingScreenView* view); void OnViewDestroyed(SupervisionOnboardingScreenView* view);
// Called when supervision onboarding has finished, exits the screen.
void Exit();
private: private:
// supervision::OnboardingDelegate:
void SkipOnboarding() override;
void FinishOnboarding() override;
SupervisionOnboardingScreenView* view_; SupervisionOnboardingScreenView* view_;
base::RepeatingClosure exit_callback_; ScreenExitCallback exit_callback_;
DISALLOW_COPY_AND_ASSIGN(SupervisionOnboardingScreen); DISALLOW_COPY_AND_ASSIGN(SupervisionOnboardingScreen);
}; };
......
...@@ -274,7 +274,7 @@ class SupervisionOnboardingBaseTest : public MixinBasedInProcessBrowserTest { ...@@ -274,7 +274,7 @@ class SupervisionOnboardingBaseTest : public MixinBasedInProcessBrowserTest {
SupervisionOnboardingScreen* supervision_onboarding_screen_; SupervisionOnboardingScreen* supervision_onboarding_screen_;
private: private:
void HandleScreenExit() { void HandleScreenExit(SupervisionOnboardingScreen::Result result) {
ASSERT_FALSE(screen_exited_); ASSERT_FALSE(screen_exited_);
screen_exited_ = true; screen_exited_ = true;
if (screen_exit_callback_) if (screen_exit_callback_)
......
...@@ -1078,14 +1078,7 @@ void WizardController::OnArcTermsOfServiceAccepted() { ...@@ -1078,14 +1078,7 @@ void WizardController::OnArcTermsOfServiceAccepted() {
return; return;
} }
// If the recommend app screen should be shown, show it after the user ShowSupervisionOnboardingScreen();
// finished with the PlayStore Terms of Service. Otherwise, advance to the
// assistant opt-in flow screen.
if (ShouldShowRecommendAppsScreen()) {
ShowRecommendAppsScreen();
} else {
ShowAssistantOptInFlowScreen();
}
} }
void WizardController::OnRecommendAppsScreenExit( void WizardController::OnRecommendAppsScreenExit(
...@@ -1117,7 +1110,7 @@ void WizardController::OnAssistantOptInFlowScreenExit() { ...@@ -1117,7 +1110,7 @@ void WizardController::OnAssistantOptInFlowScreenExit() {
void WizardController::OnMultiDeviceSetupScreenExit() { void WizardController::OnMultiDeviceSetupScreenExit() {
OnScreenExit(MultiDeviceSetupScreenView::kScreenId, 0 /* exit_code */); OnScreenExit(MultiDeviceSetupScreenView::kScreenId, 0 /* exit_code */);
ShowSupervisionOnboardingScreen(); OnOobeFlowFinished();
} }
void WizardController::OnResetScreenExit() { void WizardController::OnResetScreenExit() {
...@@ -1145,10 +1138,29 @@ void WizardController::OnDeviceModificationCanceled() { ...@@ -1145,10 +1138,29 @@ void WizardController::OnDeviceModificationCanceled() {
} }
} }
void WizardController::OnSupervisionOnboardingScreenExit() { void WizardController::OnSupervisionOnboardingScreenExit(
OnScreenExit(SupervisionOnboardingScreenView::kScreenId, 0 /* exit_code */); SupervisionOnboardingScreen::Result result) {
OnScreenExit(SupervisionOnboardingScreenView::kScreenId,
static_cast<int>(result));
OnOobeFlowFinished(); // In this case, the user went through the whole Supervision Onboarding flow
// successfully, so we should just finish the OOBE/Login here.
// Note: This intentionally skips the other screens like Assistant and
// recommended app downloads.
if (result == SupervisionOnboardingScreen::Result::kFinished) {
OnOobeFlowFinished();
return;
}
// If the recommend app screen should be shown, show it after the user
// skipped the Supervision Onboarding. Otherwise, advance to the
// assistant opt-in flow screen.
if (ShouldShowRecommendAppsScreen()) {
ShowRecommendAppsScreen();
return;
}
ShowAssistantOptInFlowScreen();
} }
void WizardController::OnSupervisionTransitionScreenExit() { void WizardController::OnSupervisionTransitionScreenExit() {
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "chrome/browser/chromeos/login/screens/kiosk_autolaunch_screen.h" #include "chrome/browser/chromeos/login/screens/kiosk_autolaunch_screen.h"
#include "chrome/browser/chromeos/login/screens/network_screen.h" #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/recommend_apps_screen.h"
#include "chrome/browser/chromeos/login/screens/supervision_onboarding_screen.h"
#include "chrome/browser/chromeos/login/screens/terms_of_service_screen.h" #include "chrome/browser/chromeos/login/screens/terms_of_service_screen.h"
#include "chrome/browser/chromeos/login/screens/update_screen.h" #include "chrome/browser/chromeos/login/screens/update_screen.h"
#include "chrome/browser/chromeos/policy/enrollment_config.h" #include "chrome/browser/chromeos/policy/enrollment_config.h"
...@@ -227,7 +228,8 @@ class WizardController { ...@@ -227,7 +228,8 @@ class WizardController {
void OnMultiDeviceSetupScreenExit(); void OnMultiDeviceSetupScreenExit();
void OnResetScreenExit(); void OnResetScreenExit();
void OnDeviceModificationCanceled(); void OnDeviceModificationCanceled();
void OnSupervisionOnboardingScreenExit(); void OnSupervisionOnboardingScreenExit(
SupervisionOnboardingScreen::Result result);
void OnSupervisionTransitionScreenExit(); void OnSupervisionTransitionScreenExit();
void OnOobeFlowFinished(); void OnOobeFlowFinished();
......
...@@ -70,12 +70,6 @@ interface OnboardingWebviewHost { ...@@ -70,12 +70,6 @@ interface OnboardingWebviewHost {
// Requests the host to load the given page. // Requests the host to load the given page.
LoadPage(OnboardingPage page) => (OnboardingLoadPageResult result); LoadPage(OnboardingPage page) => (OnboardingLoadPageResult result);
// Requests that the host exit the flow immediately. This might mean
// different things depending on the type of host. If we are running in OOBE
// we will exit the supervision screen and move to the next OOBE step, if we
// are running in a custom WebUI, we should close it.
ExitFlow();
}; };
// Result of a LoadPage call. Contains data about errors and custom data // Result of a LoadPage call. Contains data about errors and custom data
......
...@@ -15,8 +15,9 @@ ...@@ -15,8 +15,9 @@
namespace chromeos { namespace chromeos {
namespace supervision { namespace supervision {
OnboardingControllerImpl::OnboardingControllerImpl(Profile* profile) OnboardingControllerImpl::OnboardingControllerImpl(Profile* profile,
: flow_model_(std::make_unique<OnboardingFlowModel>(profile)), OnboardingDelegate* delegate)
: flow_model_(std::make_unique<OnboardingFlowModel>(profile, delegate)),
presenter_(std::make_unique<OnboardingPresenter>(flow_model_.get())), presenter_(std::make_unique<OnboardingPresenter>(flow_model_.get())),
logger_(std::make_unique<OnboardingLogger>(flow_model_.get())), logger_(std::make_unique<OnboardingLogger>(flow_model_.get())),
kiosk_next_observer_( kiosk_next_observer_(
......
...@@ -16,6 +16,7 @@ class Profile; ...@@ -16,6 +16,7 @@ class Profile;
namespace chromeos { namespace chromeos {
namespace supervision { namespace supervision {
class OnboardingDelegate;
class OnboardingFlowModel; class OnboardingFlowModel;
class OnboardingPresenter; class OnboardingPresenter;
class OnboardingLogger; class OnboardingLogger;
...@@ -23,7 +24,8 @@ class KioskNextFlowObserver; ...@@ -23,7 +24,8 @@ class KioskNextFlowObserver;
class OnboardingControllerImpl : public mojom::OnboardingController { class OnboardingControllerImpl : public mojom::OnboardingController {
public: public:
explicit OnboardingControllerImpl(Profile* profile); explicit OnboardingControllerImpl(Profile* profile,
OnboardingDelegate* delegate);
~OnboardingControllerImpl() override; ~OnboardingControllerImpl() override;
void BindRequest(mojom::OnboardingControllerRequest request); void BindRequest(mojom::OnboardingControllerRequest request);
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "base/test/scoped_feature_list.h" #include "base/test/scoped_feature_list.h"
#include "chrome/browser/chromeos/supervision/mojom/onboarding_controller.mojom.h" #include "chrome/browser/chromeos/supervision/mojom/onboarding_controller.mojom.h"
#include "chrome/browser/chromeos/supervision/onboarding_constants.h" #include "chrome/browser/chromeos/supervision/onboarding_constants.h"
#include "chrome/browser/chromeos/supervision/onboarding_delegate.h"
#include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/test_extension_system.h" #include "chrome/browser/extensions/test_extension_system.h"
#include "chrome/browser/signin/identity_test_environment_profile_adaptor.h" #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
...@@ -32,6 +33,32 @@ const char kFakeAccessToken[] = "fake-access-token"; ...@@ -32,6 +33,32 @@ const char kFakeAccessToken[] = "fake-access-token";
} // namespace } // namespace
class FakeOnboardingDelegate : public OnboardingDelegate {
public:
~FakeOnboardingDelegate() override {}
bool finished_onboarding() { return finished_; }
bool skipped_onboarding() { return skipped_; }
private:
// OnboardingDelegate:
void SkipOnboarding() override {
ASSERT_FALSE(finished_);
ASSERT_FALSE(skipped_);
skipped_ = true;
}
void FinishOnboarding() override {
ASSERT_FALSE(finished_);
ASSERT_FALSE(skipped_);
finished_ = true;
}
bool skipped_ = false;
bool finished_ = false;
};
class FakeOnboardingWebviewHost : mojom::OnboardingWebviewHost { class FakeOnboardingWebviewHost : mojom::OnboardingWebviewHost {
public: public:
explicit FakeOnboardingWebviewHost( explicit FakeOnboardingWebviewHost(
...@@ -66,8 +93,6 @@ class FakeOnboardingWebviewHost : mojom::OnboardingWebviewHost { ...@@ -66,8 +93,6 @@ class FakeOnboardingWebviewHost : mojom::OnboardingWebviewHost {
presentations_.clear(); presentations_.clear();
} }
bool exited_flow() const { return exited_flow_; }
const base::Optional<mojom::OnboardingPage>& page_loaded() { const base::Optional<mojom::OnboardingPage>& page_loaded() {
return page_loaded_; return page_loaded_;
} }
...@@ -83,26 +108,16 @@ class FakeOnboardingWebviewHost : mojom::OnboardingWebviewHost { ...@@ -83,26 +108,16 @@ class FakeOnboardingWebviewHost : mojom::OnboardingWebviewHost {
void LoadPage(mojom::OnboardingPagePtr page, void LoadPage(mojom::OnboardingPagePtr page,
LoadPageCallback callback) override { LoadPageCallback callback) override {
ASSERT_FALSE(exited_flow_);
page_loaded_ = *page; page_loaded_ = *page;
std::move(callback).Run(load_page_result_.Clone()); std::move(callback).Run(load_page_result_.Clone());
} }
void ExitFlow() override {
ASSERT_FALSE(exited_flow_);
exited_flow_ = true;
}
mojo::Binding<mojom::OnboardingWebviewHost> binding_; mojo::Binding<mojom::OnboardingWebviewHost> binding_;
mojom::OnboardingLoadPageResult load_page_result_{ mojom::OnboardingLoadPageResult load_page_result_{
net::Error::OK, kDeviceOnboardingExperimentName}; net::Error::OK, kDeviceOnboardingExperimentName};
bool exited_flow_ = false;
std::vector<mojom::OnboardingPresentationPtr> presentations_; std::vector<mojom::OnboardingPresentationPtr> presentations_;
base::Optional<mojom::OnboardingPage> page_loaded_; base::Optional<mojom::OnboardingPage> page_loaded_;
...@@ -129,7 +144,9 @@ class OnboardingControllerBaseTest : public testing::Test { ...@@ -129,7 +144,9 @@ class OnboardingControllerBaseTest : public testing::Test {
base::CommandLine::ForCurrentProcess(), base::FilePath(), base::CommandLine::ForCurrentProcess(), base::FilePath(),
/*autoupdate_enabled=*/false); /*autoupdate_enabled=*/false);
controller_impl_ = std::make_unique<OnboardingControllerImpl>(profile()); delegate_ = std::make_unique<FakeOnboardingDelegate>();
controller_impl_ =
std::make_unique<OnboardingControllerImpl>(profile(), delegate());
controller_impl_->BindRequest(mojo::MakeRequest(&controller_)); controller_impl_->BindRequest(mojo::MakeRequest(&controller_));
} }
...@@ -213,6 +230,8 @@ class OnboardingControllerBaseTest : public testing::Test { ...@@ -213,6 +230,8 @@ class OnboardingControllerBaseTest : public testing::Test {
return identity_test_env_adaptor_->identity_test_env(); return identity_test_env_adaptor_->identity_test_env();
} }
FakeOnboardingDelegate* delegate() { return delegate_.get(); }
FakeOnboardingWebviewHost* webview_host() { return webview_host_.get(); } FakeOnboardingWebviewHost* webview_host() { return webview_host_.get(); }
private: private:
...@@ -220,6 +239,7 @@ class OnboardingControllerBaseTest : public testing::Test { ...@@ -220,6 +239,7 @@ class OnboardingControllerBaseTest : public testing::Test {
std::unique_ptr<TestingProfile> profile_; std::unique_ptr<TestingProfile> profile_;
std::unique_ptr<IdentityTestEnvironmentProfileAdaptor> std::unique_ptr<IdentityTestEnvironmentProfileAdaptor>
identity_test_env_adaptor_; identity_test_env_adaptor_;
std::unique_ptr<FakeOnboardingDelegate> delegate_;
std::unique_ptr<OnboardingControllerImpl> controller_impl_; std::unique_ptr<OnboardingControllerImpl> controller_impl_;
mojom::OnboardingControllerPtr controller_; mojom::OnboardingControllerPtr controller_;
std::unique_ptr<FakeOnboardingWebviewHost> webview_host_; std::unique_ptr<FakeOnboardingWebviewHost> webview_host_;
...@@ -242,7 +262,7 @@ class OnboardingControllerFlowDisabledTest ...@@ -242,7 +262,7 @@ class OnboardingControllerFlowDisabledTest
TEST_F(OnboardingControllerFlowDisabledTest, ExitFlowWhenFlowIsDisabled) { TEST_F(OnboardingControllerFlowDisabledTest, ExitFlowWhenFlowIsDisabled) {
BindHostAndReturnLoadPageSuccess(); BindHostAndReturnLoadPageSuccess();
EXPECT_TRUE(webview_host()->exited_flow()); EXPECT_TRUE(delegate()->skipped_onboarding());
} }
TEST_F(OnboardingControllerFlowDisabledTest, TEST_F(OnboardingControllerFlowDisabledTest,
...@@ -344,7 +364,8 @@ TEST_F(OnboardingControllerTest, OverridePageUrlsByCommandLine) { ...@@ -344,7 +364,8 @@ TEST_F(OnboardingControllerTest, OverridePageUrlsByCommandLine) {
TEST_F(OnboardingControllerTest, StayInFlowWhenLoadSucceeds) { TEST_F(OnboardingControllerTest, StayInFlowWhenLoadSucceeds) {
BindHostAndReturnLoadPageSuccess(); BindHostAndReturnLoadPageSuccess();
EXPECT_FALSE(webview_host()->exited_flow()); EXPECT_FALSE(delegate()->skipped_onboarding());
EXPECT_FALSE(delegate()->finished_onboarding());
} }
TEST_F(OnboardingControllerTest, PresentReadyStateWhenLoadSucceeds) { TEST_F(OnboardingControllerTest, PresentReadyStateWhenLoadSucceeds) {
...@@ -372,7 +393,7 @@ TEST_F(OnboardingControllerTest, ExitFlowOnAuthError) { ...@@ -372,7 +393,7 @@ TEST_F(OnboardingControllerTest, ExitFlowOnAuthError) {
BindHostAndSetupFailedAuth(); BindHostAndSetupFailedAuth();
EXPECT_FALSE(webview_host()->page_loaded().has_value()); EXPECT_FALSE(webview_host()->page_loaded().has_value());
EXPECT_TRUE(webview_host()->exited_flow()); EXPECT_TRUE(delegate()->skipped_onboarding());
} }
TEST_F(OnboardingControllerTest, PresentOnlyLoadingStateOnAuthError) { TEST_F(OnboardingControllerTest, PresentOnlyLoadingStateOnAuthError) {
...@@ -393,7 +414,7 @@ TEST_F(OnboardingControllerTest, SetNotEligibleForKioskNextOnAuthError) { ...@@ -393,7 +414,7 @@ TEST_F(OnboardingControllerTest, SetNotEligibleForKioskNextOnAuthError) {
TEST_F(OnboardingControllerTest, ExitFlowOnLoadPageError) { TEST_F(OnboardingControllerTest, ExitFlowOnLoadPageError) {
BindHostAndReturnLoadPageError(); BindHostAndReturnLoadPageError();
EXPECT_TRUE(webview_host()->exited_flow()); EXPECT_TRUE(delegate()->skipped_onboarding());
} }
TEST_F(OnboardingControllerTest, PresentOnlyLoadingStateOnLoadPageError) { TEST_F(OnboardingControllerTest, PresentOnlyLoadingStateOnLoadPageError) {
...@@ -414,7 +435,7 @@ TEST_F(OnboardingControllerTest, SetNotEligibleForKioskNextOnLoadPageError) { ...@@ -414,7 +435,7 @@ TEST_F(OnboardingControllerTest, SetNotEligibleForKioskNextOnLoadPageError) {
TEST_F(OnboardingControllerTest, ExitFlowWhenHeaderValueIsMissing) { TEST_F(OnboardingControllerTest, ExitFlowWhenHeaderValueIsMissing) {
BindHostAndReturnMissingCustomHeader(); BindHostAndReturnMissingCustomHeader();
EXPECT_TRUE(webview_host()->exited_flow()); EXPECT_TRUE(delegate()->skipped_onboarding());
} }
TEST_F(OnboardingControllerTest, TEST_F(OnboardingControllerTest,
...@@ -438,7 +459,7 @@ TEST_F(OnboardingControllerTest, ...@@ -438,7 +459,7 @@ TEST_F(OnboardingControllerTest,
TEST_F(OnboardingControllerTest, ExitFlowWhenHeaderValueIsWrong) { TEST_F(OnboardingControllerTest, ExitFlowWhenHeaderValueIsWrong) {
BindHostAndReturnWrongCustomHeader(); BindHostAndReturnWrongCustomHeader();
EXPECT_TRUE(webview_host()->exited_flow()); EXPECT_TRUE(delegate()->skipped_onboarding());
} }
TEST_F(OnboardingControllerTest, TEST_F(OnboardingControllerTest,
...@@ -462,13 +483,14 @@ TEST_F(OnboardingControllerTest, ...@@ -462,13 +483,14 @@ TEST_F(OnboardingControllerTest,
TEST_F(OnboardingControllerTest, StayInFlowWhenNavigatingToDetailsPage) { TEST_F(OnboardingControllerTest, StayInFlowWhenNavigatingToDetailsPage) {
NavigateToDetailsPage(); NavigateToDetailsPage();
EXPECT_FALSE(webview_host()->exited_flow()); EXPECT_FALSE(delegate()->skipped_onboarding());
EXPECT_FALSE(delegate()->finished_onboarding());
} }
TEST_F(OnboardingControllerTest, DetailsPageExitsFlowOnFailedPageLoad) { TEST_F(OnboardingControllerTest, DetailsPageExitsFlowOnFailedPageLoad) {
NavigateToDetailsPage(/*return_error=*/true); NavigateToDetailsPage(/*return_error=*/true);
EXPECT_TRUE(webview_host()->exited_flow()); EXPECT_TRUE(delegate()->skipped_onboarding());
} }
TEST_F(OnboardingControllerTest, DetailsPageIsPresentedCorrectly) { TEST_F(OnboardingControllerTest, DetailsPageIsPresentedCorrectly) {
...@@ -500,13 +522,14 @@ TEST_F(OnboardingControllerTest, DetailsPageIsLoadedCorrectly) { ...@@ -500,13 +522,14 @@ TEST_F(OnboardingControllerTest, DetailsPageIsLoadedCorrectly) {
TEST_F(OnboardingControllerTest, StayInFlowWhenNavigatingToAllSetPage) { TEST_F(OnboardingControllerTest, StayInFlowWhenNavigatingToAllSetPage) {
NavigateToAllSetPage(); NavigateToAllSetPage();
EXPECT_FALSE(webview_host()->exited_flow()); EXPECT_FALSE(delegate()->skipped_onboarding());
EXPECT_FALSE(delegate()->finished_onboarding());
} }
TEST_F(OnboardingControllerTest, AllSetPageExitsFlowOnFailedPageLoad) { TEST_F(OnboardingControllerTest, AllSetPageExitsFlowOnFailedPageLoad) {
NavigateToAllSetPage(/*return_error=*/true); NavigateToAllSetPage(/*return_error=*/true);
EXPECT_TRUE(webview_host()->exited_flow()); EXPECT_TRUE(delegate()->skipped_onboarding());
} }
TEST_F(OnboardingControllerTest, AllSetPageIsPresentedCorrectly) { TEST_F(OnboardingControllerTest, AllSetPageIsPresentedCorrectly) {
...@@ -538,9 +561,9 @@ TEST_F(OnboardingControllerTest, AllSetPageIsLoadedCorrectly) { ...@@ -538,9 +561,9 @@ TEST_F(OnboardingControllerTest, AllSetPageIsLoadedCorrectly) {
TEST_F(OnboardingControllerTest, AllSetPageCanFinishFlow) { TEST_F(OnboardingControllerTest, AllSetPageCanFinishFlow) {
NavigateToAllSetPage(); NavigateToAllSetPage();
EXPECT_FALSE(webview_host()->exited_flow()); EXPECT_FALSE(delegate()->finished_onboarding());
HandleAction(mojom::OnboardingAction::kShowNextPage); HandleAction(mojom::OnboardingAction::kShowNextPage);
EXPECT_TRUE(webview_host()->exited_flow()); EXPECT_TRUE(delegate()->finished_onboarding());
} }
TEST_F(OnboardingControllerTest, AllSetPageEnablesKioskNext) { TEST_F(OnboardingControllerTest, AllSetPageEnablesKioskNext) {
......
// 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_SUPERVISION_ONBOARDING_DELEGATE_H_
#define CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_DELEGATE_H_
namespace chromeos {
namespace supervision {
// Interface for classes that host the Supervision Onboarding flow. Since the
// flow might be hosted by different WebUIs, this is the common interface used
// to communicate between internal onboarding classes and their WebUI handlers.
class OnboardingDelegate {
public:
virtual ~OnboardingDelegate() {}
// Called when we want to skip the onboarding flow. This can happen if the
// user actively skipped the flow or we decided that the flow should be
// skipped for other reasons (errors, missing flags, eligibility, etc).
virtual void SkipOnboarding() = 0;
// Called when the user successfully finishes the onboarding flow by reaching
// its conclusion.
virtual void FinishOnboarding() = 0;
};
} // namespace supervision
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_DELEGATE_H_
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/logging.h" #include "base/logging.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "chrome/browser/chromeos/supervision/onboarding_constants.h" #include "chrome/browser/chromeos/supervision/onboarding_constants.h"
#include "chrome/browser/chromeos/supervision/onboarding_delegate.h"
#include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/signin/identity_manager_factory.h"
#include "chromeos/constants/chromeos_switches.h" #include "chromeos/constants/chromeos_switches.h"
#include "services/identity/public/cpp/primary_account_access_token_fetcher.h" #include "services/identity/public/cpp/primary_account_access_token_fetcher.h"
...@@ -41,8 +42,9 @@ GURL SupervisionServerBaseUrl() { ...@@ -41,8 +42,9 @@ GURL SupervisionServerBaseUrl() {
} // namespace } // namespace
OnboardingFlowModel::OnboardingFlowModel(Profile* profile) OnboardingFlowModel::OnboardingFlowModel(Profile* profile,
: profile_(profile) {} OnboardingDelegate* delegate)
: profile_(profile), delegate_(delegate) {}
OnboardingFlowModel::~OnboardingFlowModel() = default; OnboardingFlowModel::~OnboardingFlowModel() = default;
...@@ -82,8 +84,13 @@ void OnboardingFlowModel::ExitFlow(ExitReason reason) { ...@@ -82,8 +84,13 @@ void OnboardingFlowModel::ExitFlow(ExitReason reason) {
observer.WillExitFlow(current_step_, reason); observer.WillExitFlow(current_step_, reason);
} }
webview_host_->ExitFlow();
webview_host_ = nullptr; webview_host_ = nullptr;
if (reason == ExitReason::kUserReachedEnd) {
delegate_->FinishOnboarding();
return;
}
delegate_->SkipOnboarding();
} }
mojom::OnboardingWebviewHost& OnboardingFlowModel::GetWebviewHost() { mojom::OnboardingWebviewHost& OnboardingFlowModel::GetWebviewHost() {
......
...@@ -22,11 +22,13 @@ class PrimaryAccountAccessTokenFetcher; ...@@ -22,11 +22,13 @@ class PrimaryAccountAccessTokenFetcher;
namespace chromeos { namespace chromeos {
namespace supervision { namespace supervision {
class OnboardingDelegate;
// Class that manages the onboarding flow state, handling user actions and // Class that manages the onboarding flow state, handling user actions and
// loading new pages. It notifies its observers of flow changes. // loading new pages. It notifies its observers of flow changes.
class OnboardingFlowModel { class OnboardingFlowModel {
public: public:
explicit OnboardingFlowModel(Profile* profile); explicit OnboardingFlowModel(Profile* profile, OnboardingDelegate* delegate);
~OnboardingFlowModel(); ~OnboardingFlowModel();
// Represents each onboarding flow step. // Represents each onboarding flow step.
...@@ -97,6 +99,7 @@ class OnboardingFlowModel { ...@@ -97,6 +99,7 @@ class OnboardingFlowModel {
void LoadPageCallback(mojom::OnboardingLoadPageResultPtr result); void LoadPageCallback(mojom::OnboardingLoadPageResultPtr result);
Profile* profile_; Profile* profile_;
OnboardingDelegate* delegate_;
mojom::OnboardingWebviewHostPtr webview_host_; mojom::OnboardingWebviewHostPtr webview_host_;
Step current_step_ = Step::kStart; Step current_step_ = Step::kStart;
base::ObserverList<Observer> observer_list_; base::ObserverList<Observer> observer_list_;
......
...@@ -180,7 +180,6 @@ ...@@ -180,7 +180,6 @@
this.setPresentation_.bind(this)); this.setPresentation_.bind(this));
this.hostCallbackRouter_.loadPage.addListener( this.hostCallbackRouter_.loadPage.addListener(
this.webviewLoader_.loadPage.bind(this.webviewLoader_)); this.webviewLoader_.loadPage.bind(this.webviewLoader_));
this.hostCallbackRouter_.exitFlow.addListener(this.exitFlow_.bind(this));
this.controller_.bindWebviewHost(this.hostCallbackRouter_.createProxy()); this.controller_.bindWebviewHost(this.hostCallbackRouter_.createProxy());
}, },
...@@ -223,11 +222,5 @@ ...@@ -223,11 +222,5 @@
this.controller_.handleAction( this.controller_.handleAction(
chromeos.supervision.mojom.OnboardingAction.kShowNextPage); chromeos.supervision.mojom.OnboardingAction.kShowNextPage);
}, },
/** @private */
exitFlow_: function() {
chrome.send(
'login.SupervisionOnboardingScreen.userActed', ['setup-finished']);
},
}); });
} }
...@@ -20,9 +20,7 @@ constexpr StaticOobeScreenId SupervisionOnboardingScreenView::kScreenId; ...@@ -20,9 +20,7 @@ constexpr StaticOobeScreenId SupervisionOnboardingScreenView::kScreenId;
SupervisionOnboardingScreenHandler::SupervisionOnboardingScreenHandler( SupervisionOnboardingScreenHandler::SupervisionOnboardingScreenHandler(
JSCallsContainer* js_calls_container) JSCallsContainer* js_calls_container)
: BaseScreenHandler(kScreenId, js_calls_container) { : BaseScreenHandler(kScreenId, js_calls_container) {}
set_user_acted_method_path("login.SupervisionOnboardingScreen.userActed");
}
SupervisionOnboardingScreenHandler::~SupervisionOnboardingScreenHandler() { SupervisionOnboardingScreenHandler::~SupervisionOnboardingScreenHandler() {
if (screen_) if (screen_)
...@@ -48,6 +46,7 @@ void SupervisionOnboardingScreenHandler::Bind( ...@@ -48,6 +46,7 @@ void SupervisionOnboardingScreenHandler::Bind(
} }
void SupervisionOnboardingScreenHandler::Unbind() { void SupervisionOnboardingScreenHandler::Unbind() {
supervision_onboarding_controller_.reset();
screen_ = nullptr; screen_ = nullptr;
BaseScreenHandler::SetBaseScreen(nullptr); BaseScreenHandler::SetBaseScreen(nullptr);
} }
...@@ -68,10 +67,11 @@ void SupervisionOnboardingScreenHandler::Initialize() {} ...@@ -68,10 +67,11 @@ void SupervisionOnboardingScreenHandler::Initialize() {}
void SupervisionOnboardingScreenHandler::BindSupervisionOnboardingController( void SupervisionOnboardingScreenHandler::BindSupervisionOnboardingController(
supervision::mojom::OnboardingControllerRequest request) { supervision::mojom::OnboardingControllerRequest request) {
DCHECK(screen_);
if (!supervision_onboarding_controller_) { if (!supervision_onboarding_controller_) {
supervision_onboarding_controller_ = supervision_onboarding_controller_ =
std::make_unique<supervision::OnboardingControllerImpl>( std::make_unique<supervision::OnboardingControllerImpl>(
ProfileManager::GetPrimaryUserProfile()); ProfileManager::GetPrimaryUserProfile(), screen_);
} }
supervision_onboarding_controller_->BindRequest(std::move(request)); supervision_onboarding_controller_->BindRequest(std::move(request));
......
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