error_screen_handler.cc revision 3551c9c881056c480085172ff9840cab31610854
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" 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/chromeos/login/login_display_host_impl.h" 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/chromeos/login/webui_login_view.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/net/network_portal_detector.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/native_window_delegate.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace { 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const char kJsScreenPath[] = "login.ErrorMessageScreen"; 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnableLazyDetection() { 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkPortalDetector* detector = NetworkPortalDetector::GetInstance(); 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (NetworkPortalDetector::IsEnabledInCommandLine() && detector) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) detector->EnableLazyDetection(); 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DisableLazyDetection() { 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkPortalDetector* detector = NetworkPortalDetector::GetInstance(); 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (NetworkPortalDetector::IsEnabledInCommandLine() && detector) 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) detector->DisableLazyDetection(); 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ErrorScreenHandler::ErrorScreenHandler( 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<NetworkStateInformer>& network_state_informer) 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) : BaseScreenHandler(kJsScreenPath), 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) network_state_informer_(network_state_informer), 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) show_on_init_(false) { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(network_state_informer_.get()); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ErrorScreenHandler::~ErrorScreenHandler() { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::Show(OobeDisplay::Screen parent_screen, 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* params) { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!page_is_ready()) { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) show_on_init_ = true; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_screen_ = parent_screen; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShowScreen(OobeUI::kScreenErrorMessage, params); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkErrorShown(); 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EnableLazyDetection(); 64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LOG(WARNING) << "Offline message is displayed"; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::Hide() { 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (parent_screen_ == OobeUI::SCREEN_UNKNOWN) 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string screen_name; 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetScreenName(parent_screen_, &screen_name)) 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ShowScreen(screen_name.c_str(), NULL); 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DisableLazyDetection(); 74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LOG(WARNING) << "Offline message is hidden"; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::FixCaptivePortal() { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!captive_portal_window_proxy_.get()) { 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content::WebContents* web_contents = 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LoginDisplayHostImpl::default_host()->GetWebUILoginView()-> 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetWebContents(); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) captive_portal_window_proxy_.reset( 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new CaptivePortalWindowProxy(network_state_informer_.get(), 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetNativeWindow(), 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) web_contents)); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) captive_portal_window_proxy_->ShowIfRedirected(); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::ShowCaptivePortal() { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This call is an explicit user action 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // i.e. clicking on link so force dialog show. 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FixCaptivePortal(); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) captive_portal_window_proxy_->Show(); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::HideCaptivePortal() { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (captive_portal_window_proxy_.get()) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) captive_portal_window_proxy_->Close(); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::SetUIState(ErrorScreen::UIState ui_state) { 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_state_ = ui_state; 104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CallJS("setUIState", static_cast<int>(ui_state_)); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::SetErrorState(ErrorScreen::ErrorState error_state, 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& network) { 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) error_state_ = error_state; 110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CallJS("setErrorState", static_cast<int>(error_state_), network); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::AllowGuestSignin(bool allowed) { 114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CallJS("allowGuestSignin", allowed); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::AllowOfflineLogin(bool allowed) { 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CallJS("allowOfflineLogin", allowed); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::NetworkErrorShown() { 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationService::current()->Notify( 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::NOTIFICATION_LOGIN_NETWORK_ERROR_SHOWN, 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationService::AllSources(), 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationService::NoDetails()); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ErrorScreenHandler::GetScreenName(OobeUI::Screen screen, 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string* name) const { 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OobeUI* oobe_ui = static_cast<OobeUI*>(web_ui()->GetController()); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!oobe_ui) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *name = oobe_ui->GetScreenName(screen); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::HandleShowCaptivePortal() { 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShowCaptivePortal(); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::HandleHideCaptivePortal() { 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HideCaptivePortal(); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::RegisterMessages() { 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddCallback("showCaptivePortal", 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &ErrorScreenHandler::HandleShowCaptivePortal); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddCallback("hideCaptivePortal", 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &ErrorScreenHandler::HandleHideCaptivePortal); 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::DeclareLocalizedValues( 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LocalizedValuesBuilder* builder) { 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("proxyErrorTitle", IDS_LOGIN_PROXY_ERROR_TITLE); 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("proxyErrorTitle", IDS_LOGIN_PROXY_ERROR_TITLE); 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("signinOfflineMessageBody", IDS_LOGIN_OFFLINE_MESSAGE); 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("captivePortalTitle", IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_TITLE); 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("captivePortalMessage", IDS_LOGIN_MAYBE_CAPTIVE_PORTAL); 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("captivePortalProxyMessage", 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_PROXY); 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("captivePortalNetworkSelect", 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_NETWORK_SELECT); 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("signinProxyMessageText", IDS_LOGIN_PROXY_ERROR_MESSAGE); 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("updateOfflineMessageBody", IDS_UPDATE_OFFLINE_MESSAGE); 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) builder->Add("updateProxyMessageText", IDS_UPDATE_PROXY_ERROR_MESSAGE); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ErrorScreenHandler::Initialize() { 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!page_is_ready()) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (show_on_init_) { 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Show(parent_screen_, NULL); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) show_on_init_ = false; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 178