Commit 2fcb4124 authored by Roman Sorokin's avatar Roman Sorokin Committed by Commit Bot

oobe screens: Refactor user actions handling

* Added userActed function to the LoginScreenBehavior
* Migrated existing usages of 'userActed' actions
* Refactored screens with LoginScreenBehavior to use new mechanism

Bug: 1049083
Change-Id: Ie5a8b7cb750008d34c651233a14b696e601d97b9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2041610Reviewed-by: default avatarRoman Sorokin [CET] <rsorokin@chromium.org>
Reviewed-by: default avatarDenis Kuznetsov [CET] <antrim@chromium.org>
Commit-Queue: Roman Sorokin [CET] <rsorokin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#739352}
parent 03961775
......@@ -5,11 +5,20 @@
#include "chrome/browser/chromeos/login/screens/kiosk_enable_screen.h"
#include "base/logging.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/chromeos/customization/customization_document.h"
#include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/ui/webui/chromeos/login/kiosk_enable_screen_handler.h"
#include "content/public/browser/notification_details.h"
#include "content/public/browser/notification_service.h"
namespace chromeos {
namespace {
constexpr const char kClose[] = "close";
constexpr const char kEnable[] = "enable";
} // namespace
KioskEnableScreen::KioskEnableScreen(
KioskEnableScreenView* view,
......@@ -19,28 +28,74 @@ KioskEnableScreen::KioskEnableScreen(
exit_callback_(exit_callback) {
DCHECK(view_);
if (view_)
view_->SetDelegate(this);
view_->SetScreen(this);
}
KioskEnableScreen::~KioskEnableScreen() {
if (view_)
view_->SetDelegate(NULL);
}
void KioskEnableScreen::OnExit() {
exit_callback_.Run();
view_->SetScreen(nullptr);
}
void KioskEnableScreen::OnViewDestroyed(KioskEnableScreenView* view) {
if (view_ == view)
view_ = NULL;
view_ = nullptr;
}
void KioskEnableScreen::ShowImpl() {
if (view_)
view_->Show();
KioskAppManager::Get()->GetConsumerKioskAutoLaunchStatus(
base::Bind(&KioskEnableScreen::OnGetConsumerKioskAutoLaunchStatus,
weak_ptr_factory_.GetWeakPtr()));
}
void KioskEnableScreen::OnGetConsumerKioskAutoLaunchStatus(
KioskAppManager::ConsumerKioskAutoLaunchStatus status) {
is_configurable_ =
(status == KioskAppManager::CONSUMER_KIOSK_AUTO_LAUNCH_CONFIGURABLE);
if (!is_configurable_) {
LOG(WARNING) << "Consumer kiosk auto launch feature is not configurable!";
HandleClose();
return;
}
}
void KioskEnableScreen::HideImpl() {}
void KioskEnableScreen::OnUserAction(const std::string& action_id) {
if (action_id == kClose)
HandleClose();
else if (action_id == kEnable)
HandleEnable();
else
BaseScreen::OnUserAction(action_id);
}
void KioskEnableScreen::HandleClose() {
exit_callback_.Run();
}
void KioskEnableScreen::HandleEnable() {
if (!is_configurable_) {
NOTREACHED();
HandleClose();
return;
}
KioskAppManager::Get()->EnableConsumerKioskAutoLaunch(
base::Bind(&KioskEnableScreen::OnEnableConsumerKioskAutoLaunch,
weak_ptr_factory_.GetWeakPtr()));
}
void KioskEnableScreen::OnEnableConsumerKioskAutoLaunch(bool success) {
view_->ShowKioskEnabled(success);
if (!success) {
LOG(WARNING) << "Consumer kiosk mode can't be enabled!";
} else {
content::NotificationService::current()->Notify(
chrome::NOTIFICATION_KIOSK_ENABLED,
content::NotificationService::AllSources(),
content::NotificationService::NoDetails());
}
}
} // namespace chromeos
......@@ -10,6 +10,7 @@
#include "base/callback.h"
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
#include "chrome/browser/chromeos/login/screens/base_screen.h"
namespace chromeos {
......@@ -24,20 +25,34 @@ class KioskEnableScreen : public BaseScreen {
const base::RepeatingClosure& exit_callback);
~KioskEnableScreen() override;
// Called when screen is exited.
void OnExit();
// This method is called, when view is being destroyed. Note, if Delegate
// is destroyed earlier then it has to call SetDelegate(nullptr).
// This method is called, when view is being destroyed. Note, if Screen
// is destroyed earlier then it has to call SetScreen(nullptr).
void OnViewDestroyed(KioskEnableScreenView* view);
private:
// BaseScreen implementation:
void ShowImpl() override;
void HideImpl() override;
void OnUserAction(const std::string& action_id) override;
void HandleClose();
void HandleEnable();
// Callback for KioskAppManager::EnableConsumerModeKiosk().
void OnEnableConsumerKioskAutoLaunch(bool success);
// Callback for KioskAppManager::GetConsumerKioskModeStatus().
void OnGetConsumerKioskAutoLaunchStatus(
KioskAppManager::ConsumerKioskAutoLaunchStatus status);
KioskEnableScreenView* view_;
base::RepeatingClosure exit_callback_;
// True if machine's consumer kiosk mode is in a configurable state.
bool is_configurable_ = false;
base::WeakPtrFactory<KioskEnableScreen> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(KioskEnableScreen);
};
......
......@@ -29,6 +29,12 @@
#include "url/gurl.h"
namespace chromeos {
namespace {
constexpr const char kAccept[] = "accept";
constexpr const char kBack[] = "back";
} // namespace
TermsOfServiceScreen::TermsOfServiceScreen(
TermsOfServiceScreenView* view,
......@@ -38,12 +44,12 @@ TermsOfServiceScreen::TermsOfServiceScreen(
exit_callback_(exit_callback) {
DCHECK(view_);
if (view_)
view_->SetDelegate(this);
view_->SetScreen(this);
}
TermsOfServiceScreen::~TermsOfServiceScreen() {
if (view_)
view_->SetDelegate(NULL);
view_->SetScreen(nullptr);
}
void TermsOfServiceScreen::OnDecline() {
......@@ -51,12 +57,20 @@ void TermsOfServiceScreen::OnDecline() {
}
void TermsOfServiceScreen::OnAccept() {
exit_callback_.Run(Result::ACCEPTED);
if (view_ && view_->AreTermsLoaded()) {
exit_callback_.Run(Result::ACCEPTED);
return;
}
// If the Terms of Service have not been successfully downloaded, the "accept
// and continue" button should not be accessible. If the user managed to
// activate it somehow anyway, do not treat this as acceptance of the Terms
// and Conditions and end the session instead, as if the user had declined.
OnDecline();
}
void TermsOfServiceScreen::OnViewDestroyed(TermsOfServiceScreenView* view) {
if (view_ == view)
view_ = NULL;
view_ = nullptr;
}
void TermsOfServiceScreen::ShowImpl() {
......@@ -80,6 +94,15 @@ void TermsOfServiceScreen::HideImpl() {
view_->Hide();
}
void TermsOfServiceScreen::OnUserAction(const std::string& action_id) {
if (action_id == kBack)
OnDecline();
else if (action_id == kAccept)
OnAccept();
else
BaseScreen::OnUserAction(action_id);
}
void TermsOfServiceScreen::StartDownload() {
const PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs();
// If an URL from which the Terms of Service can be downloaded has not been
......
......@@ -50,6 +50,7 @@ class TermsOfServiceScreen : public BaseScreen {
// BaseScreen:
void ShowImpl() override;
void HideImpl() override;
void OnUserAction(const std::string& action_id) override;
// Start downloading the Terms of Service.
void StartDownload();
......
......@@ -7,6 +7,8 @@
* 'LoginScreenBehavior' is login.Screen API implementation for Polymer objects.
*/
const CALLBACK_USER_ACTED = 'userActed';
/** @polymerBehavior */
var LoginScreenBehavior = {
// List of methods exported to login.screenName.<method> API.
......@@ -34,11 +36,22 @@ var LoginScreenBehavior = {
api[methodName] = this[methodName].bind(this);
}
}
this.sendPrefix_ = 'login.' + screenName + '.';
this.registerScreenApi_(screenName, api);
Oobe.getInstance().registerScreen(this, attributes);
},
sendPrefix_: undefined,
userActed(action_id) {
if (this.sendPrefix_ === undefined) {
console.error('LoginScreenBehavior: send prefix is not defined');
return;
}
chrome.send(this.sendPrefix_ + CALLBACK_USER_ACTED, [action_id]);
},
/* ****************** Default screen API below. ********************** */
......
......@@ -74,8 +74,7 @@ Polymer({
* @private
*/
onEnableTap_() {
chrome.send(
'login.EnableAdbSideloadingScreen.userActed', ['enable-pressed']);
this.userActed('enable-pressed');
},
/**
......@@ -84,8 +83,7 @@ Polymer({
* @private
*/
onCancelTap_() {
chrome.send(
'login.EnableAdbSideloadingScreen.userActed', ['cancel-pressed']);
this.userActed('cancel-pressed');
},
......@@ -95,7 +93,6 @@ Polymer({
* @private
*/
onLearnMoreTap_() {
chrome.send(
'login.EnableAdbSideloadingScreen.userActed', ['learn-more-link']);
this.userActed('learn-more-link');
},
});
......@@ -63,7 +63,7 @@ Polymer({
* @private
*/
onEnableButton_(event) {
chrome.send('kioskOnEnable');
this.userActed('enable');
},
/**
......@@ -71,7 +71,7 @@ Polymer({
* @private
*/
closeDialog_(event) {
chrome.send('kioskOnClose');
this.userActed('close');
},
onCompleted(success) {
......
......@@ -94,7 +94,7 @@ Polymer({
this.backButtonDisabled_ = true;
this.acceptButtonDisabled_ = true;
chrome.send('termsOfServiceAccept');
this.userActed('accept');
},
/**
......@@ -110,7 +110,7 @@ Polymer({
this.backButtonDisabled_ = true;
this.acceptButtonDisabled_ = true;
chrome.send('termsOfServiceBack');
this.userActed('back');
},
/**
......
......@@ -283,7 +283,7 @@ Polymer({
* @private
*/
onWelcomeNextButtonClicked_() {
chrome.send('login.WelcomeScreen.userActed', ['continue']);
this.userActed('continue');
},
/**
......
......@@ -41,7 +41,7 @@ Polymer({
* @private
*/
onDontEnrollButtonPressed_() {
chrome.send('login.PackagedLicenseScreen.userActed', ['dont-enroll']);
this.userActed('dont-enroll');
},
/**
......@@ -50,7 +50,7 @@ Polymer({
* @private
*/
onEnrollButtonPressed_() {
chrome.send('login.PackagedLicenseScreen.userActed', ['enroll']);
this.userActed('enroll');
},
});
......@@ -8,15 +8,12 @@
#include "base/bind.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/chromeos/login/screens/kiosk_enable_screen.h"
#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/grit/generated_resources.h"
#include "components/login/localized_values_builder.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/browser/notification_details.h"
#include "content/public/browser/notification_service.h"
namespace chromeos {
......@@ -24,11 +21,13 @@ constexpr StaticOobeScreenId KioskEnableScreenView::kScreenId;
KioskEnableScreenHandler::KioskEnableScreenHandler(
JSCallsContainer* js_calls_container)
: BaseScreenHandler(kScreenId, js_calls_container) {}
: BaseScreenHandler(kScreenId, js_calls_container) {
set_user_acted_method_path("login.KioskEnableScreen.userActed");
}
KioskEnableScreenHandler::~KioskEnableScreenHandler() {
if (delegate_)
delegate_->OnViewDestroyed(this);
if (screen_)
screen_->OnViewDestroyed(this);
}
void KioskEnableScreenHandler::Show() {
......@@ -36,28 +35,13 @@ void KioskEnableScreenHandler::Show() {
show_on_init_ = true;
return;
}
KioskAppManager::Get()->GetConsumerKioskAutoLaunchStatus(
base::Bind(
&KioskEnableScreenHandler::OnGetConsumerKioskAutoLaunchStatus,
weak_ptr_factory_.GetWeakPtr()));
}
void KioskEnableScreenHandler::OnGetConsumerKioskAutoLaunchStatus(
KioskAppManager::ConsumerKioskAutoLaunchStatus status) {
is_configurable_ =
(status == KioskAppManager::CONSUMER_KIOSK_AUTO_LAUNCH_CONFIGURABLE);
if (!is_configurable_) {
LOG(WARNING) << "Consumer kiosk auto launch feature is not configurable!";
return;
}
ShowScreen(kScreenId);
}
void KioskEnableScreenHandler::SetDelegate(KioskEnableScreen* delegate) {
delegate_ = delegate;
if (page_is_ready())
void KioskEnableScreenHandler::SetScreen(KioskEnableScreen* screen) {
BaseScreenHandler::SetBaseScreen(screen);
screen_ = screen;
if (page_is_ready() && screen_)
Initialize();
}
......@@ -75,7 +59,7 @@ void KioskEnableScreenHandler::DeclareLocalizedValues(
}
void KioskEnableScreenHandler::Initialize() {
if (!page_is_ready() || !delegate_)
if (!page_is_ready() || !screen_)
return;
if (show_on_init_) {
......@@ -84,41 +68,8 @@ void KioskEnableScreenHandler::Initialize() {
}
}
void KioskEnableScreenHandler::RegisterMessages() {
AddCallback("kioskOnClose", &KioskEnableScreenHandler::HandleOnClose);
AddCallback("kioskOnEnable", &KioskEnableScreenHandler::HandleOnEnable);
}
void KioskEnableScreenHandler::HandleOnClose() {
if (delegate_)
delegate_->OnExit();
}
void KioskEnableScreenHandler::HandleOnEnable() {
if (!is_configurable_) {
NOTREACHED();
if (delegate_)
delegate_->OnExit();
return;
}
KioskAppManager::Get()->EnableConsumerKioskAutoLaunch(
base::Bind(&KioskEnableScreenHandler::OnEnableConsumerKioskAutoLaunch,
weak_ptr_factory_.GetWeakPtr()));
}
void KioskEnableScreenHandler::OnEnableConsumerKioskAutoLaunch(
bool success) {
if (!success)
LOG(WARNING) << "Consumer kiosk mode can't be enabled!";
void KioskEnableScreenHandler::ShowKioskEnabled(bool success) {
CallJS("login.KioskEnableScreen.onCompleted", success);
if (success) {
content::NotificationService::current()->Notify(
chrome::NOTIFICATION_KIOSK_ENABLED,
content::NotificationService::AllSources(),
content::NotificationService::NoDetails());
}
}
} // namespace chromeos
......@@ -24,7 +24,8 @@ class KioskEnableScreenView {
virtual ~KioskEnableScreenView() {}
virtual void Show() = 0;
virtual void SetDelegate(KioskEnableScreen* delegate) = 0;
virtual void SetScreen(KioskEnableScreen* screen) = 0;
virtual void ShowKioskEnabled(bool success) = 0;
};
// WebUI implementation of KioskEnableScreenActor.
......@@ -36,40 +37,22 @@ class KioskEnableScreenHandler : public KioskEnableScreenView,
explicit KioskEnableScreenHandler(JSCallsContainer* js_calls_container);
~KioskEnableScreenHandler() override;
// KioskEnableScreenActor implementation:
// KioskEnableScreenView:
void Show() override;
void SetDelegate(KioskEnableScreen* delegate) override;
void SetScreen(KioskEnableScreen* screen) override;
void ShowKioskEnabled(bool success) override;
// BaseScreenHandler implementation:
void DeclareLocalizedValues(
::login::LocalizedValuesBuilder* builder) override;
void Initialize() override;
// WebUIMessageHandler implementation:
void RegisterMessages() override;
private:
// JS messages handlers.
void HandleOnClose();
void HandleOnEnable();
// Callback for KioskAppManager::EnableConsumerModeKiosk().
void OnEnableConsumerKioskAutoLaunch(bool success);
// Callback for KioskAppManager::GetConsumerKioskModeStatus().
void OnGetConsumerKioskAutoLaunchStatus(
KioskAppManager::ConsumerKioskAutoLaunchStatus status);
KioskEnableScreen* delegate_ = nullptr;
KioskEnableScreen* screen_ = nullptr;
// Keeps whether screen should be shown right after initialization.
bool show_on_init_ = false;
// True if machine's consumer kiosk mode is in a configurable state.
bool is_configurable_ = false;
base::WeakPtrFactory<KioskEnableScreenHandler> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(KioskEnableScreenHandler);
};
......
......@@ -40,6 +40,7 @@ TermsOfServiceScreenHandler::TermsOfServiceScreenHandler(
CoreOobeView* core_oobe_view)
: BaseScreenHandler(kScreenId, js_calls_container),
core_oobe_view_(core_oobe_view) {
set_user_acted_method_path("login.TermsOfServiceScreen.userActed");
}
TermsOfServiceScreenHandler::~TermsOfServiceScreenHandler() {
......@@ -47,13 +48,6 @@ TermsOfServiceScreenHandler::~TermsOfServiceScreenHandler() {
screen_->OnViewDestroyed(this);
}
void TermsOfServiceScreenHandler::RegisterMessages() {
AddCallback("termsOfServiceBack",
&TermsOfServiceScreenHandler::HandleBack);
AddCallback("termsOfServiceAccept",
&TermsOfServiceScreenHandler::HandleAccept);
}
void TermsOfServiceScreenHandler::DeclareLocalizedValues(
::login::LocalizedValuesBuilder* builder) {
builder->Add("termsOfServiceScreenHeading",
......@@ -71,7 +65,8 @@ void TermsOfServiceScreenHandler::DeclareLocalizedValues(
IDS_TERMS_OF_SERVICE_SCREEN_ACCEPT_BUTTON);
}
void TermsOfServiceScreenHandler::SetDelegate(TermsOfServiceScreen* screen) {
void TermsOfServiceScreenHandler::SetScreen(TermsOfServiceScreen* screen) {
BaseScreenHandler::SetBaseScreen(screen);
screen_ = screen;
}
......@@ -127,6 +122,10 @@ void TermsOfServiceScreenHandler::OnLoadSuccess(
UpdateTermsOfServiceInUI();
}
bool TermsOfServiceScreenHandler::AreTermsLoaded() {
return !load_error_ && !terms_of_service_.empty();
}
void TermsOfServiceScreenHandler::Initialize() {
if (show_on_init_) {
Show();
......@@ -192,23 +191,4 @@ void TermsOfServiceScreenHandler::UpdateTermsOfServiceInUI() {
CallJS("login.TermsOfServiceScreen.setTermsOfService", terms_of_service_);
}
void TermsOfServiceScreenHandler::HandleBack() {
if (screen_)
screen_->OnDecline();
}
void TermsOfServiceScreenHandler::HandleAccept() {
if (!screen_)
return;
// If the Terms of Service have not been successfully downloaded, the "accept
// and continue" button should not be accessible. If the user managed to
// activate it somehow anway, do not treat this as acceptance of the Terms
// and Conditions and end the session instead, as if the user had declined.
if (terms_of_service_.empty())
screen_->OnDecline();
else
screen_->OnAccept();
}
} // namespace chromeos
......@@ -26,7 +26,7 @@ class TermsOfServiceScreenView {
virtual ~TermsOfServiceScreenView() {}
// Sets screen this view belongs to.
virtual void SetDelegate(TermsOfServiceScreen* screen) = 0;
virtual void SetScreen(TermsOfServiceScreen* screen) = 0;
// Shows the contents of the screen.
virtual void Show() = 0;
......@@ -44,6 +44,9 @@ class TermsOfServiceScreenView {
// Called when the download of the Terms of Service is successful. Shows the
// downloaded |terms_of_service| to the user.
virtual void OnLoadSuccess(const std::string& terms_of_service) = 0;
// Whether TOS are successfully loaded.
virtual bool AreTermsLoaded() = 0;
};
// The sole implementation of the TermsOfServiceScreenView, using WebUI.
......@@ -56,20 +59,18 @@ class TermsOfServiceScreenHandler : public BaseScreenHandler,
CoreOobeView* core_oobe_view);
~TermsOfServiceScreenHandler() override;
// content::WebUIMessageHandler:
void RegisterMessages() override;
// BaseScreenHandler:
void DeclareLocalizedValues(
::login::LocalizedValuesBuilder* builder) override;
// TermsOfServiceScreenView:
void SetDelegate(TermsOfServiceScreen* screen) override;
void SetScreen(TermsOfServiceScreen* screen) override;
void Show() override;
void Hide() override;
void SetDomain(const std::string& domain) override;
void OnLoadError() override;
void OnLoadSuccess(const std::string& terms_of_service) override;
bool AreTermsLoaded() override;
private:
// BaseScreenHandler:
......@@ -92,14 +93,6 @@ class TermsOfServiceScreenHandler : public BaseScreenHandler,
// nothing if the download is still in progress.
void UpdateTermsOfServiceInUI();
// Called when the user declines the Terms of Service by clicking the "back"
// button.
void HandleBack();
// Called when the user accepts the Terms of Service by clicking the "accept
// and continue" button.
void HandleAccept();
TermsOfServiceScreen* screen_ = nullptr;
CoreOobeView* core_oobe_view_ = nullptr;
......
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