OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "chromeos/ime/component_extension_ime_manager.h" | 5 #include "chromeos/ime/component_extension_ime_manager.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
9 #include "chromeos/ime/extension_ime_util.h" | 9 #include "chromeos/ime/extension_ime_util.h" |
10 | 10 |
11 namespace chromeos { | 11 namespace chromeos { |
12 | 12 |
| 13 namespace { |
| 14 |
| 15 const char* kLoginLayoutWhitelist[] = { |
| 16 "be", |
| 17 "be", |
| 18 "be", |
| 19 "br", |
| 20 "ca", |
| 21 "ca(eng)", |
| 22 "ca(multix)", |
| 23 "ch", |
| 24 "ch(fr)", |
| 25 "cz", |
| 26 "cz(qwerty)", |
| 27 "de", |
| 28 "de(neo)", |
| 29 "dk", |
| 30 "ee", |
| 31 "es", |
| 32 "es(cat)", |
| 33 "fi", |
| 34 "fr", |
| 35 "gb(dvorak)", |
| 36 "gb(extd)", |
| 37 "hr", |
| 38 "hu", |
| 39 "is", |
| 40 "it", |
| 41 "jp", |
| 42 "latam", |
| 43 "lt", |
| 44 "lv(apostrophe)", |
| 45 "no", |
| 46 "pl", |
| 47 "pt", |
| 48 "ro", |
| 49 "se", |
| 50 "si", |
| 51 "tr", |
| 52 "us", |
| 53 "us(altgr-intl)", |
| 54 "us(colemak)", |
| 55 "us(dvorak)", |
| 56 "us(intl)" |
| 57 }; |
| 58 |
| 59 bool WhitelistContains(const char* s) { |
| 60 int from = 0, to = arraysize(kLoginLayoutWhitelist); |
| 61 while (from < to) { |
| 62 int mid = from + (to - from) / 2; |
| 63 int cmp = strcmp(s, kLoginLayoutWhitelist[mid]); |
| 64 if (cmp > 0) |
| 65 from = mid + 1; |
| 66 else if (cmp < 0) |
| 67 to = mid - 1; |
| 68 else |
| 69 return true; |
| 70 } |
| 71 return false; |
| 72 } |
| 73 |
| 74 bool IsInLoginLayoutWhitelist(std::vector<std::string>& layouts) { |
| 75 for (size_t i = 0; i < layouts.size(); ++i) { |
| 76 if (WhitelistContains(layouts[i].c_str())) |
| 77 return true; |
| 78 } |
| 79 return false; |
| 80 } |
| 81 |
| 82 } // namespace |
| 83 |
13 ComponentExtensionEngine::ComponentExtensionEngine() { | 84 ComponentExtensionEngine::ComponentExtensionEngine() { |
14 } | 85 } |
15 | 86 |
16 ComponentExtensionEngine::~ComponentExtensionEngine() { | 87 ComponentExtensionEngine::~ComponentExtensionEngine() { |
17 } | 88 } |
18 | 89 |
19 ComponentExtensionIME::ComponentExtensionIME() { | 90 ComponentExtensionIME::ComponentExtensionIME() { |
20 } | 91 } |
21 | 92 |
22 ComponentExtensionIME::~ComponentExtensionIME() { | 93 ComponentExtensionIME::~ComponentExtensionIME() { |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 | 198 |
128 input_method::InputMethodDescriptors | 199 input_method::InputMethodDescriptors |
129 ComponentExtensionIMEManager::GetAllIMEAsInputMethodDescriptor() { | 200 ComponentExtensionIMEManager::GetAllIMEAsInputMethodDescriptor() { |
130 input_method::InputMethodDescriptors result; | 201 input_method::InputMethodDescriptors result; |
131 for (size_t i = 0; i < component_extension_imes_.size(); ++i) { | 202 for (size_t i = 0; i < component_extension_imes_.size(); ++i) { |
132 for (size_t j = 0; j < component_extension_imes_[i].engines.size(); ++j) { | 203 for (size_t j = 0; j < component_extension_imes_[i].engines.size(); ++j) { |
133 const std::string input_method_id = | 204 const std::string input_method_id = |
134 extension_ime_util::GetComponentInputMethodID( | 205 extension_ime_util::GetComponentInputMethodID( |
135 component_extension_imes_[i].id, | 206 component_extension_imes_[i].id, |
136 component_extension_imes_[i].engines[j].engine_id); | 207 component_extension_imes_[i].engines[j].engine_id); |
| 208 std::vector<std::string>& layouts = |
| 209 component_extension_imes_[i].engines[j].layouts; |
137 result.push_back( | 210 result.push_back( |
138 input_method::InputMethodDescriptor( | 211 input_method::InputMethodDescriptor( |
139 input_method_id, | 212 input_method_id, |
140 component_extension_imes_[i].engines[j].display_name, | 213 component_extension_imes_[i].engines[j].display_name, |
141 std::string(), // TODO(uekawa): Set short name. | 214 std::string(), // TODO(uekawa): Set short name. |
142 component_extension_imes_[i].engines[j].layouts, | 215 layouts, |
143 component_extension_imes_[i].engines[j].language_codes, | 216 component_extension_imes_[i].engines[j].language_codes, |
144 // Enables extension based xkb keyboards on login screen. | 217 // Enables extension based xkb keyboards on login screen. |
145 extension_ime_util::IsKeyboardLayoutExtension(input_method_id), | 218 extension_ime_util::IsKeyboardLayoutExtension( |
| 219 input_method_id) && IsInLoginLayoutWhitelist(layouts), |
146 component_extension_imes_[i].options_page_url, | 220 component_extension_imes_[i].options_page_url, |
147 component_extension_imes_[i].input_view_url)); | 221 component_extension_imes_[i].input_view_url)); |
148 } | 222 } |
149 } | 223 } |
150 return result; | 224 return result; |
151 } | 225 } |
152 | 226 |
153 void ComponentExtensionIMEManager::AddObserver(Observer* observer) { | 227 void ComponentExtensionIMEManager::AddObserver(Observer* observer) { |
154 observers_.AddObserver(observer); | 228 observers_.AddObserver(observer); |
155 } | 229 } |
(...skipping 24 matching lines...) Expand all Loading... |
180 *out_extension = component_extension_imes_[i]; | 254 *out_extension = component_extension_imes_[i]; |
181 if (out_engine) | 255 if (out_engine) |
182 *out_engine = component_extension_imes_[i].engines[j]; | 256 *out_engine = component_extension_imes_[i].engines[j]; |
183 return true; | 257 return true; |
184 } | 258 } |
185 } | 259 } |
186 return false; | 260 return false; |
187 } | 261 } |
188 | 262 |
189 } // namespace chromeos | 263 } // namespace chromeos |
OLD | NEW |