Home | History | Annotate | Download | only in login
      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/ui/webui/chromeos/login/error_screen_handler.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/message_loop/message_loop.h"
      9 #include "base/time/time.h"
     10 #include "chrome/browser/chrome_notification_types.h"
     11 #include "chrome/browser/chromeos/app_mode/app_session_lifetime.h"
     12 #include "chrome/browser/chromeos/app_mode/certificate_manager_dialog.h"
     13 #include "chrome/browser/chromeos/login/ui/captive_portal_window_proxy.h"
     14 #include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
     15 #include "chrome/browser/chromeos/login/ui/webui_login_view.h"
     16 #include "chrome/browser/chromeos/net/network_portal_detector.h"
     17 #include "chrome/browser/chromeos/net/network_portal_detector_strategy.h"
     18 #include "chrome/browser/extensions/component_loader.h"
     19 #include "chrome/browser/extensions/extension_service.h"
     20 #include "chrome/browser/ui/extensions/application_launch.h"
     21 #include "chrome/browser/ui/webui/chromeos/login/native_window_delegate.h"
     22 #include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h"
     23 #include "chromeos/dbus/dbus_thread_manager.h"
     24 #include "chromeos/dbus/power_manager_client.h"
     25 #include "chromeos/dbus/session_manager_client.h"
     26 #include "extensions/browser/extension_system.h"
     27 #include "grit/browser_resources.h"
     28 #include "grit/chromium_strings.h"
     29 #include "grit/generated_resources.h"
     30 #include "grit/ui_strings.h"
     31 
     32 namespace {
     33 
     34 const char kJsScreenPath[] = "login.ErrorMessageScreen";
     35 
     36 }  // namespace
     37 
     38 namespace chromeos {
     39 
     40 ErrorScreenHandler::ErrorScreenHandler(
     41     const scoped_refptr<NetworkStateInformer>& network_state_informer)
     42     : BaseScreenHandler(kJsScreenPath),
     43       delegate_(NULL),
     44       network_state_informer_(network_state_informer),
     45       show_on_init_(false) {
     46   DCHECK(network_state_informer_.get());
     47 }
     48 
     49 ErrorScreenHandler::~ErrorScreenHandler() {}
     50 
     51 void ErrorScreenHandler::SetDelegate(ErrorScreenActorDelegate* delegate) {
     52   delegate_ = delegate;
     53 }
     54 
     55 void ErrorScreenHandler::Show(OobeDisplay::Screen parent_screen,
     56                               base::DictionaryValue* params) {
     57   if (!page_is_ready()) {
     58     show_on_init_ = true;
     59     return;
     60   }
     61   parent_screen_ = parent_screen;
     62   ShowScreen(OobeUI::kScreenErrorMessage, params);
     63   NetworkErrorShown();
     64   NetworkPortalDetector::Get()->SetStrategy(
     65       PortalDetectorStrategy::STRATEGY_ID_ERROR_SCREEN);
     66   if (delegate_)
     67     delegate_->OnErrorShow();
     68   LOG(WARNING) << "Offline message is displayed";
     69 }
     70 
     71 void ErrorScreenHandler::Hide() {
     72   if (parent_screen_ == OobeUI::SCREEN_UNKNOWN)
     73     return;
     74   std::string screen_name;
     75   if (GetScreenName(parent_screen_, &screen_name))
     76     ShowScreen(screen_name.c_str(), NULL);
     77   NetworkPortalDetector::Get()->SetStrategy(
     78       PortalDetectorStrategy::STRATEGY_ID_LOGIN_SCREEN);
     79   if (delegate_)
     80     delegate_->OnErrorHide();
     81   LOG(WARNING) << "Offline message is hidden";
     82 }
     83 
     84 void ErrorScreenHandler::FixCaptivePortal() {
     85   if (!captive_portal_window_proxy_.get()) {
     86     content::WebContents* web_contents =
     87         LoginDisplayHostImpl::default_host()->GetWebUILoginView()->
     88             GetWebContents();
     89     captive_portal_window_proxy_.reset(
     90         new CaptivePortalWindowProxy(network_state_informer_.get(),
     91                                      web_contents));
     92   }
     93   captive_portal_window_proxy_->ShowIfRedirected();
     94 }
     95 
     96 void ErrorScreenHandler::ShowCaptivePortal() {
     97   // This call is an explicit user action
     98   // i.e. clicking on link so force dialog show.
     99   FixCaptivePortal();
    100   captive_portal_window_proxy_->Show();
    101 }
    102 
    103 void ErrorScreenHandler::HideCaptivePortal() {
    104   if (captive_portal_window_proxy_.get())
    105     captive_portal_window_proxy_->Close();
    106 }
    107 
    108 void ErrorScreenHandler::SetUIState(ErrorScreen::UIState ui_state) {
    109   show_connecting_indicator_ = false;
    110   ui_state_ = ui_state;
    111   if (page_is_ready())
    112     CallJS("setUIState", static_cast<int>(ui_state_));
    113 }
    114 
    115 void ErrorScreenHandler::SetErrorState(ErrorScreen::ErrorState error_state,
    116                                        const std::string& network) {
    117   error_state_ = error_state;
    118   network_ = network;
    119   if (page_is_ready())
    120     CallJS("setErrorState", static_cast<int>(error_state_), network);
    121 }
    122 
    123 void ErrorScreenHandler::AllowGuestSignin(bool allowed) {
    124   guest_signin_allowed_ = allowed;
    125   if (page_is_ready())
    126     CallJS("allowGuestSignin", allowed);
    127 }
    128 
    129 void ErrorScreenHandler::AllowOfflineLogin(bool allowed) {
    130   offline_login_allowed_ = allowed;
    131   if (page_is_ready())
    132     CallJS("allowOfflineLogin", allowed);
    133 }
    134 
    135 void ErrorScreenHandler::ShowConnectingIndicator(bool show) {
    136   show_connecting_indicator_ = show;
    137   if (page_is_ready())
    138     CallJS("showConnectingIndicator", show);
    139 }
    140 
    141 void ErrorScreenHandler::NetworkErrorShown() {
    142   content::NotificationService::current()->Notify(
    143       chrome::NOTIFICATION_LOGIN_NETWORK_ERROR_SHOWN,
    144       content::NotificationService::AllSources(),
    145       content::NotificationService::NoDetails());
    146 }
    147 
    148 bool ErrorScreenHandler::GetScreenName(OobeUI::Screen screen,
    149                                        std::string* name) const {
    150   OobeUI* oobe_ui = static_cast<OobeUI*>(web_ui()->GetController());
    151   if (!oobe_ui)
    152     return false;
    153   *name = oobe_ui->GetScreenName(screen);
    154   return true;
    155 }
    156 
    157 void ErrorScreenHandler::HandleShowCaptivePortal() {
    158   ShowCaptivePortal();
    159 }
    160 
    161 void ErrorScreenHandler::HandleHideCaptivePortal() {
    162   HideCaptivePortal();
    163 }
    164 
    165 void ErrorScreenHandler::HandleLocalStateErrorPowerwashButtonClicked() {
    166   chromeos::DBusThreadManager::Get()->GetSessionManagerClient()->
    167       StartDeviceWipe();
    168 }
    169 
    170 void ErrorScreenHandler::HandleRebootButtonClicked() {
    171   chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart();
    172 }
    173 
    174 void ErrorScreenHandler::HandleDiagnoseButtonClicked() {
    175   Profile* profile = ProfileManager::GetActiveUserProfile();
    176   ExtensionService* extension_service =
    177       extensions::ExtensionSystem::Get(profile)->extension_service();
    178 
    179   std::string extension_id =
    180       extension_service->component_loader()->Add(
    181           IDR_CONNECTIVITY_DIAGNOSTICS_MANIFEST,
    182           base::FilePath(extension_misc::kConnectivityDiagnosticsKioskPath));
    183 
    184   const extensions::Extension* extension = extension_service->
    185       GetExtensionById(extension_id, true);
    186   OpenApplication(AppLaunchParams(profile, extension,
    187                                   extensions::LAUNCH_CONTAINER_WINDOW,
    188                                   NEW_WINDOW));
    189   InitAppSession(profile, extension_id);
    190 
    191   UserManager::Get()->SessionStarted();
    192 
    193   LoginDisplayHostImpl::default_host()->Finalize();
    194 }
    195 
    196 void ErrorScreenHandler::HandleConfigureCerts() {
    197   CertificateManagerDialog* dialog =
    198       new CertificateManagerDialog(ProfileManager::GetActiveUserProfile(),
    199                                    NULL,
    200                                    GetNativeWindow());
    201   dialog->Show();
    202 }
    203 
    204 void ErrorScreenHandler::HandleLaunchOobeGuestSession() {
    205   if (delegate_)
    206     delegate_->OnLaunchOobeGuestSession();
    207 }
    208 
    209 void ErrorScreenHandler::RegisterMessages() {
    210   AddCallback("showCaptivePortal",
    211               &ErrorScreenHandler::HandleShowCaptivePortal);
    212   AddCallback("hideCaptivePortal",
    213               &ErrorScreenHandler::HandleHideCaptivePortal);
    214   AddCallback("localStateErrorPowerwashButtonClicked",
    215               &ErrorScreenHandler::HandleLocalStateErrorPowerwashButtonClicked);
    216   AddCallback("rebootButtonClicked",
    217               &ErrorScreenHandler::HandleRebootButtonClicked);
    218   AddCallback("diagnoseButtonClicked",
    219               &ErrorScreenHandler::HandleDiagnoseButtonClicked);
    220   AddCallback("configureCertsClicked",
    221               &ErrorScreenHandler::HandleConfigureCerts);
    222   AddCallback("launchOobeGuestSession",
    223               &ErrorScreenHandler::HandleLaunchOobeGuestSession);
    224   AddCallback("rollbackOkButtonClicked",
    225               &ErrorScreenHandler::HandleRebootButtonClicked);
    226 }
    227 
    228 void ErrorScreenHandler::DeclareLocalizedValues(
    229     LocalizedValuesBuilder* builder) {
    230   builder->Add("loginErrorTitle", IDS_LOGIN_ERROR_TITLE);
    231   builder->Add("rollbackErrorTitle", IDS_RESET_SCREEN_REVERT_ERROR);
    232   builder->Add("signinOfflineMessageBody", IDS_LOGIN_OFFLINE_MESSAGE);
    233   builder->Add("kioskOfflineMessageBody", IDS_KIOSK_OFFLINE_MESSAGE);
    234   builder->Add("kioskOnlineTitle", IDS_LOGIN_NETWORK_RESTORED_TITLE);
    235   builder->Add("kioskOnlineMessageBody", IDS_KIOSK_ONLINE_MESSAGE);
    236   builder->Add("autoEnrollmentOfflineMessageBody",
    237                IDS_LOGIN_AUTO_ENROLLMENT_OFFLINE_MESSAGE);
    238   builder->AddF("rollbackErrorMessageBody",
    239                IDS_RESET_SCREEN_REVERT_ERROR_EXPLANATION,
    240                IDS_SHORT_PRODUCT_NAME);
    241   builder->Add("captivePortalTitle", IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_TITLE);
    242   builder->Add("captivePortalMessage", IDS_LOGIN_MAYBE_CAPTIVE_PORTAL);
    243   builder->Add("captivePortalProxyMessage",
    244                IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_PROXY);
    245   builder->Add("captivePortalNetworkSelect",
    246                IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_NETWORK_SELECT);
    247   builder->Add("signinProxyMessageText", IDS_LOGIN_PROXY_ERROR_MESSAGE);
    248   builder->Add("updateOfflineMessageBody", IDS_UPDATE_OFFLINE_MESSAGE);
    249   builder->Add("updateProxyMessageText", IDS_UPDATE_PROXY_ERROR_MESSAGE);
    250   builder->AddF("localStateErrorText0", IDS_LOCAL_STATE_ERROR_TEXT_0,
    251                 IDS_SHORT_PRODUCT_NAME);
    252   builder->Add("localStateErrorText1", IDS_LOCAL_STATE_ERROR_TEXT_1);
    253   builder->Add("localStateErrorPowerwashButton",
    254                IDS_LOCAL_STATE_ERROR_POWERWASH_BUTTON);
    255   builder->Add("connectingIndicatorText", IDS_LOGIN_CONNECTING_INDICATOR_TEXT);
    256   builder->Add("guestSigninFixNetwork", IDS_LOGIN_GUEST_SIGNIN_FIX_NETWORK);
    257   builder->Add("rebootButton", IDS_RELAUNCH_BUTTON);
    258   builder->Add("diagnoseButton", IDS_DIAGNOSE_BUTTON);
    259   builder->Add("configureCertsButton", IDS_MANAGE_CERTIFICATES);
    260   builder->Add("continueButton", IDS_NETWORK_SELECTION_CONTINUE_BUTTON);
    261   builder->Add("okButton", IDS_APP_OK);
    262 }
    263 
    264 void ErrorScreenHandler::Initialize() {
    265   if (!page_is_ready())
    266     return;
    267   if (show_on_init_) {
    268     base::DictionaryValue params;
    269     params.SetInteger("uiState", static_cast<int>(ui_state_));
    270     params.SetInteger("errorState", static_cast<int>(error_state_));
    271     params.SetString("network", network_);
    272     params.SetBoolean("guestSigninAllowed", guest_signin_allowed_);
    273     params.SetBoolean("offlineLoginAllowed", offline_login_allowed_);
    274     params.SetBoolean("showConnectingIndicator", show_connecting_indicator_);
    275     Show(parent_screen_, &params);
    276     show_on_init_ = false;
    277   }
    278 }
    279 
    280 }  // namespace chromeos
    281