| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h" | 5 #include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | |
| 8 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
| 9 #include "base/time/time.h" | 8 #include "base/time/time.h" |
| 10 #include "chrome/browser/chrome_notification_types.h" | 9 #include "chrome/browser/chromeos/login/screens/network_error_model.h" |
| 11 #include "chrome/browser/chromeos/app_mode/app_session_lifetime.h" | |
| 12 #include "chrome/browser/chromeos/app_mode/certificate_manager_dialog.h" | |
| 13 #include "chrome/browser/chromeos/login/ui/captive_portal_window_proxy.h" | |
| 14 #include "chrome/browser/chromeos/login/ui/login_display_host_impl.h" | |
| 15 #include "chrome/browser/chromeos/login/ui/webui_login_view.h" | |
| 16 #include "chrome/browser/extensions/component_loader.h" | |
| 17 #include "chrome/browser/extensions/extension_service.h" | |
| 18 #include "chrome/browser/profiles/profile_manager.h" | |
| 19 #include "chrome/browser/ui/extensions/app_launch_params.h" | |
| 20 #include "chrome/browser/ui/extensions/application_launch.h" | |
| 21 #include "chrome/browser/ui/webui/chromeos/login/native_window_delegate.h" | |
| 22 #include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h" | |
| 23 #include "chrome/common/extensions/extension_constants.h" | |
| 24 #include "chrome/grit/chromium_strings.h" | 10 #include "chrome/grit/chromium_strings.h" |
| 25 #include "chrome/grit/generated_resources.h" | 11 #include "chrome/grit/generated_resources.h" |
| 26 #include "chromeos/dbus/dbus_thread_manager.h" | |
| 27 #include "chromeos/dbus/power_manager_client.h" | |
| 28 #include "chromeos/dbus/session_manager_client.h" | |
| 29 #include "chromeos/network/portal_detector/network_portal_detector.h" | |
| 30 #include "chromeos/network/portal_detector/network_portal_detector_strategy.h" | |
| 31 #include "components/user_manager/user_manager.h" | |
| 32 #include "extensions/browser/extension_system.h" | |
| 33 #include "extensions/common/constants.h" | |
| 34 #include "grit/browser_resources.h" | |
| 35 #include "ui/strings/grit/ui_strings.h" | 12 #include "ui/strings/grit/ui_strings.h" |
| 36 | 13 |
| 37 namespace { | 14 namespace { |
| 38 | 15 |
| 39 const char kJsScreenPath[] = "login.ErrorMessageScreen"; | 16 const char kJsScreenPath[] = "login.ErrorMessageScreen"; |
| 40 | 17 |
| 41 } // namespace | 18 } // namespace |
| 42 | 19 |
| 43 namespace chromeos { | 20 namespace chromeos { |
| 44 | 21 |
| 45 ErrorScreenHandler::ErrorScreenHandler( | 22 ErrorScreenHandler::ErrorScreenHandler() |
| 46 const scoped_refptr<NetworkStateInformer>& network_state_informer) | |
| 47 : BaseScreenHandler(kJsScreenPath), | 23 : BaseScreenHandler(kJsScreenPath), |
| 48 delegate_(NULL), | 24 model_(nullptr), |
| 49 network_state_informer_(network_state_informer), | |
| 50 show_on_init_(false), | 25 show_on_init_(false), |
| 51 weak_ptr_factory_(this) { | 26 weak_ptr_factory_(this) { |
| 52 DCHECK(network_state_informer_.get()); | |
| 53 } | 27 } |
| 54 | 28 |
| 55 ErrorScreenHandler::~ErrorScreenHandler() { | 29 ErrorScreenHandler::~ErrorScreenHandler() { |
| 56 if (delegate_) | 30 if (model_) |
| 57 delegate_->OnActorDestroyed(); | 31 model_->OnViewDestroyed(this); |
| 58 } | 32 } |
| 59 | 33 |
| 60 void ErrorScreenHandler::SetDelegate(ErrorScreenActorDelegate* delegate) { | 34 void ErrorScreenHandler::PrepareToShow() { |
| 61 delegate_ = delegate; | |
| 62 } | 35 } |
| 63 | 36 |
| 64 void ErrorScreenHandler::Show(OobeDisplay::Screen parent_screen, | 37 void ErrorScreenHandler::Show() { |
| 65 base::DictionaryValue* params, | |
| 66 const base::Closure& on_hide) { | |
| 67 if (!page_is_ready()) { | 38 if (!page_is_ready()) { |
| 68 show_on_init_ = true; | 39 show_on_init_ = true; |
| 69 return; | 40 return; |
| 70 } | 41 } |
| 71 parent_screen_ = parent_screen; | 42 BaseScreenHandler::ShowScreen(OobeUI::kScreenErrorMessage, NULL); |
| 72 on_hide_.reset(new base::Closure(on_hide)); | 43 if (model_) |
| 73 ShowScreen(OobeUI::kScreenErrorMessage, params); | 44 model_->OnShow(); |
| 74 NetworkErrorShown(); | |
| 75 NetworkPortalDetector::Get()->SetStrategy( | |
| 76 PortalDetectorStrategy::STRATEGY_ID_ERROR_SCREEN); | |
| 77 if (delegate_) | |
| 78 delegate_->OnErrorShow(); | |
| 79 LOG(WARNING) << "Offline message is displayed"; | |
| 80 } | |
| 81 | |
| 82 void ErrorScreenHandler::CheckAndShowScreen() { | |
| 83 std::string screen_name; | |
| 84 if (GetScreenName(parent_screen(), &screen_name)) | |
| 85 ShowScreen(screen_name.c_str(), NULL); | |
| 86 } | |
| 87 | |
| 88 void ErrorScreenHandler::Show(OobeDisplay::Screen parent_screen, | |
| 89 base::DictionaryValue* params) { | |
| 90 Show(parent_screen, | |
| 91 params, | |
| 92 base::Bind(&ErrorScreenHandler::CheckAndShowScreen, | |
| 93 weak_ptr_factory_.GetWeakPtr())); | |
| 94 } | 45 } |
| 95 | 46 |
| 96 void ErrorScreenHandler::Hide() { | 47 void ErrorScreenHandler::Hide() { |
| 97 if (parent_screen_ == OobeUI::SCREEN_UNKNOWN) | |
| 98 return; | |
| 99 if (on_hide_) | |
| 100 on_hide_->Run(); | |
| 101 NetworkPortalDetector::Get()->SetStrategy( | |
| 102 PortalDetectorStrategy::STRATEGY_ID_LOGIN_SCREEN); | |
| 103 if (delegate_) | |
| 104 delegate_->OnErrorHide(); | |
| 105 LOG(WARNING) << "Offline message is hidden"; | |
| 106 } | 48 } |
| 107 | 49 |
| 108 void ErrorScreenHandler::FixCaptivePortal() { | 50 void ErrorScreenHandler::Bind(NetworkErrorModel& model) { |
| 109 if (!captive_portal_window_proxy_.get()) { | 51 model_ = &model; |
| 110 content::WebContents* web_contents = | 52 BaseScreenHandler::SetBaseScreen(model_); |
| 111 LoginDisplayHostImpl::default_host()->GetWebUILoginView()-> | |
| 112 GetWebContents(); | |
| 113 captive_portal_window_proxy_.reset( | |
| 114 new CaptivePortalWindowProxy(network_state_informer_.get(), | |
| 115 web_contents)); | |
| 116 } | |
| 117 captive_portal_window_proxy_->ShowIfRedirected(); | |
| 118 } | 53 } |
| 119 | 54 |
| 120 void ErrorScreenHandler::ShowCaptivePortal() { | 55 void ErrorScreenHandler::Unbind() { |
| 121 // This call is an explicit user action | 56 model_ = nullptr; |
| 122 // i.e. clicking on link so force dialog show. | 57 BaseScreenHandler::SetBaseScreen(nullptr); |
| 123 FixCaptivePortal(); | |
| 124 captive_portal_window_proxy_->Show(); | |
| 125 } | 58 } |
| 126 | 59 |
| 127 void ErrorScreenHandler::HideCaptivePortal() { | 60 void ErrorScreenHandler::ShowScreen(OobeUI::Screen screen) { |
| 128 if (captive_portal_window_proxy_.get()) | 61 std::string screen_name; |
| 129 captive_portal_window_proxy_->Close(); | 62 if (GetScreenName(screen, &screen_name)) |
| 130 } | 63 BaseScreenHandler::ShowScreen(screen_name.c_str(), NULL); |
| 131 | |
| 132 void ErrorScreenHandler::SetUIState(ErrorScreen::UIState ui_state) { | |
| 133 show_connecting_indicator_ = false; | |
| 134 ui_state_ = ui_state; | |
| 135 if (page_is_ready()) | |
| 136 CallJS("setUIState", static_cast<int>(ui_state_)); | |
| 137 } | |
| 138 | |
| 139 void ErrorScreenHandler::SetErrorState(ErrorScreen::ErrorState error_state, | |
| 140 const std::string& network) { | |
| 141 error_state_ = error_state; | |
| 142 network_ = network; | |
| 143 if (page_is_ready()) | |
| 144 CallJS("setErrorState", static_cast<int>(error_state_), network); | |
| 145 } | |
| 146 | |
| 147 void ErrorScreenHandler::AllowGuestSignin(bool allowed) { | |
| 148 guest_signin_allowed_ = allowed; | |
| 149 if (page_is_ready()) | |
| 150 CallJS("allowGuestSignin", allowed); | |
| 151 } | |
| 152 | |
| 153 void ErrorScreenHandler::AllowOfflineLogin(bool allowed) { | |
| 154 offline_login_allowed_ = allowed; | |
| 155 if (page_is_ready()) | |
| 156 CallJS("allowOfflineLogin", allowed); | |
| 157 } | |
| 158 | |
| 159 void ErrorScreenHandler::ShowConnectingIndicator(bool show) { | |
| 160 show_connecting_indicator_ = show; | |
| 161 if (page_is_ready()) | |
| 162 CallJS("showConnectingIndicator", show); | |
| 163 } | |
| 164 | |
| 165 void ErrorScreenHandler::NetworkErrorShown() { | |
| 166 content::NotificationService::current()->Notify( | |
| 167 chrome::NOTIFICATION_LOGIN_NETWORK_ERROR_SHOWN, | |
| 168 content::NotificationService::AllSources(), | |
| 169 content::NotificationService::NoDetails()); | |
| 170 } | 64 } |
| 171 | 65 |
| 172 bool ErrorScreenHandler::GetScreenName(OobeUI::Screen screen, | 66 bool ErrorScreenHandler::GetScreenName(OobeUI::Screen screen, |
| 173 std::string* name) const { | 67 std::string* name) const { |
| 174 OobeUI* oobe_ui = static_cast<OobeUI*>(web_ui()->GetController()); | 68 OobeUI* oobe_ui = static_cast<OobeUI*>(web_ui()->GetController()); |
| 175 if (!oobe_ui) | 69 if (!oobe_ui) |
| 176 return false; | 70 return false; |
| 177 *name = oobe_ui->GetScreenName(screen); | 71 *name = oobe_ui->GetScreenName(screen); |
| 178 return true; | 72 return true; |
| 179 } | 73 } |
| 180 | 74 |
| 181 void ErrorScreenHandler::HandleShowCaptivePortal() { | |
| 182 ShowCaptivePortal(); | |
| 183 } | |
| 184 | |
| 185 void ErrorScreenHandler::HandleHideCaptivePortal() { | 75 void ErrorScreenHandler::HandleHideCaptivePortal() { |
| 186 HideCaptivePortal(); | 76 model_->HideCaptivePortal(); |
| 187 } | |
| 188 | |
| 189 void ErrorScreenHandler::HandleLocalStateErrorPowerwashButtonClicked() { | |
| 190 chromeos::DBusThreadManager::Get()->GetSessionManagerClient()-> | |
| 191 StartDeviceWipe(); | |
| 192 } | |
| 193 | |
| 194 void ErrorScreenHandler::HandleRebootButtonClicked() { | |
| 195 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart(); | |
| 196 } | |
| 197 | |
| 198 void ErrorScreenHandler::HandleDiagnoseButtonClicked() { | |
| 199 Profile* profile = ProfileManager::GetActiveUserProfile(); | |
| 200 ExtensionService* extension_service = | |
| 201 extensions::ExtensionSystem::Get(profile)->extension_service(); | |
| 202 | |
| 203 std::string extension_id = | |
| 204 extension_service->component_loader()->Add( | |
| 205 IDR_CONNECTIVITY_DIAGNOSTICS_MANIFEST, | |
| 206 base::FilePath(extension_misc::kConnectivityDiagnosticsKioskPath)); | |
| 207 | |
| 208 const extensions::Extension* extension = extension_service-> | |
| 209 GetExtensionById(extension_id, true); | |
| 210 OpenApplication( | |
| 211 AppLaunchParams(profile, extension, extensions::LAUNCH_CONTAINER_WINDOW, | |
| 212 NEW_WINDOW, extensions::SOURCE_CHROME_INTERNAL)); | |
| 213 InitAppSession(profile, extension_id); | |
| 214 | |
| 215 user_manager::UserManager::Get()->SessionStarted(); | |
| 216 | |
| 217 LoginDisplayHostImpl::default_host()->Finalize(); | |
| 218 } | |
| 219 | |
| 220 void ErrorScreenHandler::HandleConfigureCerts() { | |
| 221 CertificateManagerDialog* dialog = | |
| 222 new CertificateManagerDialog(ProfileManager::GetActiveUserProfile(), | |
| 223 NULL, | |
| 224 GetNativeWindow()); | |
| 225 dialog->Show(); | |
| 226 } | |
| 227 | |
| 228 void ErrorScreenHandler::HandleLaunchOobeGuestSession() { | |
| 229 if (delegate_) | |
| 230 delegate_->OnLaunchOobeGuestSession(); | |
| 231 } | 77 } |
| 232 | 78 |
| 233 void ErrorScreenHandler::RegisterMessages() { | 79 void ErrorScreenHandler::RegisterMessages() { |
| 234 AddCallback("showCaptivePortal", | |
| 235 &ErrorScreenHandler::HandleShowCaptivePortal); | |
| 236 AddCallback("hideCaptivePortal", | 80 AddCallback("hideCaptivePortal", |
| 237 &ErrorScreenHandler::HandleHideCaptivePortal); | 81 &ErrorScreenHandler::HandleHideCaptivePortal); |
| 238 AddCallback("localStateErrorPowerwashButtonClicked", | |
| 239 &ErrorScreenHandler::HandleLocalStateErrorPowerwashButtonClicked); | |
| 240 AddCallback("rebootButtonClicked", | |
| 241 &ErrorScreenHandler::HandleRebootButtonClicked); | |
| 242 AddCallback("diagnoseButtonClicked", | |
| 243 &ErrorScreenHandler::HandleDiagnoseButtonClicked); | |
| 244 AddCallback("configureCertsClicked", | |
| 245 &ErrorScreenHandler::HandleConfigureCerts); | |
| 246 AddCallback("launchOobeGuestSession", | |
| 247 &ErrorScreenHandler::HandleLaunchOobeGuestSession); | |
| 248 AddCallback("rollbackOkButtonClicked", | |
| 249 &ErrorScreenHandler::HandleRebootButtonClicked); | |
| 250 } | 82 } |
| 251 | 83 |
| 252 void ErrorScreenHandler::DeclareLocalizedValues( | 84 void ErrorScreenHandler::DeclareLocalizedValues( |
| 253 LocalizedValuesBuilder* builder) { | 85 LocalizedValuesBuilder* builder) { |
| 254 builder->Add("loginErrorTitle", IDS_LOGIN_ERROR_TITLE); | 86 builder->Add("loginErrorTitle", IDS_LOGIN_ERROR_TITLE); |
| 255 builder->Add("rollbackErrorTitle", IDS_RESET_SCREEN_REVERT_ERROR); | 87 builder->Add("rollbackErrorTitle", IDS_RESET_SCREEN_REVERT_ERROR); |
| 256 builder->Add("signinOfflineMessageBody", IDS_LOGIN_OFFLINE_MESSAGE); | 88 builder->Add("signinOfflineMessageBody", IDS_LOGIN_OFFLINE_MESSAGE); |
| 257 builder->Add("kioskOfflineMessageBody", IDS_KIOSK_OFFLINE_MESSAGE); | 89 builder->Add("kioskOfflineMessageBody", IDS_KIOSK_OFFLINE_MESSAGE); |
| 258 builder->Add("kioskOnlineTitle", IDS_LOGIN_NETWORK_RESTORED_TITLE); | 90 builder->Add("kioskOnlineTitle", IDS_LOGIN_NETWORK_RESTORED_TITLE); |
| 259 builder->Add("kioskOnlineMessageBody", IDS_KIOSK_ONLINE_MESSAGE); | 91 builder->Add("kioskOnlineMessageBody", IDS_KIOSK_ONLINE_MESSAGE); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 281 builder->Add("rebootButton", IDS_RELAUNCH_BUTTON); | 113 builder->Add("rebootButton", IDS_RELAUNCH_BUTTON); |
| 282 builder->Add("diagnoseButton", IDS_DIAGNOSE_BUTTON); | 114 builder->Add("diagnoseButton", IDS_DIAGNOSE_BUTTON); |
| 283 builder->Add("configureCertsButton", IDS_MANAGE_CERTIFICATES); | 115 builder->Add("configureCertsButton", IDS_MANAGE_CERTIFICATES); |
| 284 builder->Add("continueButton", IDS_NETWORK_SELECTION_CONTINUE_BUTTON); | 116 builder->Add("continueButton", IDS_NETWORK_SELECTION_CONTINUE_BUTTON); |
| 285 builder->Add("okButton", IDS_APP_OK); | 117 builder->Add("okButton", IDS_APP_OK); |
| 286 } | 118 } |
| 287 | 119 |
| 288 void ErrorScreenHandler::Initialize() { | 120 void ErrorScreenHandler::Initialize() { |
| 289 if (!page_is_ready()) | 121 if (!page_is_ready()) |
| 290 return; | 122 return; |
| 123 |
| 291 if (show_on_init_) { | 124 if (show_on_init_) { |
| 292 base::DictionaryValue params; | 125 //TODO(nkostylev): Check that context initial state is properly passed. |
| 293 params.SetInteger("uiState", static_cast<int>(ui_state_)); | 126 Show(); |
| 294 params.SetInteger("errorState", static_cast<int>(error_state_)); | |
| 295 params.SetString("network", network_); | |
| 296 params.SetBoolean("guestSigninAllowed", guest_signin_allowed_); | |
| 297 params.SetBoolean("offlineLoginAllowed", offline_login_allowed_); | |
| 298 params.SetBoolean("showConnectingIndicator", show_connecting_indicator_); | |
| 299 Show(parent_screen_, ¶ms); | |
| 300 show_on_init_ = false; | 127 show_on_init_ = false; |
| 301 } | 128 } |
| 302 } | 129 } |
| 303 | 130 |
| 304 } // namespace chromeos | 131 } // namespace chromeos |
| OLD | NEW |