| Index: chrome/browser/chromeos/status/input_method_menu.cc
|
| diff --git a/chrome/browser/chromeos/status/input_method_menu.cc b/chrome/browser/chromeos/status/input_method_menu.cc
|
| index 1a6771f1bb1fbc787abd874ab4352ad460787339..e0e8695de5ac6eec2db697cbd0c910c896cfd37d 100644
|
| --- a/chrome/browser/chromeos/status/input_method_menu.cc
|
| +++ b/chrome/browser/chromeos/status/input_method_menu.cc
|
| @@ -14,6 +14,7 @@
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/chromeos/input_method/input_method_util.h"
|
| #include "chrome/browser/chromeos/language_preferences.h"
|
| +#include "chrome/browser/chromeos/status/status_area_view_chromeos.h"
|
| #include "chrome/browser/prefs/pref_service.h"
|
| #include "chrome/common/chrome_notification_types.h"
|
| #include "chrome/common/pref_names.h"
|
| @@ -132,7 +133,6 @@ using input_method::InputMethodManager;
|
| // InputMethodMenu
|
|
|
| InputMethodMenu::InputMethodMenu(PrefService* pref_service,
|
| - StatusAreaViewChromeos::ScreenMode screen_mode,
|
| bool for_out_of_box_experience_dialog)
|
| : input_method_descriptors_(InputMethodManager::GetInstance()->
|
| GetActiveInputMethods()),
|
| @@ -145,28 +145,32 @@ InputMethodMenu::InputMethodMenu(PrefService* pref_service,
|
| minimum_input_method_menu_width_(0),
|
| menu_alignment_(views::MenuItemView::TOPRIGHT),
|
| pref_service_(pref_service),
|
| - screen_mode_(screen_mode),
|
| for_out_of_box_experience_dialog_(for_out_of_box_experience_dialog) {
|
| DCHECK(input_method_descriptors_.get() &&
|
| !input_method_descriptors_->empty());
|
|
|
| // Sync current and previous input methods on Chrome prefs with ibus-daemon.
|
| - if (pref_service_ && (screen_mode_ == StatusAreaViewChromeos::BROWSER_MODE)) {
|
| - previous_input_method_pref_.Init(
|
| - prefs::kLanguagePreviousInputMethod, pref_service, this);
|
| - current_input_method_pref_.Init(
|
| - prefs::kLanguageCurrentInputMethod, pref_service, this);
|
| + if (pref_service_ && StatusAreaViewChromeos::IsBrowserMode()) {
|
| + InitializePrefMembers();
|
| }
|
|
|
| InputMethodManager* manager = InputMethodManager::GetInstance();
|
| - if (screen_mode_ == StatusAreaViewChromeos::LOGIN_MODE_VIEWS ||
|
| - screen_mode_ == StatusAreaViewChromeos::LOGIN_MODE_WEBUI) {
|
| + if (StatusAreaViewChromeos::IsLoginMode()) {
|
| // This button is for the login screen.
|
| manager->AddPreLoginPreferenceObserver(this);
|
| registrar_.Add(this,
|
| chrome::NOTIFICATION_LOGIN_USER_CHANGED,
|
| content::NotificationService::AllSources());
|
| - } else if (screen_mode_ == StatusAreaViewChromeos::BROWSER_MODE) {
|
| +#if defined(USE_AURA)
|
| + // On Aura status area is not recreated on sign in.
|
| + // In case of Chrome crash, Chrome will be reloaded but IsLoginMode() will
|
| + // return false at this point so NOTIFICATION_PROFILE_CREATED will be
|
| + // ignored and all initialization will happen in ctor.
|
| + registrar_.Add(this,
|
| + chrome::NOTIFICATION_PROFILE_CREATED,
|
| + content::NotificationService::AllSources());
|
| +#endif
|
| + } else if (StatusAreaViewChromeos::IsBrowserMode()) {
|
| manager->AddPostLoginPreferenceObserver(this);
|
| }
|
|
|
| @@ -421,15 +425,14 @@ void InputMethodMenu::PreferenceUpdateNeeded(
|
| InputMethodManager* manager,
|
| const input_method::InputMethodDescriptor& previous_input_method,
|
| const input_method::InputMethodDescriptor& current_input_method) {
|
| - if (screen_mode_ == StatusAreaViewChromeos::BROWSER_MODE) {
|
| + if (StatusAreaViewChromeos::IsBrowserMode()) {
|
| if (pref_service_) { // make sure we're not in unit tests.
|
| // Sometimes (e.g. initial boot) |previous_input_method.id()| is empty.
|
| previous_input_method_pref_.SetValue(previous_input_method.id());
|
| current_input_method_pref_.SetValue(current_input_method.id());
|
| pref_service_->ScheduleSavePersistentPrefs();
|
| }
|
| - } else if (screen_mode_ == StatusAreaViewChromeos::LOGIN_MODE_VIEWS ||
|
| - screen_mode_ == StatusAreaViewChromeos::LOGIN_MODE_WEBUI) {
|
| + } else if (StatusAreaViewChromeos::IsLoginMode()) {
|
| if (g_browser_process && g_browser_process->local_state()) {
|
| g_browser_process->local_state()->SetString(
|
| language_prefs::kPreferredKeyboardLayout, current_input_method.id());
|
| @@ -465,7 +468,7 @@ void InputMethodMenu::FirstObserverIsAdded(InputMethodManager* manager) {
|
| // NOTICE: Since this function might be called from the constructor of this
|
| // class, it's better to avoid calling virtual functions.
|
|
|
| - if (pref_service_ && (screen_mode_ == StatusAreaViewChromeos::BROWSER_MODE)) {
|
| + if (pref_service_ && (StatusAreaViewChromeos::IsBrowserMode())) {
|
| // Get the input method name in the Preferences file which was in use last
|
| // time, and switch to the method. We remember two input method names in the
|
| // preference so that the Control+space hot-key could work fine from the
|
| @@ -712,6 +715,16 @@ void InputMethodMenu::Observe(int type,
|
| // anymore.
|
| RemoveObservers();
|
| }
|
| +#if defined(USE_AURA)
|
| + if (type == chrome::NOTIFICATION_PROFILE_CREATED) {
|
| + // On Aura status area is not recreated on login for normal user sign in.
|
| + // NOTIFICATION_LOGIN_USER_CHANGED has been notified early in login process.
|
| + InitializePrefMembers();
|
| + InputMethodManager* manager = InputMethodManager::GetInstance();
|
| + manager->AddPostLoginPreferenceObserver(this);
|
| + manager->AddObserver(this);
|
| + }
|
| +#endif
|
| }
|
|
|
| void InputMethodMenu::SetMinimumWidth(int width) {
|
| @@ -721,13 +734,19 @@ void InputMethodMenu::SetMinimumWidth(int width) {
|
|
|
| void InputMethodMenu::RemoveObservers() {
|
| InputMethodManager* manager = InputMethodManager::GetInstance();
|
| - if (screen_mode_ == StatusAreaViewChromeos::LOGIN_MODE_VIEWS ||
|
| - screen_mode_ == StatusAreaViewChromeos::LOGIN_MODE_WEBUI) {
|
| + if (StatusAreaViewChromeos::IsLoginMode()) {
|
| manager->RemovePreLoginPreferenceObserver(this);
|
| - } else if (screen_mode_ == StatusAreaViewChromeos::BROWSER_MODE) {
|
| + } else if (StatusAreaViewChromeos::IsBrowserMode()) {
|
| manager->RemovePostLoginPreferenceObserver(this);
|
| }
|
| manager->RemoveObserver(this);
|
| }
|
|
|
| +void InputMethodMenu::InitializePrefMembers() {
|
| + previous_input_method_pref_.Init(
|
| + prefs::kLanguagePreviousInputMethod, pref_service_, this);
|
| + current_input_method_pref_.Init(
|
| + prefs::kLanguageCurrentInputMethod, pref_service_, this);
|
| +}
|
| +
|
| } // namespace chromeos
|
|
|