Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / chrome_browser_main_chromeos.cc
index b995ba0..0009c9a 100644 (file)
 #include "chrome/browser/chromeos/accessibility/magnification_manager.h"
 #include "chrome/browser/chromeos/app_mode/kiosk_app_launch_error.h"
 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
+#include "chrome/browser/chromeos/app_mode/kiosk_mode_idle_app_name_notification.h"
 #include "chrome/browser/chromeos/boot_times_loader.h"
 #include "chrome/browser/chromeos/contacts/contact_manager.h"
 #include "chrome/browser/chromeos/dbus/cros_dbus_service.h"
+#include "chrome/browser/chromeos/events/event_rewriter.h"
+#include "chrome/browser/chromeos/events/system_key_event_listener.h"
+#include "chrome/browser/chromeos/events/xinput_hierarchy_changed_event_listener.h"
 #include "chrome/browser/chromeos/extensions/default_app_order.h"
 #include "chrome/browser/chromeos/extensions/extension_system_event_observer.h"
 #include "chrome/browser/chromeos/external_metrics.h"
 #include "chrome/browser/chromeos/imageburner/burn_manager.h"
 #include "chrome/browser/chromeos/input_method/input_method_configuration.h"
+#include "chrome/browser/chromeos/input_method/input_method_util.h"
 #include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_idle_logout.h"
 #include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver.h"
 #include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_settings.h"
+#include "chrome/browser/chromeos/language_preferences.h"
 #include "chrome/browser/chromeos/login/authenticator.h"
 #include "chrome/browser/chromeos/login/login_utils.h"
 #include "chrome/browser/chromeos/login/login_wizard.h"
 #include "chrome/browser/chromeos/power/idle_action_warning_observer.h"
 #include "chrome/browser/chromeos/power/peripheral_battery_observer.h"
 #include "chrome/browser/chromeos/power/power_button_observer.h"
+#include "chrome/browser/chromeos/power/power_data_collector.h"
 #include "chrome/browser/chromeos/power/power_prefs.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h"
 #include "chrome/browser/chromeos/settings/device_settings_service.h"
 #include "chrome/browser/chromeos/settings/owner_key_util.h"
 #include "chrome/browser/chromeos/status/data_promo_notification.h"
-#include "chrome/browser/chromeos/system_key_event_listener.h"
 #include "chrome/browser/chromeos/upgrade_detector_chromeos.h"
-#include "chrome/browser/chromeos/xinput_hierarchy_changed_event_listener.h"
 #include "chrome/browser/defaults.h"
 #include "chrome/browser/metrics/metrics_service.h"
 #include "chrome/browser/net/chrome_network_delegate.h"
@@ -92,7 +97,6 @@
 #include "chromeos/network/network_change_notifier_chromeos.h"
 #include "chromeos/network/network_change_notifier_factory_chromeos.h"
 #include "chromeos/network/network_handler.h"
-#include "chromeos/power/power_data_collector.h"
 #include "chromeos/system/statistics_provider.h"
 #include "chromeos/tpm_token_loader.h"
 #include "content/public/browser/browser_thread.h"
@@ -553,6 +557,63 @@ void ChromeBrowserMainPartsChromeos::PreProfileInit() {
   }
 }
 
