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