| 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/reset_screen_handler.h" | 5 #include "chrome/browser/ui/webui/chromeos/login/reset_screen_handler.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/command_line.h" | |
| 10 #include "base/metrics/histogram.h" | |
| 11 #include "base/prefs/pref_registry_simple.h" | 9 #include "base/prefs/pref_registry_simple.h" |
| 12 #include "base/prefs/pref_service.h" | |
| 13 #include "base/values.h" | 10 #include "base/values.h" |
| 14 #include "chrome/browser/browser_process.h" | 11 #include "chrome/browser/browser_process.h" |
| 15 #include "chrome/browser/chromeos/login/help_app_launcher.h" | 12 #include "chrome/browser/chromeos/login/help_app_launcher.h" |
| 16 #include "chrome/browser/chromeos/reset/metrics.h" | 13 #include "chrome/browser/chromeos/login/screens/reset_model.h" |
| 17 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" | 14 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" |
| 18 #include "chrome/common/pref_names.h" | 15 #include "chrome/common/pref_names.h" |
| 19 #include "chrome/grit/chromium_strings.h" | 16 #include "chrome/grit/chromium_strings.h" |
| 20 #include "chrome/grit/generated_resources.h" | 17 #include "chrome/grit/generated_resources.h" |
| 21 #include "chromeos/chromeos_switches.h" | |
| 22 #include "chromeos/dbus/dbus_thread_manager.h" | |
| 23 #include "chromeos/dbus/power_manager_client.h" | |
| 24 #include "chromeos/dbus/session_manager_client.h" | 18 #include "chromeos/dbus/session_manager_client.h" |
| 25 #include "chromeos/dbus/update_engine_client.h" | |
| 26 #include "components/login/localized_values_builder.h" | 19 #include "components/login/localized_values_builder.h" |
| 27 #include "content/public/browser/browser_thread.h" | |
| 28 | 20 |
| 29 namespace { | 21 namespace { |
| 30 | 22 |
| 31 const char kJsScreenPath[] = "login.ResetScreen"; | 23 const char kJsScreenPath[] = "login.ResetScreen"; |
| 32 | 24 |
| 33 // Reset screen id. | |
| 34 const char kResetScreen[] = "reset"; | |
| 35 | |
| 36 const int kErrorUIStateRollback = 7; | |
| 37 | |
| 38 } // namespace | 25 } // namespace |
| 39 | 26 |
| 40 namespace chromeos { | 27 namespace chromeos { |
| 41 | 28 |
| 42 ResetScreenHandler::ResetScreenHandler() | 29 ResetScreenHandler::ResetScreenHandler() |
| 43 : BaseScreenHandler(kJsScreenPath), | 30 : BaseScreenHandler(kJsScreenPath), |
| 44 delegate_(NULL), | 31 model_(nullptr), |
| 45 show_on_init_(false), | 32 show_on_init_(false) { |
| 46 restart_required_(true), | |
| 47 reboot_was_requested_(false), | |
| 48 rollback_available_(false), | |
| 49 rollback_checked_(false), | |
| 50 preparing_for_rollback_(false), | |
| 51 weak_ptr_factory_(this) { | |
| 52 } | 33 } |
| 53 | 34 |
| 54 ResetScreenHandler::~ResetScreenHandler() { | 35 ResetScreenHandler::~ResetScreenHandler() { |
| 55 if (delegate_) | 36 if (model_) |
| 56 delegate_->OnActorDestroyed(this); | 37 model_->OnViewDestroyed(this); |
| 57 DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this); | |
| 58 } | 38 } |
| 59 | 39 |
| 60 void ResetScreenHandler::PrepareToShow() { | 40 void ResetScreenHandler::PrepareToShow() { |
| 61 } | 41 } |
| 62 | 42 |
| 63 void ResetScreenHandler::ShowWithParams() { | |
| 64 int dialog_type; | |
| 65 if (restart_required_) { | |
| 66 dialog_type = reset::DIALOG_SHORTCUT_RESTART_REQUIRED; | |
| 67 } else { | |
| 68 dialog_type = reset::DIALOG_SHORTCUT_OFFERING_ROLLBACK_UNAVAILABLE; | |
| 69 } | |
| 70 UMA_HISTOGRAM_ENUMERATION("Reset.ChromeOS.PowerwashDialogShown", | |
| 71 dialog_type, | |
| 72 reset::DIALOG_VIEW_TYPE_SIZE); | |
| 73 | |
| 74 PrefService* prefs = g_browser_process->local_state(); | |
| 75 prefs->SetBoolean(prefs::kFactoryResetRequested, false); | |
| 76 prefs->CommitPendingWrite(); | |
| 77 base::DictionaryValue reset_screen_params; | |
| 78 reset_screen_params.SetBoolean("restartRequired", restart_required_); | |
| 79 reset_screen_params.SetBoolean("rollbackAvailable", rollback_available_); | |
| 80 #if defined(OFFICIAL_BUILD) | |
| 81 reset_screen_params.SetBoolean("isOfficialBuild", true); | |
| 82 #endif | |
| 83 ShowScreen(kResetScreen, &reset_screen_params); | |
| 84 } | |
| 85 | |
| 86 void ResetScreenHandler::Show() { | 43 void ResetScreenHandler::Show() { |
| 87 if (!page_is_ready()) { | 44 if (!page_is_ready()) { |
| 88 show_on_init_ = true; | 45 show_on_init_ = true; |
| 89 return; | 46 return; |
| 90 } | 47 } |
| 91 | 48 ShowScreen(OobeUI::kScreenOobeReset, NULL); |
| 92 ChooseAndApplyShowScenario(); | |
| 93 } | |
| 94 | |
| 95 void ResetScreenHandler::ChooseAndApplyShowScenario() { | |
| 96 PrefService* prefs = g_browser_process->local_state(); | |
| 97 restart_required_ = !base::CommandLine::ForCurrentProcess()->HasSwitch( | |
| 98 switches::kFirstExecAfterBoot); | |
| 99 | |
| 100 reboot_was_requested_ = false; | |
| 101 preparing_for_rollback_ = false; | |
| 102 if (!restart_required_) // First exec after boot. | |
| 103 reboot_was_requested_ = prefs->GetBoolean(prefs::kFactoryResetRequested); | |
| 104 | |
| 105 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | |
| 106 switches::kDisableRollbackOption)) { | |
| 107 rollback_available_ = false; | |
| 108 ShowWithParams(); | |
| 109 } else if (restart_required_) { | |
| 110 // Will require restart. | |
| 111 ShowWithParams(); | |
| 112 } else { | |
| 113 chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()-> | |
| 114 CanRollbackCheck(base::Bind(&ResetScreenHandler::OnRollbackCheck, | |
| 115 weak_ptr_factory_.GetWeakPtr())); | |
| 116 } | |
| 117 } | 49 } |
| 118 | 50 |
| 119 void ResetScreenHandler::Hide() { | 51 void ResetScreenHandler::Hide() { |
| 120 } | 52 } |
| 121 | 53 |
| 122 void ResetScreenHandler::SetDelegate(Delegate* delegate) { | |
| 123 delegate_ = delegate; | |
| 124 if (page_is_ready()) | |
| 125 Initialize(); | |
| 126 } | |
| 127 | |
| 128 void ResetScreenHandler::DeclareLocalizedValues( | 54 void ResetScreenHandler::DeclareLocalizedValues( |
| 129 ::login::LocalizedValuesBuilder* builder) { | 55 ::login::LocalizedValuesBuilder* builder) { |
| 130 builder->Add("resetScreenTitle", IDS_RESET_SCREEN_TITLE); | 56 builder->Add("resetScreenTitle", IDS_RESET_SCREEN_TITLE); |
| 131 builder->Add("resetScreenAccessibleTitle", IDS_RESET_SCREEN_TITLE); | 57 builder->Add("resetScreenAccessibleTitle", IDS_RESET_SCREEN_TITLE); |
| 132 builder->Add("resetScreenIconTitle", IDS_RESET_SCREEN_ICON_TITLE); | 58 builder->Add("resetScreenIconTitle", IDS_RESET_SCREEN_ICON_TITLE); |
| 133 builder->Add("cancelButton", IDS_CANCEL); | 59 builder->Add("cancelButton", IDS_CANCEL); |
| 134 | 60 |
| 135 builder->Add("resetButtonRestart", IDS_RELAUNCH_BUTTON); | 61 builder->Add("resetButtonRestart", IDS_RELAUNCH_BUTTON); |
| 136 builder->Add("resetButtonPowerwash", IDS_RESET_SCREEN_POWERWASH); | 62 builder->Add("resetButtonPowerwash", IDS_RESET_SCREEN_POWERWASH); |
| 137 builder->Add("resetButtonPowerwashAndRollback", | 63 builder->Add("resetButtonPowerwashAndRollback", |
| (...skipping 23 matching lines...) Expand all Loading... |
| 161 IDS_SHORT_PRODUCT_NAME); | 87 IDS_SHORT_PRODUCT_NAME); |
| 162 | 88 |
| 163 builder->Add("confirmPowerwashTitle", IDS_RESET_SCREEN_POPUP_POWERWASH_TITLE); | 89 builder->Add("confirmPowerwashTitle", IDS_RESET_SCREEN_POPUP_POWERWASH_TITLE); |
| 164 builder->Add("confirmRollbackTitle", IDS_RESET_SCREEN_POPUP_ROLLBACK_TITLE); | 90 builder->Add("confirmRollbackTitle", IDS_RESET_SCREEN_POPUP_ROLLBACK_TITLE); |
| 165 builder->Add("confirmPowerwashMessage", | 91 builder->Add("confirmPowerwashMessage", |
| 166 IDS_RESET_SCREEN_POPUP_POWERWASH_TEXT); | 92 IDS_RESET_SCREEN_POPUP_POWERWASH_TEXT); |
| 167 builder->Add("confirmRollbackMessage", IDS_RESET_SCREEN_POPUP_ROLLBACK_TEXT); | 93 builder->Add("confirmRollbackMessage", IDS_RESET_SCREEN_POPUP_ROLLBACK_TEXT); |
| 168 builder->Add("confirmResetButton", IDS_RESET_SCREEN_POPUP_CONFIRM_BUTTON); | 94 builder->Add("confirmResetButton", IDS_RESET_SCREEN_POPUP_CONFIRM_BUTTON); |
| 169 } | 95 } |
| 170 | 96 |
| 171 // Invoked from call to CanRollbackCheck upon completion of the DBus call. | |
| 172 void ResetScreenHandler::OnRollbackCheck(bool can_rollback) { | |
| 173 VLOG(1) << "Callback from CanRollbackCheck, result " << can_rollback; | |
| 174 rollback_available_ = can_rollback; | |
| 175 ShowWithParams(); | |
| 176 } | |
| 177 | |
| 178 // static | 97 // static |
| 179 void ResetScreenHandler::RegisterPrefs(PrefRegistrySimple* registry) { | 98 void ResetScreenHandler::RegisterPrefs(PrefRegistrySimple* registry) { |
| 180 registry->RegisterBooleanPref(prefs::kFactoryResetRequested, false); | 99 registry->RegisterBooleanPref(prefs::kFactoryResetRequested, false); |
| 181 } | 100 } |
| 182 | 101 |
| 183 void ResetScreenHandler::Initialize() { | 102 void ResetScreenHandler::Initialize() { |
| 184 if (!page_is_ready() || !delegate_) | 103 if (!page_is_ready()) |
| 185 return; | 104 return; |
| 186 | 105 |
| 187 if (show_on_init_) { | 106 if (show_on_init_) { |
| 188 Show(); | 107 Show(); |
| 189 show_on_init_ = false; | 108 show_on_init_ = false; |
| 190 } | 109 } |
| 191 } | 110 } |
| 192 | 111 |
| 193 void ResetScreenHandler::RegisterMessages() { | 112 void ResetScreenHandler::Bind(ResetModel& model) { |
| 194 AddCallback("cancelOnReset", &ResetScreenHandler::HandleOnCancel); | 113 model_ = &model; |
| 195 AddCallback("restartOnReset", &ResetScreenHandler::HandleOnRestart); | 114 BaseScreenHandler::SetBaseScreen(model_); |
| 196 AddCallback("powerwashOnReset", &ResetScreenHandler::HandleOnPowerwash); | |
| 197 AddCallback("resetOnLearnMore", &ResetScreenHandler::HandleOnLearnMore); | |
| 198 AddCallback("toggleRollbackOnResetScreen", | |
| 199 &ResetScreenHandler::HandleOnToggleRollback); | |
| 200 AddCallback( | |
| 201 "showConfirmationOnReset", &ResetScreenHandler::HandleOnShowConfirm); | |
| 202 } | 115 } |
| 203 | 116 |
| 204 void ResetScreenHandler::HandleOnCancel() { | 117 void ResetScreenHandler::Unbind() { |
| 205 if (preparing_for_rollback_) | 118 model_ = nullptr; |
| 206 return; | 119 BaseScreenHandler::SetBaseScreen(nullptr); |
| 207 // Hide Rollback view for the next show. | |
| 208 if (rollback_available_ && rollback_checked_) | |
| 209 HandleOnToggleRollback(); | |
| 210 if (delegate_) | |
| 211 delegate_->OnExit(); | |
| 212 DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this); | |
| 213 } | |
| 214 | |
| 215 void ResetScreenHandler::HandleOnRestart() { | |
| 216 PrefService* prefs = g_browser_process->local_state(); | |
| 217 prefs->SetBoolean(prefs::kFactoryResetRequested, true); | |
| 218 prefs->CommitPendingWrite(); | |
| 219 | |
| 220 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart(); | |
| 221 } | |
| 222 | |
| 223 void ResetScreenHandler::HandleOnPowerwash(bool rollback_checked) { | |
| 224 if (rollback_available_ && rollback_checked) { | |
| 225 preparing_for_rollback_ = true; | |
| 226 CallJS("updateViewOnRollbackCall"); | |
| 227 DBusThreadManager::Get()->GetUpdateEngineClient()->AddObserver(this); | |
| 228 VLOG(1) << "Starting Rollback"; | |
| 229 chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()->Rollback(); | |
| 230 } else { | |
| 231 if (rollback_checked && !rollback_available_) { | |
| 232 NOTREACHED() << | |
| 233 "Rollback was checked but not available. Starting powerwash."; | |
| 234 } | |
| 235 VLOG(1) << "Starting Powerwash"; | |
| 236 chromeos::DBusThreadManager::Get()->GetSessionManagerClient()-> | |
| 237 StartDeviceWipe(); | |
| 238 } | |
| 239 } | |
| 240 | |
| 241 void ResetScreenHandler::HandleOnLearnMore() { | |
| 242 VLOG(1) << "Trying to view the help article about reset options."; | |
| 243 if (!help_app_.get()) | |
| 244 help_app_ = new HelpAppLauncher(GetNativeWindow()); | |
| 245 help_app_->ShowHelpTopic(HelpAppLauncher::HELP_POWERWASH); | |
| 246 } | |
| 247 | |
| 248 void ResetScreenHandler::HandleOnToggleRollback() { | |
| 249 // Hide Rollback if visible. | |
| 250 if (rollback_available_ && rollback_checked_) { | |
| 251 VLOG(1) << "Hiding rollback view on reset screen"; | |
| 252 CallJS("hideRollbackOption"); | |
| 253 rollback_checked_ = false; | |
| 254 return; | |
| 255 } | |
| 256 | |
| 257 // Show Rollback if available. | |
| 258 VLOG(1) << "Requested rollback availability" << rollback_available_; | |
| 259 if (rollback_available_ && !rollback_checked_) { | |
| 260 UMA_HISTOGRAM_ENUMERATION( | |
| 261 "Reset.ChromeOS.PowerwashDialogShown", | |
| 262 reset::DIALOG_SHORTCUT_OFFERING_ROLLBACK_AVAILABLE, | |
| 263 reset::DIALOG_VIEW_TYPE_SIZE); | |
| 264 CallJS("showRollbackOption"); | |
| 265 rollback_checked_ = true; | |
| 266 } | |
| 267 } | |
| 268 | |
| 269 void ResetScreenHandler::HandleOnShowConfirm() { | |
| 270 int dialog_type = rollback_checked_ ? | |
| 271 reset::DIALOG_SHORTCUT_CONFIRMING_POWERWASH_AND_ROLLBACK : | |
| 272 reset::DIALOG_SHORTCUT_CONFIRMING_POWERWASH_ONLY; | |
| 273 UMA_HISTOGRAM_ENUMERATION( | |
| 274 "Reset.ChromeOS.PowerwashDialogShown", | |
| 275 dialog_type, | |
| 276 reset::DIALOG_VIEW_TYPE_SIZE); | |
| 277 } | |
| 278 | |
| 279 void ResetScreenHandler::UpdateStatusChanged( | |
| 280 const UpdateEngineClient::Status& status) { | |
| 281 VLOG(1) << "Update status change to " << status.status; | |
| 282 if (status.status == UpdateEngineClient::UPDATE_STATUS_ERROR || | |
| 283 status.status == | |
| 284 UpdateEngineClient::UPDATE_STATUS_REPORTING_ERROR_EVENT) { | |
| 285 preparing_for_rollback_ = false; | |
| 286 // Show error screen. | |
| 287 base::DictionaryValue params; | |
| 288 params.SetInteger("uiState", kErrorUIStateRollback); | |
| 289 ShowScreen(OobeUI::kScreenErrorMessage, ¶ms); | |
| 290 } else if (status.status == | |
| 291 UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT) { | |
| 292 DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart(); | |
| 293 } | |
| 294 } | 120 } |
| 295 | 121 |
| 296 } // namespace chromeos | 122 } // namespace chromeos |
| OLD | NEW |