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