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