+class GuestLanguageSetCallbackData {
+ public:
+  explicit GuestLanguageSetCallbackData(Profile* profile) : profile(profile) {
+  }
+
+  // Must match SwitchLanguageCallback type.
+  static void Callback(const scoped_ptr<GuestLanguageSetCallbackData>& self,
+                       const std::string& locale,
+                       const std::string& loaded_locale,
+                       bool success);
+
+  Profile* profile;
+};
+
+// static
+void GuestLanguageSetCallbackData::Callback(
+    const scoped_ptr<GuestLanguageSetCallbackData>& self,
+    const std::string& locale,
+    const std::string& loaded_locale,
+    bool success) {
+  input_method::InputMethodManager* const ime_manager =
+      input_method::InputMethodManager::Get();
+  // Active layout must be hardware "login layout".
+  // The previous one must be "locale default layout".
+  // First, enable all hardware input methods.
+  const std::vector<std::string>& input_methods =
+      ime_manager->GetInputMethodUtil()->GetHardwareInputMethodIds();
+  for (size_t i = 0; i < input_methods.size(); ++i)
+    ime_manager->EnableInputMethod(input_methods[i]);
+
+  // Second, enable locale based input methods.
+  const std::string locale_default_input_method =
+      ime_manager->GetInputMethodUtil()->
+          GetLanguageDefaultInputMethodId(loaded_locale);
+  if (!locale_default_input_method.empty()) {
+    PrefService* user_prefs = self->profile->GetPrefs();
+    user_prefs->SetString(prefs::kLanguagePreviousInputMethod,
+                          locale_default_input_method);
+    ime_manager->EnableInputMethod(locale_default_input_method);
+  }
+
+  // Finally, activate the first login input method.
+  const std::vector<std::string>& login_input_methods =
+      ime_manager->GetInputMethodUtil()->GetHardwareLoginInputMethodIds();
+  ime_manager->ChangeInputMethod(login_input_methods[0]);
+}
+
+void SetGuestLocale(UserManager* const usermanager, Profile* const profile) {
+  scoped_ptr<GuestLanguageSetCallbackData> data(
+      new GuestLanguageSetCallbackData(profile));
+  scoped_ptr<locale_util::SwitchLanguageCallback> callback(
+      new locale_util::SwitchLanguageCallback(base::Bind(
+          &GuestLanguageSetCallbackData::Callback, base::Passed(data.Pass()))));
+  User* const user = usermanager->GetUserByProfile(profile);
+  usermanager->RespectLocalePreference(profile, user, callback.Pass());
+}
+
 void ChromeBrowserMainPartsChromeos::PostProfileInit() {
   // -- This used to be in ChromeBrowserMainParts::PreMainMessageLoopRun()
   // -- just after CreateProfile().
@@ -609,6 +670,12 @@ void ChromeBrowserMainPartsChromeos::PostProfileInit() {
     OptionallyRunChromeOSLoginManager(parsed_command_line(), profile());
   }
 
+  // Guest user profile is never initialized with locale settings,
+  // so we need special handling for Guest session.
+  UserManager* const usermanager = UserManager::Get();
+  if (usermanager->IsLoggedInAsGuest())
+    SetGuestLocale(usermanager, profile());
+
   // These observers must be initialized after the profile because
   // they use the profile to dispatch extension events.
   extension_system_event_observer_.reset(new ExtensionSystemEventObserver());
@@ -645,6 +712,8 @@ void ChromeBrowserMainPartsChromeos::PreBrowserStart() {
   DeviceUMA::GetInstance();
 #endif
 
+  event_rewriter_.reset(new EventRewriter());
+
   // -- This used to be in ChromeBrowserMainParts::PreMainMessageLoopRun()
   // -- immediately after ChildProcess::WaitForDebugger().
 
@@ -677,6 +746,9 @@ void ChromeBrowserMainPartsChromeos::PostMainMessageLoopRun() {
 
   g_browser_process->platform_part()->oom_priority_manager()->Stop();
 
+  // Destroy the application name notifier for Kiosk mode.
+  KioskModeIdleAppNameNotification::Shutdown();
+
   // Stops all in-flight OAuth2 token fetchers before the IO thread stops.
   DeviceOAuth2TokenServiceFactory::Shutdown();
 
@@ -706,6 +778,7 @@ void ChromeBrowserMainPartsChromeos::PostMainMessageLoopRun() {
   retail_mode_power_save_blocker_.reset();
   peripheral_battery_observer_.reset();
   power_prefs_.reset();
+  event_rewriter_.reset();
 
   // The XInput2 event listener needs to be shut down earlier than when
   // Singletons are finally destroyed in AtExitManager.