| Index: chromeos/ime/component_extension_ime_manager.cc
|
| diff --git a/chromeos/ime/component_extension_ime_manager.cc b/chromeos/ime/component_extension_ime_manager.cc
|
| index f77421918c29bff0346364840cd9875e36069574..8098ee2a5ff68776d2dd4146a7607564e40efe37 100644
|
| --- a/chromeos/ime/component_extension_ime_manager.cc
|
| +++ b/chromeos/ime/component_extension_ime_manager.cc
|
| @@ -87,13 +87,27 @@ ComponentExtensionIMEManager::~ComponentExtensionIMEManager() {
|
| void ComponentExtensionIMEManager::Initialize(
|
| scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate) {
|
| delegate_ = delegate.Pass();
|
| - component_extension_imes_ = delegate_->ListIME();
|
| + std::vector<ComponentExtensionIME> ext_list = delegate_->ListIME();
|
| + for (size_t i = 0; i < ext_list.size(); ++i) {
|
| + ComponentExtensionIME& ext = ext_list[i];
|
| + bool exists = component_extension_imes_.find(ext.id) !=
|
| + component_extension_imes_.end();
|
| + if (!exists)
|
| + component_extension_imes_[ext.id] = ext;
|
| + for (size_t j = 0; j < ext.engines.size(); ++j) {
|
| + if (exists)
|
| + component_extension_imes_[ext.id].engines.push_back(ext.engines[j]);
|
| + input_method_id_set_.insert(
|
| + extension_ime_util::GetComponentInputMethodID(
|
| + ext.id, ext.engines[j].engine_id));
|
| + }
|
| + }
|
| }
|
|
|
| bool ComponentExtensionIMEManager::LoadComponentExtensionIME(
|
| const std::string& input_method_id) {
|
| ComponentExtensionIME ime;
|
| - if (FindEngineEntry(input_method_id, &ime, NULL))
|
| + if (FindEngineEntry(input_method_id, &ime))
|
| return delegate_->Load(ime.id, ime.manifest, ime.path);
|
| else
|
| return false;
|
| @@ -102,7 +116,7 @@ bool ComponentExtensionIMEManager::LoadComponentExtensionIME(
|
| bool ComponentExtensionIMEManager::UnloadComponentExtensionIME(
|
| const std::string& input_method_id) {
|
| ComponentExtensionIME ime;
|
| - if (!FindEngineEntry(input_method_id, &ime, NULL))
|
| + if (!FindEngineEntry(input_method_id, &ime))
|
| return false;
|
| delegate_->Unload(ime.id, ime.path);
|
| return true;
|
| @@ -110,87 +124,41 @@ bool ComponentExtensionIMEManager::UnloadComponentExtensionIME(
|
|
|
| bool ComponentExtensionIMEManager::IsWhitelisted(
|
| const std::string& input_method_id) {
|
| - return extension_ime_util::IsComponentExtensionIME(input_method_id) &&
|
| - FindEngineEntry(input_method_id, NULL, NULL);
|
| + return input_method_id_set_.find(input_method_id) !=
|
| + input_method_id_set_.end();
|
| }
|
|
|
| bool ComponentExtensionIMEManager::IsWhitelistedExtension(
|
| const std::string& extension_id) {
|
| - for (size_t i = 0; i < component_extension_imes_.size(); ++i) {
|
| - if (component_extension_imes_[i].id == extension_id)
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -std::string ComponentExtensionIMEManager::GetId(
|
| - const std::string& extension_id,
|
| - const std::string& engine_id) {
|
| - ComponentExtensionEngine engine;
|
| - const std::string& input_method_id =
|
| - extension_ime_util::GetComponentInputMethodID(extension_id, engine_id);
|
| - if (!FindEngineEntry(input_method_id, NULL, &engine))
|
| - return "";
|
| - return input_method_id;
|
| -}
|
| -
|
| -std::string ComponentExtensionIMEManager::GetName(
|
| - const std::string& input_method_id) {
|
| - ComponentExtensionEngine engine;
|
| - if (!FindEngineEntry(input_method_id, NULL, &engine))
|
| - return "";
|
| - return engine.display_name;
|
| -}
|
| -
|
| -std::string ComponentExtensionIMEManager::GetDescription(
|
| - const std::string& input_method_id) {
|
| - ComponentExtensionEngine engine;
|
| - if (!FindEngineEntry(input_method_id, NULL, &engine))
|
| - return "";
|
| - return engine.description;
|
| -}
|
| -
|
| -std::vector<std::string> ComponentExtensionIMEManager::ListIMEByLanguage(
|
| - const std::string& language) {
|
| - std::vector<std::string> result;
|
| - for (size_t i = 0; i < component_extension_imes_.size(); ++i) {
|
| - for (size_t j = 0; j < component_extension_imes_[i].engines.size(); ++j) {
|
| - const ComponentExtensionIME& ime = component_extension_imes_[i];
|
| - if (std::find(ime.engines[j].language_codes.begin(),
|
| - ime.engines[j].language_codes.end(),
|
| - language) != ime.engines[j].language_codes.end()) {
|
| - result.push_back(extension_ime_util::GetComponentInputMethodID(
|
| - ime.id,
|
| - ime.engines[j].engine_id));
|
| - }
|
| - }
|
| - }
|
| - return result;
|
| + return component_extension_imes_.find(extension_id) !=
|
| + component_extension_imes_.end();
|
| }
|
|
|
| input_method::InputMethodDescriptors
|
| ComponentExtensionIMEManager::GetAllIMEAsInputMethodDescriptor() {
|
| input_method::InputMethodDescriptors result;
|
| - for (size_t i = 0; i < component_extension_imes_.size(); ++i) {
|
| - for (size_t j = 0; j < component_extension_imes_[i].engines.size(); ++j) {
|
| + for (std::map<std::string, ComponentExtensionIME>::const_iterator it =
|
| + component_extension_imes_.begin();
|
| + it != component_extension_imes_.end(); ++it) {
|
| + const ComponentExtensionIME& ext = it->second;
|
| + for (size_t j = 0; j < ext.engines.size(); ++j) {
|
| + const ComponentExtensionEngine& ime = ext.engines[j];
|
| const std::string input_method_id =
|
| extension_ime_util::GetComponentInputMethodID(
|
| - component_extension_imes_[i].id,
|
| - component_extension_imes_[i].engines[j].engine_id);
|
| - const std::vector<std::string>& layouts =
|
| - component_extension_imes_[i].engines[j].layouts;
|
| + ext.id, ime.engine_id);
|
| + const std::vector<std::string>& layouts = ime.layouts;
|
| result.push_back(
|
| input_method::InputMethodDescriptor(
|
| input_method_id,
|
| - component_extension_imes_[i].engines[j].display_name,
|
| + ime.display_name,
|
| std::string(), // TODO(uekawa): Set short name.
|
| layouts,
|
| - component_extension_imes_[i].engines[j].language_codes,
|
| + ime.language_codes,
|
| // Enables extension based xkb keyboards on login screen.
|
| extension_ime_util::IsKeyboardLayoutExtension(
|
| input_method_id) && IsInLoginLayoutWhitelist(layouts),
|
| - component_extension_imes_[i].engines[j].options_page_url,
|
| - component_extension_imes_[i].engines[j].input_view_url));
|
| + ime.options_page_url,
|
| + ime.input_view_url));
|
| }
|
| }
|
| return result;
|
| @@ -210,30 +178,20 @@ ComponentExtensionIMEManager::GetXkbIMEAsInputMethodDescriptor() {
|
|
|
| bool ComponentExtensionIMEManager::FindEngineEntry(
|
| const std::string& input_method_id,
|
| - ComponentExtensionIME* out_extension,
|
| - ComponentExtensionEngine* out_engine) {
|
| - if (!extension_ime_util::IsComponentExtensionIME(input_method_id))
|
| + ComponentExtensionIME* out_extension) {
|
| + if (!IsWhitelisted(input_method_id))
|
| return false;
|
| - for (size_t i = 0; i < component_extension_imes_.size(); ++i) {
|
| - const std::string extension_id = component_extension_imes_[i].id;
|
| - const std::vector<ComponentExtensionEngine>& engines =
|
| - component_extension_imes_[i].engines;
|
|
|
| - for (size_t j = 0; j < engines.size(); ++j) {
|
| - const std::string trial_ime_id =
|
| - extension_ime_util::GetComponentInputMethodID(
|
| - extension_id, engines[j].engine_id);
|
| - if (trial_ime_id != input_method_id)
|
| - continue;
|
| -
|
| - if (out_extension)
|
| - *out_extension = component_extension_imes_[i];
|
| - if (out_engine)
|
| - *out_engine = component_extension_imes_[i].engines[j];
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| + std::string extension_id =
|
| + extension_ime_util::GetExtensionIDFromInputMethodID(input_method_id);
|
| + std::map<std::string, ComponentExtensionIME>::iterator it =
|
| + component_extension_imes_.find(extension_id);
|
| + if (it == component_extension_imes_.end())
|
| + return false;
|
| +
|
| + if (out_extension)
|
| + *out_extension = it->second;
|
| + return true;
|
| }
|
|
|
| bool ComponentExtensionIMEManager::IsInLoginLayoutWhitelist(
|
|
|