| Index: chrome/browser/chromeos/input_method/input_method_persistence.cc
|
| diff --git a/chrome/browser/chromeos/input_method/input_method_persistence.cc b/chrome/browser/chromeos/input_method/input_method_persistence.cc
|
| index 9562b237cc4b21bd9d7e13aeb269dbaa89d8d53f..49809fe1aa04807a5bf99efaafe701af5356f4d4 100644
|
| --- a/chrome/browser/chromeos/input_method/input_method_persistence.cc
|
| +++ b/chrome/browser/chromeos/input_method/input_method_persistence.cc
|
| @@ -4,11 +4,13 @@
|
|
|
| #include "chrome/browser/chromeos/input_method/input_method_persistence.h"
|
|
|
| +#include "base/chromeos/chromeos_version.h"
|
| #include "base/logging.h"
|
| #include "base/prefs/pref_service.h"
|
| #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/prefs/scoped_user_pref_update.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/profiles/profile_manager.h"
|
| #include "chrome/common/pref_names.h"
|
| @@ -25,7 +27,62 @@ void PersistSystemInputMethod(const std::string& input_method) {
|
| language_prefs::kPreferredKeyboardLayout, input_method);
|
| }
|
|
|
| -void PersistUserInputMethod(const std::string& input_method) {
|
| +// Update user LRU keyboard layout for login screen
|
| +static void SetUserLRUInputMethod(
|
| + const std::string& input_method,
|
| + const chromeos::input_method::InputMethodManager* const manager) {
|
| + // Skip if it's not a keyboard layout. Drop input methods including
|
| + // extension ones.
|
| + if (!InputMethodUtil::IsKeyboardLayout(input_method))
|
| + return;
|
| +
|
| + PrefService* const local_state = g_browser_process->local_state();
|
| +
|
| + Profile* const profile = ProfileManager::GetDefaultProfile();
|
| +
|
| + if (profile == NULL)
|
| + return;
|
| +
|
| + if (!manager->IsFullLatinKeyboard(input_method))
|
| + return;
|
| +
|
| + const std::string username = profile->GetProfileName();
|
| + if (base::chromeos::IsRunningOnChromeOS() && !username.empty() &&
|
| + !local_state->ReadOnly()) {
|
| + bool update_succeed = false;
|
| + {
|
| + // Updater may have side-effects, therefore we do not replace
|
| + // entry while updater exists.
|
| + DictionaryPrefUpdate updater(local_state, prefs::kUsersLRUInputMethod);
|
| + base::DictionaryValue* const users_lru_input_methods = updater.Get();
|
| + if (users_lru_input_methods) {
|
| + users_lru_input_methods->SetStringWithoutPathExpansion(username,
|
| + input_method);
|
| + update_succeed = true;
|
| + }
|
| + }
|
| + if (!update_succeed) {
|
| + // Somehow key kUsersLRUInputMethod has value of invalid type.
|
| + // Replace and retry.
|
| + local_state->Set(prefs::kUsersLRUInputMethod, base::DictionaryValue());
|
| +
|
| + DictionaryPrefUpdate updater(local_state, prefs::kUsersLRUInputMethod);
|
| + base::DictionaryValue* const users_lru_input_methods = updater.Get();
|
| + if (users_lru_input_methods) {
|
| + users_lru_input_methods->SetStringWithoutPathExpansion(username,
|
| + input_method);
|
| + update_succeed = true;
|
| + }
|
| + }
|
| + if (!update_succeed) {
|
| + DVLOG(1) << "Failed to replace local_state.kUsersLRUInputMethod: '"
|
| + << prefs::kUsersLRUInputMethod << "' for '" << username << "'";
|
| + }
|
| + }
|
| +}
|
| +
|
| +void PersistUserInputMethod(const std::string& input_method,
|
| + InputMethodManager* const manager) {
|
| PrefService* user_prefs = NULL;
|
| Profile* profile = ProfileManager::GetDefaultProfile();
|
| if (profile)
|
| @@ -33,6 +90,8 @@ void PersistUserInputMethod(const std::string& input_method) {
|
| if (!user_prefs)
|
| return;
|
|
|
| + SetUserLRUInputMethod(input_method, manager);
|
| +
|
| const std::string current_input_method_on_pref =
|
| user_prefs->GetString(prefs::kLanguageCurrentInputMethod);
|
| if (current_input_method_on_pref == input_method)
|
| @@ -73,7 +132,7 @@ void InputMethodPersistence::InputMethodChanged(
|
| PersistSystemInputMethod(current_input_method);
|
| return;
|
| case InputMethodManager::STATE_BROWSER_SCREEN:
|
| - PersistUserInputMethod(current_input_method);
|
| + PersistUserInputMethod(current_input_method, manager);
|
| return;
|
| case InputMethodManager::STATE_LOCK_SCREEN:
|
| // We use a special set of input methods on the screen. Do not update.
|
|
|