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