• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/chromeos/login/screens/error_screen.h"
6 
7 #include "base/command_line.h"
8 #include "chrome/browser/chromeos/login/chrome_restart_request.h"
9 #include "chrome/browser/chromeos/login/screens/error_screen_actor.h"
10 #include "chrome/browser/chromeos/login/startup_utils.h"
11 #include "chrome/browser/chromeos/login/wizard_controller.h"
12 #include "chrome/browser/chromeos/settings/cros_settings.h"
13 
14 namespace chromeos {
15 
ErrorScreen(ScreenObserver * screen_observer,ErrorScreenActor * actor)16 ErrorScreen::ErrorScreen(ScreenObserver* screen_observer,
17                          ErrorScreenActor* actor)
18     : WizardScreen(screen_observer),
19       actor_(actor),
20       parent_screen_(OobeDisplay::SCREEN_UNKNOWN),
21       weak_factory_(this) {
22   DCHECK(actor_);
23   actor_->SetDelegate(this);
24 }
25 
~ErrorScreen()26 ErrorScreen::~ErrorScreen() {
27   actor_->SetDelegate(NULL);
28 }
29 
PrepareToShow()30 void ErrorScreen::PrepareToShow() {
31 }
32 
Show()33 void ErrorScreen::Show() {
34   DCHECK(actor_);
35   actor_->Show(parent_screen(), NULL);
36 }
37 
Hide()38 void ErrorScreen::Hide() {
39   DCHECK(actor_);
40   actor_->Hide();
41 }
42 
GetName() const43 std::string ErrorScreen::GetName() const {
44   return WizardController::kErrorScreenName;
45 }
46 
OnErrorShow()47 void ErrorScreen::OnErrorShow() {}
48 
OnErrorHide()49 void ErrorScreen::OnErrorHide() {}
50 
OnLaunchOobeGuestSession()51 void ErrorScreen::OnLaunchOobeGuestSession() {
52   DeviceSettingsService::Get()->GetOwnershipStatusAsync(
53       base::Bind(&ErrorScreen::StartGuestSessionAfterOwnershipCheck,
54                  weak_factory_.GetWeakPtr()));
55 }
56 
OnLoginFailure(const LoginFailure & error)57 void ErrorScreen::OnLoginFailure(const LoginFailure& error) {
58   // The only condition leading here is guest mount failure, which should not
59   // happen in practice. For now, just log an error so this situation is visible
60   // in logs if it ever occurs.
61   NOTREACHED() << "Guest login failed.";
62   guest_login_performer_.reset();
63 }
64 
OnLoginSuccess(const UserContext & user_context)65 void ErrorScreen::OnLoginSuccess(const UserContext& user_context) {
66   LOG(FATAL);
67 }
68 
OnOffTheRecordLoginSuccess()69 void ErrorScreen::OnOffTheRecordLoginSuccess() {
70   // Restart Chrome to enter the guest session.
71   const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess();
72   CommandLine command_line(browser_command_line.GetProgram());
73   std::string cmd_line_str =
74       GetOffTheRecordCommandLine(GURL(),
75                                  StartupUtils::IsOobeCompleted(),
76                                  browser_command_line,
77                                  &command_line);
78 
79   RestartChrome(cmd_line_str);
80 }
81 
OnPasswordChangeDetected()82 void ErrorScreen::OnPasswordChangeDetected() {
83   LOG(FATAL);
84 }
85 
WhiteListCheckFailed(const std::string & email)86 void ErrorScreen::WhiteListCheckFailed(const std::string& email) {
87   LOG(FATAL);
88 }
89 
PolicyLoadFailed()90 void ErrorScreen::PolicyLoadFailed() {
91   LOG(FATAL);
92 }
93 
OnOnlineChecked(const std::string & username,bool success)94 void ErrorScreen::OnOnlineChecked(const std::string& username, bool success) {
95   LOG(FATAL);
96 }
97 
FixCaptivePortal()98 void ErrorScreen::FixCaptivePortal() {
99   DCHECK(actor_);
100   actor_->FixCaptivePortal();
101 }
102 
ShowCaptivePortal()103 void ErrorScreen::ShowCaptivePortal() {
104   DCHECK(actor_);
105   actor_->ShowCaptivePortal();
106 }
107 
HideCaptivePortal()108 void ErrorScreen::HideCaptivePortal() {
109   DCHECK(actor_);
110   actor_->HideCaptivePortal();
111 }
112 
SetUIState(UIState ui_state)113 void ErrorScreen::SetUIState(UIState ui_state) {
114   DCHECK(actor_);
115   actor_->SetUIState(ui_state);
116 }
117 
GetUIState() const118 ErrorScreen::UIState ErrorScreen::GetUIState() const {
119   DCHECK(actor_);
120   return actor_->ui_state();
121 }
122 
SetErrorState(ErrorState error_state,const std::string & network)123 void ErrorScreen::SetErrorState(ErrorState error_state,
124                                 const std::string& network) {
125   DCHECK(actor_);
126   actor_->SetErrorState(error_state, network);
127 }
128 
AllowGuestSignin(bool allow)129 void ErrorScreen::AllowGuestSignin(bool allow) {
130   DCHECK(actor_);
131   actor_->AllowGuestSignin(allow);
132 }
133 
ShowConnectingIndicator(bool show)134 void ErrorScreen::ShowConnectingIndicator(bool show) {
135   DCHECK(actor_);
136   actor_->ShowConnectingIndicator(show);
137 }
138 
StartGuestSessionAfterOwnershipCheck(DeviceSettingsService::OwnershipStatus ownership_status)139 void ErrorScreen::StartGuestSessionAfterOwnershipCheck(
140     DeviceSettingsService::OwnershipStatus ownership_status) {
141 
142   // Make sure to disallow guest login if it's explicitly disabled.
143   CrosSettingsProvider::TrustedStatus trust_status =
144       CrosSettings::Get()->PrepareTrustedValues(
145           base::Bind(&ErrorScreen::StartGuestSessionAfterOwnershipCheck,
146                      weak_factory_.GetWeakPtr(),
147                      ownership_status));
148   switch (trust_status) {
149     case CrosSettingsProvider::TEMPORARILY_UNTRUSTED:
150       // Wait for a callback.
151       return;
152     case CrosSettingsProvider::PERMANENTLY_UNTRUSTED:
153       // Only allow guest sessions if there is no owner yet.
154       if (ownership_status == DeviceSettingsService::OWNERSHIP_NONE)
155         break;
156       return;
157     case CrosSettingsProvider::TRUSTED: {
158       // Honor kAccountsPrefAllowGuest.
159       bool allow_guest = false;
160       CrosSettings::Get()->GetBoolean(kAccountsPrefAllowGuest, &allow_guest);
161       if (allow_guest)
162         break;
163       return;
164     }
165   }
166 
167   if (guest_login_performer_)
168     return;
169 
170   guest_login_performer_.reset(new LoginPerformer(this));
171   guest_login_performer_->LoginOffTheRecord();
172 }
173 
174 }  // namespace chromeos
175