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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h" 6 7 #include "ash/magnifier/magnifier_constants.h" 8 #include "base/memory/scoped_ptr.h" 9 #include "chrome/browser/browser_process.h" 10 #include "chrome/browser/chrome_notification_types.h" 11 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h" 12 #include "chrome/browser/chromeos/accessibility/magnification_manager.h" 13 #include "chrome/browser/chromeos/login/wizard_controller.h" 14 #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" 15 #include "chrome/browser/chromeos/system/input_device_settings.h" 16 #include "chrome/browser/policy/browser_policy_connector.h" 17 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" 18 #include "chrome/common/chrome_constants.h" 19 #include "chrome/common/chrome_version_info.h" 20 #include "chromeos/chromeos_constants.h" 21 #include "content/public/browser/notification_service.h" 22 #include "grit/chromium_strings.h" 23 #include "grit/generated_resources.h" 24 25 namespace { 26 27 const char kJsScreenPath[] = "cr.ui.Oobe"; 28 29 // JS API callbacks names. 30 const char kJsApiEnableHighContrast[] = "enableHighContrast"; 31 const char kJsApiEnableScreenMagnifier[] = "enableScreenMagnifier"; 32 const char kJsApiEnableLargeCursor[] = "enableLargeCursor"; 33 const char kJsApiEnableSpokenFeedback[] = "enableSpokenFeedback"; 34 const char kJsApiScreenStateInitialize[] = "screenStateInitialize"; 35 const char kJsApiSkipUpdateEnrollAfterEula[] = "skipUpdateEnrollAfterEula"; 36 37 } // namespace 38 39 namespace chromeos { 40 41 // Note that show_oobe_ui_ defaults to false because WizardController assumes 42 // OOBE UI is not visible by default. 43 CoreOobeHandler::CoreOobeHandler(OobeUI* oobe_ui) 44 : BaseScreenHandler(kJsScreenPath), 45 oobe_ui_(oobe_ui), 46 show_oobe_ui_(false), 47 version_info_updater_(this), 48 delegate_(NULL) { 49 registrar_.Add( 50 this, 51 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE, 52 content::NotificationService::AllSources()); 53 registrar_.Add( 54 this, 55 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFIER, 56 content::NotificationService::AllSources()); 57 registrar_.Add( 58 this, 59 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK, 60 content::NotificationService::AllSources()); 61 registrar_.Add( 62 this, 63 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_LARGE_CURSOR, 64 content::NotificationService::AllSources()); 65 } 66 67 CoreOobeHandler::~CoreOobeHandler() { 68 } 69 70 void CoreOobeHandler::SetDelegate(Delegate* delegate) { 71 delegate_ = delegate; 72 } 73 74 void CoreOobeHandler::DeclareLocalizedValues(LocalizedValuesBuilder* builder) { 75 builder->Add("title", IDS_SHORT_PRODUCT_NAME); 76 builder->Add("productName", IDS_SHORT_PRODUCT_NAME); 77 builder->Add("learnMore", IDS_LEARN_MORE); 78 79 // OOBE accessibility options menu strings shown on each screen. 80 builder->Add("accessibilityLink", IDS_OOBE_ACCESSIBILITY_LINK); 81 builder->Add("spokenFeedbackOption", IDS_OOBE_SPOKEN_FEEDBACK_OPTION); 82 builder->Add("largeCursorOption", IDS_OOBE_LARGE_CURSOR_OPTION); 83 builder->Add("highContrastOption", IDS_OOBE_HIGH_CONTRAST_MODE_OPTION); 84 builder->Add("screenMagnifierOption", IDS_OOBE_SCREEN_MAGNIFIER_OPTION); 85 86 // Strings for the device requisition prompt. 87 builder->Add("deviceRequisitionPromptCancel", 88 IDS_ENTERPRISE_DEVICE_REQUISITION_PROMPT_CANCEL); 89 builder->Add("deviceRequisitionPromptOk", 90 IDS_ENTERPRISE_DEVICE_REQUISITION_PROMPT_OK); 91 builder->Add("deviceRequisitionPromptText", 92 IDS_ENTERPRISE_DEVICE_REQUISITION_PROMPT_TEXT); 93 } 94 95 void CoreOobeHandler::Initialize() { 96 UpdateA11yState(); 97 UpdateOobeUIVisibility(); 98 #if defined(OFFICIAL_BUILD) 99 version_info_updater_.StartUpdate(true); 100 #else 101 version_info_updater_.StartUpdate(false); 102 #endif 103 UpdateDeviceRequisition(); 104 } 105 106 void CoreOobeHandler::RegisterMessages() { 107 AddCallback(kJsApiScreenStateInitialize, 108 &CoreOobeHandler::HandleInitialized); 109 AddCallback(kJsApiSkipUpdateEnrollAfterEula, 110 &CoreOobeHandler::HandleSkipUpdateEnrollAfterEula); 111 AddCallback("updateCurrentScreen", 112 &CoreOobeHandler::HandleUpdateCurrentScreen); 113 AddCallback(kJsApiEnableHighContrast, 114 &CoreOobeHandler::HandleEnableHighContrast); 115 AddCallback(kJsApiEnableLargeCursor, 116 &CoreOobeHandler::HandleEnableLargeCursor); 117 AddCallback(kJsApiEnableScreenMagnifier, 118 &CoreOobeHandler::HandleEnableScreenMagnifier); 119 AddCallback(kJsApiEnableSpokenFeedback, 120 &CoreOobeHandler::HandleEnableSpokenFeedback); 121 AddCallback("setDeviceRequisition", 122 &CoreOobeHandler::HandleSetDeviceRequisition); 123 AddCallback("skipToLoginForTesting", 124 &CoreOobeHandler::HandleSkipToLoginForTesting); 125 } 126 127 void CoreOobeHandler::ShowSignInError( 128 int login_attempts, 129 const std::string& error_text, 130 const std::string& help_link_text, 131 HelpAppLauncher::HelpTopic help_topic_id) { 132 CallJS("showSignInError", login_attempts, error_text, 133 help_link_text, static_cast<int>(help_topic_id)); 134 } 135 136 void CoreOobeHandler::ShowTpmError() { 137 CallJS("showTpmError"); 138 } 139 140 void CoreOobeHandler::ShowSignInUI(const std::string& email) { 141 CallJS("showSigninUI", email); 142 } 143 144 void CoreOobeHandler::ResetSignInUI(bool force_online) { 145 CallJS("resetSigninUI", force_online); 146 } 147 148 void CoreOobeHandler::ClearUserPodPassword() { 149 CallJS("clearUserPodPassword"); 150 } 151 152 void CoreOobeHandler::RefocusCurrentPod() { 153 CallJS("refocusCurrentPod"); 154 } 155 156 void CoreOobeHandler::OnLoginSuccess(const std::string& username) { 157 CallJS("onLoginSuccess", username); 158 } 159 160 void CoreOobeHandler::ShowPasswordChangedScreen(bool show_password_error) { 161 CallJS("showPasswordChangedScreen", show_password_error); 162 } 163 164 void CoreOobeHandler::SetUsageStats(bool checked) { 165 CallJS("setUsageStats", checked); 166 } 167 168 void CoreOobeHandler::SetOemEulaUrl(const std::string& oem_eula_url) { 169 CallJS("setOemEulaUrl", oem_eula_url); 170 } 171 172 void CoreOobeHandler::SetTpmPassword(const std::string& tpm_password) { 173 CallJS("setTpmPassword", tpm_password); 174 } 175 176 void CoreOobeHandler::ClearErrors() { 177 CallJS("clearErrors"); 178 } 179 180 void CoreOobeHandler::ReloadContent(const base::DictionaryValue& dictionary) { 181 CallJS("reloadContent", dictionary); 182 } 183 184 void CoreOobeHandler::HandleInitialized() { 185 oobe_ui_->InitializeHandlers(); 186 } 187 188 void CoreOobeHandler::HandleSkipUpdateEnrollAfterEula() { 189 WizardController* controller = WizardController::default_controller(); 190 DCHECK(controller); 191 if (controller) 192 controller->SkipUpdateEnrollAfterEula(); 193 } 194 195 void CoreOobeHandler::HandleUpdateCurrentScreen(const std::string& screen) { 196 if (delegate_) 197 delegate_->OnCurrentScreenChanged(screen); 198 } 199 200 void CoreOobeHandler::HandleEnableHighContrast(bool enabled) { 201 AccessibilityManager::Get()->EnableHighContrast(enabled); 202 } 203 204 void CoreOobeHandler::HandleEnableLargeCursor(bool enabled) { 205 AccessibilityManager::Get()->EnableLargeCursor(enabled); 206 } 207 208 void CoreOobeHandler::HandleEnableScreenMagnifier(bool enabled) { 209 // TODO(nkostylev): Add support for partial screen magnifier. 210 DCHECK(MagnificationManager::Get()); 211 MagnificationManager::Get()->SetMagnifierEnabled(enabled); 212 } 213 214 void CoreOobeHandler::HandleEnableSpokenFeedback() { 215 // Checkbox is initialized on page init and updates when spoken feedback 216 // setting is changed so just toggle spoken feedback here. 217 AccessibilityManager::Get()->ToggleSpokenFeedback( 218 ash::A11Y_NOTIFICATION_NONE); 219 } 220 221 void CoreOobeHandler::HandleSetDeviceRequisition( 222 const std::string& requisition) { 223 g_browser_process->browser_policy_connector()->GetDeviceCloudPolicyManager()-> 224 SetDeviceRequisition(requisition); 225 } 226 227 void CoreOobeHandler::HandleSkipToLoginForTesting() { 228 if (WizardController::default_controller()) 229 WizardController::default_controller()->SkipToLoginForTesting(); 230 } 231 232 void CoreOobeHandler::ShowOobeUI(bool show) { 233 if (show == show_oobe_ui_) 234 return; 235 236 show_oobe_ui_ = show; 237 238 if (page_is_ready()) 239 UpdateOobeUIVisibility(); 240 } 241 242 void CoreOobeHandler::UpdateA11yState() { 243 DCHECK(MagnificationManager::Get()); 244 base::DictionaryValue a11y_info; 245 a11y_info.SetBoolean("highContrastEnabled", 246 AccessibilityManager::Get()->IsHighContrastEnabled()); 247 a11y_info.SetBoolean("largeCursorEnabled", 248 AccessibilityManager::Get()->IsLargeCursorEnabled()); 249 a11y_info.SetBoolean("spokenFeedbackEnabled", 250 AccessibilityManager::Get()->IsSpokenFeedbackEnabled()); 251 a11y_info.SetBoolean("screenMagnifierEnabled", 252 MagnificationManager::Get()->IsMagnifierEnabled()); 253 CallJS("refreshA11yInfo", a11y_info); 254 } 255 256 void CoreOobeHandler::UpdateOobeUIVisibility() { 257 // Don't show version label on the stable channel by default. 258 bool should_show_version = true; 259 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); 260 if (channel == chrome::VersionInfo::CHANNEL_STABLE || 261 channel == chrome::VersionInfo::CHANNEL_BETA) { 262 should_show_version = false; 263 } 264 CallJS("showVersion", should_show_version); 265 CallJS("showOobeUI", show_oobe_ui_); 266 if (system::keyboard_settings::ForceKeyboardDrivenUINavigation()) 267 CallJS("enableKeyboardFlow", true); 268 } 269 270 void CoreOobeHandler::OnOSVersionLabelTextUpdated( 271 const std::string& os_version_label_text) { 272 UpdateLabel("version", os_version_label_text); 273 } 274 275 void CoreOobeHandler::OnEnterpriseInfoUpdated( 276 const std::string& message_text) { 277 CallJS("setEnterpriseInfo", message_text); 278 } 279 280 void CoreOobeHandler::UpdateLabel(const std::string& id, 281 const std::string& text) { 282 CallJS("setLabelText", id, text); 283 } 284 285 void CoreOobeHandler::UpdateDeviceRequisition() { 286 CallJS("updateDeviceRequisition", 287 g_browser_process->browser_policy_connector()-> 288 GetDeviceCloudPolicyManager()->GetDeviceRequisition()); 289 } 290 291 void CoreOobeHandler::Observe(int type, 292 const content::NotificationSource& source, 293 const content::NotificationDetails& details) { 294 if (type == 295 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE || 296 type == chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_LARGE_CURSOR || 297 type == chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFIER || 298 type == chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK) { 299 UpdateA11yState(); 300 } else { 301 NOTREACHED() << "Unexpected notification " << type; 302 } 303 } 304 305 } // namespace chromeos 306