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> // std::find | 7 #include <algorithm> // std::find |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 } kMigrationHangulKeyboardToInputMethodID[] = { | 103 } kMigrationHangulKeyboardToInputMethodID[] = { |
104 { "2", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_2set" }, | 104 { "2", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_2set" }, |
105 { "3f", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_3setfinal" }, | 105 { "3f", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_3setfinal" }, |
106 { "39", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_3set390" }, | 106 { "39", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_3set390" }, |
107 { "3s", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_3setnoshift" }, | 107 { "3s", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_3setnoshift" }, |
108 { "ro", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_romaja" }, | 108 { "ro", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_romaja" }, |
109 }; | 109 }; |
110 | 110 |
111 } // namespace | 111 } // namespace |
112 | 112 |
| 113 bool InputMethodManagerImpl::IsFullLatinKeyboard( |
| 114 const std::string& layout) const { |
| 115 const std::string& lang = util_.GetLanguageCodeFromInputMethodId(layout); |
| 116 return full_latin_keyboard_checker.IsFullLatinKeyboard(layout, lang); |
| 117 } |
| 118 |
113 InputMethodManagerImpl::InputMethodManagerImpl( | 119 InputMethodManagerImpl::InputMethodManagerImpl( |
114 scoped_ptr<InputMethodDelegate> delegate) | 120 scoped_ptr<InputMethodDelegate> delegate) |
115 : delegate_(delegate.Pass()), | 121 : delegate_(delegate.Pass()), |
116 state_(STATE_LOGIN_SCREEN), | 122 state_(STATE_LOGIN_SCREEN), |
117 util_(delegate_.get(), GetSupportedInputMethods()), | 123 util_(delegate_.get(), GetSupportedInputMethods()), |
118 component_extension_ime_manager_(new ComponentExtensionIMEManager()), | 124 component_extension_ime_manager_(new ComponentExtensionIMEManager()), |
119 weak_ptr_factory_(this) { | 125 weak_ptr_factory_(this) { |
120 IBusDaemonController::GetInstance()->AddObserver(this); | 126 IBusDaemonController::GetInstance()->AddObserver(this); |
121 } | 127 } |
122 | 128 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 } | 206 } |
201 if (result->empty()) { | 207 if (result->empty()) { |
202 // Initially |active_input_method_ids_| is empty. browser_tests might take | 208 // Initially |active_input_method_ids_| is empty. browser_tests might take |
203 // this path. | 209 // this path. |
204 result->push_back( | 210 result->push_back( |
205 InputMethodUtil::GetFallbackInputMethodDescriptor()); | 211 InputMethodUtil::GetFallbackInputMethodDescriptor()); |
206 } | 212 } |
207 return result.Pass(); | 213 return result.Pass(); |
208 } | 214 } |
209 | 215 |
| 216 const std::vector<std::string>& |
| 217 InputMethodManagerImpl::GetActiveInputMethodIds() const { |
| 218 return active_input_method_ids_; |
| 219 } |
| 220 |
210 size_t InputMethodManagerImpl::GetNumActiveInputMethods() const { | 221 size_t InputMethodManagerImpl::GetNumActiveInputMethods() const { |
211 return active_input_method_ids_.size(); | 222 return active_input_method_ids_.size(); |
212 } | 223 } |
213 | 224 |
214 void InputMethodManagerImpl::EnableLayouts(const std::string& language_code, | 225 void InputMethodManagerImpl::EnableLayouts(const std::string& language_code, |
215 const std::string& initial_layout) { | 226 const std::string& initial_layout) { |
216 if (state_ == STATE_TERMINATING) | 227 if (state_ == STATE_TERMINATING) |
217 return; | 228 return; |
218 | 229 |
219 std::vector<std::string> candidates; | 230 std::vector<std::string> candidates; |
(...skipping 23 matching lines...) Expand all Loading... |
243 // Not efficient, but should be fine, as the two vectors are very | 254 // Not efficient, but should be fine, as the two vectors are very |
244 // short (2-5 items). | 255 // short (2-5 items). |
245 if (!Contains(layouts, candidate)) | 256 if (!Contains(layouts, candidate)) |
246 layouts.push_back(candidate); | 257 layouts.push_back(candidate); |
247 } | 258 } |
248 | 259 |
249 active_input_method_ids_.swap(layouts); | 260 active_input_method_ids_.swap(layouts); |
250 ChangeInputMethod(initial_layout); // you can pass empty |initial_layout|. | 261 ChangeInputMethod(initial_layout); // you can pass empty |initial_layout|. |
251 } | 262 } |
252 | 263 |
| 264 // Adds new input method to given list. |
| 265 bool InputMethodManagerImpl::EnableInputMethodImpl( |
| 266 const std::string& input_method_id, |
| 267 std::vector<std::string>& new_active_input_method_ids) const { |
| 268 if (!util_.IsValidInputMethodId(input_method_id)) { |
| 269 DVLOG(1) << "EnableInputMethod: Invalid ID: " << input_method_id; |
| 270 return false; |
| 271 } |
| 272 |
| 273 if (!Contains(new_active_input_method_ids, input_method_id)) |
| 274 new_active_input_method_ids.push_back(input_method_id); |
| 275 |
| 276 return true; |
| 277 } |
| 278 |
| 279 // Starts or stops the system input method framework as needed. |
| 280 void InputMethodManagerImpl::ReconfigureIMFramework() { |
| 281 if (component_extension_ime_manager_->IsInitialized()) |
| 282 LoadNecessaryComponentExtensions(); |
| 283 |
| 284 if (ContainsOnlyKeyboardLayout(active_input_method_ids_)) { |
| 285 // Do NOT call ibus_controller_->Stop(); here to work around a crash issue |
| 286 // at crbug.com/27051. |
| 287 // TODO(yusukes): We can safely call Stop(); here once crbug.com/26443 |
| 288 // is implemented. |
| 289 } else { |
| 290 MaybeInitializeCandidateWindowController(); |
| 291 IBusDaemonController::GetInstance()->Start(); |
| 292 } |
| 293 } |
| 294 |
| 295 bool InputMethodManagerImpl::EnableInputMethod( |
| 296 const std::string& input_method_id) { |
| 297 if (!EnableInputMethodImpl(input_method_id, active_input_method_ids_)) |
| 298 return false; |
| 299 |
| 300 ReconfigureIMFramework(); |
| 301 return true; |
| 302 } |
| 303 |
253 bool InputMethodManagerImpl::EnableInputMethods( | 304 bool InputMethodManagerImpl::EnableInputMethods( |
254 const std::vector<std::string>& new_active_input_method_ids) { | 305 const std::vector<std::string>& new_active_input_method_ids) { |
255 if (state_ == STATE_TERMINATING) | 306 if (state_ == STATE_TERMINATING) |
256 return false; | 307 return false; |
257 | 308 |
258 // Filter unknown or obsolete IDs. | 309 // Filter unknown or obsolete IDs. |
259 std::vector<std::string> new_active_input_method_ids_filtered; | 310 std::vector<std::string> new_active_input_method_ids_filtered; |
260 | 311 |
261 for (size_t i = 0; i < new_active_input_method_ids.size(); ++i) { | 312 for (size_t i = 0; i < new_active_input_method_ids.size(); ++i) |
262 const std::string& input_method_id = new_active_input_method_ids[i]; | 313 EnableInputMethodImpl(new_active_input_method_ids[i], |
263 if (util_.IsValidInputMethodId(input_method_id)) | 314 new_active_input_method_ids_filtered); |
264 new_active_input_method_ids_filtered.push_back(input_method_id); | |
265 else | |
266 DVLOG(1) << "EnableInputMethods: Invalid ID: " << input_method_id; | |
267 } | |
268 | 315 |
269 if (new_active_input_method_ids_filtered.empty()) { | 316 if (new_active_input_method_ids_filtered.empty()) { |
270 DVLOG(1) << "EnableInputMethods: No valid input method ID"; | 317 DVLOG(1) << "EnableInputMethods: No valid input method ID"; |
271 return false; | 318 return false; |
272 } | 319 } |
273 | 320 |
274 // Copy extension IDs to |new_active_input_method_ids_filtered|. We have to | 321 // Copy extension IDs to |new_active_input_method_ids_filtered|. We have to |
275 // keep relative order of the extension input method IDs. | 322 // keep relative order of the extension input method IDs. |
276 for (size_t i = 0; i < active_input_method_ids_.size(); ++i) { | 323 for (size_t i = 0; i < active_input_method_ids_.size(); ++i) { |
277 const std::string& input_method_id = active_input_method_ids_[i]; | 324 const std::string& input_method_id = active_input_method_ids_[i]; |
278 if (extension_ime_util::IsExtensionIME(input_method_id)) | 325 if (extension_ime_util::IsExtensionIME(input_method_id)) |
279 new_active_input_method_ids_filtered.push_back(input_method_id); | 326 new_active_input_method_ids_filtered.push_back(input_method_id); |
280 } | 327 } |
281 active_input_method_ids_.swap(new_active_input_method_ids_filtered); | 328 active_input_method_ids_.swap(new_active_input_method_ids_filtered); |
282 | 329 |
283 if (component_extension_ime_manager_->IsInitialized()) | 330 ReconfigureIMFramework(); |
284 LoadNecessaryComponentExtensions(); | |
285 | |
286 if (ContainOnlyKeyboardLayout(active_input_method_ids_)) { | |
287 // Do NOT call ibus_controller_->Stop(); here to work around a crash issue | |
288 // at crosbug.com/27051. | |
289 // TODO(yusukes): We can safely call Stop(); here once crosbug.com/26443 | |
290 // is implemented. | |
291 } else { | |
292 MaybeInitializeCandidateWindowController(); | |
293 IBusDaemonController::GetInstance()->Start(); | |
294 } | |
295 | 331 |
296 // If |current_input_method| is no longer in |active_input_method_ids_|, | 332 // If |current_input_method| is no longer in |active_input_method_ids_|, |
297 // ChangeInputMethod() picks the first one in |active_input_method_ids_|. | 333 // ChangeInputMethod() picks the first one in |active_input_method_ids_|. |
298 ChangeInputMethod(current_input_method_.id()); | 334 ChangeInputMethod(current_input_method_.id()); |
299 return true; | 335 return true; |
300 } | 336 } |
301 | 337 |
302 bool InputMethodManagerImpl::MigrateOldInputMethods( | 338 bool InputMethodManagerImpl::MigrateOldInputMethods( |
303 std::vector<std::string>* input_method_ids) { | 339 std::vector<std::string>* input_method_ids) { |
304 bool rewritten = false; | 340 bool rewritten = false; |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
557 void InputMethodManagerImpl::RemoveInputMethodExtension(const std::string& id) { | 593 void InputMethodManagerImpl::RemoveInputMethodExtension(const std::string& id) { |
558 if (!extension_ime_util::IsExtensionIME(id)) | 594 if (!extension_ime_util::IsExtensionIME(id)) |
559 DVLOG(1) << id << " is not a valid extension input method ID."; | 595 DVLOG(1) << id << " is not a valid extension input method ID."; |
560 | 596 |
561 std::vector<std::string>::iterator i = std::find( | 597 std::vector<std::string>::iterator i = std::find( |
562 active_input_method_ids_.begin(), active_input_method_ids_.end(), id); | 598 active_input_method_ids_.begin(), active_input_method_ids_.end(), id); |
563 if (i != active_input_method_ids_.end()) | 599 if (i != active_input_method_ids_.end()) |
564 active_input_method_ids_.erase(i); | 600 active_input_method_ids_.erase(i); |
565 extra_input_methods_.erase(id); | 601 extra_input_methods_.erase(id); |
566 | 602 |
567 if (ContainOnlyKeyboardLayout(active_input_method_ids_)) { | 603 if (ContainsOnlyKeyboardLayout(active_input_method_ids_)) { |
568 // Do NOT call ibus_controller_->Stop(); here to work around a crash issue | 604 // Do NOT call ibus_controller_->Stop(); here to work around a crash issue |
569 // at crosbug.com/27051. | 605 // at crosbug.com/27051. |
570 // TODO(yusukes): We can safely call Stop(); here once crosbug.com/26443 | 606 // TODO(yusukes): We can safely call Stop(); here once crosbug.com/26443 |
571 // is implemented. | 607 // is implemented. |
572 } | 608 } |
573 | 609 |
574 // If |current_input_method| is no longer in |active_input_method_ids_|, | 610 // If |current_input_method| is no longer in |active_input_method_ids_|, |
575 // switch to the first one in |active_input_method_ids_|. | 611 // switch to the first one in |active_input_method_ids_|. |
576 ChangeInputMethod(current_input_method_.id()); | 612 ChangeInputMethod(current_input_method_.id()); |
577 | 613 |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
911 active_input_method_ids_ = saved_active_input_method_ids_; | 947 active_input_method_ids_ = saved_active_input_method_ids_; |
912 | 948 |
913 ChangeInputMethod(current_input_method_.id()); | 949 ChangeInputMethod(current_input_method_.id()); |
914 } | 950 } |
915 | 951 |
916 bool InputMethodManagerImpl::InputMethodIsActivated( | 952 bool InputMethodManagerImpl::InputMethodIsActivated( |
917 const std::string& input_method_id) { | 953 const std::string& input_method_id) { |
918 return Contains(active_input_method_ids_, input_method_id); | 954 return Contains(active_input_method_ids_, input_method_id); |
919 } | 955 } |
920 | 956 |
921 bool InputMethodManagerImpl::ContainOnlyKeyboardLayout( | 957 bool InputMethodManagerImpl::ContainsOnlyKeyboardLayout( |
922 const std::vector<std::string>& value) { | 958 const std::vector<std::string>& value) { |
923 for (size_t i = 0; i < value.size(); ++i) { | 959 for (size_t i = 0; i < value.size(); ++i) { |
924 if (!InputMethodUtil::IsKeyboardLayout(value[i])) | 960 if (!InputMethodUtil::IsKeyboardLayout(value[i])) |
925 return false; | 961 return false; |
926 } | 962 } |
927 return true; | 963 return true; |
928 } | 964 } |
929 | 965 |
930 void InputMethodManagerImpl::MaybeInitializeCandidateWindowController() { | 966 void InputMethodManagerImpl::MaybeInitializeCandidateWindowController() { |
931 if (candidate_window_controller_.get()) | 967 if (candidate_window_controller_.get()) |
932 return; | 968 return; |
933 | 969 |
934 candidate_window_controller_.reset( | 970 candidate_window_controller_.reset( |
935 CandidateWindowController::CreateCandidateWindowController()); | 971 CandidateWindowController::CreateCandidateWindowController()); |
936 if (candidate_window_controller_->Init()) | 972 if (candidate_window_controller_->Init()) |
937 candidate_window_controller_->AddObserver(this); | 973 candidate_window_controller_->AddObserver(this); |
938 else | 974 else |
939 DVLOG(1) << "Failed to initialize the candidate window controller"; | 975 DVLOG(1) << "Failed to initialize the candidate window controller"; |
940 } | 976 } |
941 | 977 |
942 bool InputMethodManagerImpl::IsIBusConnectionAlive() { | 978 bool InputMethodManagerImpl::IsIBusConnectionAlive() { |
943 return DBusThreadManager::Get() && DBusThreadManager::Get()->GetIBusClient(); | 979 return DBusThreadManager::Get() && DBusThreadManager::Get()->GetIBusClient(); |
944 } | 980 } |
945 | 981 |
946 } // namespace input_method | 982 } // namespace input_method |
947 } // namespace chromeos | 983 } // namespace chromeos |
OLD | NEW |