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