| 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 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 case STATE_TERMINATING: { | 105 case STATE_TERMINATING: { |
| 106 if (candidate_window_controller_.get()) | 106 if (candidate_window_controller_.get()) |
| 107 candidate_window_controller_.reset(); | 107 candidate_window_controller_.reset(); |
| 108 break; | 108 break; |
| 109 } | 109 } |
| 110 } | 110 } |
| 111 } | 111 } |
| 112 | 112 |
| 113 scoped_ptr<InputMethodDescriptors> | 113 scoped_ptr<InputMethodDescriptors> |
| 114 InputMethodManagerImpl::GetSupportedInputMethods() const { | 114 InputMethodManagerImpl::GetSupportedInputMethods() const { |
| 115 return whitelist_.GetSupportedInputMethods(); | 115 if (!extension_ime_util::UseWrappedExtensionKeyboardLayouts()) { |
| 116 return whitelist_.GetSupportedInputMethods(); |
| 117 } |
| 118 // Returns empty list because all the supported imes have been migrated to |
| 119 // component extension imes. |
| 120 return scoped_ptr<InputMethodDescriptors>(new InputMethodDescriptors).Pass(); |
| 116 } | 121 } |
| 117 | 122 |
| 118 scoped_ptr<InputMethodDescriptors> | 123 scoped_ptr<InputMethodDescriptors> |
| 119 InputMethodManagerImpl::GetActiveInputMethods() const { | 124 InputMethodManagerImpl::GetActiveInputMethods() const { |
| 120 scoped_ptr<InputMethodDescriptors> result(new InputMethodDescriptors); | 125 scoped_ptr<InputMethodDescriptors> result(new InputMethodDescriptors); |
| 121 // Build the active input method descriptors from the active input | 126 // Build the active input method descriptors from the active input |
| 122 // methods cache |active_input_method_ids_|. | 127 // methods cache |active_input_method_ids_|. |
| 123 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) { |
| 124 const std::string& input_method_id = active_input_method_ids_[i]; | 129 const std::string& input_method_id = active_input_method_ids_[i]; |
| 125 const InputMethodDescriptor* descriptor = | 130 const InputMethodDescriptor* descriptor = |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 } | 244 } |
| 240 | 245 |
| 241 if (!Contains(*new_active_input_method_ids, input_method_id)) | 246 if (!Contains(*new_active_input_method_ids, input_method_id)) |
| 242 new_active_input_method_ids->push_back(input_method_id); | 247 new_active_input_method_ids->push_back(input_method_id); |
| 243 | 248 |
| 244 return true; | 249 return true; |
| 245 } | 250 } |
| 246 | 251 |
| 247 // Starts or stops the system input method framework as needed. | 252 // Starts or stops the system input method framework as needed. |
| 248 void InputMethodManagerImpl::ReconfigureIMFramework() { | 253 void InputMethodManagerImpl::ReconfigureIMFramework() { |
| 249 if (component_extension_ime_manager_->IsInitialized()) | 254 LoadNecessaryComponentExtensions(); |
| 250 LoadNecessaryComponentExtensions(); | |
| 251 | |
| 252 const bool need_engine = | |
| 253 !ContainsOnlyKeyboardLayout(active_input_method_ids_); | |
| 254 | 255 |
| 255 // Initialize candidate window controller and widgets such as | 256 // Initialize candidate window controller and widgets such as |
| 256 // candidate window, infolist and mode indicator. Note, mode | 257 // candidate window, infolist and mode indicator. Note, mode |
| 257 // indicator is used by only keyboard layout input methods. | 258 // indicator is used by only keyboard layout input methods. |
| 258 if (need_engine || active_input_method_ids_.size() > 1) | 259 MaybeInitializeCandidateWindowController(); |
| 259 MaybeInitializeCandidateWindowController(); | |
| 260 } | 260 } |
| 261 | 261 |
| 262 bool InputMethodManagerImpl::EnableInputMethod( | 262 bool InputMethodManagerImpl::EnableInputMethod( |
| 263 const std::string& input_method_id) { | 263 const std::string& input_method_id) { |
| 264 if (!EnableInputMethodImpl(input_method_id, &active_input_method_ids_)) | 264 if (!EnableInputMethodImpl(input_method_id, &active_input_method_ids_)) |
| 265 return false; | 265 return false; |
| 266 | 266 |
| 267 ReconfigureIMFramework(); | 267 ReconfigureIMFramework(); |
| 268 return true; | 268 return true; |
| 269 } | 269 } |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 if (candidate_window_controller_.get()) | 345 if (candidate_window_controller_.get()) |
| 346 candidate_window_controller_->Hide(); | 346 candidate_window_controller_->Hide(); |
| 347 | 347 |
| 348 // Disable the current engine handler. | 348 // Disable the current engine handler. |
| 349 IMEEngineHandlerInterface* engine = | 349 IMEEngineHandlerInterface* engine = |
| 350 IMEBridge::Get()->GetCurrentEngineHandler(); | 350 IMEBridge::Get()->GetCurrentEngineHandler(); |
| 351 if (engine) | 351 if (engine) |
| 352 engine->Disable(); | 352 engine->Disable(); |
| 353 | 353 |
| 354 // Configure the next engine handler. | 354 // Configure the next engine handler. |
| 355 if (InputMethodUtil::IsKeyboardLayout(input_method_id_to_switch)) { | 355 if (InputMethodUtil::IsKeyboardLayout(input_method_id_to_switch) && |
| 356 !extension_ime_util::IsKeyboardLayoutExtension( |
| 357 input_method_id_to_switch)) { |
| 356 IMEBridge::Get()->SetCurrentEngineHandler(NULL); | 358 IMEBridge::Get()->SetCurrentEngineHandler(NULL); |
| 357 } else { | 359 } else { |
| 358 IMEEngineHandlerInterface* next_engine = | 360 IMEEngineHandlerInterface* next_engine = |
| 359 IMEBridge::Get()->SetCurrentEngineHandlerById( | 361 IMEBridge::Get()->SetCurrentEngineHandlerById( |
| 360 input_method_id_to_switch); | 362 input_method_id_to_switch); |
| 361 | 363 |
| 362 if (next_engine) | 364 if (next_engine) |
| 363 next_engine->Enable(); | 365 next_engine->Enable(); |
| 364 } | 366 } |
| 365 | 367 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 ChangeInputMethodInternal(pending_input_method_, false); | 420 ChangeInputMethodInternal(pending_input_method_, false); |
| 419 } | 421 } |
| 420 | 422 |
| 421 void InputMethodManagerImpl::LoadNecessaryComponentExtensions() { | 423 void InputMethodManagerImpl::LoadNecessaryComponentExtensions() { |
| 422 if (!component_extension_ime_manager_->IsInitialized()) | 424 if (!component_extension_ime_manager_->IsInitialized()) |
| 423 return; | 425 return; |
| 424 // Load component extensions but also update |active_input_method_ids_| as | 426 // Load component extensions but also update |active_input_method_ids_| as |
| 425 // some component extension IMEs may have been removed from the Chrome OS | 427 // some component extension IMEs may have been removed from the Chrome OS |
| 426 // image. If specified component extension IME no longer exists, falling back | 428 // image. If specified component extension IME no longer exists, falling back |
| 427 // to an existing IME. | 429 // to an existing IME. |
| 428 std::vector<std::string> unfiltered_input_method_ids = | 430 std::vector<std::string> unfiltered_input_method_ids; |
| 429 active_input_method_ids_; | 431 unfiltered_input_method_ids.swap(active_input_method_ids_); |
| 430 active_input_method_ids_.clear(); | |
| 431 for (size_t i = 0; i < unfiltered_input_method_ids.size(); ++i) { | 432 for (size_t i = 0; i < unfiltered_input_method_ids.size(); ++i) { |
| 432 if (!extension_ime_util::IsComponentExtensionIME( | 433 if (!extension_ime_util::IsComponentExtensionIME( |
| 433 unfiltered_input_method_ids[i])) { | 434 unfiltered_input_method_ids[i])) { |
| 434 // Legacy IMEs or xkb layouts are alwayes active. | 435 // Legacy IMEs or xkb layouts are alwayes active. |
| 435 active_input_method_ids_.push_back(unfiltered_input_method_ids[i]); | 436 active_input_method_ids_.push_back(unfiltered_input_method_ids[i]); |
| 436 } else if (component_extension_ime_manager_->IsWhitelisted( | 437 } else if (component_extension_ime_manager_->IsWhitelisted( |
| 437 unfiltered_input_method_ids[i])) { | 438 unfiltered_input_method_ids[i])) { |
| 438 component_extension_ime_manager_->LoadComponentExtensionIME( | 439 component_extension_ime_manager_->LoadComponentExtensionIME( |
| 439 unfiltered_input_method_ids[i]); | 440 unfiltered_input_method_ids[i]); |
| 440 active_input_method_ids_.push_back(unfiltered_input_method_ids[i]); | 441 active_input_method_ids_.push_back(unfiltered_input_method_ids[i]); |
| 441 } | 442 } |
| 442 } | 443 } |
| 444 // TODO(shuchen): move this call in ComponentExtensionIMEManager. |
| 445 component_extension_ime_manager_->NotifyInitialized(); |
| 443 } | 446 } |
| 444 | 447 |
| 445 void InputMethodManagerImpl::ActivateInputMethodMenuItem( | 448 void InputMethodManagerImpl::ActivateInputMethodMenuItem( |
| 446 const std::string& key) { | 449 const std::string& key) { |
| 447 DCHECK(!key.empty()); | 450 DCHECK(!key.empty()); |
| 448 | 451 |
| 449 if (ash::ime::InputMethodMenuManager::GetInstance()-> | 452 if (ash::ime::InputMethodMenuManager::GetInstance()-> |
| 450 HasInputMethodMenuItemForKey(key)) { | 453 HasInputMethodMenuItemForKey(key)) { |
| 451 IMEEngineHandlerInterface* engine = | 454 IMEEngineHandlerInterface* engine = |
| 452 IMEBridge::Get()->GetCurrentEngineHandler(); | 455 IMEBridge::Get()->GetCurrentEngineHandler(); |
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 828 active_input_method_ids_ = saved_active_input_method_ids_; | 831 active_input_method_ids_ = saved_active_input_method_ids_; |
| 829 | 832 |
| 830 ChangeInputMethod(current_input_method_.id()); | 833 ChangeInputMethod(current_input_method_.id()); |
| 831 } | 834 } |
| 832 | 835 |
| 833 bool InputMethodManagerImpl::InputMethodIsActivated( | 836 bool InputMethodManagerImpl::InputMethodIsActivated( |
| 834 const std::string& input_method_id) { | 837 const std::string& input_method_id) { |
| 835 return Contains(active_input_method_ids_, input_method_id); | 838 return Contains(active_input_method_ids_, input_method_id); |
| 836 } | 839 } |
| 837 | 840 |
| 838 bool InputMethodManagerImpl::ContainsOnlyKeyboardLayout( | |
| 839 const std::vector<std::string>& value) { | |
| 840 for (size_t i = 0; i < value.size(); ++i) { | |
| 841 if (!InputMethodUtil::IsKeyboardLayout(value[i])) | |
| 842 return false; | |
| 843 } | |
| 844 return true; | |
| 845 } | |
| 846 | |
| 847 void InputMethodManagerImpl::MaybeInitializeCandidateWindowController() { | 841 void InputMethodManagerImpl::MaybeInitializeCandidateWindowController() { |
| 848 if (candidate_window_controller_.get()) | 842 if (candidate_window_controller_.get()) |
| 849 return; | 843 return; |
| 850 | 844 |
| 851 candidate_window_controller_.reset( | 845 candidate_window_controller_.reset( |
| 852 CandidateWindowController::CreateCandidateWindowController()); | 846 CandidateWindowController::CreateCandidateWindowController()); |
| 853 candidate_window_controller_->AddObserver(this); | 847 candidate_window_controller_->AddObserver(this); |
| 854 } | 848 } |
| 855 | 849 |
| 856 } // namespace input_method | 850 } // namespace input_method |
| 857 } // namespace chromeos | 851 } // namespace chromeos |
| OLD | NEW |