| Index: chrome/browser/chromeos/input_method/input_method_util.cc
|
| diff --git a/chrome/browser/chromeos/input_method/input_method_util.cc b/chrome/browser/chromeos/input_method/input_method_util.cc
|
| index e11dd25e34e545c664398cb4c900c5e7b21f1c90..920ff9826a525b6db8936ab73e5219e27d84cd6c 100644
|
| --- a/chrome/browser/chromeos/input_method/input_method_util.cc
|
| +++ b/chrome/browser/chromeos/input_method/input_method_util.cc
|
| @@ -459,7 +459,12 @@ base::string16 InputMethodUtil::GetInputMethodLongName(
|
| DCHECK(!input_method.language_codes().empty());
|
| const std::string language_code = input_method.language_codes().at(0);
|
|
|
| - base::string16 text = TranslateString(input_method.id());
|
| + // Before translate the string, convert the input method id to legacy xkb id
|
| + // if possible.
|
| + // TODO(shuchen): the GetInputMethodLongName() method should be removed when
|
| + // finish the wrapping of xkb to extension.
|
| + base::string16 text = TranslateString(
|
| + extension_ime_util::MaybeGetLegacyXkbId(input_method.id()));
|
| if (text == standard_input_method_text ||
|
| language_code == "de" ||
|
| language_code == "fr" ||
|
| @@ -478,7 +483,20 @@ const InputMethodDescriptor* InputMethodUtil::GetInputMethodDescriptorFromId(
|
| const std::string& input_method_id) const {
|
| InputMethodIdToDescriptorMap::const_iterator iter
|
| = id_to_descriptor_.find(input_method_id);
|
| - return (iter == id_to_descriptor_.end()) ? NULL : &(iter->second);
|
| + if (iter == id_to_descriptor_.end()) {
|
| + // If failed to find the descriptor for given id, it may because of the id
|
| + // is a component extension xkb id (_comp_ime_...xkb:...).
|
| + // So try to convert it to legacy xkb id and find again.
|
| + // This hack is mainly for OOBE session, which requires a sync call to get
|
| + // the input method descriptor for extension xkb id.
|
| + // TODO(shuchen): need to support async wait for component extension
|
| + // loading in OOBE session. This hack won't be needed when it's been done.
|
| + iter = id_to_descriptor_.find(
|
| + extension_ime_util::MaybeGetLegacyXkbId(input_method_id));
|
| + if (iter == id_to_descriptor_.end())
|
| + return NULL;
|
| + }
|
| + return &(iter->second);
|
| }
|
|
|
| bool InputMethodUtil::GetInputMethodIdsFromLanguageCode(
|
| @@ -611,11 +629,36 @@ std::string InputMethodUtil::GetLanguageDefaultInputMethodId(
|
| return std::string();
|
| }
|
|
|
| +bool InputMethodUtil::MigrateXkbInputMethods(
|
| + std::vector<std::string>* input_method_ids) {
|
| + bool rewritten = false;
|
| + std::vector<std::string>& ids = *input_method_ids;
|
| + for (size_t i = 0; i < ids.size(); ++i) {
|
| + std::string id =
|
| + extension_ime_util::GetInputMethodIDByKeyboardLayout(ids[i]);
|
| + if (id != ids[i]) {
|
| + ids[i] = id;
|
| + rewritten = true;
|
| + }
|
| + }
|
| + if (rewritten) {
|
| + // Removes the duplicates.
|
| + std::vector<std::string> new_ids;
|
| + for (size_t i = 0; i < ids.size(); ++i) {
|
| + if (std::find(new_ids.begin(), new_ids.end(), ids[i]) == new_ids.end())
|
| + new_ids.push_back(ids[i]);
|
| + }
|
| + ids.swap(new_ids);
|
| + }
|
| + return rewritten;
|
| +}
|
| +
|
| void InputMethodUtil::UpdateHardwareLayoutCache() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| hardware_layouts_.clear();
|
| hardware_login_layouts_.clear();
|
| Tokenize(delegate_->GetHardwareKeyboardLayouts(), ",", &hardware_layouts_);
|
| + MigrateXkbInputMethods(&hardware_layouts_);
|
|
|
| for (size_t i = 0; i < hardware_layouts_.size(); ++i) {
|
| if (IsLoginKeyboard(hardware_layouts_[i]))
|
| @@ -682,14 +725,15 @@ InputMethodDescriptor InputMethodUtil::GetFallbackInputMethodDescriptor() {
|
| layouts.push_back("us");
|
| std::vector<std::string> languages;
|
| languages.push_back("en-US");
|
| - return InputMethodDescriptor("xkb:us::eng",
|
| - "",
|
| - "US",
|
| - layouts,
|
| - languages,
|
| - true, // login keyboard.
|
| - GURL(), // options page, not available.
|
| - GURL()); // input view page, not available.
|
| + return InputMethodDescriptor(
|
| + extension_ime_util::GetInputMethodIDByKeyboardLayout("xkb:us::eng"),
|
| + "",
|
| + "US",
|
| + layouts,
|
| + languages,
|
| + true, // login keyboard.
|
| + GURL(), // options page, not available.
|
| + GURL()); // input view page, not available.
|
| }
|
|
|
| void InputMethodUtil::ReloadInternalMaps() {
|
|
|