summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShu Chen <shuchen@google.com>2014-11-20 00:52:58 +0800
committerShu Chen <shuchen@google.com>2014-11-19 16:55:07 +0000
commitde1e82c991ee5b93a5dc87682b141fe6fa5b8306 (patch)
treee98b9fc43b03b0d7b2a70a0349487c5ffea50817
parente6140944597d889972a7355b9c198cf8a503daac (diff)
downloadchromium_src-de1e82c991ee5b93a5dc87682b141fe6fa5b8306.zip
chromium_src-de1e82c991ee5b93a5dc87682b141fe6fa5b8306.tar.gz
chromium_src-de1e82c991ee5b93a5dc87682b141fe6fa5b8306.tar.bz2
Sort input method list as the sequence as XKB, M17n, T13, CJK.
BUG=432662 TEST=Verified on linux_chromeos. Review URL: https://codereview.chromium.org/722183002 Cr-Commit-Position: refs/heads/master@{#304033} (cherry picked from commit 09194f83919025a67a0eaf3b610fa91f6e14e480) Review URL: https://codereview.chromium.org/736743004 Cr-Commit-Position: refs/branch-heads/2171@{#431} Cr-Branched-From: 267aeeb8d85c8503a7fd12bd14654b8ea78d3974-refs/heads/master@{#297060}
-rw-r--r--chromeos/ime/component_extension_ime_manager.cc22
-rw-r--r--chromeos/ime/component_extension_ime_manager_unittest.cc36
2 files changed, 45 insertions, 13 deletions
diff --git a/chromeos/ime/component_extension_ime_manager.cc b/chromeos/ime/component_extension_ime_manager.cc
index feb0347..49bd813 100644
--- a/chromeos/ime/component_extension_ime_manager.cc
+++ b/chromeos/ime/component_extension_ime_manager.cc
@@ -55,6 +55,27 @@ const char* kLoginLayoutWhitelist[] = {
"us(intl)"
};
+// Gets the input method category according to the given input method id.
+// This is used for sorting a list of input methods.
+int GetInputMethodCategory(const std::string& id) {
+ const std::string engine_id =
+ chromeos::extension_ime_util::GetComponentIDByInputMethodID(id);
+ if (StartsWithASCII(engine_id, "xkb:", true))
+ return 0;
+ if (StartsWithASCII(engine_id, "vkd_", true))
+ return 1;
+ if (engine_id.find("-t-i0-") != std::string::npos &&
+ !StartsWithASCII(engine_id, "zh-", true)) {
+ return 2;
+ }
+ return 3;
+}
+
+bool InputMethodCompare(const input_method::InputMethodDescriptor& im1,
+ const input_method::InputMethodDescriptor& im2) {
+ return GetInputMethodCategory(im1.id()) < GetInputMethodCategory(im2.id());
+}
+
} // namespace
ComponentExtensionEngine::ComponentExtensionEngine() {
@@ -164,6 +185,7 @@ input_method::InputMethodDescriptors
ime.input_view_url));
}
}
+ std::stable_sort(result.begin(), result.end(), InputMethodCompare);
return result;
}
diff --git a/chromeos/ime/component_extension_ime_manager_unittest.cc b/chromeos/ime/component_extension_ime_manager_unittest.cc
index 9e8bdb3..840f3c4 100644
--- a/chromeos/ime/component_extension_ime_manager_unittest.cc
+++ b/chromeos/ime/component_extension_ime_manager_unittest.cc
@@ -28,24 +28,24 @@ class ComponentExtensionIMEManagerTest : public testing::Test {
ext1.path = base::FilePath("ext1_file_path");
ComponentExtensionEngine ext1_engine1;
- ext1_engine1.engine_id = "ext1_engine1_engine_id";
+ ext1_engine1.engine_id = "zh-t-i0-pinyin";
ext1_engine1.display_name = "ext1_engine_1_display_name";
- ext1_engine1.language_codes.push_back("en");
+ ext1_engine1.language_codes.push_back("zh-CN");
ext1_engine1.layouts.push_back("us");
ext1.engines.push_back(ext1_engine1);
ComponentExtensionEngine ext1_engine2;
- ext1_engine2.engine_id = "ext1_engine2_engine_id";
+ ext1_engine2.engine_id = "mozc_us";
ext1_engine2.display_name = "ext1_engine2_display_name";
- ext1_engine2.language_codes.push_back("en");
+ ext1_engine2.language_codes.push_back("jp");
ext1_engine2.layouts.push_back("us");
ext1.engines.push_back(ext1_engine2);
ComponentExtensionEngine ext1_engine3;
- ext1_engine3.engine_id = "ext1_engine3_engine_id";
+ ext1_engine3.engine_id = "xkb:ru::rus";
ext1_engine3.display_name = "ext1_engine3_display_name";
- ext1_engine3.language_codes.push_back("ja");
- ext1_engine3.layouts.push_back("us");
+ ext1_engine3.language_codes.push_back("ru");
+ ext1_engine3.layouts.push_back("ru");
ext1.engines.push_back(ext1_engine3);
ime_list_.push_back(ext1);
@@ -56,24 +56,24 @@ class ComponentExtensionIMEManagerTest : public testing::Test {
ext2.path = base::FilePath("ext2_file_path");
ComponentExtensionEngine ext2_engine1;
- ext2_engine1.engine_id = "ext2_engine1_engine_id";
+ ext2_engine1.engine_id = "vkd_ru_phone_aatseel";
ext2_engine1.display_name = "ext2_engine_1_display_name";
- ext2_engine1.language_codes.push_back("en");
+ ext2_engine1.language_codes.push_back("ru");
ext2_engine1.layouts.push_back("us");
ext2.engines.push_back(ext2_engine1);
ComponentExtensionEngine ext2_engine2;
- ext2_engine2.engine_id = "ext2_engine2_engine_id";
+ ext2_engine2.engine_id = "vkd_vi_telex";
ext2_engine2.display_name = "ext2_engine2_display_name";
ext2_engine2.language_codes.push_back("hi");
ext2_engine2.layouts.push_back("us");
ext2.engines.push_back(ext2_engine2);
ComponentExtensionEngine ext2_engine3;
- ext2_engine3.engine_id = "ext2_engine3_engine_id";
+ ext2_engine3.engine_id = "xkb:us::eng";
ext2_engine3.display_name = "ext2_engine3_display_name";
- ext2_engine3.language_codes.push_back("ja");
- ext2_engine3.layouts.push_back("jp");
+ ext2_engine3.language_codes.push_back("us");
+ ext2_engine3.layouts.push_back("us");
ext2.engines.push_back(ext2_engine3);
ime_list_.push_back(ext2);
@@ -191,6 +191,16 @@ TEST_F(ComponentExtensionIMEManagerTest, GetAllIMEAsInputMethodDescriptor) {
total_ime_size += ime_list_[i].engines.size();
}
EXPECT_EQ(total_ime_size, descriptors.size());
+
+ // Verify order
+ for (size_t i = 0; i < descriptors.size(); ++i) {
+ const input_method::InputMethodDescriptor& d = descriptors[i];
+ if (i < 2) {
+ EXPECT_TRUE(d.id().find("xkb:") != std::string::npos);
+ } else if (i >= 2 && i < 4) {
+ EXPECT_TRUE(d.id().find("vkd_") != std::string::npos);
+ }
+ }
}
} // namespace