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