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

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

Issue 2261903002: Fix race condition in MD Settings Languages page causing inconsistent settings (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: errors Created 4 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 <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 #include <memory> 9 #include <memory>
10 #include <string> 10 #include <string>
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 46
47 namespace extensions { 47 namespace extensions {
48 48
49 namespace language_settings_private = api::language_settings_private; 49 namespace language_settings_private = api::language_settings_private;
50 50
51 #if defined(OS_CHROMEOS) 51 #if defined(OS_CHROMEOS)
52 using chromeos::input_method::InputMethodDescriptor; 52 using chromeos::input_method::InputMethodDescriptor;
53 using chromeos::input_method::InputMethodDescriptors; 53 using chromeos::input_method::InputMethodDescriptors;
54 using chromeos::input_method::InputMethodManager; 54 using chromeos::input_method::InputMethodManager;
55 using chromeos::input_method::InputMethodUtil; 55 using chromeos::input_method::InputMethodUtil;
56 #endif
56 57
57 namespace { 58 namespace {
58 59
60 static const char kErrorLanguageAlreadyEnabled[] = "Language already enabled";
61 static const char kErrorLanguageNotEnabled[] = "Language not enabled";
62
63 #if defined(OS_CHROMEOS)
59 // Returns the set of IDs of all enabled IMEs. 64 // Returns the set of IDs of all enabled IMEs.
60 std::unordered_set<std::string> GetEnabledIMEs( 65 std::unordered_set<std::string> GetEnabledIMEs(
61 scoped_refptr<InputMethodManager::State> ime_state) { 66 scoped_refptr<InputMethodManager::State> ime_state) {
62 const std::vector<std::string>& ime_ids(ime_state->GetActiveInputMethodIds()); 67 const std::vector<std::string>& ime_ids(ime_state->GetActiveInputMethodIds());
63 return std::unordered_set<std::string>(ime_ids.begin(), ime_ids.end()); 68 return std::unordered_set<std::string>(ime_ids.begin(), ime_ids.end());
64 } 69 }
65 70
66 // Returns the set of IDs of enabled IMEs for the given pref. 71 // Returns the set of IDs of enabled IMEs for the given pref.
67 std::unordered_set<std::string> GetIMEsFromPref(PrefService* prefs, 72 std::unordered_set<std::string> GetIMEsFromPref(PrefService* prefs,
68 const char* pref_name) { 73 const char* pref_name) {
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 // Remove the added descriptor from the candidate list. 150 // Remove the added descriptor from the candidate list.
146 it = descriptors.erase(it); 151 it = descriptors.erase(it);
147 } else { 152 } else {
148 it++; 153 it++;
149 } 154 }
150 } 155 }
151 } 156 }
152 157
153 return extension_ime_list; 158 return extension_ime_list;
154 } 159 }
160 #endif
155 161
156 } // anonymous namespace 162 } // anonymous namespace
157 #endif
158 163
159 LanguageSettingsPrivateGetLanguageListFunction:: 164 LanguageSettingsPrivateGetLanguageListFunction::
160 LanguageSettingsPrivateGetLanguageListFunction() { 165 LanguageSettingsPrivateGetLanguageListFunction() {
161 } 166 }
162 167
163 LanguageSettingsPrivateGetLanguageListFunction:: 168 LanguageSettingsPrivateGetLanguageListFunction::
164 ~LanguageSettingsPrivateGetLanguageListFunction() { 169 ~LanguageSettingsPrivateGetLanguageListFunction() {
165 } 170 }
166 171
167 ExtensionFunction::ResponseAction 172 ExtensionFunction::ResponseAction
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 if (spellcheck_language_set.count(pair.first) > 0) 243 if (spellcheck_language_set.count(pair.first) > 0)
239 language.supports_spellcheck.reset(new bool(true)); 244 language.supports_spellcheck.reset(new bool(true));
240 if (translate_language_set.count(pair.first) > 0) 245 if (translate_language_set.count(pair.first) > 0)
241 language.supports_translate.reset(new bool(true)); 246 language.supports_translate.reset(new bool(true));
242 247
243 language_list->Append(language.ToValue()); 248 language_list->Append(language.ToValue());
244 } 249 }
245 return RespondNow(OneArgument(std::move(language_list))); 250 return RespondNow(OneArgument(std::move(language_list)));
246 } 251 }
247 252
248 LanguageSettingsPrivateSetLanguageListFunction:: 253 LanguageSettingsPrivateEnableLanguageFunction::
249 LanguageSettingsPrivateSetLanguageListFunction() 254 LanguageSettingsPrivateEnableLanguageFunction()
250 : chrome_details_(this) { 255 : chrome_details_(this) {}
251 }
252 256
253 LanguageSettingsPrivateSetLanguageListFunction:: 257 LanguageSettingsPrivateEnableLanguageFunction::
254 ~LanguageSettingsPrivateSetLanguageListFunction() { 258 ~LanguageSettingsPrivateEnableLanguageFunction() {}
255 }
256 259
257 ExtensionFunction::ResponseAction 260 ExtensionFunction::ResponseAction
258 LanguageSettingsPrivateSetLanguageListFunction::Run() { 261 LanguageSettingsPrivateEnableLanguageFunction::Run() {
259 std::unique_ptr<language_settings_private::SetLanguageList::Params> 262 std::unique_ptr<language_settings_private::EnableLanguage::Params>
260 parameters = 263 parameters =
261 language_settings_private::SetLanguageList::Params::Create(*args_); 264 language_settings_private::EnableLanguage::Params::Create(*args_);
262 EXTENSION_FUNCTION_VALIDATE(parameters.get()); 265 EXTENSION_FUNCTION_VALIDATE(parameters.get());
263 266
264 std::unique_ptr<translate::TranslatePrefs> translate_prefs = 267 std::unique_ptr<translate::TranslatePrefs> translate_prefs =
265 ChromeTranslateClient::CreateTranslatePrefs( 268 ChromeTranslateClient::CreateTranslatePrefs(
266 chrome_details_.GetProfile()->GetPrefs()); 269 chrome_details_.GetProfile()->GetPrefs());
267 translate_prefs->UpdateLanguageList(parameters->language_codes); 270
271 std::vector<std::string> languages;
272 translate_prefs->GetLanguageList(&languages);
273
274 if (std::find(languages.begin(), languages.end(),
275 parameters->language_code) != languages.end()) {
276 return RespondNow(Error(kErrorLanguageAlreadyEnabled));
Devlin 2016/08/22 18:38:19 drive-by: To me, this seems a little weird. I wou
stevenjb 2016/08/22 18:41:30 I requested this. The UI shouldn't generally do th
Devlin 2016/08/22 19:01:00 Given this is a private API, I don't care that muc
277 }
278
279 languages.push_back(parameters->language_code);
Devlin 2016/08/22 18:38:19 drive-by: do we need to check that the language ex
280 translate_prefs->UpdateLanguageList(languages);
268 281
269 return RespondNow(NoArguments()); 282 return RespondNow(NoArguments());
270 } 283 }
284
285 LanguageSettingsPrivateDisableLanguageFunction::
286 LanguageSettingsPrivateDisableLanguageFunction()
287 : chrome_details_(this) {}
288
289 LanguageSettingsPrivateDisableLanguageFunction::
290 ~LanguageSettingsPrivateDisableLanguageFunction() {}
291
292 ExtensionFunction::ResponseAction
293 LanguageSettingsPrivateDisableLanguageFunction::Run() {
294 std::unique_ptr<language_settings_private::DisableLanguage::Params>
295 parameters =
296 language_settings_private::DisableLanguage::Params::Create(*args_);
297 EXTENSION_FUNCTION_VALIDATE(parameters.get());
298
299 std::unique_ptr<translate::TranslatePrefs> translate_prefs =
300 ChromeTranslateClient::CreateTranslatePrefs(
301 chrome_details_.GetProfile()->GetPrefs());
302
303 std::vector<std::string> languages;
304 translate_prefs->GetLanguageList(&languages);
305
306 auto it =
307 std::find(languages.begin(), languages.end(), parameters->language_code);
308 if (it == languages.end())
309 return RespondNow(Error(kErrorLanguageNotEnabled));
310
311 languages.erase(it);
312 translate_prefs->UpdateLanguageList(languages);
313
314 return RespondNow(NoArguments());
315 }
271 316
272 LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction:: 317 LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction::
273 LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction() { 318 LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction() {
274 } 319 }
275 320
276 LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction:: 321 LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction::
277 ~LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction() { 322 ~LanguageSettingsPrivateGetSpellcheckDictionaryStatusesFunction() {
278 } 323 }
279 324
280 ExtensionFunction::ResponseAction 325 ExtensionFunction::ResponseAction
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
565 input_method_list.end(), input_method_id); 610 input_method_list.end(), input_method_id);
566 if (pos != input_method_list.end()) { 611 if (pos != input_method_list.end()) {
567 input_method_list.erase(pos); 612 input_method_list.erase(pos);
568 prefs->SetString(pref_name, base::JoinString(input_method_list, ",")); 613 prefs->SetString(pref_name, base::JoinString(input_method_list, ","));
569 } 614 }
570 #endif 615 #endif
571 return RespondNow(NoArguments()); 616 return RespondNow(NoArguments());
572 } 617 }
573 618
574 } // namespace extensions 619 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698