error_screen_handler.cc revision a36e5920737c6adbddd3e43b760e5de8431db6e0
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/captive_portal_window_proxy.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/net/network_portal_detector.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/native_window_delegate.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace { 18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const char kJsScreenPath[] = "login.ErrorMessageScreen"; 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnableLazyDetection() { 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkPortalDetector* detector = NetworkPortalDetector::GetInstance(); 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (NetworkPortalDetector::IsEnabledInCommandLine() && detector) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) detector->EnableLazyDetection(); 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DisableLazyDetection() { 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkPortalDetector* detector = NetworkPortalDetector::GetInstance(); 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (NetworkPortalDetector::IsEnabledInCommandLine() && detector) 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) detector->DisableLazyDetection(); 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ErrorScreenHandler::ErrorScreenHandler( 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<NetworkStateInformer>& network_state_informer) 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) : BaseScreenHandler(kJsScreenPath), 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) network_state_informer_(network_state_informer), 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) show_on_init_(false) { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(network_state_informer_.get()); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ErrorScreenHandler::~ErrorScreenHandler() { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::Show(OobeDisplay::Screen parent_screen, 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* params) { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!page_is_ready()) { 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) show_on_init_ = true; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_screen_ = parent_screen; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShowScreen(OobeUI::kScreenErrorMessage, params); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkErrorShown(); 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EnableLazyDetection(); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::Hide() { 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (parent_screen_ == OobeUI::SCREEN_UNKNOWN) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string screen_name; 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetScreenName(parent_screen_, &screen_name)) 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ShowScreen(screen_name.c_str(), NULL); 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DisableLazyDetection(); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::FixCaptivePortal() { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!captive_portal_window_proxy_.get()) { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) captive_portal_window_proxy_.reset( 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new CaptivePortalWindowProxy(network_state_informer_.get(), 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetNativeWindow())); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) captive_portal_window_proxy_->ShowIfRedirected(); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::ShowCaptivePortal() { 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This call is an explicit user action 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // i.e. clicking on link so force dialog show. 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FixCaptivePortal(); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) captive_portal_window_proxy_->Show(); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::HideCaptivePortal() { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (captive_portal_window_proxy_.get()) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) captive_portal_window_proxy_->Close(); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::SetUIState(ErrorScreen::UIState ui_state) { 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_state_ = ui_state; 96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CallJS("setUIState", static_cast<int>(ui_state_)); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::SetErrorState(ErrorScreen::ErrorState error_state, 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& network) { 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) error_state_ = error_state; 102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CallJS("setErrorState", static_cast<int>(error_state_), network); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::AllowGuestSignin(bool allowed) { 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CallJS("allowGuestSignin", allowed); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::AllowOfflineLogin(bool allowed) { 110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CallJS("allowOfflineLogin", allowed); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::NetworkErrorShown() { 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationService::current()->Notify( 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::NOTIFICATION_LOGIN_NETWORK_ERROR_SHOWN, 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationService::AllSources(), 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationService::NoDetails()); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ErrorScreenHandler::GetScreenName(OobeUI::Screen screen, 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string* name) const { 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OobeUI* oobe_ui = static_cast<OobeUI*>(web_ui()->GetController()); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!oobe_ui) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *name = oobe_ui->GetScreenName(screen); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::HandleShowCaptivePortal() { 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShowCaptivePortal(); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::HandleHideCaptivePortal() { 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HideCaptivePortal(); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::RegisterMessages() { 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddCallback("showCaptivePortal", 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &ErrorScreenHandler::HandleShowCaptivePortal); 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddCallback("hideCaptivePortal", 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &ErrorScreenHandler::HandleHideCaptivePortal); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::DeclareLocalizedValues( 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LocalizedValuesBuilder* builder) { 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("proxyErrorTitle", IDS_LOGIN_PROXY_ERROR_TITLE); 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("proxyErrorTitle", IDS_LOGIN_PROXY_ERROR_TITLE); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("signinOfflineMessageBody", IDS_LOGIN_OFFLINE_MESSAGE); 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("captivePortalTitle", IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_TITLE); 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("captivePortalMessage", IDS_LOGIN_MAYBE_CAPTIVE_PORTAL); 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("captivePortalProxyMessage", 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_PROXY); 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("captivePortalNetworkSelect", 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_NETWORK_SELECT); 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("signinProxyMessageText", IDS_LOGIN_PROXY_ERROR_MESSAGE); 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("updateOfflineMessageBody", IDS_UPDATE_OFFLINE_MESSAGE); 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("updateProxyMessageText", IDS_UPDATE_PROXY_ERROR_MESSAGE); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ErrorScreenHandler::Initialize() { 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!page_is_ready()) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (show_on_init_) { 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Show(parent_screen_, NULL); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) show_on_init_ = false; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 170