| 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_util.h" | 5 #include "ui/base/ime/chromeos/input_method_util.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <functional> | 10 #include <functional> |
| 11 #include <map> | 11 #include <map> |
| 12 #include <memory> | 12 #include <memory> |
| 13 #include <unordered_set> | 13 #include <unordered_set> |
| 14 #include <utility> | 14 #include <utility> |
| 15 | 15 |
| 16 #include "base/macros.h" | 16 #include "base/macros.h" |
| 17 #include "base/strings/string_split.h" | 17 #include "base/strings/string_split.h" |
| 18 #include "base/strings/string_util.h" | 18 #include "base/strings/string_util.h" |
| 19 #include "base/strings/utf_string_conversions.h" | 19 #include "base/strings/utf_string_conversions.h" |
| 20 #include "chrome/common/extensions/extension_constants.h" | |
| 21 // TODO(nona): move this header from this file. | |
| 22 #include "chrome/grit/generated_resources.h" | |
| 23 #include "components/prefs/pref_service.h" | |
| 24 #include "ui/base/ime/chromeos/component_extension_ime_manager.h" | 20 #include "ui/base/ime/chromeos/component_extension_ime_manager.h" |
| 25 #include "ui/base/ime/chromeos/extension_ime_util.h" | 21 #include "ui/base/ime/chromeos/extension_ime_util.h" |
| 26 // For SetHardwareKeyboardLayoutForTesting. | 22 // For SetHardwareKeyboardLayoutForTesting. |
| 27 #include "ui/base/ime/chromeos/fake_input_method_delegate.h" | 23 #include "ui/base/ime/chromeos/fake_input_method_delegate.h" |
| 28 #include "ui/base/ime/chromeos/input_method_delegate.h" | 24 #include "ui/base/ime/chromeos/input_method_delegate.h" |
| 29 #include "ui/base/l10n/l10n_util.h" | 25 #include "ui/base/l10n/l10n_util.h" |
| 26 #include "ui/chromeos/strings/grit/ui_chromeos_strings.h" |
| 30 | 27 |
| 31 namespace { | 28 namespace { |
| 32 | 29 |
| 33 // A mapping from an input method id to a resource id for a | 30 // A mapping from an input method id to a resource id for a |
| 34 // medium length language indicator. | 31 // medium length language indicator. |
| 35 // For those languages that want to display a slightly longer text in the | 32 // For those languages that want to display a slightly longer text in the |
| 36 // "Your input method has changed to..." bubble than in the status tray. | 33 // "Your input method has changed to..." bubble than in the status tray. |
| 37 // If an entry is not found in this table the short name is used. | 34 // If an entry is not found in this table the short name is used. |
| 38 const struct { | 35 const struct { |
| 39 const char* engine_id; | 36 const char* engine_id; |
| 40 const int resource_id; | 37 const int resource_id; |
| 41 } kMappingImeIdToMediumLenNameResourceId[] = { | 38 } kMappingImeIdToMediumLenNameResourceId[] = { |
| 42 { "hangul_2set", IDS_LANGUAGES_MEDIUM_LEN_NAME_KOREAN }, | 39 { "hangul_2set", IDS_LANGUAGES_MEDIUM_LEN_NAME_KOREAN }, |
| 43 { "hangul_3set390", IDS_LANGUAGES_MEDIUM_LEN_NAME_KOREAN }, | 40 { "hangul_3set390", IDS_LANGUAGES_MEDIUM_LEN_NAME_KOREAN }, |
| 44 { "hangul_3setfinal", IDS_LANGUAGES_MEDIUM_LEN_NAME_KOREAN }, | 41 { "hangul_3setfinal", IDS_LANGUAGES_MEDIUM_LEN_NAME_KOREAN }, |
| 45 { "hangul_3setnoshift", IDS_LANGUAGES_MEDIUM_LEN_NAME_KOREAN }, | 42 { "hangul_3setnoshift", IDS_LANGUAGES_MEDIUM_LEN_NAME_KOREAN }, |
| 46 { "hangul_3setromaja", IDS_LANGUAGES_MEDIUM_LEN_NAME_KOREAN }, | 43 { "hangul_3setromaja", IDS_LANGUAGES_MEDIUM_LEN_NAME_KOREAN }, |
| 47 { "zh-t-i0-pinyin", IDS_LANGUAGES_MEDIUM_LEN_NAME_CHINESE_SIMPLIFIED}, | 44 { "zh-t-i0-pinyin", IDS_LANGUAGES_MEDIUM_LEN_NAME_CHINESE_SIMPLIFIED}, |
| 48 { "zh-t-i0-wubi-1986", IDS_LANGUAGES_MEDIUM_LEN_NAME_CHINESE_SIMPLIFIED }, | 45 { "zh-t-i0-wubi-1986", IDS_LANGUAGES_MEDIUM_LEN_NAME_CHINESE_SIMPLIFIED }, |
| 49 { "zh-hant-t-i0-und", IDS_LANGUAGES_MEDIUM_LEN_NAME_CHINESE_TRADITIONAL }, | 46 { "zh-hant-t-i0-und", IDS_LANGUAGES_MEDIUM_LEN_NAME_CHINESE_TRADITIONAL }, |
| 50 { "zh-hant-t-i0-cangjie-1987", | 47 { "zh-hant-t-i0-cangjie-1987", |
| 51 IDS_LANGUAGES_MEDIUM_LEN_NAME_CHINESE_TRADITIONAL }, | 48 IDS_LANGUAGES_MEDIUM_LEN_NAME_CHINESE_TRADITIONAL }, |
| 52 { "zh-hant-t-i0-cangjie-1987-x-m0-simplified", | 49 { "zh-hant-t-i0-cangjie-1987-x-m0-simplified", |
| 53 IDS_LANGUAGES_MEDIUM_LEN_NAME_CHINESE_TRADITIONAL }, | 50 IDS_LANGUAGES_MEDIUM_LEN_NAME_CHINESE_TRADITIONAL }, |
| 54 { extension_misc::kBrailleImeEngineId, | 51 { chromeos::extension_ime_util::kBrailleImeEngineId, |
| 55 IDS_LANGUAGES_MEDIUM_LEN_NAME_BRAILLE }, | 52 IDS_LANGUAGES_MEDIUM_LEN_NAME_BRAILLE }, |
| 56 }; | 53 }; |
| 57 const size_t kMappingImeIdToMediumLenNameResourceIdLen = | 54 const size_t kMappingImeIdToMediumLenNameResourceIdLen = |
| 58 arraysize(kMappingImeIdToMediumLenNameResourceId); | 55 arraysize(kMappingImeIdToMediumLenNameResourceId); |
| 59 | 56 |
| 60 // Due to asynchronous initialization of component extension manager, | 57 // Due to asynchronous initialization of component extension manager, |
| 61 // GetFirstLoginInputMethodIds may miss component extension IMEs. To enable | 58 // GetFirstLoginInputMethodIds may miss component extension IMEs. To enable |
| 62 // component extension IME as the first loging input method, we have to prepare | 59 // component extension IME as the first loging input method, we have to prepare |
| 63 // component extension IME IDs. | 60 // component extension IME IDs. |
| 64 // Note: empty layout means the rule applies for all layouts. | 61 // Note: empty layout means the rule applies for all layouts. |
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 // Initialize a map from English string to Chrome string resource ID as well. | 378 // Initialize a map from English string to Chrome string resource ID as well. |
| 382 for (size_t i = 0; i < kEnglishToResourceIdArraySize; ++i) { | 379 for (size_t i = 0; i < kEnglishToResourceIdArraySize; ++i) { |
| 383 const EnglishToResouceId& map_entry = kEnglishToResourceIdArray[i]; | 380 const EnglishToResouceId& map_entry = kEnglishToResourceIdArray[i]; |
| 384 const bool result = english_to_resource_id_.insert(std::make_pair( | 381 const bool result = english_to_resource_id_.insert(std::make_pair( |
| 385 map_entry.english_string_from_ibus, map_entry.resource_id)).second; | 382 map_entry.english_string_from_ibus, map_entry.resource_id)).second; |
| 386 DCHECK(result) << "Duplicated string is found: " | 383 DCHECK(result) << "Duplicated string is found: " |
| 387 << map_entry.english_string_from_ibus; | 384 << map_entry.english_string_from_ibus; |
| 388 } | 385 } |
| 389 } | 386 } |
| 390 | 387 |
| 391 InputMethodUtil::~InputMethodUtil() { | 388 InputMethodUtil::~InputMethodUtil() {} |
| 392 } | |
| 393 | 389 |
| 394 std::string InputMethodUtil::GetLocalizedDisplayName( | 390 std::string InputMethodUtil::GetLocalizedDisplayName( |
| 395 const InputMethodDescriptor& descriptor) const { | 391 const InputMethodDescriptor& descriptor) const { |
| 396 // Localizes the input method name. | 392 // Localizes the input method name. |
| 397 const std::string& disp = descriptor.name(); | 393 const std::string& disp = descriptor.name(); |
| 398 if (base::StartsWith(disp, "__MSG_", base::CompareCase::SENSITIVE)) { | 394 if (base::StartsWith(disp, "__MSG_", base::CompareCase::SENSITIVE)) { |
| 399 const InputMethodNameMap* map = kInputMethodNameMap; | 395 const InputMethodNameMap* map = kInputMethodNameMap; |
| 400 size_t map_size = arraysize(kInputMethodNameMap); | 396 size_t map_size = arraysize(kInputMethodNameMap); |
| 401 std::string name = base::ToUpperASCII(disp); | 397 std::string name = base::ToUpperASCII(disp); |
| 402 const InputMethodNameMap map_key = {name.c_str(), 0}; | 398 const InputMethodNameMap map_key = {name.c_str(), 0}; |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 if (language_code == "de" || language_code == "fr" || language_code == "nl") { | 518 if (language_code == "de" || language_code == "fr" || language_code == "nl") { |
| 523 const base::string16 language_name = delegate_->GetDisplayLanguageName( | 519 const base::string16 language_name = delegate_->GetDisplayLanguageName( |
| 524 language_code); | 520 language_code); |
| 525 text = language_name + base::UTF8ToUTF16(" - ") + text; | 521 text = language_name + base::UTF8ToUTF16(" - ") + text; |
| 526 } | 522 } |
| 527 | 523 |
| 528 DCHECK(!text.empty()); | 524 DCHECK(!text.empty()); |
| 529 return text; | 525 return text; |
| 530 } | 526 } |
| 531 | 527 |
| 532 | |
| 533 base::string16 InputMethodUtil::GetInputMethodLongNameStripped( | 528 base::string16 InputMethodUtil::GetInputMethodLongNameStripped( |
| 534 const InputMethodDescriptor& input_method) const { | 529 const InputMethodDescriptor& input_method) const { |
| 535 return GetInputMethodLongNameInternal(input_method, true /* short_name */); | 530 return GetInputMethodLongNameInternal(input_method, true /* short_name */); |
| 536 } | 531 } |
| 537 | 532 |
| 538 base::string16 InputMethodUtil::GetInputMethodLongName( | 533 base::string16 InputMethodUtil::GetInputMethodLongName( |
| 539 const InputMethodDescriptor& input_method) const { | 534 const InputMethodDescriptor& input_method) const { |
| 540 return GetInputMethodLongNameInternal(input_method, false /* short_name */); | 535 return GetInputMethodLongNameInternal(input_method, false /* short_name */); |
| 541 } | 536 } |
| 542 | 537 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 587 void InputMethodUtil::GetFirstLoginInputMethodIds( | 582 void InputMethodUtil::GetFirstLoginInputMethodIds( |
| 588 const std::string& language_code, | 583 const std::string& language_code, |
| 589 const InputMethodDescriptor& preferred_input_method, | 584 const InputMethodDescriptor& preferred_input_method, |
| 590 std::vector<std::string>* out_input_method_ids) const { | 585 std::vector<std::string>* out_input_method_ids) const { |
| 591 out_input_method_ids->clear(); | 586 out_input_method_ids->clear(); |
| 592 | 587 |
| 593 // First, add the preferred keyboard layout (e.g. one used on the login | 588 // First, add the preferred keyboard layout (e.g. one used on the login |
| 594 // screen or set in UserContext when starting a public session). | 589 // screen or set in UserContext when starting a public session). |
| 595 out_input_method_ids->push_back(preferred_input_method.id()); | 590 out_input_method_ids->push_back(preferred_input_method.id()); |
| 596 | 591 |
| 597 const std::string current_layout | 592 const std::string current_layout = |
| 598 = preferred_input_method.GetPreferredKeyboardLayout(); | 593 preferred_input_method.GetPreferredKeyboardLayout(); |
| 599 for (size_t i = 0; i < arraysize(kDefaultInputMethodRecommendation); | 594 for (size_t i = 0; i < arraysize(kDefaultInputMethodRecommendation); ++i) { |
| 600 ++i) { | 595 if (kDefaultInputMethodRecommendation[i].locale == language_code && |
| 601 if (kDefaultInputMethodRecommendation[i].locale == language_code && ( | 596 (!kDefaultInputMethodRecommendation[i].layout[0] || |
| 602 !kDefaultInputMethodRecommendation[i].layout[0] || | 597 kDefaultInputMethodRecommendation[i].layout == current_layout)) { |
| 603 kDefaultInputMethodRecommendation[i].layout == current_layout)) { | |
| 604 out_input_method_ids->push_back( | 598 out_input_method_ids->push_back( |
| 605 extension_ime_util::GetInputMethodIDByEngineID( | 599 extension_ime_util::GetInputMethodIDByEngineID( |
| 606 kDefaultInputMethodRecommendation[i].engine_id)); | 600 kDefaultInputMethodRecommendation[i].engine_id)); |
| 607 return; | 601 return; |
| 608 } | 602 } |
| 609 } | 603 } |
| 610 | 604 |
| 611 std::vector<std::string> input_method_ids; | 605 std::vector<std::string> input_method_ids; |
| 612 GetInputMethodIdsFromLanguageCode( | 606 GetInputMethodIdsFromLanguageCode( |
| 613 language_code, kAllInputMethods, &input_method_ids); | 607 language_code, kAllInputMethods, &input_method_ids); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 659 for (size_t j = 0; j < arraysize(kEngineIdMigrationMap); ++j) { | 653 for (size_t j = 0; j < arraysize(kEngineIdMigrationMap); ++j) { |
| 660 size_t pos = engine_id.find(kEngineIdMigrationMap[j][0]); | 654 size_t pos = engine_id.find(kEngineIdMigrationMap[j][0]); |
| 661 if (pos == 0) { | 655 if (pos == 0) { |
| 662 engine_id.replace(0, | 656 engine_id.replace(0, |
| 663 strlen(kEngineIdMigrationMap[j][0]), | 657 strlen(kEngineIdMigrationMap[j][0]), |
| 664 kEngineIdMigrationMap[j][1]); | 658 kEngineIdMigrationMap[j][1]); |
| 665 break; | 659 break; |
| 666 } | 660 } |
| 667 } | 661 } |
| 668 // Migrates the extension IDs. | 662 // Migrates the extension IDs. |
| 669 std::string id = | 663 std::string id = extension_ime_util::GetInputMethodIDByEngineID(engine_id); |
| 670 extension_ime_util::GetInputMethodIDByEngineID(engine_id); | |
| 671 if (extension_ime_util::IsComponentExtensionIME(id)) { | 664 if (extension_ime_util::IsComponentExtensionIME(id)) { |
| 672 std::string id_new = extension_ime_util::GetInputMethodIDByEngineID( | 665 std::string id_new = extension_ime_util::GetInputMethodIDByEngineID( |
| 673 extension_ime_util::GetComponentIDByInputMethodID(id)); | 666 extension_ime_util::GetComponentIDByInputMethodID(id)); |
| 674 if (extension_ime_util::IsComponentExtensionIME(id_new)) | 667 if (extension_ime_util::IsComponentExtensionIME(id_new)) |
| 675 id = id_new; | 668 id = id_new; |
| 676 } | 669 } |
| 677 return id; | 670 return id; |
| 678 } | 671 } |
| 679 | 672 |
| 680 bool InputMethodUtil::MigrateInputMethods( | 673 bool InputMethodUtil::MigrateInputMethods( |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 746 } | 739 } |
| 747 } | 740 } |
| 748 | 741 |
| 749 void InputMethodUtil::SetHardwareKeyboardLayoutForTesting( | 742 void InputMethodUtil::SetHardwareKeyboardLayoutForTesting( |
| 750 const std::string& layout) { | 743 const std::string& layout) { |
| 751 delegate_->SetHardwareKeyboardLayoutForTesting(layout); | 744 delegate_->SetHardwareKeyboardLayoutForTesting(layout); |
| 752 cached_hardware_layouts_.clear(); | 745 cached_hardware_layouts_.clear(); |
| 753 UpdateHardwareLayoutCache(); | 746 UpdateHardwareLayoutCache(); |
| 754 } | 747 } |
| 755 | 748 |
| 756 const std::vector<std::string>& | 749 const std::vector<std::string>& InputMethodUtil::GetHardwareInputMethodIds() { |
| 757 InputMethodUtil::GetHardwareInputMethodIds() { | |
| 758 DCHECK(thread_checker_.CalledOnValidThread()); | 750 DCHECK(thread_checker_.CalledOnValidThread()); |
| 759 UpdateHardwareLayoutCache(); | 751 UpdateHardwareLayoutCache(); |
| 760 return hardware_layouts_; | 752 return hardware_layouts_; |
| 761 } | 753 } |
| 762 | 754 |
| 763 const std::vector<std::string>& | 755 const std::vector<std::string>& |
| 764 InputMethodUtil::GetHardwareLoginInputMethodIds() { | 756 InputMethodUtil::GetHardwareLoginInputMethodIds() { |
| 765 DCHECK(thread_checker_.CalledOnValidThread()); | 757 DCHECK(thread_checker_.CalledOnValidThread()); |
| 766 UpdateHardwareLayoutCache(); | 758 UpdateHardwareLayoutCache(); |
| 767 return hardware_login_layouts_; | 759 return hardware_login_layouts_; |
| 768 } | 760 } |
| 769 | 761 |
| 770 bool InputMethodUtil::IsLoginKeyboard(const std::string& input_method_id) | 762 bool InputMethodUtil::IsLoginKeyboard(const std::string& input_method_id) |
| 771 const { | 763 const { |
| 772 const InputMethodDescriptor* ime = | 764 const InputMethodDescriptor* ime = |
| 773 GetInputMethodDescriptorFromId(input_method_id); | 765 GetInputMethodDescriptorFromId(input_method_id); |
| 774 return ime ? ime->is_login_keyboard() : false; | 766 return ime ? ime->is_login_keyboard() : false; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 828 "US", | 820 "US", |
| 829 layouts, | 821 layouts, |
| 830 languages, | 822 languages, |
| 831 true, // login keyboard. | 823 true, // login keyboard. |
| 832 GURL(), // options page, not available. | 824 GURL(), // options page, not available. |
| 833 GURL()); // input view page, not available. | 825 GURL()); // input view page, not available. |
| 834 } | 826 } |
| 835 | 827 |
| 836 } // namespace input_method | 828 } // namespace input_method |
| 837 } // namespace chromeos | 829 } // namespace chromeos |
| OLD | NEW |