error_screen_handler.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/message_loop.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/time.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/captive_portal_window_proxy.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/webui_login_display_host.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/native_window_delegate.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_notification_types.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ErrorScreenHandler::ErrorScreenHandler(
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const scoped_refptr<NetworkStateInformer>& network_state_informer)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : network_state_informer_(network_state_informer),
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      native_window_delegate_(NULL),
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_on_init_(false) {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(network_state_informer_.get());
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ErrorScreenHandler::~ErrorScreenHandler() {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ErrorScreenHandler::SetNativeWindowDelegate(
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeWindowDelegate* native_window_delegate) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_window_delegate_ = native_window_delegate;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::Show(OobeUI::Screen parent_screen,
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              base::DictionaryValue* params) {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!page_is_ready()) {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    show_on_init_ = true;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parent_screen_ = parent_screen;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShowScreen(OobeUI::kScreenErrorMessage, params);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkErrorShown();
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::Hide() {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (parent_screen_ != OobeUI::SCREEN_UNKNOWN) {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string screen_name;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (GetScreenName(parent_screen_, &screen_name))
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShowScreen(screen_name.c_str(), NULL);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::FixCaptivePortal() {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!native_window_delegate_)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!captive_portal_window_proxy_.get()) {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    captive_portal_window_proxy_.reset(
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new CaptivePortalWindowProxy(network_state_informer_.get(),
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     GetNativeWindow()));
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  captive_portal_window_proxy_->ShowIfRedirected();
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::ShowCaptivePortal() {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This call is an explicit user action
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // i.e. clicking on link so force dialog show.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FixCaptivePortal();
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  captive_portal_window_proxy_->Show();
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::HideCaptivePortal() {
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (captive_portal_window_proxy_.get())
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    captive_portal_window_proxy_->Close();
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::ShowProxyError() {
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction("login.ErrorMessageScreen.showProxyError");
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_ = STATE_PROXY_ERROR;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::ShowCaptivePortalError(const std::string& network) {
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringValue network_value(network);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction(
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "login.ErrorMessageScreen.showCaptivePortalError", network_value);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_ = STATE_CAPTIVE_PORTAL_ERROR;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::ShowTimeoutError() {
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction("login.ErrorMessageScreen.showTimeoutError");
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_ = STATE_TIMEOUT_ERROR;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::ShowOfflineError() {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction("login.ErrorMessageScreen.showOfflineError");
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_ = STATE_OFFLINE_ERROR;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::AllowGuestSignin(bool allowed) {
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FundamentalValue allowed_value(allowed);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction("login.ErrorMessageScreen.allowGuestSignin",
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   allowed_value);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::AllowOfflineLogin(bool allowed) {
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FundamentalValue allowed_value(allowed);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction("login.ErrorMessageScreen.allowOfflineLogin",
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   allowed_value);
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::NetworkErrorShown() {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::NotificationService::current()->Notify(
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::NOTIFICATION_LOGIN_NETWORK_ERROR_SHOWN,
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::NotificationService::AllSources(),
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::NotificationService::NoDetails());
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ErrorScreenHandler::GetScreenName(OobeUI::Screen screen,
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       std::string* name) const {
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OobeUI* oobe_ui = static_cast<OobeUI*>(web_ui()->GetController());
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!oobe_ui)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *name = oobe_ui->GetScreenName(screen);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::HandleShowCaptivePortal(const base::ListValue* args) {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShowCaptivePortal();
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::HandleHideCaptivePortal(const base::ListValue* args) {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HideCaptivePortal();
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::RegisterMessages() {
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->RegisterMessageCallback("showCaptivePortal",
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&ErrorScreenHandler::HandleShowCaptivePortal,
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->RegisterMessageCallback("hideCaptivePortal",
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&ErrorScreenHandler::HandleHideCaptivePortal,
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ErrorScreenHandler::GetLocalizedStrings(
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* localized_strings) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("offlineMessageTitle",
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_TITLE));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("offlineMessageBody",
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_MESSAGE));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("captivePortalTitle",
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_TITLE));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("captivePortalMessage",
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LOGIN_MAYBE_CAPTIVE_PORTAL));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("captivePortalProxyMessage",
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_PROXY));
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("captivePortalNetworkSelect",
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_NETWORK_SELECT));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("proxyMessageText",
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LOGIN_PROXY_ERROR_MESSAGE));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ErrorScreenHandler::Initialize() {
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!page_is_ready())
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (show_on_init_) {
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Show(parent_screen_, NULL);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    show_on_init_ = false;
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow ErrorScreenHandler::GetNativeWindow() {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (native_window_delegate_)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return native_window_delegate_->GetNativeWindow();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
182