Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(287)

Side by Side Diff: chrome/browser/ui/webui/chromeos/login/reset_screen_handler.cc

Issue 491263002: UI flow rework for device reset options. Reset made available from gaia screen. Tests adapted. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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" 9 #include "base/command_line.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
(...skipping 28 matching lines...) Expand all
39 39
40 namespace chromeos { 40 namespace chromeos {
41 41
42 ResetScreenHandler::ResetScreenHandler() 42 ResetScreenHandler::ResetScreenHandler()
43 : BaseScreenHandler(kJsScreenPath), 43 : BaseScreenHandler(kJsScreenPath),
44 delegate_(NULL), 44 delegate_(NULL),
45 show_on_init_(false), 45 show_on_init_(false),
46 restart_required_(true), 46 restart_required_(true),
47 reboot_was_requested_(false), 47 reboot_was_requested_(false),
48 rollback_available_(false), 48 rollback_available_(false),
49 rollback_checked_(false),
49 preparing_for_rollback_(false), 50 preparing_for_rollback_(false),
50 weak_ptr_factory_(this) { 51 weak_ptr_factory_(this) {
51 } 52 }
52 53
53 ResetScreenHandler::~ResetScreenHandler() { 54 ResetScreenHandler::~ResetScreenHandler() {
54 if (delegate_) 55 if (delegate_)
55 delegate_->OnActorDestroyed(this); 56 delegate_->OnActorDestroyed(this);
56 DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this); 57 DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this);
57 } 58 }
58 59
59 void ResetScreenHandler::PrepareToShow() { 60 void ResetScreenHandler::PrepareToShow() {
60 } 61 }
61 62
62 void ResetScreenHandler::ShowWithParams() { 63 void ResetScreenHandler::ShowWithParams() {
63 int dialog_type; 64 int dialog_type;
64 if (reboot_was_requested_) { 65 if (restart_required_) {
65 dialog_type = rollback_available_ ? 66 dialog_type = reset::DIALOG_SHORTCUT_RESTART_REQUIRED;
66 reset::DIALOG_SHORTCUT_CONFIRMING_POWERWASH_AND_ROLLBACK :
67 reset::DIALOG_SHORTCUT_CONFIRMING_POWERWASH_ONLY;
68 } else { 67 } else {
69 dialog_type = rollback_available_ ? 68 dialog_type = reset::DIALOG_SHORTCUT_OFFERING_ROLLBACK_UNAVAILABLE;
70 reset::DIALOG_SHORTCUT_OFFERING_ROLLBACK_AVAILABLE :
71 reset::DIALOG_SHORTCUT_OFFERING_ROLLBACK_UNAVAILABLE;
72 } 69 }
73 UMA_HISTOGRAM_ENUMERATION("Reset.ChromeOS.PowerwashDialogShown", 70 UMA_HISTOGRAM_ENUMERATION("Reset.ChromeOS.PowerwashDialogShown",
74 dialog_type, 71 dialog_type,
75 reset::DIALOG_VIEW_TYPE_SIZE); 72 reset::DIALOG_VIEW_TYPE_SIZE);
76 73
77 base::DictionaryValue reset_screen_params;
78 reset_screen_params.SetBoolean("showRestartMsg", restart_required_);
79 reset_screen_params.SetBoolean(
80 "showRollbackOption", rollback_available_ && !reboot_was_requested_);
81 reset_screen_params.SetBoolean(
82 "simpleConfirm", reboot_was_requested_ && !rollback_available_);
83 reset_screen_params.SetBoolean(
84 "rollbackConfirm", reboot_was_requested_ && rollback_available_);
85
86 PrefService* prefs = g_browser_process->local_state(); 74 PrefService* prefs = g_browser_process->local_state();
87 prefs->SetBoolean(prefs::kFactoryResetRequested, false); 75 prefs->SetBoolean(prefs::kFactoryResetRequested, false);
88 prefs->SetBoolean(prefs::kRollbackRequested, false);
89 prefs->CommitPendingWrite(); 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_);
90 ShowScreen(kResetScreen, &reset_screen_params); 80 ShowScreen(kResetScreen, &reset_screen_params);
91 } 81 }
92 82
83
84
Dmitry Polukhin 2014/08/22 07:58:23 Nit, remove duplicating empty strings.
merkulova 2014/08/22 09:46:46 Done.
93 void ResetScreenHandler::Show() { 85 void ResetScreenHandler::Show() {
94 if (!page_is_ready()) { 86 if (!page_is_ready()) {
95 show_on_init_ = true; 87 show_on_init_ = true;
96 return; 88 return;
97 } 89 }
98 90
99 ChooseAndApplyShowScenario(); 91 ChooseAndApplyShowScenario();
100 } 92 }
101 93
102 void ResetScreenHandler::ChooseAndApplyShowScenario() { 94 void ResetScreenHandler::ChooseAndApplyShowScenario() {
103 PrefService* prefs = g_browser_process->local_state(); 95 PrefService* prefs = g_browser_process->local_state();
104 restart_required_ = !CommandLine::ForCurrentProcess()->HasSwitch( 96 restart_required_ = !CommandLine::ForCurrentProcess()->HasSwitch(
105 switches::kFirstExecAfterBoot); 97 switches::kFirstExecAfterBoot);
98
106 reboot_was_requested_ = false; 99 reboot_was_requested_ = false;
107 rollback_available_ = false; 100 rollback_available_ = false;
108 preparing_for_rollback_ = false; 101 preparing_for_rollback_ = false;
109 if (!restart_required_) // First exec after boot. 102 if (!restart_required_) // First exec after boot.
110 reboot_was_requested_ = prefs->GetBoolean(prefs::kFactoryResetRequested); 103 reboot_was_requested_ = prefs->GetBoolean(prefs::kFactoryResetRequested);
111 104
112 if (!CommandLine::ForCurrentProcess()->HasSwitch( 105 if (!CommandLine::ForCurrentProcess()->HasSwitch(
113 switches::kEnableRollbackOption)) { 106 switches::kEnableRollbackOption)) {
114 rollback_available_ = false; 107 rollback_available_ = false;
115 ShowWithParams(); 108 ShowWithParams();
116 } else if (!restart_required_ && reboot_was_requested_) { 109 } else if (!restart_required_ && reboot_was_requested_) {
117 // First exec after boot. 110 // First exec after boot.
118 PrefService* prefs = g_browser_process->local_state();
119 rollback_available_ = prefs->GetBoolean(prefs::kRollbackRequested);
120 ShowWithParams();
121 } else {
122 chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()-> 111 chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()->
123 CanRollbackCheck(base::Bind(&ResetScreenHandler::OnRollbackCheck, 112 CanRollbackCheck(base::Bind(&ResetScreenHandler::OnRollbackCheck,
124 weak_ptr_factory_.GetWeakPtr())); 113 weak_ptr_factory_.GetWeakPtr()));
114 } else {
115 // Will require restart.
116 ShowWithParams();
125 } 117 }
126 } 118 }
127 119
128 void ResetScreenHandler::Hide() { 120 void ResetScreenHandler::Hide() {
129 DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this); 121 DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this);
130 } 122 }
131 123
132 void ResetScreenHandler::SetDelegate(Delegate* delegate) { 124 void ResetScreenHandler::SetDelegate(Delegate* delegate) {
133 delegate_ = delegate; 125 delegate_ = delegate;
134 if (page_is_ready()) 126 if (page_is_ready())
135 Initialize(); 127 Initialize();
136 } 128 }
137 129
138 void ResetScreenHandler::DeclareLocalizedValues( 130 void ResetScreenHandler::DeclareLocalizedValues(
139 LocalizedValuesBuilder* builder) { 131 LocalizedValuesBuilder* builder) {
140 builder->Add("resetScreenTitle", IDS_RESET_SCREEN_TITLE); 132 builder->Add("resetScreenTitle", IDS_RESET_SCREEN_TITLE);
141 builder->Add("resetScreenAccessibleTitle", IDS_RESET_SCREEN_TITLE); 133 builder->Add("resetScreenAccessibleTitle", IDS_RESET_SCREEN_TITLE);
142 builder->Add("resetScreenIconTitle",IDS_RESET_SCREEN_ICON_TITLE); 134 builder->Add("resetScreenIconTitle",IDS_RESET_SCREEN_ICON_TITLE);
143 builder->Add("cancelButton", IDS_CANCEL); 135 builder->Add("cancelButton", IDS_CANCEL);
136 builder->Add("resetButtonReset", IDS_RESET_SCREEN_RESET);
137 builder->Add("resetButtonRestart", IDS_RELAUNCH_BUTTON);
138 builder->Add("resetButtonPowerwash", IDS_RESET_SCREEN_POWERWASH);
139 builder->Add("resetButtonPowerwashAndRollback",
140 IDS_RESET_SCREEN_POWERWASH_AND_REVERT);
144 141
145 builder->Add("resetWarningDataDetails", 142 builder->Add("resetWarningDataDetails",
146 IDS_RESET_SCREEN_WARNING_DETAILS_DATA); 143 IDS_RESET_SCREEN_WARNING_DETAILS_DATA);
147 builder->Add("resetRestartMessage", IDS_RESET_SCREEN_RESTART_MSG); 144 builder->Add("resetRestartMessage", IDS_RESET_SCREEN_RESTART_MSG);
148 builder->AddF("resetRollbackOption",
149 IDS_RESET_SCREEN_ROLLBACK_OPTION,
150 IDS_SHORT_PRODUCT_NAME);
151 builder->AddF("resetRevertPromise", 145 builder->AddF("resetRevertPromise",
152 IDS_RESET_SCREEN_PREPARING_REVERT_PROMISE, 146 IDS_RESET_SCREEN_PREPARING_REVERT_PROMISE,
153 IDS_SHORT_PRODUCT_NAME); 147 IDS_SHORT_PRODUCT_NAME);
154 builder->AddF("resetRevertSpinnerMessage", 148 builder->AddF("resetRevertSpinnerMessage",
155 IDS_RESET_SCREEN_PREPARING_REVERT_SPINNER_MESSAGE, 149 IDS_RESET_SCREEN_PREPARING_REVERT_SPINNER_MESSAGE,
156 IDS_SHORT_PRODUCT_NAME); 150 IDS_SHORT_PRODUCT_NAME);
157 151
158 // Different variants of the same UI elements for all dialog cases. 152 // Variants for screen title.
159 builder->Add("resetButtonReset", IDS_RESET_SCREEN_RESET); 153 builder->AddF("resetWarningTitle",
160 builder->Add("resetButtonRelaunch", IDS_RELAUNCH_BUTTON);
161 builder->Add("resetButtonPowerwash", IDS_RESET_SCREEN_POWERWASH);
162
163 builder->AddF(
164 "resetAndRollbackWarningTextConfirmational",
165 IDS_RESET_SCREEN_CONFIRMATION_WARNING_POWERWASH_AND_ROLLBACK_MSG,
166 IDS_SHORT_PRODUCT_NAME);
167 builder->AddF("resetWarningTextConfirmational",
168 IDS_RESET_SCREEN_CONFIRMATION_WARNING_POWERWASH_MSG,
169 IDS_SHORT_PRODUCT_NAME);
170 builder->AddF("resetWarningTextInitial",
171 IDS_RESET_SCREEN_WARNING_MSG, 154 IDS_RESET_SCREEN_WARNING_MSG,
172 IDS_SHORT_PRODUCT_NAME); 155 IDS_SHORT_PRODUCT_NAME);
156 builder->AddF("resetPowerwashWarningTitle",
157 IDS_RESET_SCREEN_WARNING_POWERWASH_MSG,
158 IDS_SHORT_PRODUCT_NAME);
159 builder->AddF("resetPowerwasAndRollbackhWarningTitle",
160 IDS_RESET_SCREEN_WARNING_POWERWASH_AND_ROLLBACK_MSG,
161 IDS_SHORT_PRODUCT_NAME);
173 162
174 builder->AddF( 163 // Variants for screen message.
175 "resetAndRollbackWarningDetailsConfirmational", 164 builder->AddF("resetPowerwashWarningDetails",
176 IDS_RESET_SCREEN_CONFIRMATION_WARNING_ROLLBACK_DETAILS, 165 IDS_RESET_SCREEN_WARNING_DETAILS,
177 IDS_SHORT_PRODUCT_NAME); 166 IDS_SHORT_PRODUCT_NAME);
178 builder->AddF("resetWarningDetailsConfirmational", 167 builder->AddF("resetPowerwashRollbackWarningDetails",
168 IDS_RESET_SCREEN_WARNING_POWERWASH_AND_ROLLBACK_MSG,
169 IDS_SHORT_PRODUCT_NAME);
170 builder->AddF("resetPowerwashConfirmationDetails",
179 IDS_RESET_SCREEN_CONFIRMATION_WARNING_DETAILS, 171 IDS_RESET_SCREEN_CONFIRMATION_WARNING_DETAILS,
180 IDS_SHORT_PRODUCT_NAME); 172 IDS_SHORT_PRODUCT_NAME);
181 builder->AddF("resetWarningDetailsInitial", 173 builder->AddF("resetPowerwashRollbackConfirmationDetails",
182 IDS_RESET_SCREEN_WARNING_DETAILS, 174 IDS_RESET_SCREEN_CONFIRMATION_WARNING_ROLLBACK_DETAILS,
183 IDS_SHORT_PRODUCT_NAME); 175 IDS_SHORT_PRODUCT_NAME);
184 } 176 }
185 177
186 // Invoked from call to CanRollbackCheck upon completion of the DBus call. 178 // Invoked from call to CanRollbackCheck upon completion of the DBus call.
187 void ResetScreenHandler::OnRollbackCheck(bool can_rollback) { 179 void ResetScreenHandler::OnRollbackCheck(bool can_rollback) {
188 VLOG(1) << "Callback from CanRollbackCheck, result " << can_rollback; 180 VLOG(1) << "Callback from CanRollbackCheck, result " << can_rollback;
189 rollback_available_ = can_rollback; 181 rollback_available_ = can_rollback;
190 ShowWithParams(); 182 ShowWithParams();
191 } 183 }
192 184
193 // static 185 // static
194 void ResetScreenHandler::RegisterPrefs(PrefRegistrySimple* registry) { 186 void ResetScreenHandler::RegisterPrefs(PrefRegistrySimple* registry) {
195 registry->RegisterBooleanPref(prefs::kFactoryResetRequested, false); 187 registry->RegisterBooleanPref(prefs::kFactoryResetRequested, false);
196 registry->RegisterBooleanPref(prefs::kRollbackRequested, false);
197 } 188 }
198 189
199 void ResetScreenHandler::Initialize() { 190 void ResetScreenHandler::Initialize() {
200 if (!page_is_ready() || !delegate_) 191 if (!page_is_ready() || !delegate_)
201 return; 192 return;
202 193
203 if (show_on_init_) { 194 if (show_on_init_) {
204 Show(); 195 Show();
205 show_on_init_ = false; 196 show_on_init_ = false;
206 } 197 }
207 } 198 }
208 199
209 void ResetScreenHandler::RegisterMessages() { 200 void ResetScreenHandler::RegisterMessages() {
210 AddCallback("cancelOnReset", &ResetScreenHandler::HandleOnCancel); 201 AddCallback("cancelOnReset", &ResetScreenHandler::HandleOnCancel);
211 AddCallback("restartOnReset", &ResetScreenHandler::HandleOnRestart); 202 AddCallback("restartOnReset", &ResetScreenHandler::HandleOnRestart);
212 AddCallback("powerwashOnReset", &ResetScreenHandler::HandleOnPowerwash); 203 AddCallback("powerwashOnReset", &ResetScreenHandler::HandleOnPowerwash);
213 AddCallback("resetOnLearnMore", &ResetScreenHandler::HandleOnLearnMore); 204 AddCallback("resetOnLearnMore", &ResetScreenHandler::HandleOnLearnMore);
205 AddCallback(
206 "showRollbackOnResetScreen", &ResetScreenHandler::HandleOnShowRollback);
207 AddCallback(
208 "hideRollbackOnResetScreen", &ResetScreenHandler::HandleOnHideRollback);
209 AddCallback(
210 "showConfirmationOnReset", &ResetScreenHandler::HandleOnShowConfirm);
214 } 211 }
215 212
216 void ResetScreenHandler::HandleOnCancel() { 213 void ResetScreenHandler::HandleOnCancel() {
217 if (preparing_for_rollback_) 214 if (preparing_for_rollback_)
218 return; 215 return;
219 if (delegate_) 216 if (delegate_)
220 delegate_->OnExit(); 217 delegate_->OnExit();
221 DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this); 218 DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this);
222 } 219 }
223 220
224 void ResetScreenHandler::HandleOnRestart(bool should_rollback) { 221 void ResetScreenHandler::HandleOnRestart() {
225 PrefService* prefs = g_browser_process->local_state(); 222 PrefService* prefs = g_browser_process->local_state();
226 prefs->SetBoolean(prefs::kFactoryResetRequested, true); 223 prefs->SetBoolean(prefs::kFactoryResetRequested, true);
227 prefs->SetBoolean(prefs::kRollbackRequested, should_rollback);
228 prefs->CommitPendingWrite(); 224 prefs->CommitPendingWrite();
229 225
230 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart(); 226 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart();
231 } 227 }
232 228
233 void ResetScreenHandler::HandleOnPowerwash(bool rollback_checked) { 229 void ResetScreenHandler::HandleOnPowerwash(bool rollback_checked) {
234 if (rollback_available_ && (rollback_checked || reboot_was_requested_)) { 230 if (rollback_available_ && rollback_checked) {
235 preparing_for_rollback_ = true; 231 preparing_for_rollback_ = true;
236 CallJS("updateViewOnRollbackCall"); 232 CallJS("updateViewOnRollbackCall");
237 DBusThreadManager::Get()->GetUpdateEngineClient()->AddObserver(this); 233 DBusThreadManager::Get()->GetUpdateEngineClient()->AddObserver(this);
234 VLOG(1) << "Starting Rollback";
238 chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()->Rollback(); 235 chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()->Rollback();
239 } else { 236 } else {
240 if (rollback_checked && !rollback_available_) { 237 if (rollback_checked && !rollback_available_) {
241 NOTREACHED() << 238 NOTREACHED() <<
242 "Rollback was checked but not available. Starting powerwash."; 239 "Rollback was checked but not available. Starting powerwash.";
243 } 240 }
241 VLOG(1) << "Starting Powerwash";
244 chromeos::DBusThreadManager::Get()->GetSessionManagerClient()-> 242 chromeos::DBusThreadManager::Get()->GetSessionManagerClient()->
245 StartDeviceWipe(); 243 StartDeviceWipe();
246 } 244 }
247 } 245 }
248 246
249 void ResetScreenHandler::HandleOnLearnMore() { 247 void ResetScreenHandler::HandleOnLearnMore() {
250 if (!help_app_.get()) 248 if (!help_app_.get())
251 help_app_ = new HelpAppLauncher(GetNativeWindow()); 249 help_app_ = new HelpAppLauncher(GetNativeWindow());
252 help_app_->ShowHelpTopic(HelpAppLauncher::HELP_POWERWASH); 250 help_app_->ShowHelpTopic(HelpAppLauncher::HELP_POWERWASH);
253 } 251 }
254 252
253 void ResetScreenHandler::HandleOnShowRollback() {
254 VLOG(1) << "Requested rollback availability" << rollback_available_;
255 if (rollback_available_) {
256 UMA_HISTOGRAM_ENUMERATION(
257 "Reset.ChromeOS.PowerwashDialogShown",
258 reset::DIALOG_SHORTCUT_OFFERING_ROLLBACK_AVAILABLE,
259 reset::DIALOG_VIEW_TYPE_SIZE);
260 CallJS("showRollbackOption");
261 rollback_checked_ = true;
262 }
263 }
264
265 void ResetScreenHandler::HandleOnHideRollback() {
266 if (rollback_available_ && rollback_checked_) {
267 CallJS("hideRollbackOption");
268 rollback_checked_ = false;
269 }
270 }
271
272 void ResetScreenHandler::HandleOnShowConfirm() {
273 int dialog_type = rollback_checked_ ?
274 reset::DIALOG_SHORTCUT_CONFIRMING_POWERWASH_AND_ROLLBACK :
275 reset::DIALOG_SHORTCUT_CONFIRMING_POWERWASH_ONLY;
276 UMA_HISTOGRAM_ENUMERATION(
277 "Reset.ChromeOS.PowerwashDialogShown",
278 dialog_type,
279 reset::DIALOG_VIEW_TYPE_SIZE);
280 }
281
255 void ResetScreenHandler::UpdateStatusChanged( 282 void ResetScreenHandler::UpdateStatusChanged(
256 const UpdateEngineClient::Status& status) { 283 const UpdateEngineClient::Status& status) {
257 VLOG(1) << "Update status change to " << status.status; 284 VLOG(1) << "Update status change to " << status.status;
258 if (status.status == UpdateEngineClient::UPDATE_STATUS_ERROR || 285 if (status.status == UpdateEngineClient::UPDATE_STATUS_ERROR ||
259 status.status == 286 status.status ==
260 UpdateEngineClient::UPDATE_STATUS_REPORTING_ERROR_EVENT) { 287 UpdateEngineClient::UPDATE_STATUS_REPORTING_ERROR_EVENT) {
261 preparing_for_rollback_ = false; 288 preparing_for_rollback_ = false;
262 // Show error screen. 289 // Show error screen.
263 base::DictionaryValue params; 290 base::DictionaryValue params;
264 params.SetInteger("uiState", kErrorUIStateRollback); 291 params.SetInteger("uiState", kErrorUIStateRollback);
265 ShowScreen(OobeUI::kScreenErrorMessage, &params); 292 ShowScreen(OobeUI::kScreenErrorMessage, &params);
266 } else if (status.status == 293 } else if (status.status ==
267 UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT) { 294 UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT) {
268 DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart(); 295 DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart();
269 } 296 }
270 } 297 }
271 298
272 } // namespace chromeos 299 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698