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 920ff9826a525b6db8936ab73e5219e27d84cd6c..9f10471d4359bc0a30d22066b053d3a06e42433f 100644 |
--- a/chrome/browser/chromeos/input_method/input_method_util.cc |
+++ b/chrome/browser/chromeos/input_method/input_method_util.cc |
@@ -20,6 +20,7 @@ |
// For SetHardwareKeyboardLayoutForTesting. |
#include "chromeos/ime/fake_input_method_delegate.h" |
#include "chromeos/ime/input_method_delegate.h" |
+#include "chromeos/ime/input_method_whitelist.h" |
// TODO(nona): move this header from this file. |
#include "grit/generated_resources.h" |
@@ -126,6 +127,61 @@ const struct { |
{ "vi", "us", "_comp_ime_jhffeifommiaekmbkkjlpmilogcfdohpvkd_vi_tcvn" }, |
}; |
+// The map from xkb layout to the indicator text. |
+// Refer to crbug.com/349829. |
+const char* const kXkbIndicators[][2] = {{"am", "AM"}, |
+ {"be", "BE"}, |
+ {"bg", "BG"}, |
+ {"bg(phonetic)", "BG"}, |
+ {"br", "BR"}, |
+ {"by", "BY"}, |
+ {"ca", "CA"}, |
+ {"ca(eng)", "CA"}, |
+ {"ca(multix)", "CA"}, |
+ {"ch", "CH"}, |
+ {"ch(fr)", "CH"}, |
+ {"cz", "CZ"}, |
+ {"cz(qwerty)", "CS"}, |
+ {"de", "DE"}, |
+ {"de(neo)", "NEO"}, |
+ {"dk", "DK"}, |
+ {"ee", "EE"}, |
+ {"es", "ES"}, |
+ {"es(cat)", "CAS"}, |
+ {"fi", "FI"}, |
+ {"fr", "FR"}, |
+ {"gb(dvorak)", "DV"}, |
+ {"gb(extd)", "GB"}, |
+ {"ge", "GE"}, |
+ {"gr", "GR"}, |
+ {"hr", "HR"}, |
+ {"hu", "HU"}, |
+ {"il", "IL"}, |
+ {"is", "IS"}, |
+ {"it", "IT"}, |
+ {"jp", "JA"}, |
+ {"latam", "LA"}, |
+ {"lt", "LT"}, |
+ {"lv(apostrophe)", "LV"}, |
+ {"mn", "MN"}, |
+ {"no", "NO"}, |
+ {"pl", "PL"}, |
+ {"pt", "PT"}, |
+ {"ro", "RO"}, |
+ {"rs", "RS"}, |
+ {"ru", "RU"}, |
+ {"ru(phonetic)", "RU"}, |
+ {"se", "SE"}, |
+ {"si", "SI"}, |
+ {"sk", "SK"}, |
+ {"tr", "TR"}, |
+ {"ua", "UA"}, |
+ {"us", "US"}, |
+ {"us(altgr-intl)", "EXTD"}, |
+ {"us(colemak)", "CO"}, |
+ {"us(dvorak)", "DV"}, |
+ {"us(intl)", "INTL"}, }; |
+ |
} // namespace |
namespace chromeos { |
@@ -291,6 +347,11 @@ InputMethodUtil::InputMethodUtil( |
scoped_ptr<InputMethodDescriptors> supported_input_methods) |
: supported_input_methods_(supported_input_methods.Pass()), |
delegate_(delegate) { |
+ // Makes sure the supported input methods at least have the fallback ime. |
+ // So that it won't cause massive test failures. |
+ if (supported_input_methods_->empty()) |
+ supported_input_methods_->push_back(GetFallbackInputMethodDescriptor()); |
+ |
ReloadInternalMaps(); |
// Initialize a map from English string to Chrome string resource ID as well. |
@@ -301,6 +362,11 @@ InputMethodUtil::InputMethodUtil( |
DCHECK(result) << "Duplicated string is found: " |
<< map_entry.english_string_from_ibus; |
} |
+ |
+ // Initialize the map from xkb layout to indicator text. |
+ for (size_t i = 0; i < arraysize(kXkbIndicators); ++i) { |
+ xkb_layout_to_indicator_[kXkbIndicators[i][0]] = kXkbIndicators[i][1]; |
+ } |
} |
InputMethodUtil::~InputMethodUtil() { |
@@ -398,13 +464,11 @@ base::string16 InputMethodUtil::GetInputMethodShortName( |
} |
// Display the keyboard layout name when using a keyboard layout. |
- if (text.empty() && |
- IsKeyboardLayout(input_method.id())) { |
- const size_t kMaxKeyboardLayoutNameLen = 2; |
- const base::string16 keyboard_layout = |
- base::UTF8ToUTF16(GetKeyboardLayoutName(input_method.id())); |
- text = StringToUpperASCII(keyboard_layout).substr( |
- 0, kMaxKeyboardLayoutNameLen); |
+ if (text.empty() && IsKeyboardLayout(input_method.id())) { |
+ std::map<std::string, std::string>::const_iterator it = |
+ xkb_layout_to_indicator_.find(GetKeyboardLayoutName(input_method.id())); |
+ if (it != xkb_layout_to_indicator_.end()) |
+ text = base::UTF8ToUTF16(it->second); |
} |
// TODO(yusukes): Some languages have two or more input methods. For example, |
@@ -481,21 +545,10 @@ base::string16 InputMethodUtil::GetInputMethodLongName( |
const InputMethodDescriptor* InputMethodUtil::GetInputMethodDescriptorFromId( |
const std::string& input_method_id) const { |
- InputMethodIdToDescriptorMap::const_iterator iter |
- = id_to_descriptor_.find(input_method_id); |
- 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; |
- } |
+ InputMethodIdToDescriptorMap::const_iterator iter = |
+ id_to_descriptor_.find(input_method_id); |
+ if (iter == id_to_descriptor_.end()) |
+ return NULL; |
return &(iter->second); |
} |
@@ -708,16 +761,49 @@ bool InputMethodUtil::IsLoginKeyboard(const std::string& input_method_id) |
void InputMethodUtil::SetComponentExtensions( |
const InputMethodDescriptors& imes) { |
- component_extension_ime_id_to_descriptor_.clear(); |
for (size_t i = 0; i < imes.size(); ++i) { |
- const InputMethodDescriptor& input_method = imes.at(i); |
+ const InputMethodDescriptor& input_method = imes[i]; |
DCHECK(!input_method.language_codes().empty()); |
- const std::string language_code = input_method.language_codes().at(0); |
- id_to_language_code_.insert( |
- std::make_pair(input_method.id(), language_code)); |
- id_to_descriptor_.insert( |
- std::make_pair(input_method.id(), input_method)); |
+ const std::vector<std::string>& language_codes = |
+ input_method.language_codes(); |
+ id_to_language_code_[input_method.id()] = language_codes[0]; |
+ id_to_descriptor_[input_method.id()] = input_method; |
+ |
+ typedef LanguageCodeToIdsMap::const_iterator It; |
+ for (size_t j = 0; j < language_codes.size(); ++j) { |
+ std::pair<It, It> range = |
+ language_code_to_ids_.equal_range(language_codes[j]); |
+ It it = range.first; |
+ for (; it != range.second; ++it) { |
+ if (it->second == input_method.id()) |
+ break; |
+ } |
+ if (it == range.second) |
+ language_code_to_ids_.insert( |
+ std::make_pair(language_codes[j], input_method.id())); |
+ } |
+ } |
+} |
+ |
+void InputMethodUtil::InitXkbInputMethodsForTesting() { |
+ if (!extension_ime_util::UseWrappedExtensionKeyboardLayouts()) |
+ return; |
+ scoped_ptr<InputMethodDescriptors> original_imes = |
+ InputMethodWhitelist().GetSupportedInputMethods(); |
+ InputMethodDescriptors whitelist_imes; |
+ for (size_t i = 0; i < original_imes->size(); ++i) { |
+ const InputMethodDescriptor& ime = (*original_imes)[i]; |
+ whitelist_imes.push_back(InputMethodDescriptor( |
+ extension_ime_util::GetInputMethodIDByKeyboardLayout(ime.id()), |
+ "", |
+ ime.indicator(), |
+ ime.keyboard_layouts(), |
+ ime.language_codes(), |
+ ime.is_login_keyboard(), |
+ ime.options_page_url(), |
+ ime.input_view_url())); |
} |
+ SetComponentExtensions(whitelist_imes); |
} |
InputMethodDescriptor InputMethodUtil::GetFallbackInputMethodDescriptor() { |