Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Side by Side Diff: chrome/browser/ui/webui/chromeos/login/l10n_util.cc

Issue 417103003: Retrieve the list of keyboard layouts for public sessions async (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/ui/webui/chromeos/login/l10n_util.h" 5 #include "chrome/browser/ui/webui/chromeos/login/l10n_util.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <iterator> 8 #include <iterator>
9 #include <map> 9 #include <map>
10 #include <set> 10 #include <set>
11 #include <utility> 11 #include <utility>
12 12
13 #include "base/basictypes.h" 13 #include "base/basictypes.h"
14 #include "base/bind.h"
14 #include "base/i18n/rtl.h" 15 #include "base/i18n/rtl.h"
16 #include "base/location.h"
15 #include "base/logging.h" 17 #include "base/logging.h"
16 #include "base/strings/string16.h" 18 #include "base/strings/string16.h"
17 #include "base/strings/stringprintf.h" 19 #include "base/strings/stringprintf.h"
18 #include "base/strings/utf_string_conversions.h" 20 #include "base/strings/utf_string_conversions.h"
19 #include "base/values.h" 21 #include "base/values.h"
20 #include "chrome/browser/browser_process.h" 22 #include "chrome/browser/browser_process.h"
21 #include "chrome/browser/chromeos/customization_document.h" 23 #include "chrome/browser/chromeos/customization_document.h"
22 #include "chrome/browser/chromeos/input_method/input_method_util.h" 24 #include "chrome/browser/chromeos/input_method/input_method_util.h"
23 #include "chromeos/ime/component_extension_ime_manager.h" 25 #include "chromeos/ime/component_extension_ime_manager.h"
24 #include "chromeos/ime/input_method_descriptor.h" 26 #include "chromeos/ime/input_method_descriptor.h"
25 #include "chromeos/ime/input_method_manager.h" 27 #include "chromeos/ime/input_method_manager.h"
28 #include "content/public/browser/browser_thread.h"
26 #include "grit/generated_resources.h" 29 #include "grit/generated_resources.h"
27 #include "ui/base/l10n/l10n_util.h" 30 #include "ui/base/l10n/l10n_util.h"
28 31
29 namespace chromeos { 32 namespace chromeos {
30 33
31 namespace { 34 namespace {
32 35
33 base::DictionaryValue* CreateInputMethodsEntry( 36 scoped_ptr<base::DictionaryValue> CreateInputMethodsEntry(
34 const input_method::InputMethodDescriptor& method, 37 const input_method::InputMethodDescriptor& method,
35 const std::string selected) { 38 const std::string selected) {
36 input_method::InputMethodUtil* util = 39 input_method::InputMethodUtil* util =
37 input_method::InputMethodManager::Get()->GetInputMethodUtil(); 40 input_method::InputMethodManager::Get()->GetInputMethodUtil();
38 const std::string& ime_id = method.id(); 41 const std::string& ime_id = method.id();
39 scoped_ptr<base::DictionaryValue> input_method(new base::DictionaryValue); 42 scoped_ptr<base::DictionaryValue> input_method(new base::DictionaryValue);
40 input_method->SetString("value", ime_id); 43 input_method->SetString("value", ime_id);
41 input_method->SetString("title", util->GetInputMethodLongName(method)); 44 input_method->SetString("title", util->GetInputMethodLongName(method));
42 input_method->SetBoolean("selected", ime_id == selected); 45 input_method->SetBoolean("selected", ime_id == selected);
43 return input_method.release(); 46 return input_method.Pass();
44 } 47 }
45 48
46 // Returns true if element was inserted. 49 // Returns true if element was inserted.
47 bool InsertString(const std::string& str, std::set<std::string>& to) { 50 bool InsertString(const std::string& str, std::set<std::string>& to) {
48 const std::pair<std::set<std::string>::iterator, bool> result = 51 const std::pair<std::set<std::string>::iterator, bool> result =
49 to.insert(str); 52 to.insert(str);
50 return result.second; 53 return result.second;
51 } 54 }
52 55
53 void AddOptgroupOtherLayouts(base::ListValue* input_methods_list) { 56 void AddOptgroupOtherLayouts(base::ListValue* input_methods_list) {
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 dictionary->SetString("code", pair.first); 266 dictionary->SetString("code", pair.first);
264 dictionary->SetString("displayName", out_display_names[i]); 267 dictionary->SetString("displayName", out_display_names[i]);
265 dictionary->SetString("textDirection", directionality); 268 dictionary->SetString("textDirection", directionality);
266 dictionary->SetString("nativeDisplayName", pair.second); 269 dictionary->SetString("nativeDisplayName", pair.second);
267 language_list->Append(dictionary); 270 language_list->Append(dictionary);
268 } 271 }
269 272
270 return language_list.Pass(); 273 return language_list.Pass();
271 } 274 }
272 275
276 // Invokes |callback| with a list of keyboard layouts that can be used for
277 // |resolved_locale|.
278 void GetKeyboardLayoutsForResolvedLocale(
279 const GetKeyboardLayoutsForLocaleCallback& callback,
280 const std::string& resolved_locale) {
281 input_method::InputMethodUtil* util =
282 input_method::InputMethodManager::Get()->GetInputMethodUtil();
283 std::vector<std::string> layouts = util->GetHardwareInputMethodIds();
284 std::vector<std::string> layouts_from_locale;
285 util->GetInputMethodIdsFromLanguageCode(
286 resolved_locale,
287 input_method::kKeyboardLayoutsOnly,
288 &layouts_from_locale);
289 layouts.insert(layouts.end(), layouts_from_locale.begin(),
290 layouts_from_locale.end());
291
292 std::string selected;
293 if (!layouts_from_locale.empty()) {
294 selected =
295 util->GetInputMethodDescriptorFromId(layouts_from_locale[0])->id();
296 }
297
298 scoped_ptr<base::ListValue> input_methods_list(new base::ListValue);
299 std::set<std::string> input_methods_added;
300 for (std::vector<std::string>::const_iterator it = layouts.begin();
301 it != layouts.end(); ++it) {
302 const input_method::InputMethodDescriptor* ime =
303 util->GetInputMethodDescriptorFromId(*it);
304 if (!InsertString(ime->id(), input_methods_added))
305 continue;
306 input_methods_list->Append(
307 CreateInputMethodsEntry(*ime, selected).release());
308 }
309
310 callback.Run(input_methods_list.Pass());
311 }
312
273 } // namespace 313 } // namespace
274 314
275 const char kMostRelevantLanguagesDivider[] = "MOST_RELEVANT_LANGUAGES_DIVIDER"; 315 const char kMostRelevantLanguagesDivider[] = "MOST_RELEVANT_LANGUAGES_DIVIDER";
276 316
277 scoped_ptr<base::ListValue> GetUILanguageList( 317 scoped_ptr<base::ListValue> GetUILanguageList(
278 const std::vector<std::string>* most_relevant_language_codes, 318 const std::vector<std::string>* most_relevant_language_codes,
279 const std::string& selected) { 319 const std::string& selected) {
280 ComponentExtensionIMEManager* manager = 320 ComponentExtensionIMEManager* manager =
281 input_method::InputMethodManager::Get()-> 321 input_method::InputMethodManager::Get()->
282 GetComponentExtensionIMEManager(); 322 GetComponentExtensionIMEManager();
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 392
353 for (std::vector<std::string>::const_iterator i = 393 for (std::vector<std::string>::const_iterator i =
354 hardware_login_input_methods.begin(); 394 hardware_login_input_methods.begin();
355 i != hardware_login_input_methods.end(); 395 i != hardware_login_input_methods.end();
356 ++i) { 396 ++i) {
357 const input_method::InputMethodDescriptor* ime = 397 const input_method::InputMethodDescriptor* ime =
358 util->GetInputMethodDescriptorFromId(*i); 398 util->GetInputMethodDescriptorFromId(*i);
359 // Do not crash in case of misconfiguration. 399 // Do not crash in case of misconfiguration.
360 if (ime) { 400 if (ime) {
361 input_methods_added.insert(*i); 401 input_methods_added.insert(*i);
362 input_methods_list->Append(CreateInputMethodsEntry(*ime, selected)); 402 input_methods_list->Append(
403 CreateInputMethodsEntry(*ime, selected).release());
363 } else { 404 } else {
364 NOTREACHED(); 405 NOTREACHED();
365 } 406 }
366 } 407 }
367 408
368 bool optgroup_added = false; 409 bool optgroup_added = false;
369 for (size_t i = 0; i < input_methods->size(); ++i) { 410 for (size_t i = 0; i < input_methods->size(); ++i) {
370 // Makes sure the id is in legacy xkb id format. 411 // Makes sure the id is in legacy xkb id format.
371 const std::string& ime_id = (*input_methods)[i].id(); 412 const std::string& ime_id = (*input_methods)[i].id();
372 if (!InsertString(ime_id, input_methods_added)) 413 if (!InsertString(ime_id, input_methods_added))
373 continue; 414 continue;
374 if (!optgroup_added) { 415 if (!optgroup_added) {
375 optgroup_added = true; 416 optgroup_added = true;
376 AddOptgroupOtherLayouts(input_methods_list.get()); 417 AddOptgroupOtherLayouts(input_methods_list.get());
377 } 418 }
378 input_methods_list->Append(CreateInputMethodsEntry((*input_methods)[i], 419 input_methods_list->Append(CreateInputMethodsEntry((*input_methods)[i],
379 selected)); 420 selected).release());
380 } 421 }
381 422
382 // "xkb:us::eng" should always be in the list of available layouts. 423 // "xkb:us::eng" should always be in the list of available layouts.
383 const std::string us_keyboard_id = 424 const std::string us_keyboard_id =
384 util->GetFallbackInputMethodDescriptor().id(); 425 util->GetFallbackInputMethodDescriptor().id();
385 if (input_methods_added.find(us_keyboard_id) == input_methods_added.end()) { 426 if (input_methods_added.find(us_keyboard_id) == input_methods_added.end()) {
386 const input_method::InputMethodDescriptor* us_eng_descriptor = 427 const input_method::InputMethodDescriptor* us_eng_descriptor =
387 util->GetInputMethodDescriptorFromId(us_keyboard_id); 428 util->GetInputMethodDescriptorFromId(us_keyboard_id);
388 DCHECK(us_eng_descriptor); 429 DCHECK(us_eng_descriptor);
389 if (!optgroup_added) { 430 if (!optgroup_added) {
390 optgroup_added = true; 431 optgroup_added = true;
391 AddOptgroupOtherLayouts(input_methods_list.get()); 432 AddOptgroupOtherLayouts(input_methods_list.get());
392 } 433 }
393 input_methods_list->Append(CreateInputMethodsEntry(*us_eng_descriptor, 434 input_methods_list->Append(CreateInputMethodsEntry(*us_eng_descriptor,
394 selected)); 435 selected).release());
395 } 436 }
396 return input_methods_list.Pass(); 437 return input_methods_list.Pass();
397 } 438 }
398 439
399 scoped_ptr<base::ListValue> GetKeyboardLayoutsForLocale( 440 void GetKeyboardLayoutsForLocale(
441 const GetKeyboardLayoutsForLocaleCallback& callback,
400 const std::string& locale) { 442 const std::string& locale) {
401 input_method::InputMethodUtil* util = 443 // Resolve |locale| on the FILE thread, then continue on the UI thread.
402 input_method::InputMethodManager::Get()->GetInputMethodUtil(); 444 content::BrowserThread::PostTaskAndReplyWithResult(
403 std::vector<std::string> layouts = util->GetHardwareInputMethodIds(); 445 content::BrowserThread::FILE,
Nikita (slow) 2014/07/30 12:08:47 FILE thread is deprecated https://groups.google.co
bartfab (slow) 2014/07/30 12:55:17 Done.
404 std::vector<std::string> layouts_from_locale; 446 FROM_HERE,
405 util->GetInputMethodIdsFromLanguageCode( 447 base::Bind(&l10n_util::GetApplicationLocale,
406 l10n_util::GetApplicationLocale(locale), 448 locale),
407 input_method::kKeyboardLayoutsOnly, 449 base::Bind(&GetKeyboardLayoutsForResolvedLocale,
408 &layouts_from_locale); 450 callback));
409 layouts.insert(layouts.end(), layouts_from_locale.begin(), 451 }
410 layouts_from_locale.end());
411 452
412 std::string selected; 453 scoped_ptr<base::DictionaryValue> GetCurrentKeyboardLayout() {
413 if (!layouts_from_locale.empty()) { 454 const input_method::InputMethodDescriptor current_input_method =
414 selected = 455 input_method::InputMethodManager::Get()->GetCurrentInputMethod();
415 util->GetInputMethodDescriptorFromId(layouts_from_locale[0])->id(); 456 return CreateInputMethodsEntry(current_input_method,
416 } 457 current_input_method.id());
417
418 scoped_ptr<base::ListValue> input_methods_list(new base::ListValue);
419 std::set<std::string> input_methods_added;
420 for (std::vector<std::string>::const_iterator it = layouts.begin();
421 it != layouts.end(); ++it) {
422 const input_method::InputMethodDescriptor* ime =
423 util->GetInputMethodDescriptorFromId(*it);
424 if (!InsertString(ime->id(), input_methods_added))
425 continue;
426 input_methods_list->Append(CreateInputMethodsEntry(*ime, selected));
427 }
428 return input_methods_list.Pass();
429 } 458 }
430 459
431 } // namespace chromeos 460 } // namespace chromeos
OLDNEW
« no previous file with comments | « chrome/browser/ui/webui/chromeos/login/l10n_util.h ('k') | chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698