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