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

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

Issue 904163003: Reset Screen moved to ScreenContext. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Include for GetNativeWindow added. Created 5 years, 10 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
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"
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
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, &params);
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
OLDNEW
« no previous file with comments | « chrome/browser/ui/webui/chromeos/login/reset_screen_handler.h ('k') | chrome/chrome_browser_chromeos.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698