OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/input_method/input_method_manager_impl.h" | 5 #include "chrome/browser/chromeos/input_method/input_method_manager_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "ash/ime/input_method_menu_item.h" | 9 #include "ash/ime/input_method_menu_item.h" |
10 #include "ash/ime/input_method_menu_manager.h" | 10 #include "ash/ime/input_method_menu_manager.h" |
(...skipping 25 matching lines...) Expand all Loading... |
36 namespace chromeos { | 36 namespace chromeos { |
37 | 37 |
38 namespace input_method { | 38 namespace input_method { |
39 namespace { | 39 namespace { |
40 | 40 |
41 const char kNaclMozcUsId[] = "nacl_mozc_us"; | 41 const char kNaclMozcUsId[] = "nacl_mozc_us"; |
42 const char kNaclMozcJpId[] = "nacl_mozc_jp"; | 42 const char kNaclMozcJpId[] = "nacl_mozc_jp"; |
43 const char kExt2Engine1Id[] = "ext2_engine1-t-i0-engine_id"; | 43 const char kExt2Engine1Id[] = "ext2_engine1-t-i0-engine_id"; |
44 const char kExt2Engine2Id[] = "ext2_engine2-t-i0-engine_id"; | 44 const char kExt2Engine2Id[] = "ext2_engine2-t-i0-engine_id"; |
45 const char kPinyinImeId[] = "zh-t-i0-pinyin"; | 45 const char kPinyinImeId[] = "zh-t-i0-pinyin"; |
| 46 const char kExtensionId1[] = "00000000000000000000000000000000"; |
| 47 const char kExtensionId2[] = "11111111111111111111111111111111"; |
46 | 48 |
47 // Returns true if |descriptors| contain |target|. | 49 // Returns true if |descriptors| contain |target|. |
48 bool Contain(const InputMethodDescriptors& descriptors, | 50 bool Contain(const InputMethodDescriptors& descriptors, |
49 const InputMethodDescriptor& target) { | 51 const InputMethodDescriptor& target) { |
50 for (size_t i = 0; i < descriptors.size(); ++i) { | 52 for (size_t i = 0; i < descriptors.size(); ++i) { |
51 if (descriptors[i].id() == target.id()) | 53 if (descriptors[i].id() == target.id()) |
52 return true; | 54 return true; |
53 } | 55 } |
54 return false; | 56 return false; |
55 } | 57 } |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 | 130 |
129 delegate_ = new FakeInputMethodDelegate(); | 131 delegate_ = new FakeInputMethodDelegate(); |
130 manager_.reset(new InputMethodManagerImpl( | 132 manager_.reset(new InputMethodManagerImpl( |
131 scoped_ptr<InputMethodDelegate>(delegate_))); | 133 scoped_ptr<InputMethodDelegate>(delegate_))); |
132 manager_->GetInputMethodUtil()->UpdateHardwareLayoutCache(); | 134 manager_->GetInputMethodUtil()->UpdateHardwareLayoutCache(); |
133 candidate_window_controller_ = new MockCandidateWindowController; | 135 candidate_window_controller_ = new MockCandidateWindowController; |
134 manager_->SetCandidateWindowControllerForTesting( | 136 manager_->SetCandidateWindowControllerForTesting( |
135 candidate_window_controller_); | 137 candidate_window_controller_); |
136 keyboard_ = new FakeImeKeyboard; | 138 keyboard_ = new FakeImeKeyboard; |
137 manager_->SetImeKeyboardForTesting(keyboard_); | 139 manager_->SetImeKeyboardForTesting(keyboard_); |
138 mock_engine_handler_.reset( | 140 mock_engine_handler_.reset(new MockInputMethodEngine()); |
139 new MockInputMethodEngine(InputMethodDescriptor())); | |
140 IMEBridge::Initialize(); | 141 IMEBridge::Initialize(); |
141 IMEBridge::Get()->SetCurrentEngineHandler(mock_engine_handler_.get()); | 142 IMEBridge::Get()->SetCurrentEngineHandler(mock_engine_handler_.get()); |
142 | 143 |
143 menu_manager_ = ash::ime::InputMethodMenuManager::GetInstance(); | 144 menu_manager_ = ash::ime::InputMethodMenuManager::GetInstance(); |
144 | 145 |
145 InitImeList(); | 146 InitImeList(); |
146 | 147 |
147 BrowserWithTestWindowTest::SetUp(); | 148 BrowserWithTestWindowTest::SetUp(); |
148 } | 149 } |
149 | 150 |
150 virtual void TearDown() OVERRIDE { | 151 virtual void TearDown() OVERRIDE { |
151 BrowserWithTestWindowTest::TearDown(); | 152 BrowserWithTestWindowTest::TearDown(); |
152 | 153 |
153 ui::ShutdownInputMethodForTesting(); | 154 ui::ShutdownInputMethodForTesting(); |
154 | 155 |
155 delegate_ = NULL; | 156 delegate_ = NULL; |
156 candidate_window_controller_ = NULL; | 157 candidate_window_controller_ = NULL; |
157 keyboard_ = NULL; | 158 keyboard_ = NULL; |
158 manager_.reset(); | 159 manager_.reset(); |
159 | 160 |
160 profile_manager_.reset(); | 161 profile_manager_.reset(); |
161 } | 162 } |
162 | 163 |
163 protected: | 164 protected: |
164 Profile* GetProfile() { return manager_->GetProfile(); } | |
165 // Helper function to initialize component extension stuff for testing. | 165 // Helper function to initialize component extension stuff for testing. |
166 void InitComponentExtension() { | 166 void InitComponentExtension() { |
167 mock_delegate_ = new MockComponentExtIMEManagerDelegate(); | 167 mock_delegate_ = new MockComponentExtIMEManagerDelegate(); |
168 mock_delegate_->set_ime_list(ime_list_); | 168 mock_delegate_->set_ime_list(ime_list_); |
169 scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate(mock_delegate_); | 169 scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate(mock_delegate_); |
170 | 170 |
| 171 std::vector<std::string> layouts; |
| 172 layouts.push_back("us"); |
| 173 std::vector<std::string> languages; |
| 174 languages.push_back("en-US"); |
| 175 |
171 // Note, for production, these SetEngineHandler are called when | 176 // Note, for production, these SetEngineHandler are called when |
172 // IMEEngineHandlerInterface is initialized via | 177 // IMEEngineHandlerInterface is initialized via |
173 // InitializeComponentextension. | 178 // InitializeComponentextension. |
174 manager_->AddInputMethodExtension(GetProfile(), | 179 InputMethodDescriptors descriptors; |
175 ImeIdFromEngineId(kNaclMozcUsId), | 180 manager_->AddInputMethodExtension(ImeIdFromEngineId(kNaclMozcUsId), |
| 181 descriptors, |
176 mock_engine_handler_.get()); | 182 mock_engine_handler_.get()); |
177 manager_->AddInputMethodExtension(GetProfile(), | 183 manager_->AddInputMethodExtension(ImeIdFromEngineId(kExt2Engine1Id), |
178 ImeIdFromEngineId(kNaclMozcJpId), | 184 descriptors, |
179 mock_engine_handler_.get()); | |
180 manager_->AddInputMethodExtension(GetProfile(), | |
181 ImeIdFromEngineId(kExt2Engine1Id), | |
182 mock_engine_handler_.get()); | |
183 manager_->AddInputMethodExtension(GetProfile(), | |
184 ImeIdFromEngineId(kExt2Engine2Id), | |
185 mock_engine_handler_.get()); | 185 mock_engine_handler_.get()); |
186 manager_->InitializeComponentExtensionForTesting(delegate.Pass()); | 186 manager_->InitializeComponentExtensionForTesting(delegate.Pass()); |
187 } | 187 } |
188 | 188 |
189 void InitImeList() { | 189 void InitImeList() { |
190 ime_list_.clear(); | 190 ime_list_.clear(); |
191 | 191 |
192 ComponentExtensionIME ext_xkb; | 192 ComponentExtensionIME ext_xkb; |
193 ext_xkb.id = extension_ime_util::kXkbExtensionId; | 193 ext_xkb.id = extension_ime_util::kXkbExtensionId; |
194 ext_xkb.description = "ext_xkb_description"; | 194 ext_xkb.description = "ext_xkb_description"; |
(...skipping 923 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1118 EXPECT_EQ(ImeIdFromEngineId(ids[0]), manager_->GetCurrentInputMethod().id()); | 1118 EXPECT_EQ(ImeIdFromEngineId(ids[0]), manager_->GetCurrentInputMethod().id()); |
1119 EXPECT_EQ("us(dvorak)", keyboard_->last_layout_); | 1119 EXPECT_EQ("us(dvorak)", keyboard_->last_layout_); |
1120 | 1120 |
1121 // Add two Extension IMEs. | 1121 // Add two Extension IMEs. |
1122 std::vector<std::string> layouts; | 1122 std::vector<std::string> layouts; |
1123 layouts.push_back("us"); | 1123 layouts.push_back("us"); |
1124 std::vector<std::string> languages; | 1124 std::vector<std::string> languages; |
1125 languages.push_back("en-US"); | 1125 languages.push_back("en-US"); |
1126 | 1126 |
1127 const std::string ext1_id = | 1127 const std::string ext1_id = |
1128 extension_ime_util::GetInputMethodID("deadbeef", "engine_id"); | 1128 extension_ime_util::GetInputMethodID(kExtensionId1, "engine_id"); |
1129 const InputMethodDescriptor descriptor1(ext1_id, | 1129 const InputMethodDescriptor descriptor1(ext1_id, |
1130 "deadbeef input method", | 1130 "deadbeef input method", |
1131 "DB", | 1131 "DB", |
1132 layouts, | 1132 layouts, |
1133 languages, | 1133 languages, |
1134 false, // is_login_keyboard | 1134 false, // is_login_keyboard |
1135 GURL(), | 1135 GURL(), |
1136 GURL()); | 1136 GURL()); |
1137 MockInputMethodEngine engine(descriptor1); | 1137 MockInputMethodEngine engine; |
1138 manager_->AddInputMethodExtension(GetProfile(), ext1_id, &engine); | 1138 InputMethodDescriptors descriptors; |
| 1139 descriptors.push_back(descriptor1); |
| 1140 manager_->AddInputMethodExtension(kExtensionId1, descriptors, &engine); |
1139 | 1141 |
1140 // Extension IMEs are not enabled by default. | 1142 // Extension IMEs are not enabled by default. |
1141 EXPECT_EQ(1U, manager_->GetNumActiveInputMethods()); | 1143 EXPECT_EQ(1U, manager_->GetNumActiveInputMethods()); |
1142 | 1144 |
1143 std::vector<std::string> extension_ime_ids; | 1145 std::vector<std::string> extension_ime_ids; |
1144 extension_ime_ids.push_back(ext1_id); | 1146 extension_ime_ids.push_back(ext1_id); |
1145 manager_->SetEnabledExtensionImes(&extension_ime_ids); | 1147 manager_->SetEnabledExtensionImes(&extension_ime_ids); |
1146 EXPECT_EQ(2U, manager_->GetNumActiveInputMethods()); | 1148 EXPECT_EQ(2U, manager_->GetNumActiveInputMethods()); |
1147 | 1149 |
1148 { | 1150 { |
1149 scoped_ptr<InputMethodDescriptors> methods( | 1151 scoped_ptr<InputMethodDescriptors> methods( |
1150 manager_->GetActiveInputMethods()); | 1152 manager_->GetActiveInputMethods()); |
1151 ASSERT_EQ(2U, methods->size()); | 1153 ASSERT_EQ(2U, methods->size()); |
1152 // Ext IMEs should be at the end of the list. | 1154 // Ext IMEs should be at the end of the list. |
1153 EXPECT_EQ(ext1_id, methods->at(1).id()); | 1155 EXPECT_EQ(ext1_id, methods->at(1).id()); |
1154 } | 1156 } |
1155 | 1157 |
1156 const std::string ext2_id = | 1158 const std::string ext2_id = |
1157 extension_ime_util::GetInputMethodID("cafebabe", "engine_id"); | 1159 extension_ime_util::GetInputMethodID(kExtensionId2, "engine_id"); |
1158 const InputMethodDescriptor descriptor2(ext2_id, | 1160 const InputMethodDescriptor descriptor2(ext2_id, |
1159 "cafebabe input method", | 1161 "cafebabe input method", |
1160 "CB", | 1162 "CB", |
1161 layouts, | 1163 layouts, |
1162 languages, | 1164 languages, |
1163 false, // is_login_keyboard | 1165 false, // is_login_keyboard |
1164 GURL(), | 1166 GURL(), |
1165 GURL()); | 1167 GURL()); |
1166 MockInputMethodEngine engine2(descriptor2); | 1168 descriptors.clear(); |
1167 manager_->AddInputMethodExtension(GetProfile(), ext2_id, &engine2); | 1169 descriptors.push_back(descriptor2); |
| 1170 MockInputMethodEngine engine2; |
| 1171 manager_->AddInputMethodExtension(kExtensionId2, descriptors, &engine2); |
1168 EXPECT_EQ(2U, manager_->GetNumActiveInputMethods()); | 1172 EXPECT_EQ(2U, manager_->GetNumActiveInputMethods()); |
1169 | 1173 |
1170 extension_ime_ids.push_back(ext2_id); | 1174 extension_ime_ids.push_back(ext2_id); |
1171 manager_->SetEnabledExtensionImes(&extension_ime_ids); | 1175 manager_->SetEnabledExtensionImes(&extension_ime_ids); |
1172 EXPECT_EQ(3U, manager_->GetNumActiveInputMethods()); | 1176 EXPECT_EQ(3U, manager_->GetNumActiveInputMethods()); |
1173 { | 1177 { |
1174 scoped_ptr<InputMethodDescriptors> methods( | 1178 scoped_ptr<InputMethodDescriptors> methods( |
1175 manager_->GetActiveInputMethods()); | 1179 manager_->GetActiveInputMethods()); |
1176 ASSERT_EQ(3U, methods->size()); | 1180 ASSERT_EQ(3U, methods->size()); |
1177 // Ext IMEs should be at the end of the list. | 1181 // Ext IMEs should be at the end of the list. |
1178 EXPECT_EQ(ext1_id, methods->at(1).id()); | 1182 EXPECT_EQ(ext1_id, methods->at(1).id()); |
1179 EXPECT_EQ(ext2_id, methods->at(2).id()); | 1183 EXPECT_EQ(ext2_id, methods->at(2).id()); |
1180 } | 1184 } |
1181 | 1185 |
1182 // Remove them. | 1186 // Remove them. |
1183 manager_->RemoveInputMethodExtension(GetProfile(), ext1_id); | 1187 manager_->RemoveInputMethodExtension(kExtensionId1); |
1184 EXPECT_EQ(2U, manager_->GetNumActiveInputMethods()); | 1188 EXPECT_EQ(2U, manager_->GetNumActiveInputMethods()); |
1185 manager_->RemoveInputMethodExtension(GetProfile(), ext2_id); | 1189 manager_->RemoveInputMethodExtension(kExtensionId2); |
1186 EXPECT_EQ(1U, manager_->GetNumActiveInputMethods()); | 1190 EXPECT_EQ(1U, manager_->GetNumActiveInputMethods()); |
1187 } | 1191 } |
1188 | 1192 |
1189 TEST_F(InputMethodManagerImplTest, TestAddExtensionInputThenLockScreen) { | 1193 TEST_F(InputMethodManagerImplTest, TestAddExtensionInputThenLockScreen) { |
1190 TestObserver observer; | 1194 TestObserver observer; |
1191 InitComponentExtension(); | 1195 InitComponentExtension(); |
1192 manager_->AddObserver(&observer); | 1196 manager_->AddObserver(&observer); |
1193 manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN); | 1197 manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN); |
1194 std::vector<std::string> ids; | 1198 std::vector<std::string> ids; |
1195 ids.push_back(ImeIdFromEngineId("xkb:us::eng")); | 1199 ids.push_back(ImeIdFromEngineId("xkb:us::eng")); |
1196 EXPECT_TRUE(manager_->ReplaceEnabledInputMethods(ids)); | 1200 EXPECT_TRUE(manager_->ReplaceEnabledInputMethods(ids)); |
1197 EXPECT_EQ(1U, manager_->GetNumActiveInputMethods()); | 1201 EXPECT_EQ(1U, manager_->GetNumActiveInputMethods()); |
1198 EXPECT_EQ(1, observer.input_method_changed_count_); | 1202 EXPECT_EQ(1, observer.input_method_changed_count_); |
1199 EXPECT_EQ(ImeIdFromEngineId(ids[0]), manager_->GetCurrentInputMethod().id()); | 1203 EXPECT_EQ(ImeIdFromEngineId(ids[0]), manager_->GetCurrentInputMethod().id()); |
1200 EXPECT_EQ("us", keyboard_->last_layout_); | 1204 EXPECT_EQ("us", keyboard_->last_layout_); |
1201 | 1205 |
1202 // Add an Extension IME. | 1206 // Add an Extension IME. |
1203 std::vector<std::string> layouts; | 1207 std::vector<std::string> layouts; |
1204 layouts.push_back("us(dvorak)"); | 1208 layouts.push_back("us(dvorak)"); |
1205 std::vector<std::string> languages; | 1209 std::vector<std::string> languages; |
1206 languages.push_back("en-US"); | 1210 languages.push_back("en-US"); |
1207 | 1211 |
1208 const std::string ext_id = | 1212 const std::string ext_id = |
1209 extension_ime_util::GetInputMethodID("deadbeef", "engine_id"); | 1213 extension_ime_util::GetInputMethodID(kExtensionId1, "engine_id"); |
1210 const InputMethodDescriptor descriptor(ext_id, | 1214 const InputMethodDescriptor descriptor(ext_id, |
1211 "deadbeef input method", | 1215 "deadbeef input method", |
1212 "DB", | 1216 "DB", |
1213 layouts, | 1217 layouts, |
1214 languages, | 1218 languages, |
1215 false, // is_login_keyboard | 1219 false, // is_login_keyboard |
1216 GURL(), | 1220 GURL(), |
1217 GURL()); | 1221 GURL()); |
1218 MockInputMethodEngine engine(descriptor); | 1222 MockInputMethodEngine engine; |
1219 manager_->AddInputMethodExtension(GetProfile(), ext_id, &engine); | 1223 InputMethodDescriptors descriptors; |
| 1224 descriptors.push_back(descriptor); |
| 1225 manager_->AddInputMethodExtension(kExtensionId1, descriptors, &engine); |
1220 | 1226 |
1221 // Extension IME is not enabled by default. | 1227 // Extension IME is not enabled by default. |
1222 EXPECT_EQ(1U, manager_->GetNumActiveInputMethods()); | 1228 EXPECT_EQ(1U, manager_->GetNumActiveInputMethods()); |
1223 EXPECT_EQ(1, observer.input_method_changed_count_); | 1229 EXPECT_EQ(1, observer.input_method_changed_count_); |
1224 | 1230 |
1225 std::vector<std::string> extension_ime_ids; | 1231 std::vector<std::string> extension_ime_ids; |
1226 extension_ime_ids.push_back(ext_id); | 1232 extension_ime_ids.push_back(ext_id); |
1227 manager_->SetEnabledExtensionImes(&extension_ime_ids); | 1233 manager_->SetEnabledExtensionImes(&extension_ime_ids); |
1228 EXPECT_EQ(2U, manager_->GetNumActiveInputMethods()); | 1234 EXPECT_EQ(2U, manager_->GetNumActiveInputMethods()); |
1229 | 1235 |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1305 ASSERT_EQ(4U, input_method_ids.size()); | 1311 ASSERT_EQ(4U, input_method_ids.size()); |
1306 | 1312 |
1307 EXPECT_EQ(ImeIdFromEngineId("xkb:us::eng"), input_method_ids[0]); | 1313 EXPECT_EQ(ImeIdFromEngineId("xkb:us::eng"), input_method_ids[0]); |
1308 EXPECT_EQ(ImeIdFromEngineId("xkb:fr::fra"), input_method_ids[1]); | 1314 EXPECT_EQ(ImeIdFromEngineId("xkb:fr::fra"), input_method_ids[1]); |
1309 EXPECT_EQ("_comp_ime_asdf_pinyin", input_method_ids[2]); | 1315 EXPECT_EQ("_comp_ime_asdf_pinyin", input_method_ids[2]); |
1310 EXPECT_EQ(ImeIdFromEngineId("zh-t-i0-pinyin"), input_method_ids[3]); | 1316 EXPECT_EQ(ImeIdFromEngineId("zh-t-i0-pinyin"), input_method_ids[3]); |
1311 } | 1317 } |
1312 | 1318 |
1313 } // namespace input_method | 1319 } // namespace input_method |
1314 } // namespace chromeos | 1320 } // namespace chromeos |
OLD | NEW |