Home | History | Annotate | Download | only in login
      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