summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/chromeos')
-rw-r--r--chrome/browser/chromeos/status/language_menu_button.cc45
-rw-r--r--chrome/browser/chromeos/status/language_menu_button.h13
-rw-r--r--chrome/browser/chromeos/status/language_menu_button_unittest.cc41
3 files changed, 82 insertions, 17 deletions
diff --git a/chrome/browser/chromeos/status/language_menu_button.cc b/chrome/browser/chromeos/status/language_menu_button.cc
index c31e8b5..fe2518a 100644
--- a/chrome/browser/chromeos/status/language_menu_button.cc
+++ b/chrome/browser/chromeos/status/language_menu_button.cc
@@ -322,7 +322,8 @@ string16 LanguageMenuButton::GetLabelAt(int index) const {
const std::string language_code =
input_method::GetLanguageCodeFromDescriptor(
input_method_descriptors_->at(index));
- bool need_method_name = (need_method_name_.count(language_code) > 0);
+ const bool need_method_name =
+ (ambiguous_language_code_set_.count(language_code) > 0);
name = GetTextForMenu(input_method_descriptors_->at(index),
need_method_name);
} else if (GetPropertyIndex(index, &index)) {
@@ -486,26 +487,17 @@ void LanguageMenuButton::RebuildModel() {
// Indicates if separator's needed before each section.
bool need_separator = false;
- need_method_name_.clear();
- std::set<std::string> languages_seen;
+ ambiguous_language_code_set_.clear();
if (!input_method_descriptors_->empty()) {
// We "abuse" the command_id and group_id arguments of AddRadioItem method.
// A COMMAND_ID_XXX enum value is passed as command_id, and array index of
// |input_method_descriptors_| or |property_list| is passed as group_id.
for (size_t i = 0; i < input_method_descriptors_->size(); ++i) {
model_->AddRadioItem(COMMAND_ID_INPUT_METHODS, dummy_label, i);
-
- const std::string language_code
- = input_method::GetLanguageCodeFromDescriptor(
- input_method_descriptors_->at(i));
- // If there is more than one input method for this language, then we need
- // to display the method name.
- if (languages_seen.find(language_code) == languages_seen.end()) {
- languages_seen.insert(language_code);
- } else {
- need_method_name_.insert(language_code);
- }
}
+
+ GetAmbiguousLanguageCodeSet(*input_method_descriptors_,
+ &ambiguous_language_code_set_);
need_separator = true;
}
@@ -648,6 +640,31 @@ void LanguageMenuButton::RegisterPrefs(PrefService* local_state) {
local_state->RegisterStringPref(kPreferredKeyboardLayout, "");
}
+void LanguageMenuButton::GetAmbiguousLanguageCodeSet(
+ const InputMethodDescriptors& input_method_descriptors,
+ std::set<std::string>* ambiguous_language_code_set) {
+ DCHECK(ambiguous_language_code_set);
+ ambiguous_language_code_set->clear();
+
+ std::set<std::string> languages_seen;
+ for (size_t i = 0; i < input_method_descriptors.size(); ++i) {
+ const std::string language_code
+ = input_method::GetLanguageCodeFromDescriptor(
+ input_method_descriptors.at(i));
+ // If there is more than one input method for this language, then we need
+ // to display the method name.
+ if (languages_seen.count(language_code) > 0 ||
+ // Special-case Japanese as showing the language name alone is
+ // confusing when Japanese keyboard is enabled but Japanese
+ // input methods are not.
+ language_code == "ja") {
+ ambiguous_language_code_set->insert(language_code);
+ } else {
+ languages_seen.insert(language_code);
+ }
+ }
+}
+
void LanguageMenuButton::Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details) {
diff --git a/chrome/browser/chromeos/status/language_menu_button.h b/chrome/browser/chromeos/status/language_menu_button.h
index abc694d..991578f 100644
--- a/chrome/browser/chromeos/status/language_menu_button.h
+++ b/chrome/browser/chromeos/status/language_menu_button.h
@@ -76,6 +76,14 @@ class LanguageMenuButton : public views::MenuButton,
// Registers input method preferences for the login screen.
static void RegisterPrefs(PrefService* local_state);
+ // Gets the language codes that are ambiguous if we only show the
+ // language names in the menu. For these languages, we'll show the input
+ // method names in addition to the language names. The original contents
+ // of |ambiguous_language_code_set| are lost.
+ static void GetAmbiguousLanguageCodeSet(
+ const InputMethodDescriptors& input_method_descriptors,
+ std::set<std::string>* ambiguous_language_code_set);
+
protected:
// views::View implementation.
virtual void OnLocaleChanged();
@@ -115,8 +123,9 @@ class LanguageMenuButton : public views::MenuButton,
StringPrefMember previous_input_method_pref_;
StringPrefMember current_input_method_pref_;
- // Languages that need the input method name displayed.
- std::set<std::string> need_method_name_;
+ // Language codes that can be ambiguous. See comments at
+ // GetAmbiguousLanguageCodeSet() for details.
+ std::set<std::string> ambiguous_language_code_set_;
// We borrow menus::SimpleMenuModel implementation to maintain the current
// content of the pop-up menu. The menus::MenuModel is implemented using this
diff --git a/chrome/browser/chromeos/status/language_menu_button_unittest.cc b/chrome/browser/chromeos/status/language_menu_button_unittest.cc
index b769ad7..87cdc36 100644
--- a/chrome/browser/chromeos/status/language_menu_button_unittest.cc
+++ b/chrome/browser/chromeos/status/language_menu_button_unittest.cc
@@ -30,7 +30,7 @@ TEST(LanguageMenuButtonTest, GetTextForIndicatorTest) {
// Test special cases.
{
- InputMethodDescriptor desc("xkb:us:dvorak:eng", "Dvorak", "us", "us");
+ InputMethodDescriptor desc("xkb:us:dvorak:eng", "Dvorak", "us", "eng");
EXPECT_EQ(L"DV", LanguageMenuButton::GetTextForIndicator(desc));
}
{
@@ -86,4 +86,43 @@ TEST(LanguageMenuButtonTest, GetTextForTooltipTest) {
}
}
+TEST(LanguageMenuButtonTest, GetAmbiguousLanguageCodeSet) {
+ {
+ std::set<std::string> ambiguous_language_code_set;
+ InputMethodDescriptors descriptors;
+ descriptors.push_back(InputMethodDescriptor(
+ "xkb:us::eng", "USA", "us", "eng"));
+ LanguageMenuButton::GetAmbiguousLanguageCodeSet(
+ descriptors, &ambiguous_language_code_set);
+ // There is no ambituity.
+ EXPECT_TRUE(ambiguous_language_code_set.empty());
+ }
+ {
+ std::set<std::string> ambiguous_language_code_set;
+ InputMethodDescriptors descriptors;
+ descriptors.push_back(InputMethodDescriptor(
+ "xkb:us::eng", "USA", "us", "eng"));
+ descriptors.push_back(InputMethodDescriptor(
+ "xkb:us:dvorak:eng", "Dvorak", "us", "eng"));
+ LanguageMenuButton::GetAmbiguousLanguageCodeSet(
+ descriptors, &ambiguous_language_code_set);
+ // This is ambiguous, as two input methods are present for "en-US".
+ EXPECT_EQ(1U, ambiguous_language_code_set.size());
+ EXPECT_EQ(1U, ambiguous_language_code_set.count("en-US"));
+ }
+ {
+ std::set<std::string> ambiguous_language_code_set;
+ InputMethodDescriptors descriptors;
+ descriptors.push_back(InputMethodDescriptor(
+ "xkb:jp::jpn", "Japan", "jp", "jpn"));
+ LanguageMenuButton::GetAmbiguousLanguageCodeSet(
+ descriptors, &ambiguous_language_code_set);
+ // Japanese is special. Showing the language name alone for the
+ // Japanese keyboard layout is confusing, hence we consider it
+ // ambiguous.
+ EXPECT_EQ(1U, ambiguous_language_code_set.size());
+ EXPECT_EQ(1U, ambiguous_language_code_set.count("ja"));
+ }
+}
+
} // namespace chromeos