error_screen_handler.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/captive_portal_window_proxy.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/native_window_delegate.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ErrorScreenHandler::ErrorScreenHandler(
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const scoped_refptr<NetworkStateInformer>& network_state_informer)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : network_state_informer_(network_state_informer),
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      native_window_delegate_(NULL) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(network_state_informer_);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_state_informer_->AddObserver(this);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ErrorScreenHandler::~ErrorScreenHandler() {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_state_informer_->RemoveObserver(this);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ErrorScreenHandler::SetNativeWindowDelegate(
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeWindowDelegate* native_window_delegate) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_window_delegate_ = native_window_delegate;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ErrorScreenHandler::UpdateState(NetworkStateInformer::State state,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const std::string& network_name,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const std::string& reason,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     ConnectionType last_network_type) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(ERROR) << "ErrorScreenHandler::UpdateState(): state=" << state <<
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ", network_name=" << network_name <<
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ", reason=" << reason <<
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ", last_network_type=" << last_network_type;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO (ygorshenin): instead of just call JS function, move all
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // logic from JS here.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue state_value(state);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringValue network_value(network_name);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringValue reason_value(reason);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue last_network_value(last_network_type);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("login.ErrorMessageScreen.updateState",
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_value, network_value, reason_value, last_network_value);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ErrorScreenHandler::GetLocalizedStrings(
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* localized_strings) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("offlineMessageTitle",
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_TITLE));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("offlineMessageBody",
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_MESSAGE));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("captivePortalTitle",
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_TITLE));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("captivePortalMessage",
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LOGIN_MAYBE_CAPTIVE_PORTAL));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("captivePortalProxyMessage",
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_PROXY));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("captivePortalNetworkSelect",
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_NETWORK_SELECT));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("proxyMessageText",
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LOGIN_PROXY_ERROR_MESSAGE));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ErrorScreenHandler::Initialize() {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow ErrorScreenHandler::GetNativeWindow() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (native_window_delegate_)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return native_window_delegate_->GetNativeWindow();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ErrorScreenHandler::RegisterMessages() {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("fixCaptivePortal",
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ErrorScreenHandler::HandleFixCaptivePortal,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("showCaptivePortal",
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ErrorScreenHandler::HandleShowCaptivePortal,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("hideCaptivePortal",
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ErrorScreenHandler::HandleHideCaptivePortal,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ErrorScreenHandler::HandleFixCaptivePortal(const base::ListValue* args) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!native_window_delegate_)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO (ygorshenin): move error page and captive portal window
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // showing logic to C++ (currenly most of it is done on the JS
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // side).
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!captive_portal_window_proxy_.get()) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    captive_portal_window_proxy_.reset(
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new CaptivePortalWindowProxy(network_state_informer_.get(),
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     GetNativeWindow()));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  captive_portal_window_proxy_->ShowIfRedirected();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ErrorScreenHandler::HandleShowCaptivePortal(const base::ListValue* args) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This call is an explicit user action
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // i.e. clicking on link so force dialog show.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HandleFixCaptivePortal(args);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  captive_portal_window_proxy_->Show();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ErrorScreenHandler::HandleHideCaptivePortal(const base::ListValue* args) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (captive_portal_window_proxy_.get())
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    captive_portal_window_proxy_->Close();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
119