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" |
9 #include "base/prefs/pref_registry_simple.h" | 11 #include "base/prefs/pref_registry_simple.h" |
| 12 #include "base/prefs/pref_service.h" |
10 #include "base/values.h" | 13 #include "base/values.h" |
11 #include "chrome/browser/browser_process.h" | 14 #include "chrome/browser/browser_process.h" |
12 #include "chrome/browser/chromeos/login/help_app_launcher.h" | 15 #include "chrome/browser/chromeos/login/help_app_launcher.h" |
13 #include "chrome/browser/chromeos/login/screens/reset_model.h" | 16 #include "chrome/browser/chromeos/reset/metrics.h" |
14 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" | 17 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" |
15 #include "chrome/common/pref_names.h" | 18 #include "chrome/common/pref_names.h" |
16 #include "chrome/grit/chromium_strings.h" | 19 #include "chrome/grit/chromium_strings.h" |
17 #include "chrome/grit/generated_resources.h" | 20 #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" |
18 #include "chromeos/dbus/session_manager_client.h" | 24 #include "chromeos/dbus/session_manager_client.h" |
| 25 #include "chromeos/dbus/update_engine_client.h" |
19 #include "components/login/localized_values_builder.h" | 26 #include "components/login/localized_values_builder.h" |
| 27 #include "content/public/browser/browser_thread.h" |
20 | 28 |
21 namespace { | 29 namespace { |
22 | 30 |
23 const char kJsScreenPath[] = "login.ResetScreen"; | 31 const char kJsScreenPath[] = "login.ResetScreen"; |
24 | 32 |
| 33 // Reset screen id. |
| 34 const char kResetScreen[] = "reset"; |
| 35 |
| 36 const int kErrorUIStateRollback = 7; |
| 37 |
25 } // namespace | 38 } // namespace |
26 | 39 |
27 namespace chromeos { | 40 namespace chromeos { |
28 | 41 |
29 ResetScreenHandler::ResetScreenHandler() | 42 ResetScreenHandler::ResetScreenHandler() |
30 : BaseScreenHandler(kJsScreenPath), | 43 : BaseScreenHandler(kJsScreenPath), |
31 model_(nullptr), | 44 delegate_(NULL), |
32 show_on_init_(false) { | 45 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) { |
33 } | 52 } |
34 | 53 |
35 ResetScreenHandler::~ResetScreenHandler() { | 54 ResetScreenHandler::~ResetScreenHandler() { |
36 if (model_) | 55 if (delegate_) |
37 model_->OnViewDestroyed(this); | 56 delegate_->OnActorDestroyed(this); |
| 57 DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this); |
38 } | 58 } |
39 | 59 |
40 void ResetScreenHandler::PrepareToShow() { | 60 void ResetScreenHandler::PrepareToShow() { |
41 } | 61 } |
42 | 62 |
| 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 |
43 void ResetScreenHandler::Show() { | 86 void ResetScreenHandler::Show() { |
44 if (!page_is_ready()) { | 87 if (!page_is_ready()) { |
45 show_on_init_ = true; | 88 show_on_init_ = true; |
46 return; | 89 return; |
47 } | 90 } |
48 ShowScreen(OobeUI::kScreenOobeReset, NULL); | 91 |
| 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 } |
49 } | 117 } |
50 | 118 |
51 void ResetScreenHandler::Hide() { | 119 void ResetScreenHandler::Hide() { |
52 } | 120 } |
53 | 121 |
| 122 void ResetScreenHandler::SetDelegate(Delegate* delegate) { |
| 123 delegate_ = delegate; |
| 124 if (page_is_ready()) |
| 125 Initialize(); |
| 126 } |
| 127 |
54 void ResetScreenHandler::DeclareLocalizedValues( | 128 void ResetScreenHandler::DeclareLocalizedValues( |
55 ::login::LocalizedValuesBuilder* builder) { | 129 ::login::LocalizedValuesBuilder* builder) { |
56 builder->Add("resetScreenTitle", IDS_RESET_SCREEN_TITLE); | 130 builder->Add("resetScreenTitle", IDS_RESET_SCREEN_TITLE); |
57 builder->Add("resetScreenAccessibleTitle", IDS_RESET_SCREEN_TITLE); | 131 builder->Add("resetScreenAccessibleTitle", IDS_RESET_SCREEN_TITLE); |
58 builder->Add("resetScreenIconTitle", IDS_RESET_SCREEN_ICON_TITLE); | 132 builder->Add("resetScreenIconTitle", IDS_RESET_SCREEN_ICON_TITLE); |
59 builder->Add("cancelButton", IDS_CANCEL); | 133 builder->Add("cancelButton", IDS_CANCEL); |
60 | 134 |
61 builder->Add("resetButtonRestart", IDS_RELAUNCH_BUTTON); | 135 builder->Add("resetButtonRestart", IDS_RELAUNCH_BUTTON); |
62 builder->Add("resetButtonPowerwash", IDS_RESET_SCREEN_POWERWASH); | 136 builder->Add("resetButtonPowerwash", IDS_RESET_SCREEN_POWERWASH); |
63 builder->Add("resetButtonPowerwashAndRollback", | 137 builder->Add("resetButtonPowerwashAndRollback", |
(...skipping 23 matching lines...) Expand all Loading... |
87 IDS_SHORT_PRODUCT_NAME); | 161 IDS_SHORT_PRODUCT_NAME); |
88 | 162 |
89 builder->Add("confirmPowerwashTitle", IDS_RESET_SCREEN_POPUP_POWERWASH_TITLE); | 163 builder->Add("confirmPowerwashTitle", IDS_RESET_SCREEN_POPUP_POWERWASH_TITLE); |
90 builder->Add("confirmRollbackTitle", IDS_RESET_SCREEN_POPUP_ROLLBACK_TITLE); | 164 builder->Add("confirmRollbackTitle", IDS_RESET_SCREEN_POPUP_ROLLBACK_TITLE); |
91 builder->Add("confirmPowerwashMessage", | 165 builder->Add("confirmPowerwashMessage", |
92 IDS_RESET_SCREEN_POPUP_POWERWASH_TEXT); | 166 IDS_RESET_SCREEN_POPUP_POWERWASH_TEXT); |
93 builder->Add("confirmRollbackMessage", IDS_RESET_SCREEN_POPUP_ROLLBACK_TEXT); | 167 builder->Add("confirmRollbackMessage", IDS_RESET_SCREEN_POPUP_ROLLBACK_TEXT); |
94 builder->Add("confirmResetButton", IDS_RESET_SCREEN_POPUP_CONFIRM_BUTTON); | 168 builder->Add("confirmResetButton", IDS_RESET_SCREEN_POPUP_CONFIRM_BUTTON); |
95 } | 169 } |
96 | 170 |
| 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 |
97 // static | 178 // static |
98 void ResetScreenHandler::RegisterPrefs(PrefRegistrySimple* registry) { | 179 void ResetScreenHandler::RegisterPrefs(PrefRegistrySimple* registry) { |
99 registry->RegisterBooleanPref(prefs::kFactoryResetRequested, false); | 180 registry->RegisterBooleanPref(prefs::kFactoryResetRequested, false); |
100 } | 181 } |
101 | 182 |
102 void ResetScreenHandler::Initialize() { | 183 void ResetScreenHandler::Initialize() { |
103 if (!page_is_ready()) | 184 if (!page_is_ready() || !delegate_) |
104 return; | 185 return; |
105 | 186 |
106 if (show_on_init_) { | 187 if (show_on_init_) { |
107 Show(); | 188 Show(); |
108 show_on_init_ = false; | 189 show_on_init_ = false; |
109 } | 190 } |
110 } | 191 } |
111 | 192 |
112 void ResetScreenHandler::Bind(ResetModel& model) { | 193 void ResetScreenHandler::RegisterMessages() { |
113 model_ = &model; | 194 AddCallback("cancelOnReset", &ResetScreenHandler::HandleOnCancel); |
114 BaseScreenHandler::SetBaseScreen(model_); | 195 AddCallback("restartOnReset", &ResetScreenHandler::HandleOnRestart); |
| 196 AddCallback("powerwashOnReset", &ResetScreenHandler::HandleOnPowerwash); |
| 197 AddCallback("resetOnLearnMore", &ResetScreenHandler::HandleOnLearnMore); |
| 198 AddCallback("toggleRollbackOnResetScreen", |
| 199 &ResetScreenHandler::HandleOnToggleRollback); |
| 200 AddCallback( |
| 201 "showConfirmationOnReset", &ResetScreenHandler::HandleOnShowConfirm); |
115 } | 202 } |
116 | 203 |
117 void ResetScreenHandler::Unbind() { | 204 void ResetScreenHandler::HandleOnCancel() { |
118 model_ = nullptr; | 205 if (preparing_for_rollback_) |
119 BaseScreenHandler::SetBaseScreen(nullptr); | 206 return; |
| 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 } |
120 } | 294 } |
121 | 295 |
122 } // namespace chromeos | 296 } // namespace chromeos |
OLD | NEW |