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

Side by Side Diff: chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc

Issue 1283603002: Implement langageSettingsPrivate API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@LanguageSettingsAPIIDLChanges
Patch Set: Created 5 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/extensions/api/language_settings_private/language_setti ngs_private_api.h" 5 #include "chrome/browser/extensions/api/language_settings_private/language_setti ngs_private_api.h"
6 6
7 #include <map>
8 #include <string>
9 #include <unordered_set>
10 #include <utility>
11 #include <vector>
12
13 #include "base/i18n/rtl.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/strings/string16.h"
16 #include "base/strings/utf_string_conversions.h"
7 #include "base/values.h" 17 #include "base/values.h"
18 #include "chrome/browser/browser_process.h"
19 #include "chrome/browser/extensions/api/language_settings_private/language_setti ngs_private_delegate.h"
20 #include "chrome/browser/extensions/api/language_settings_private/language_setti ngs_private_delegate_factory.h"
21 #include "chrome/browser/profiles/profile.h"
22 #include "chrome/browser/spellchecker/spellcheck_factory.h"
23 #include "chrome/browser/spellchecker/spellcheck_service.h"
24 #include "chrome/browser/translate/chrome_translate_client.h"
25 #include "chrome/browser/translate/translate_service.h"
8 #include "chrome/common/extensions/api/language_settings_private.h" 26 #include "chrome/common/extensions/api/language_settings_private.h"
27 #include "chrome/common/spellcheck_common.h"
28 #include "components/translate/core/browser/translate_download_manager.h"
29 #include "third_party/icu/source/i18n/unicode/coll.h"
30 #include "ui/base/l10n/l10n_util.h"
31 #include "ui/base/l10n/l10n_util_collator.h"
9 32
10 namespace extensions { 33 namespace extensions {
11 34
12 namespace language_settings_private = api::language_settings_private; 35 namespace language_settings_private = api::language_settings_private;
13 36
14 LanguageSettingsPrivateGetLanguageListFunction:: 37 LanguageSettingsPrivateGetLanguageListFunction::
15 LanguageSettingsPrivateGetLanguageListFunction() { 38 LanguageSettingsPrivateGetLanguageListFunction() {
16 } 39 }
17 40
18 LanguageSettingsPrivateGetLanguageListFunction:: 41 LanguageSettingsPrivateGetLanguageListFunction::
19 ~LanguageSettingsPrivateGetLanguageListFunction() { 42 ~LanguageSettingsPrivateGetLanguageListFunction() {
20 } 43 }
21 44
22 ExtensionFunction::ResponseAction 45 ExtensionFunction::ResponseAction
23 LanguageSettingsPrivateGetLanguageListFunction::Run() { 46 LanguageSettingsPrivateGetLanguageListFunction::Run() {
24 return RespondNow(OneArgument(new base::ListValue())); 47 // Collect the language codes from the supported accept-languages.
48 const std::string app_locale = g_browser_process->GetApplicationLocale();
49 std::vector<std::string> language_codes;
50 l10n_util::GetAcceptLanguagesForLocale(app_locale, &language_codes);
51
52 // Map of display name -> {language code, native display name}.
53 typedef std::pair<std::string, base::string16> LanguagePair;
54 typedef std::map<base::string16, LanguagePair,
55 l10n_util::StringComparator<base::string16>> LanguageMap;
56
57 // Collator used to sort display names in the current locale.
58 UErrorCode error = U_ZERO_ERROR;
59 scoped_ptr<icu::Collator> collator(icu::Collator::createInstance(
60 icu::Locale(app_locale.c_str()), error));
61 if (U_FAILURE(error))
62 collator.reset();
63 l10n_util::StringComparator<base::string16> c(collator.get());
64 LanguageMap language_map(c);
stevenjb 2015/08/10 16:13:54 nit: elim |c|
michaelpg 2015/08/10 23:31:50 I don't write enough C++ these days to be confiden
stevenjb 2015/08/11 19:30:19 Right. It's just a nit, but the reasoning is: decl
65
66 // Build the list of display names and the language map.
67 for (size_t i = 0; i < language_codes.size(); ++i) {
stevenjb 2015/08/10 16:13:54 for (auto code : language_codes)
michaelpg 2015/08/10 23:31:51 Done (using const auto&)
68 base::string16 display_name = l10n_util::GetDisplayNameForLocale(
69 language_codes[i], app_locale, false);
70 base::string16 native_display_name = l10n_util::GetDisplayNameForLocale(
71 language_codes[i], language_codes[i], false);
72 language_map[display_name] =
73 std::make_pair(language_codes[i], native_display_name);
74 }
75
76 // Get the list of available locales (display languages) and convert to a set.
77 const std::vector<std::string>& locales = l10n_util::GetAvailableLocales();
78 const std::unordered_set<std::string> locale_set(
79 locales.begin(), locales.end());
80
81 // Get the list of spell check languages and convert to a set.
82 std::vector<std::string> spellcheck_languages;
83 chrome::spellcheck_common::SpellCheckLanguages(&spellcheck_languages);
84 const std::unordered_set<std::string> spellcheck_language_set(
85 spellcheck_languages.begin(), spellcheck_languages.end());
86
87 // Get the list of translatable languages and convert to a set.
88 std::vector<std::string> translate_languages;
89 translate::TranslateDownloadManager::GetSupportedLanguages(
90 &translate_languages);
91 const std::unordered_set<std::string> translate_language_set(
92 translate_languages.begin(), translate_languages.end());
93
94 // Build the language list from the language map.
95 scoped_ptr<base::ListValue> language_list(new base::ListValue);
96 for (LanguageMap::iterator it = language_map.begin();
97 it != language_map.end();
98 ++it) {
stevenjb 2015/08/10 16:13:54 for (auto it : language_map)
michaelpg 2015/08/10 23:31:50 Done (using const auto&, and renaming because it's
99 const base::string16& display_name = it->first;
100 const LanguagePair& pair = it->second;
101
102 language_settings_private::Language language;
103 language.code = pair.first;
104
105 base::string16 adjusted_display_name(display_name);
106 base::i18n::AdjustStringForLocaleDirection(&adjusted_display_name);
107 language.display_name = base::UTF16ToUTF8(adjusted_display_name);
108
109 base::string16 adjusted_native_display_name(pair.second);
110 base::i18n::AdjustStringForLocaleDirection(&adjusted_native_display_name);
111 language.native_display_name =
112 base::UTF16ToUTF8(adjusted_native_display_name);
113
114 // Set optional fields only if they differ from the default.
115 if (base::i18n::StringContainsStrongRTLChars(display_name))
116 language.rtl.reset(new bool(true));
117 if (locale_set.count(pair.first) > 0)
118 language.supports_ui.reset(new bool(true));
119 if (spellcheck_language_set.count(pair.first) > 0)
120 language.supports_spellcheck.reset(new bool(true));
121 if (translate_language_set.count(pair.first) > 0)
122 language.supports_translate.reset(new bool(true));
123
124 language_list->Append(language.ToValue());
125 }
126 return RespondNow(OneArgument(language_list.release()));
25 } 127 }
26 128
27 LanguageSettingsPrivateSetLanguageListFunction:: 129 LanguageSettingsPrivateSetLanguageListFunction::
28 LanguageSettingsPrivateSetLanguageListFunction() { 130 LanguageSettingsPrivateSetLanguageListFunction()
131 : chrome_details_(this) {
29 } 132 }
30 133
31 LanguageSettingsPrivateSetLanguageListFunction:: 134 LanguageSettingsPrivateSetLanguageListFunction::
32 ~LanguageSettingsPrivateSetLanguageListFunction() { 135 ~LanguageSettingsPrivateSetLanguageListFunction() {
33 } 136 }
34 137
35 ExtensionFunction::ResponseAction 138 ExtensionFunction::ResponseAction
36 LanguageSettingsPrivateSetLanguageListFunction::Run() { 139 LanguageSettingsPrivateSetLanguageListFunction::Run() {
37 scoped_ptr<language_settings_private::SetLanguageList::Params> parameters = 140 scoped_ptr<language_settings_private::SetLanguageList::Params> parameters =
38 language_settings_private::SetLanguageList::Params::Create(*args_); 141 language_settings_private::SetLanguageList::Params::Create(*args_);
39 EXTENSION_FUNCTION_VALIDATE(parameters.get()); 142 EXTENSION_FUNCTION_VALIDATE(parameters.get());
40 143
144 Profile* profile = chrome_details_.GetProfile();
145 scoped_ptr<translate::TranslatePrefs> translate_prefs =
146 ChromeTranslateClient::CreateTranslatePrefs(profile->GetPrefs());
147 translate_prefs->UpdateLanguageList(parameters->language_codes);
148
41 return RespondNow(NoArguments()); 149 return RespondNow(NoArguments());
42 } 150 }
43 151
44 LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction:: 152 LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction::
45 LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction() { 153 LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction() {
46 } 154 }
47 155
48 LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction:: 156 LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction::
49 ~LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction() { 157 ~LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction() {
50 } 158 }
51 159
52 ExtensionFunction::ResponseAction 160 ExtensionFunction::ResponseAction
53 LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction::Run() { 161 LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction::Run() {
54 return RespondNow(OneArgument(new base::ListValue())); 162 LanguageSettingsPrivateDelegate* delegate =
163 LanguageSettingsPrivateDelegateFactory::GetForBrowserContext(
164 browser_context());
165 const std::vector<scoped_ptr<
166 language_settings_private::SpellcheckDictionaryStatus>>& statuses =
167 delegate->GetHunspellDictionaryStatuses();
168
169 scoped_ptr<base::ListValue> return_list(new base::ListValue());
170 for (const auto& status : statuses)
171 return_list->Append(status->ToValue());
172 return RespondNow(OneArgument(return_list.release()));
55 } 173 }
56 174
57 LanguageSettingsPrivateGetSpellcheckWordsFunction:: 175 LanguageSettingsPrivateGetSpellcheckWordsFunction::
58 LanguageSettingsPrivateGetSpellcheckWordsFunction() { 176 LanguageSettingsPrivateGetSpellcheckWordsFunction() {
59 } 177 }
60 178
61 LanguageSettingsPrivateGetSpellcheckWordsFunction:: 179 LanguageSettingsPrivateGetSpellcheckWordsFunction::
62 ~LanguageSettingsPrivateGetSpellcheckWordsFunction() { 180 ~LanguageSettingsPrivateGetSpellcheckWordsFunction() {
63 } 181 }
64 182
65 ExtensionFunction::ResponseAction 183 ExtensionFunction::ResponseAction
66 LanguageSettingsPrivateGetSpellcheckWordsFunction::Run() { 184 LanguageSettingsPrivateGetSpellcheckWordsFunction::Run() {
67 return RespondNow(OneArgument(new base::ListValue())); 185 SpellcheckService* service =
186 SpellcheckServiceFactory::GetForContext(browser_context());
187 SpellcheckCustomDictionary* dictionary = service->GetCustomDictionary();
188
189 scoped_ptr<base::ListValue> word_list(new base::ListValue());
190 // TODO(michaelpg): observe the dictionary and respond later if not loaded.
191 if (dictionary->IsLoaded()) {
192 const std::set<std::string>& words = dictionary->GetWords();
193 for (const std::string& word : words)
194 word_list->AppendString(word);
195 }
196 return RespondNow(OneArgument(word_list.release()));
68 } 197 }
69 198
70 LanguageSettingsPrivateGetTranslateTargetLanguageFunction:: 199 LanguageSettingsPrivateGetTranslateTargetLanguageFunction::
71 LanguageSettingsPrivateGetTranslateTargetLanguageFunction() { 200 LanguageSettingsPrivateGetTranslateTargetLanguageFunction()
201 : chrome_details_(this) {
72 } 202 }
73 203
74 LanguageSettingsPrivateGetTranslateTargetLanguageFunction:: 204 LanguageSettingsPrivateGetTranslateTargetLanguageFunction::
75 ~LanguageSettingsPrivateGetTranslateTargetLanguageFunction() { 205 ~LanguageSettingsPrivateGetTranslateTargetLanguageFunction() {
76 } 206 }
77 207
78 ExtensionFunction::ResponseAction 208 ExtensionFunction::ResponseAction
79 LanguageSettingsPrivateGetTranslateTargetLanguageFunction::Run() { 209 LanguageSettingsPrivateGetTranslateTargetLanguageFunction::Run() {
80 return RespondNow(OneArgument(new base::StringValue(""))); 210 Profile* profile = chrome_details_.GetProfile();
211 PrefService* prefs = profile->GetPrefs();
212 std::string target_language =
213 TranslateService::GetTargetLanguage(prefs);
stevenjb 2015/08/10 16:13:54 nit: no need for local var
michaelpg 2015/08/10 23:31:50 Done. Hope this isn't too much.
stevenjb 2015/08/11 19:30:19 Occasionally, a well named local used only once he
214 return RespondNow(OneArgument(new base::StringValue(target_language)));
81 } 215 }
82 216
83 LanguageSettingsPrivateGetInputMethodListsFunction:: 217 LanguageSettingsPrivateGetInputMethodListsFunction::
84 LanguageSettingsPrivateGetInputMethodListsFunction() { 218 LanguageSettingsPrivateGetInputMethodListsFunction() {
85 } 219 }
86 220
87 LanguageSettingsPrivateGetInputMethodListsFunction:: 221 LanguageSettingsPrivateGetInputMethodListsFunction::
88 ~LanguageSettingsPrivateGetInputMethodListsFunction() { 222 ~LanguageSettingsPrivateGetInputMethodListsFunction() {
89 } 223 }
90 224
(...skipping 22 matching lines...) Expand all
113 LanguageSettingsPrivateRemoveInputMethodFunction:: 247 LanguageSettingsPrivateRemoveInputMethodFunction::
114 ~LanguageSettingsPrivateRemoveInputMethodFunction() { 248 ~LanguageSettingsPrivateRemoveInputMethodFunction() {
115 } 249 }
116 250
117 ExtensionFunction::ResponseAction 251 ExtensionFunction::ResponseAction
118 LanguageSettingsPrivateRemoveInputMethodFunction::Run() { 252 LanguageSettingsPrivateRemoveInputMethodFunction::Run() {
119 return RespondNow(OneArgument(new base::FundamentalValue(true))); 253 return RespondNow(OneArgument(new base::FundamentalValue(true)));
120 } 254 }
121 255
122 } // namespace extensions 256 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698