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"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/app_mode/app_session_lifetime.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/app_mode/certificate_manager_dialog.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/captive_portal_window_proxy.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/webui_login_view.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/component_loader.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/extensions/application_launch.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/native_window_delegate.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/chromium_strings.h"
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chromeos/dbus/power_manager_client.h"
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chromeos/dbus/session_manager_client.h"
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/network/portal_detector/network_portal_detector.h"
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/network/portal_detector/network_portal_detector_strategy.h"
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h"
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "grit/browser_resources.h"
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/strings/grit/ui_strings.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace {
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const char kJsScreenPath[] = "login.ErrorMessageScreen";
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ErrorScreenHandler::ErrorScreenHandler(
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const scoped_refptr<NetworkStateInformer>& network_state_informer)
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    : BaseScreenHandler(kJsScreenPath),
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      delegate_(NULL),
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      network_state_informer_(network_state_informer),
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      show_on_init_(false),
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      weak_ptr_factory_(this) {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(network_state_informer_.get());
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ErrorScreenHandler::~ErrorScreenHandler() {}
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ErrorScreenHandler::SetDelegate(ErrorScreenActorDelegate* delegate) {
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  delegate_ = delegate;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::Show(OobeDisplay::Screen parent_screen,
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              base::DictionaryValue* params,
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              const base::Closure& on_hide) {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!page_is_ready()) {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    show_on_init_ = true;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parent_screen_ = parent_screen;
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  on_hide_.reset(new base::Closure(on_hide));
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShowScreen(OobeUI::kScreenErrorMessage, params);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkErrorShown();
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NetworkPortalDetector::Get()->SetStrategy(
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      PortalDetectorStrategy::STRATEGY_ID_ERROR_SCREEN);
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (delegate_)
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    delegate_->OnErrorShow();
73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  LOG(WARNING) << "Offline message is displayed";
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ErrorScreenHandler::CheckAndShowScreen() {
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string screen_name;
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (GetScreenName(parent_screen(), &screen_name))
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ShowScreen(screen_name.c_str(), NULL);
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ErrorScreenHandler::Show(OobeDisplay::Screen parent_screen,
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              base::DictionaryValue* params) {
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Show(parent_screen,
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       params,
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       base::Bind(&ErrorScreenHandler::CheckAndShowScreen,
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  weak_ptr_factory_.GetWeakPtr()));
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::Hide() {
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (parent_screen_ == OobeUI::SCREEN_UNKNOWN)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (on_hide_)
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    on_hide_->Run();
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NetworkPortalDetector::Get()->SetStrategy(
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      PortalDetectorStrategy::STRATEGY_ID_LOGIN_SCREEN);
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (delegate_)
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    delegate_->OnErrorHide();
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  LOG(WARNING) << "Offline message is hidden";
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::FixCaptivePortal() {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!captive_portal_window_proxy_.get()) {
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    content::WebContents* web_contents =
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        LoginDisplayHostImpl::default_host()->GetWebUILoginView()->
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            GetWebContents();
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    captive_portal_window_proxy_.reset(
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new CaptivePortalWindowProxy(network_state_informer_.get(),
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                     web_contents));
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  captive_portal_window_proxy_->ShowIfRedirected();
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::ShowCaptivePortal() {
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This call is an explicit user action
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // i.e. clicking on link so force dialog show.
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FixCaptivePortal();
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  captive_portal_window_proxy_->Show();
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::HideCaptivePortal() {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (captive_portal_window_proxy_.get())
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    captive_portal_window_proxy_->Close();
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::SetUIState(ErrorScreen::UIState ui_state) {
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  show_connecting_indicator_ = false;
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_state_ = ui_state;
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (page_is_ready())
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    CallJS("setUIState", static_cast<int>(ui_state_));
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::SetErrorState(ErrorScreen::ErrorState error_state,
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       const std::string& network) {
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  error_state_ = error_state;
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  network_ = network;
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (page_is_ready())
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    CallJS("setErrorState", static_cast<int>(error_state_), network);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::AllowGuestSignin(bool allowed) {
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  guest_signin_allowed_ = allowed;
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (page_is_ready())
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    CallJS("allowGuestSignin", allowed);
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::AllowOfflineLogin(bool allowed) {
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  offline_login_allowed_ = allowed;
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (page_is_ready())
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    CallJS("allowOfflineLogin", allowed);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ErrorScreenHandler::ShowConnectingIndicator(bool show) {
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  show_connecting_indicator_ = show;
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (page_is_ready())
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    CallJS("showConnectingIndicator", show);
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::NetworkErrorShown() {
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::NotificationService::current()->Notify(
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::NOTIFICATION_LOGIN_NETWORK_ERROR_SHOWN,
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::NotificationService::AllSources(),
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::NotificationService::NoDetails());
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ErrorScreenHandler::GetScreenName(OobeUI::Screen screen,
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       std::string* name) const {
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OobeUI* oobe_ui = static_cast<OobeUI*>(web_ui()->GetController());
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!oobe_ui)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *name = oobe_ui->GetScreenName(screen);
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::HandleShowCaptivePortal() {
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShowCaptivePortal();
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::HandleHideCaptivePortal() {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HideCaptivePortal();
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void ErrorScreenHandler::HandleLocalStateErrorPowerwashButtonClicked() {
18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  chromeos::DBusThreadManager::Get()->GetSessionManagerClient()->
18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      StartDeviceWipe();
18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ErrorScreenHandler::HandleRebootButtonClicked() {
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart();
190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ErrorScreenHandler::HandleDiagnoseButtonClicked() {
193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Profile* profile = ProfileManager::GetActiveUserProfile();
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ExtensionService* extension_service =
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      extensions::ExtensionSystem::Get(profile)->extension_service();
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string extension_id =
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      extension_service->component_loader()->Add(
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          IDR_CONNECTIVITY_DIAGNOSTICS_MANIFEST,
200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          base::FilePath(extension_misc::kConnectivityDiagnosticsKioskPath));
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const extensions::Extension* extension = extension_service->
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetExtensionById(extension_id, true);
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OpenApplication(AppLaunchParams(profile, extension,
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  extensions::LAUNCH_CONTAINER_WINDOW,
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  NEW_WINDOW));
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InitAppSession(profile, extension_id);
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_manager::UserManager::Get()->SessionStarted();
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LoginDisplayHostImpl::default_host()->Finalize();
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ErrorScreenHandler::HandleConfigureCerts() {
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CertificateManagerDialog* dialog =
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      new CertificateManagerDialog(ProfileManager::GetActiveUserProfile(),
217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   NULL,
218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   GetNativeWindow());
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  dialog->Show();
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ErrorScreenHandler::HandleLaunchOobeGuestSession() {
223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (delegate_)
224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    delegate_->OnLaunchOobeGuestSession();
225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorScreenHandler::RegisterMessages() {
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("showCaptivePortal",
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &ErrorScreenHandler::HandleShowCaptivePortal);
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("hideCaptivePortal",
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &ErrorScreenHandler::HandleHideCaptivePortal);
23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddCallback("localStateErrorPowerwashButtonClicked",
23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              &ErrorScreenHandler::HandleLocalStateErrorPowerwashButtonClicked);
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AddCallback("rebootButtonClicked",
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              &ErrorScreenHandler::HandleRebootButtonClicked);
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddCallback("diagnoseButtonClicked",
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              &ErrorScreenHandler::HandleDiagnoseButtonClicked);
238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AddCallback("configureCertsClicked",
239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              &ErrorScreenHandler::HandleConfigureCerts);
240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  AddCallback("launchOobeGuestSession",
241effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              &ErrorScreenHandler::HandleLaunchOobeGuestSession);
242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  AddCallback("rollbackOkButtonClicked",
243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              &ErrorScreenHandler::HandleRebootButtonClicked);
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ErrorScreenHandler::DeclareLocalizedValues(
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LocalizedValuesBuilder* builder) {
24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  builder->Add("loginErrorTitle", IDS_LOGIN_ERROR_TITLE);
249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  builder->Add("rollbackErrorTitle", IDS_RESET_SCREEN_REVERT_ERROR);
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("signinOfflineMessageBody", IDS_LOGIN_OFFLINE_MESSAGE);
25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  builder->Add("kioskOfflineMessageBody", IDS_KIOSK_OFFLINE_MESSAGE);
252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  builder->Add("kioskOnlineTitle", IDS_LOGIN_NETWORK_RESTORED_TITLE);
253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  builder->Add("kioskOnlineMessageBody", IDS_KIOSK_ONLINE_MESSAGE);
254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  builder->Add("autoEnrollmentOfflineMessageBody",
255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               IDS_LOGIN_AUTO_ENROLLMENT_OFFLINE_MESSAGE);
256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  builder->AddF("rollbackErrorMessageBody",
257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               IDS_RESET_SCREEN_REVERT_ERROR_EXPLANATION,
258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               IDS_SHORT_PRODUCT_NAME);
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("captivePortalTitle", IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_TITLE);
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("captivePortalMessage", IDS_LOGIN_MAYBE_CAPTIVE_PORTAL);
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("captivePortalProxyMessage",
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_PROXY);
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("captivePortalNetworkSelect",
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_NETWORK_SELECT);
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("signinProxyMessageText", IDS_LOGIN_PROXY_ERROR_MESSAGE);
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("updateOfflineMessageBody", IDS_UPDATE_OFFLINE_MESSAGE);
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("updateProxyMessageText", IDS_UPDATE_PROXY_ERROR_MESSAGE);
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  builder->AddF("localStateErrorText0", IDS_LOCAL_STATE_ERROR_TEXT_0,
26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                IDS_SHORT_PRODUCT_NAME);
27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  builder->Add("localStateErrorText1", IDS_LOCAL_STATE_ERROR_TEXT_1);
27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  builder->Add("localStateErrorPowerwashButton",
27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)               IDS_LOCAL_STATE_ERROR_POWERWASH_BUTTON);
273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  builder->Add("connectingIndicatorText", IDS_LOGIN_CONNECTING_INDICATOR_TEXT);
274effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  builder->Add("guestSigninFixNetwork", IDS_LOGIN_GUEST_SIGNIN_FIX_NETWORK);
275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  builder->Add("rebootButton", IDS_RELAUNCH_BUTTON);
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  builder->Add("diagnoseButton", IDS_DIAGNOSE_BUTTON);
277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  builder->Add("configureCertsButton", IDS_MANAGE_CERTIFICATES);
278effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  builder->Add("continueButton", IDS_NETWORK_SELECTION_CONTINUE_BUTTON);
279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  builder->Add("okButton", IDS_APP_OK);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ErrorScreenHandler::Initialize() {
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!page_is_ready())
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (show_on_init_) {
28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::DictionaryValue params;
28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    params.SetInteger("uiState", static_cast<int>(ui_state_));
28858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    params.SetInteger("errorState", static_cast<int>(error_state_));
28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    params.SetString("network", network_);
29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    params.SetBoolean("guestSigninAllowed", guest_signin_allowed_);
29158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    params.SetBoolean("offlineLoginAllowed", offline_login_allowed_);
292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    params.SetBoolean("showConnectingIndicator", show_connecting_indicator_);
29358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    Show(parent_screen_, &params);
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    show_on_init_ = false;
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
299