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 "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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 | 53 |
54 bool InputMethodManagerImpl::MigrateInputMethods( | 54 bool InputMethodManagerImpl::MigrateInputMethods( |
55 std::vector<std::string>* input_method_ids) { | 55 std::vector<std::string>* input_method_ids) { |
56 return util_.MigrateInputMethods(input_method_ids); | 56 return util_.MigrateInputMethods(input_method_ids); |
57 } | 57 } |
58 | 58 |
59 InputMethodManagerImpl::InputMethodManagerImpl( | 59 InputMethodManagerImpl::InputMethodManagerImpl( |
60 scoped_ptr<InputMethodDelegate> delegate) | 60 scoped_ptr<InputMethodDelegate> delegate) |
61 : delegate_(delegate.Pass()), | 61 : delegate_(delegate.Pass()), |
62 state_(STATE_LOGIN_SCREEN), | 62 state_(STATE_LOGIN_SCREEN), |
63 util_(delegate_.get(), whitelist_.GetSupportedInputMethods()), | 63 util_(delegate_.get()), |
64 component_extension_ime_manager_(new ComponentExtensionIMEManager()), | 64 component_extension_ime_manager_(new ComponentExtensionIMEManager()), |
65 weak_ptr_factory_(this) { | 65 weak_ptr_factory_(this) { |
| 66 if (base::SysInfo::IsRunningOnChromeOS()) |
| 67 keyboard_.reset(ImeKeyboard::Create()); |
| 68 else |
| 69 keyboard_.reset(new FakeImeKeyboard()); |
66 } | 70 } |
67 | 71 |
68 InputMethodManagerImpl::~InputMethodManagerImpl() { | 72 InputMethodManagerImpl::~InputMethodManagerImpl() { |
69 if (candidate_window_controller_.get()) | 73 if (candidate_window_controller_.get()) |
70 candidate_window_controller_->RemoveObserver(this); | 74 candidate_window_controller_->RemoveObserver(this); |
71 } | 75 } |
72 | 76 |
73 void InputMethodManagerImpl::AddObserver( | 77 void InputMethodManagerImpl::AddObserver( |
74 InputMethodManager::Observer* observer) { | 78 InputMethodManager::Observer* observer) { |
75 observers_.AddObserver(observer); | 79 observers_.AddObserver(observer); |
(...skipping 30 matching lines...) Expand all Loading... |
106 case STATE_TERMINATING: { | 110 case STATE_TERMINATING: { |
107 if (candidate_window_controller_.get()) | 111 if (candidate_window_controller_.get()) |
108 candidate_window_controller_.reset(); | 112 candidate_window_controller_.reset(); |
109 break; | 113 break; |
110 } | 114 } |
111 } | 115 } |
112 } | 116 } |
113 | 117 |
114 scoped_ptr<InputMethodDescriptors> | 118 scoped_ptr<InputMethodDescriptors> |
115 InputMethodManagerImpl::GetSupportedInputMethods() const { | 119 InputMethodManagerImpl::GetSupportedInputMethods() const { |
116 if (!IsXkbComponentExtensionAvailable()) | |
117 return whitelist_.GetSupportedInputMethods().Pass(); | |
118 return scoped_ptr<InputMethodDescriptors>(new InputMethodDescriptors).Pass(); | 120 return scoped_ptr<InputMethodDescriptors>(new InputMethodDescriptors).Pass(); |
119 } | 121 } |
120 | 122 |
121 scoped_ptr<InputMethodDescriptors> | 123 scoped_ptr<InputMethodDescriptors> |
122 InputMethodManagerImpl::GetActiveInputMethods() const { | 124 InputMethodManagerImpl::GetActiveInputMethods() const { |
123 scoped_ptr<InputMethodDescriptors> result(new InputMethodDescriptors); | 125 scoped_ptr<InputMethodDescriptors> result(new InputMethodDescriptors); |
124 // Build the active input method descriptors from the active input | 126 // Build the active input method descriptors from the active input |
125 // methods cache |active_input_method_ids_|. | 127 // methods cache |active_input_method_ids_|. |
126 for (size_t i = 0; i < active_input_method_ids_.size(); ++i) { | 128 for (size_t i = 0; i < active_input_method_ids_.size(); ++i) { |
127 const std::string& input_method_id = active_input_method_ids_[i]; | 129 const std::string& input_method_id = active_input_method_ids_[i]; |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 scoped_ptr<InputMethodDescriptors> input_methods(GetActiveInputMethods()); | 320 scoped_ptr<InputMethodDescriptors> input_methods(GetActiveInputMethods()); |
319 DCHECK(!input_methods->empty()); | 321 DCHECK(!input_methods->empty()); |
320 input_method_id_to_switch = input_methods->at(0).id(); | 322 input_method_id_to_switch = input_methods->at(0).id(); |
321 if (!input_method_id.empty()) { | 323 if (!input_method_id.empty()) { |
322 DVLOG(1) << "Can't change the current input method to " | 324 DVLOG(1) << "Can't change the current input method to " |
323 << input_method_id << " since the engine is not enabled. " | 325 << input_method_id << " since the engine is not enabled. " |
324 << "Switch to " << input_method_id_to_switch << " instead."; | 326 << "Switch to " << input_method_id_to_switch << " instead."; |
325 } | 327 } |
326 } | 328 } |
327 | 329 |
328 if (!component_extension_ime_manager_->IsInitialized() && | |
329 !InputMethodUtil::IsKeyboardLayout(input_method_id_to_switch)) { | |
330 // We can't change input method before the initialization of | |
331 // component extension ime manager. ChangeInputMethod will be | |
332 // called with |pending_input_method_| when the initialization is | |
333 // done. | |
334 pending_input_method_ = input_method_id_to_switch; | |
335 return false; | |
336 } | |
337 pending_input_method_.clear(); | |
338 | |
339 // Hide candidate window and info list. | 330 // Hide candidate window and info list. |
340 if (candidate_window_controller_.get()) | 331 if (candidate_window_controller_.get()) |
341 candidate_window_controller_->Hide(); | 332 candidate_window_controller_->Hide(); |
342 | 333 |
343 // Disable the current engine handler. | 334 // Disable the current engine handler. |
344 IMEEngineHandlerInterface* engine = | 335 IMEEngineHandlerInterface* engine = |
345 IMEBridge::Get()->GetCurrentEngineHandler(); | 336 IMEBridge::Get()->GetCurrentEngineHandler(); |
346 if (engine) | 337 if (engine) |
347 engine->Disable(); | 338 engine->Disable(); |
348 | 339 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 << current_input_method_.GetPreferredKeyboardLayout(); | 388 << current_input_method_.GetPreferredKeyboardLayout(); |
398 } | 389 } |
399 | 390 |
400 // Update input method indicators (e.g. "US", "DV") in Chrome windows. | 391 // Update input method indicators (e.g. "US", "DV") in Chrome windows. |
401 FOR_EACH_OBSERVER(InputMethodManager::Observer, | 392 FOR_EACH_OBSERVER(InputMethodManager::Observer, |
402 observers_, | 393 observers_, |
403 InputMethodChanged(this, show_message)); | 394 InputMethodChanged(this, show_message)); |
404 return true; | 395 return true; |
405 } | 396 } |
406 | 397 |
407 bool InputMethodManagerImpl::IsXkbComponentExtensionAvailable() const { | |
408 if (!component_extension_ime_manager_->IsInitialized()) | |
409 return false; | |
410 InputMethodDescriptors imes = | |
411 component_extension_ime_manager_->GetAllIMEAsInputMethodDescriptor(); | |
412 for (size_t i = 0; i < imes.size(); ++i) { | |
413 if (StartsWithASCII(extension_ime_util::MaybeGetLegacyXkbId( | |
414 imes[i].id()), "xkb:", true)) | |
415 return true; | |
416 } | |
417 return false; | |
418 } | |
419 | |
420 void InputMethodManagerImpl::OnComponentExtensionInitialized( | 398 void InputMethodManagerImpl::OnComponentExtensionInitialized( |
421 scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate) { | 399 scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate) { |
422 DCHECK(thread_checker_.CalledOnValidThread()); | 400 DCHECK(thread_checker_.CalledOnValidThread()); |
423 component_extension_ime_manager_->Initialize(delegate.Pass()); | 401 component_extension_ime_manager_->Initialize(delegate.Pass()); |
424 InputMethodDescriptors imes = | 402 |
425 component_extension_ime_manager_->GetAllIMEAsInputMethodDescriptor(); | 403 util_.ResetInputMethods( |
426 // In case of XKB extension is not available (e.g. linux_chromeos), don't | 404 component_extension_ime_manager_->GetAllIMEAsInputMethodDescriptor()); |
427 // reset the input methods in InputMethodUtil, Instead append input methods. | |
428 if (IsXkbComponentExtensionAvailable()) | |
429 util_.ResetInputMethods(imes); | |
430 else | |
431 util_.AppendInputMethods(imes); | |
432 | 405 |
433 LoadNecessaryComponentExtensions(); | 406 LoadNecessaryComponentExtensions(); |
434 | |
435 if (!pending_input_method_.empty()) | |
436 ChangeInputMethodInternal(pending_input_method_, false); | |
437 } | 407 } |
438 | 408 |
439 void InputMethodManagerImpl::LoadNecessaryComponentExtensions() { | 409 void InputMethodManagerImpl::LoadNecessaryComponentExtensions() { |
440 if (!component_extension_ime_manager_->IsInitialized()) | |
441 return; | |
442 // Load component extensions but also update |active_input_method_ids_| as | 410 // Load component extensions but also update |active_input_method_ids_| as |
443 // some component extension IMEs may have been removed from the Chrome OS | 411 // some component extension IMEs may have been removed from the Chrome OS |
444 // image. If specified component extension IME no longer exists, falling back | 412 // image. If specified component extension IME no longer exists, falling back |
445 // to an existing IME. | 413 // to an existing IME. |
446 std::vector<std::string> unfiltered_input_method_ids; | 414 std::vector<std::string> unfiltered_input_method_ids; |
447 unfiltered_input_method_ids.swap(active_input_method_ids_); | 415 unfiltered_input_method_ids.swap(active_input_method_ids_); |
448 for (size_t i = 0; i < unfiltered_input_method_ids.size(); ++i) { | 416 for (size_t i = 0; i < unfiltered_input_method_ids.size(); ++i) { |
449 if (!extension_ime_util::IsComponentExtensionIME( | 417 if (!extension_ime_util::IsComponentExtensionIME( |
450 unfiltered_input_method_ids[i])) { | 418 unfiltered_input_method_ids[i])) { |
451 // Legacy IMEs or xkb layouts are alwayes active. | 419 // Legacy IMEs or xkb layouts are alwayes active. |
452 active_input_method_ids_.push_back(unfiltered_input_method_ids[i]); | 420 active_input_method_ids_.push_back(unfiltered_input_method_ids[i]); |
453 } else if (component_extension_ime_manager_->IsWhitelisted( | 421 } else if (component_extension_ime_manager_->IsWhitelisted( |
454 unfiltered_input_method_ids[i])) { | 422 unfiltered_input_method_ids[i])) { |
455 component_extension_ime_manager_->LoadComponentExtensionIME( | 423 component_extension_ime_manager_->LoadComponentExtensionIME( |
456 unfiltered_input_method_ids[i]); | 424 unfiltered_input_method_ids[i]); |
457 active_input_method_ids_.push_back(unfiltered_input_method_ids[i]); | 425 active_input_method_ids_.push_back(unfiltered_input_method_ids[i]); |
458 } | 426 } |
459 } | 427 } |
460 // TODO(shuchen): move this call in ComponentExtensionIMEManager. | |
461 component_extension_ime_manager_->NotifyInitialized(); | |
462 } | 428 } |
463 | 429 |
464 void InputMethodManagerImpl::ActivateInputMethodMenuItem( | 430 void InputMethodManagerImpl::ActivateInputMethodMenuItem( |
465 const std::string& key) { | 431 const std::string& key) { |
466 DCHECK(!key.empty()); | 432 DCHECK(!key.empty()); |
467 | 433 |
468 if (ash::ime::InputMethodMenuManager::GetInstance()-> | 434 if (ash::ime::InputMethodMenuManager::GetInstance()-> |
469 HasInputMethodMenuItemForKey(key)) { | 435 HasInputMethodMenuItemForKey(key)) { |
470 IMEEngineHandlerInterface* engine = | 436 IMEEngineHandlerInterface* engine = |
471 IMEBridge::Get()->GetCurrentEngineHandler(); | 437 IMEBridge::Get()->GetCurrentEngineHandler(); |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
800 return &util_; | 766 return &util_; |
801 } | 767 } |
802 | 768 |
803 ComponentExtensionIMEManager* | 769 ComponentExtensionIMEManager* |
804 InputMethodManagerImpl::GetComponentExtensionIMEManager() { | 770 InputMethodManagerImpl::GetComponentExtensionIMEManager() { |
805 DCHECK(thread_checker_.CalledOnValidThread()); | 771 DCHECK(thread_checker_.CalledOnValidThread()); |
806 return component_extension_ime_manager_.get(); | 772 return component_extension_ime_manager_.get(); |
807 } | 773 } |
808 | 774 |
809 void InputMethodManagerImpl::InitializeComponentExtension() { | 775 void InputMethodManagerImpl::InitializeComponentExtension() { |
810 ComponentExtensionIMEManagerImpl* impl = | 776 active_input_method_ids_.push_back( |
811 new ComponentExtensionIMEManagerImpl(); | 777 InputMethodUtil::GetFallbackInputMethodDescriptor().id()); |
812 scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate(impl); | 778 scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate( |
813 impl->InitializeAsync(base::Bind( | 779 new ComponentExtensionIMEManagerImpl()); |
814 &InputMethodManagerImpl::OnComponentExtensionInitialized, | 780 OnComponentExtensionInitialized(delegate.Pass()); |
815 weak_ptr_factory_.GetWeakPtr(), | |
816 base::Passed(&delegate))); | |
817 } | |
818 | |
819 void InputMethodManagerImpl::Init(base::SequencedTaskRunner* ui_task_runner) { | |
820 DCHECK(thread_checker_.CalledOnValidThread()); | |
821 | |
822 if (base::SysInfo::IsRunningOnChromeOS()) | |
823 keyboard_.reset(ImeKeyboard::Create()); | |
824 else | |
825 keyboard_.reset(new FakeImeKeyboard()); | |
826 | |
827 // We can't call impl->Initialize here, because file thread is not available | |
828 // at this moment. | |
829 ui_task_runner->PostTask( | |
830 FROM_HERE, | |
831 base::Bind(&InputMethodManagerImpl::InitializeComponentExtension, | |
832 weak_ptr_factory_.GetWeakPtr())); | |
833 } | 781 } |
834 | 782 |
835 void InputMethodManagerImpl::SetCandidateWindowControllerForTesting( | 783 void InputMethodManagerImpl::SetCandidateWindowControllerForTesting( |
836 CandidateWindowController* candidate_window_controller) { | 784 CandidateWindowController* candidate_window_controller) { |
837 candidate_window_controller_.reset(candidate_window_controller); | 785 candidate_window_controller_.reset(candidate_window_controller); |
838 candidate_window_controller_->AddObserver(this); | 786 candidate_window_controller_->AddObserver(this); |
839 } | 787 } |
840 | 788 |
841 void InputMethodManagerImpl::SetImeKeyboardForTesting(ImeKeyboard* keyboard) { | 789 void InputMethodManagerImpl::SetImeKeyboardForTesting(ImeKeyboard* keyboard) { |
842 keyboard_.reset(keyboard); | 790 keyboard_.reset(keyboard); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
922 CandidateWindowController::CreateCandidateWindowController()); | 870 CandidateWindowController::CreateCandidateWindowController()); |
923 candidate_window_controller_->AddObserver(this); | 871 candidate_window_controller_->AddObserver(this); |
924 } | 872 } |
925 | 873 |
926 Profile* InputMethodManagerImpl::GetProfile() const { | 874 Profile* InputMethodManagerImpl::GetProfile() const { |
927 return ProfileManager::GetActiveUserProfile(); | 875 return ProfileManager::GetActiveUserProfile(); |
928 } | 876 } |
929 | 877 |
930 } // namespace input_method | 878 } // namespace input_method |
931 } // namespace chromeos | 879 } // namespace chromeos |
OLD | NEW |