Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <iterator> | 9 #include <iterator> |
| 10 #include <map> | 10 #include <map> |
| 11 #include <memory> | 11 #include <memory> |
| 12 #include <set> | 12 #include <set> |
| 13 #include <utility> | 13 #include <utility> |
| 14 | 14 |
| 15 #include "base/bind.h" | 15 #include "base/bind.h" |
| 16 #include "base/i18n/rtl.h" | 16 #include "base/i18n/rtl.h" |
| 17 #include "base/location.h" | 17 #include "base/location.h" |
| 18 #include "base/logging.h" | 18 #include "base/logging.h" |
| 19 #include "base/memory/ptr_util.h" | 19 #include "base/memory/ptr_util.h" |
| 20 #include "base/memory/ref_counted.h" | 20 #include "base/memory/ref_counted.h" |
| 21 #include "base/sequenced_task_runner.h" | 21 #include "base/sequenced_task_runner.h" |
| 22 #include "base/stl_util.h" | 22 #include "base/stl_util.h" |
| 23 #include "base/strings/string16.h" | 23 #include "base/strings/string16.h" |
| 24 #include "base/strings/stringprintf.h" | 24 #include "base/strings/stringprintf.h" |
| 25 #include "base/strings/utf_string_conversions.h" | 25 #include "base/strings/utf_string_conversions.h" |
| 26 #include "base/task_runner_util.h" | 26 #include "base/task_runner_util.h" |
| 27 #include "base/threading/sequenced_worker_pool.h" | 27 #include "base/task_scheduler/post_task.h" |
| 28 #include "base/threading/thread_task_runner_handle.h" | 28 #include "base/threading/sequenced_task_runner_handle.h" |
| 29 #include "base/values.h" | 29 #include "base/values.h" |
| 30 #include "chrome/browser/browser_process.h" | 30 #include "chrome/browser/browser_process.h" |
| 31 #include "chrome/browser/chromeos/customization/customization_document.h" | 31 #include "chrome/browser/chromeos/customization/customization_document.h" |
| 32 #include "chrome/browser/chromeos/input_method/input_method_util.h" | 32 #include "chrome/browser/chromeos/input_method/input_method_util.h" |
| 33 #include "chrome/browser/chromeos/profiles/profile_helper.h" | 33 #include "chrome/browser/chromeos/profiles/profile_helper.h" |
| 34 #include "chrome/browser/profiles/profile_manager.h" | 34 #include "chrome/browser/profiles/profile_manager.h" |
| 35 #include "chrome/grit/generated_resources.h" | 35 #include "chrome/grit/generated_resources.h" |
| 36 #include "content/public/browser/browser_thread.h" | 36 #include "content/public/browser/browser_thread.h" |
| 37 #include "ui/base/ime/chromeos/component_extension_ime_manager.h" | 37 #include "ui/base/ime/chromeos/component_extension_ime_manager.h" |
| 38 #include "ui/base/ime/chromeos/input_method_descriptor.h" | 38 #include "ui/base/ime/chromeos/input_method_descriptor.h" |
| 39 #include "ui/base/ime/chromeos/input_method_manager.h" | 39 #include "ui/base/ime/chromeos/input_method_manager.h" |
| 40 #include "ui/base/l10n/l10n_util.h" | 40 #include "ui/base/l10n/l10n_util.h" |
| 41 | 41 |
| 42 namespace chromeos { | 42 namespace chromeos { |
| 43 | 43 |
| 44 const char kMostRelevantLanguagesDivider[] = "MOST_RELEVANT_LANGUAGES_DIVIDER"; | 44 const char kMostRelevantLanguagesDivider[] = "MOST_RELEVANT_LANGUAGES_DIVIDER"; |
| 45 | 45 |
| 46 namespace { | 46 namespace { |
| 47 | 47 |
| 48 const char kSequenceToken[] = "chromeos_login_l10n_util"; | |
| 49 | |
| 50 std::unique_ptr<base::DictionaryValue> CreateInputMethodsEntry( | 48 std::unique_ptr<base::DictionaryValue> CreateInputMethodsEntry( |
| 51 const input_method::InputMethodDescriptor& method, | 49 const input_method::InputMethodDescriptor& method, |
| 52 const std::string selected) { | 50 const std::string selected) { |
| 53 input_method::InputMethodUtil* util = | 51 input_method::InputMethodUtil* util = |
| 54 input_method::InputMethodManager::Get()->GetInputMethodUtil(); | 52 input_method::InputMethodManager::Get()->GetInputMethodUtil(); |
| 55 const std::string& ime_id = method.id(); | 53 const std::string& ime_id = method.id(); |
| 56 std::unique_ptr<base::DictionaryValue> input_method( | 54 std::unique_ptr<base::DictionaryValue> input_method( |
| 57 new base::DictionaryValue); | 55 new base::DictionaryValue); |
| 58 input_method->SetString("value", ime_id); | 56 input_method->SetString("value", ime_id); |
| 59 input_method->SetString( | 57 input_method->SetString( |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 339 std::string resolved_locale; | 337 std::string resolved_locale; |
| 340 if (!l10n_util::CheckAndResolveLocale(requested_locale, &resolved_locale)) | 338 if (!l10n_util::CheckAndResolveLocale(requested_locale, &resolved_locale)) |
| 341 return loaded_locale; | 339 return loaded_locale; |
| 342 | 340 |
| 343 if (resolved_locale == loaded_locale) | 341 if (resolved_locale == loaded_locale) |
| 344 return requested_locale; | 342 return requested_locale; |
| 345 | 343 |
| 346 return loaded_locale; | 344 return loaded_locale; |
| 347 } | 345 } |
| 348 | 346 |
| 349 void ResolveLanguageListOnBlockingPool( | 347 void ResolveLanguageListInThreadPool( |
| 350 std::unique_ptr<chromeos::locale_util::LanguageSwitchResult> | 348 std::unique_ptr<chromeos::locale_util::LanguageSwitchResult> |
| 351 language_switch_result, | 349 language_switch_result, |
| 352 const scoped_refptr<base::TaskRunner> task_runner, | 350 const scoped_refptr<base::TaskRunner> task_runner, |
| 353 const UILanguageListResolvedCallback& resolved_callback) { | 351 const UILanguageListResolvedCallback& resolved_callback) { |
| 354 // DCHECK(task_runner->RunsTasksInCurrentSequence()); | |
|
achuithb
2017/05/18 21:36:51
Is there an appropriate DCHECK to assert the right
| |
| 355 base::ThreadRestrictions::AssertIOAllowed(); | 352 base::ThreadRestrictions::AssertIOAllowed(); |
|
emaxx
2017/05/19 17:58:16
nit: While you're here - please add #include "base
fdoray
2017/05/19 18:34:28
Done.
| |
| 356 | 353 |
| 357 std::string selected_language; | 354 std::string selected_language; |
| 358 if (!language_switch_result) { | 355 if (!language_switch_result) { |
| 359 selected_language = | 356 selected_language = |
| 360 StartupCustomizationDocument::GetInstance()->initial_locale_default(); | 357 StartupCustomizationDocument::GetInstance()->initial_locale_default(); |
| 361 } else { | 358 } else { |
| 362 if (language_switch_result->success) { | 359 if (language_switch_result->success) { |
| 363 if (language_switch_result->requested_locale == | 360 if (language_switch_result->requested_locale == |
| 364 language_switch_result->loaded_locale) { | 361 language_switch_result->loaded_locale) { |
| 365 selected_language = language_switch_result->requested_locale; | 362 selected_language = language_switch_result->requested_locale; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 421 } | 418 } |
| 422 | 419 |
| 423 } // namespace | 420 } // namespace |
| 424 | 421 |
| 425 void ResolveUILanguageList( | 422 void ResolveUILanguageList( |
| 426 std::unique_ptr<chromeos::locale_util::LanguageSwitchResult> | 423 std::unique_ptr<chromeos::locale_util::LanguageSwitchResult> |
| 427 language_switch_result, | 424 language_switch_result, |
| 428 const UILanguageListResolvedCallback& callback) { | 425 const UILanguageListResolvedCallback& callback) { |
| 429 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 426 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 430 | 427 |
| 431 content::BrowserThread::GetBlockingPool()->PostTask( | 428 base::PostTaskWithTraits( |
| 432 FROM_HERE, base::Bind(&ResolveLanguageListOnBlockingPool, | 429 FROM_HERE, {base::MayBlock()}, |
| 433 base::Passed(&language_switch_result), | 430 base::BindOnce(&ResolveLanguageListInThreadPool, |
| 434 base::ThreadTaskRunnerHandle::Get(), callback)); | 431 base::Passed(&language_switch_result), |
| 432 base::SequencedTaskRunnerHandle::Get(), callback)); | |
| 435 } | 433 } |
| 436 | 434 |
| 437 std::unique_ptr<base::ListValue> GetMinimalUILanguageList() { | 435 std::unique_ptr<base::ListValue> GetMinimalUILanguageList() { |
| 438 const std::string application_locale = | 436 const std::string application_locale = |
| 439 g_browser_process->GetApplicationLocale(); | 437 g_browser_process->GetApplicationLocale(); |
| 440 base::string16 language_native_display_name = | 438 base::string16 language_native_display_name = |
| 441 l10n_util::GetDisplayNameForLocale( | 439 l10n_util::GetDisplayNameForLocale( |
| 442 application_locale, application_locale, true); | 440 application_locale, application_locale, true); |
| 443 | 441 |
| 444 std::unique_ptr<base::ListValue> language_list(new base::ListValue()); | 442 std::unique_ptr<base::ListValue> language_list(new base::ListValue()); |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 571 input_methods_list->Append( | 569 input_methods_list->Append( |
| 572 CreateInputMethodsEntry(*us_eng_descriptor, selected)); | 570 CreateInputMethodsEntry(*us_eng_descriptor, selected)); |
| 573 manager->GetActiveIMEState()->EnableInputMethod(us_keyboard_id); | 571 manager->GetActiveIMEState()->EnableInputMethod(us_keyboard_id); |
| 574 } | 572 } |
| 575 return input_methods_list; | 573 return input_methods_list; |
| 576 } | 574 } |
| 577 | 575 |
| 578 void GetKeyboardLayoutsForLocale( | 576 void GetKeyboardLayoutsForLocale( |
| 579 const GetKeyboardLayoutsForLocaleCallback& callback, | 577 const GetKeyboardLayoutsForLocaleCallback& callback, |
| 580 const std::string& locale) { | 578 const std::string& locale) { |
| 581 base::SequencedWorkerPool* worker_pool = | |
| 582 content::BrowserThread::GetBlockingPool(); | |
| 583 scoped_refptr<base::SequencedTaskRunner> background_task_runner = | |
| 584 worker_pool->GetSequencedTaskRunnerWithShutdownBehavior( | |
| 585 worker_pool->GetNamedSequenceToken(kSequenceToken), | |
| 586 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); | |
|
emaxx
2017/05/19 17:58:16
Is there a reason for not keeping the SKIP_ON_SHUT
fdoray
2017/05/19 18:34:28
No. Added it back.
| |
| 587 | |
| 588 // Resolve |locale| on a background thread, then continue on the current | 579 // Resolve |locale| on a background thread, then continue on the current |
| 589 // thread. | 580 // thread. |
| 590 std::string (*get_application_locale)(const std::string&, bool) = | 581 std::string (*get_application_locale)(const std::string&, bool) = |
| 591 &l10n_util::GetApplicationLocale; | 582 &l10n_util::GetApplicationLocale; |
| 592 base::PostTaskAndReplyWithResult( | 583 base::PostTaskWithTraitsAndReplyWithResult( |
|
fdoray
2017/05/17 17:52:16
Is it important to have mutual exclusion between t
emaxx
2017/05/19 17:58:16
Looking at implementation of l10n_util::GetApplica
| |
| 593 background_task_runner.get(), FROM_HERE, | 584 FROM_HERE, {base::MayBlock()}, |
| 594 base::Bind(get_application_locale, locale, false /* set_icu_locale */), | 585 base::BindOnce(get_application_locale, locale, |
| 595 base::Bind(&GetKeyboardLayoutsForResolvedLocale, locale, callback)); | 586 false /* set_icu_locale */), |
| 587 base::BindOnce(&GetKeyboardLayoutsForResolvedLocale, locale, callback)); | |
| 596 } | 588 } |
| 597 | 589 |
| 598 std::unique_ptr<base::DictionaryValue> GetCurrentKeyboardLayout() { | 590 std::unique_ptr<base::DictionaryValue> GetCurrentKeyboardLayout() { |
| 599 const input_method::InputMethodDescriptor current_input_method = | 591 const input_method::InputMethodDescriptor current_input_method = |
| 600 input_method::InputMethodManager::Get() | 592 input_method::InputMethodManager::Get() |
| 601 ->GetActiveIMEState() | 593 ->GetActiveIMEState() |
| 602 ->GetCurrentInputMethod(); | 594 ->GetCurrentInputMethod(); |
| 603 return CreateInputMethodsEntry(current_input_method, | 595 return CreateInputMethodsEntry(current_input_method, |
| 604 current_input_method.id()); | 596 current_input_method.id()); |
| 605 } | 597 } |
| 606 | 598 |
| 607 } // namespace chromeos | 599 } // namespace chromeos |
| OLD | NEW |