diff options
author | nona@chromium.org <nona@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-04 11:17:34 +0000 |
---|---|---|
committer | nona@chromium.org <nona@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-04 11:17:34 +0000 |
commit | 1a3e9f47e2c6dc7557eb2970dc014ad9bbb7603c (patch) | |
tree | 5b02459489133ddc7542a6ed10cd1f68863d28ed /chrome/browser/chromeos | |
parent | 303d24abd2e1af5d35370c71916477454c070552 (diff) | |
download | chromium_src-1a3e9f47e2c6dc7557eb2970dc014ad9bbb7603c.zip chromium_src-1a3e9f47e2c6dc7557eb2970dc014ad9bbb7603c.tar.gz chromium_src-1a3e9f47e2c6dc7557eb2970dc014ad9bbb7603c.tar.bz2 |
Support Component Extension IME
Component Extension IME is basically treated as system input method.
BUG=164377
TEST=None
Review URL: https://chromiumcodereview.appspot.com/13527002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@192293 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/chromeos')
3 files changed, 30 insertions, 4 deletions
diff --git a/chrome/browser/chromeos/input_method/ibus_controller_impl.cc b/chrome/browser/chromeos/input_method/ibus_controller_impl.cc index 5d98bf5..558eb28 100644 --- a/chrome/browser/chromeos/input_method/ibus_controller_impl.cc +++ b/chrome/browser/chromeos/input_method/ibus_controller_impl.cc @@ -29,6 +29,7 @@ #include "chromeos/dbus/ibus/ibus_input_context_client.h" #include "chromeos/dbus/ibus/ibus_panel_service.h" #include "chromeos/dbus/ibus/ibus_property.h" +#include "chromeos/ime/component_extension_ime_manager.h" #include "chromeos/ime/extension_ime_util.h" #include "chromeos/ime/input_method_config.h" #include "chromeos/ime/input_method_property.h" @@ -201,7 +202,8 @@ bool IBusControllerImpl::ChangeInputMethod(const std::string& id) { // Sanity checks. DCHECK(!InputMethodUtil::IsKeyboardLayout(id)); if (!whitelist_.InputMethodIdIsWhitelisted(id) && - !extension_ime_util::IsExtensionIME(id)) + !extension_ime_util::IsExtensionIME(id) && + !ComponentExtensionIMEManager::IsComponentExtensionIMEId(id)) return false; // Clear input method properties unconditionally if |id| is not equal to diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc index bc5de30..0aab684 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc @@ -208,6 +208,9 @@ bool InputMethodManagerImpl::EnableInputMethods( } active_input_method_ids_.swap(new_active_input_method_ids_filtered); + if (component_extension_ime_manager_->IsInitialized()) + LoadNecessaryComponentExtensions(); + if (ContainOnlyKeyboardLayout(active_input_method_ids_)) { // Do NOT call ibus_controller_->Stop(); here to work around a crash issue // at crosbug.com/27051. @@ -333,6 +336,8 @@ void InputMethodManagerImpl::OnComponentExtensionInitialized( util_.SetComponentExtensions( component_extension_ime_manager_->GetAllIMEAsInputMethodDescriptor()); + LoadNecessaryComponentExtensions(); + if (!pending_input_method_.empty()) { ChangeInputMethod(pending_input_method_); pending_input_method_.clear(); @@ -340,6 +345,18 @@ void InputMethodManagerImpl::OnComponentExtensionInitialized( } +void InputMethodManagerImpl::LoadNecessaryComponentExtensions() { + if (!component_extension_ime_manager_->IsInitialized()) + return; + for (size_t i = 0; i < active_input_method_ids_.size(); ++i) { + if (component_extension_ime_manager_->IsWhitelisted( + active_input_method_ids_[i])) { + component_extension_ime_manager_->LoadComponentExtensionIME( + active_input_method_ids_[i]); + } + } +} + void InputMethodManagerImpl::ActivateInputMethodProperty( const std::string& key) { DCHECK(!key.empty()); @@ -355,7 +372,8 @@ void InputMethodManagerImpl::AddInputMethodExtension( if (state_ == STATE_TERMINATING) return; - if (!extension_ime_util::IsExtensionIME(id)) { + if (!extension_ime_util::IsExtensionIME(id) && + !ComponentExtensionIMEManager::IsComponentExtensionIMEId(id)) { DVLOG(1) << id << " is not a valid extension input method ID."; return; } @@ -363,7 +381,8 @@ void InputMethodManagerImpl::AddInputMethodExtension( const std::string layout = layouts.empty() ? "" : layouts[0]; extra_input_methods_[id] = InputMethodDescriptor(id, name, layout, language, true); - if (!Contains(filtered_extension_imes_, id)) { + if (!Contains(filtered_extension_imes_, id) && + !ComponentExtensionIMEManager::IsComponentExtensionIMEId(id)) { if (!Contains(active_input_method_ids_, id)) { active_input_method_ids_.push_back(id); } else { @@ -420,7 +439,8 @@ void InputMethodManagerImpl::GetInputMethodExtensions( std::map<std::string, InputMethodDescriptor>::iterator iter; for (iter = extra_input_methods_.begin(); iter != extra_input_methods_.end(); ++iter) { - result->push_back(iter->second); + if (extension_ime_util::IsExtensionIME(iter->first)) + result->push_back(iter->second); } } diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.h b/chrome/browser/chromeos/input_method/input_method_manager_impl.h index c061c87..eba250e 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl.h +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.h @@ -152,6 +152,10 @@ class InputMethodManagerImpl : public InputMethodManager, void InitializeComponentExtension( const scoped_refptr<base::SequencedTaskRunner>& file_task_runner); + // Loads necessary component extensions. + // TODO(nona): Support dynamical unloading. + void LoadNecessaryComponentExtensions(); + scoped_ptr<InputMethodDelegate> delegate_; // The current browser status. |