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

Side by Side Diff: components/translate/core/browser/translate_prefs.cc

Issue 1923143003: Implement the 2016Q2 Translate UI designe spec out in (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: change according to msw review comments Created 4 years, 7 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 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 "components/translate/core/browser/translate_prefs.h" 5 #include "components/translate/core/browser/translate_prefs.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "base/strings/string_split.h" 10 #include "base/strings/string_split.h"
11 #include "base/strings/string_util.h" 11 #include "base/strings/string_util.h"
12 #include "build/build_config.h" 12 #include "build/build_config.h"
13 #include "components/pref_registry/pref_registry_syncable.h" 13 #include "components/pref_registry/pref_registry_syncable.h"
14 #include "components/prefs/pref_service.h" 14 #include "components/prefs/pref_service.h"
15 #include "components/prefs/scoped_user_pref_update.h" 15 #include "components/prefs/scoped_user_pref_update.h"
16 #include "components/translate/core/browser/translate_accept_languages.h" 16 #include "components/translate/core/browser/translate_accept_languages.h"
17 #include "components/translate/core/browser/translate_download_manager.h" 17 #include "components/translate/core/browser/translate_download_manager.h"
18 #include "components/translate/core/browser/translate_experiment.h" 18 #include "components/translate/core/browser/translate_experiment.h"
19 #include "components/translate/core/common/translate_util.h" 19 #include "components/translate/core/common/translate_util.h"
20 20
21 namespace translate { 21 namespace translate {
22 22
23 const char TranslatePrefs::kPrefTranslateSiteBlacklist[] = 23 const char TranslatePrefs::kPrefTranslateSiteBlacklist[] =
24 "translate_site_blacklist"; 24 "translate_site_blacklist";
25 const char TranslatePrefs::kPrefTranslateWhitelists[] = 25 const char TranslatePrefs::kPrefTranslateWhitelists[] = "translate_whitelists";
26 "translate_whitelists";
27 const char TranslatePrefs::kPrefTranslateDeniedCount[] = 26 const char TranslatePrefs::kPrefTranslateDeniedCount[] =
28 "translate_denied_count_for_language"; 27 "translate_denied_count_for_language";
28 const char TranslatePrefs::kPrefTranslateIgnoredCount[] =
29 "translate_ignored_count_for_language";
29 const char TranslatePrefs::kPrefTranslateAcceptedCount[] = 30 const char TranslatePrefs::kPrefTranslateAcceptedCount[] =
30 "translate_accepted_count"; 31 "translate_accepted_count";
31 const char TranslatePrefs::kPrefTranslateBlockedLanguages[] = 32 const char TranslatePrefs::kPrefTranslateBlockedLanguages[] =
32 "translate_blocked_languages"; 33 "translate_blocked_languages";
33 const char TranslatePrefs::kPrefTranslateLastDeniedTimeForLanguage[] = 34 const char TranslatePrefs::kPrefTranslateLastDeniedTimeForLanguage[] =
34 "translate_last_denied_time_for_language"; 35 "translate_last_denied_time_for_language";
35 const char TranslatePrefs::kPrefTranslateTooOftenDeniedForLanguage[] = 36 const char TranslatePrefs::kPrefTranslateTooOftenDeniedForLanguage[] =
36 "translate_too_often_denied_for_language"; 37 "translate_too_often_denied_for_language";
37 38
38 // This property is deprecated but there is still some usages. Don't use this 39 // This property is deprecated but there is still some usages. Don't use this
39 // for new code. 40 // for new code.
40 static const char kPrefTranslateLanguageBlacklist[] = 41 static const char kPrefTranslateLanguageBlacklist[] =
41 "translate_language_blacklist"; 42 "translate_language_blacklist";
42 43
43 // The below properties used to be used but now are deprecated. Don't use them 44 // The below properties used to be used but now are deprecated. Don't use them
44 // since an old profile might have some values there. 45 // since an old profile might have some values there.
45 // 46 //
46 // * translate_last_denied_time 47 // * translate_last_denied_time
47 // * translate_too_often_denied 48 // * translate_too_often_denied
48 49
49 namespace { 50 namespace {
50 51
51 void GetBlacklistedLanguages(const PrefService* prefs, 52 void GetBlacklistedLanguages(const PrefService* prefs,
52 std::vector<std::string>* languages) { 53 std::vector<std::string>* languages) {
53 DCHECK(languages); 54 DCHECK(languages);
54 DCHECK(languages->empty()); 55 DCHECK(languages->empty());
55 56
56 const char* key = kPrefTranslateLanguageBlacklist; 57 const char* key = kPrefTranslateLanguageBlacklist;
57 const base::ListValue* list = prefs->GetList(key); 58 const base::ListValue* list = prefs->GetList(key);
58 for (base::ListValue::const_iterator it = list->begin(); 59 for (base::ListValue::const_iterator it = list->begin(); it != list->end();
59 it != list->end(); ++it) { 60 ++it) {
60 std::string lang; 61 std::string lang;
61 (*it)->GetAsString(&lang); 62 (*it)->GetAsString(&lang);
62 languages->push_back(lang); 63 languages->push_back(lang);
63 } 64 }
64 } 65 }
65 66
66 // Expands language codes to make these more suitable for Accept-Language. 67 // Expands language codes to make these more suitable for Accept-Language.
67 // Example: ['en-US', 'ja', 'en-CA'] => ['en-US', 'en', 'ja', 'en-CA']. 68 // Example: ['en-US', 'ja', 'en-CA'] => ['en-US', 'en', 'ja', 'en-CA'].
68 // 'en' won't appear twice as this function eliminates duplicates. 69 // 'en' won't appear twice as this function eliminates duplicates.
69 void ExpandLanguageCodes(const std::vector<std::string>& languages, 70 void ExpandLanguageCodes(const std::vector<std::string>& languages,
(...skipping 19 matching lines...) Expand all
89 const std::string& main_part = tokens[0]; 90 const std::string& main_part = tokens[0];
90 if (seen.find(main_part) == seen.end()) { 91 if (seen.find(main_part) == seen.end()) {
91 expanded_languages->push_back(main_part); 92 expanded_languages->push_back(main_part);
92 seen.insert(main_part); 93 seen.insert(main_part);
93 } 94 }
94 } 95 }
95 } 96 }
96 97
97 } // namespace 98 } // namespace
98 99
100 const base::Feature kTranslateUI2016Q2{"TranslateUI2016Q2",
101 base::FEATURE_DISABLED_BY_DEFAULT};
102
99 DenialTimeUpdate::DenialTimeUpdate(PrefService* prefs, 103 DenialTimeUpdate::DenialTimeUpdate(PrefService* prefs,
100 const std::string& language, 104 const std::string& language,
101 size_t max_denial_count) 105 size_t max_denial_count)
102 : denial_time_dict_update_( 106 : denial_time_dict_update_(
103 prefs, 107 prefs,
104 TranslatePrefs::kPrefTranslateLastDeniedTimeForLanguage), 108 TranslatePrefs::kPrefTranslateLastDeniedTimeForLanguage),
105 language_(language), 109 language_(language),
106 max_denial_count_(max_denial_count), 110 max_denial_count_(max_denial_count),
107 time_list_(nullptr) {} 111 time_list_(nullptr) {}
108 112
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 DCHECK(GetDenialTimes()); 150 DCHECK(GetDenialTimes());
147 GetDenialTimes()->AppendDouble(denial_time.ToJsTime()); 151 GetDenialTimes()->AppendDouble(denial_time.ToJsTime());
148 152
149 while (GetDenialTimes()->GetSize() >= max_denial_count_) 153 while (GetDenialTimes()->GetSize() >= max_denial_count_)
150 GetDenialTimes()->Remove(0, nullptr); 154 GetDenialTimes()->Remove(0, nullptr);
151 } 155 }
152 156
153 TranslatePrefs::TranslatePrefs(PrefService* user_prefs, 157 TranslatePrefs::TranslatePrefs(PrefService* user_prefs,
154 const char* accept_languages_pref, 158 const char* accept_languages_pref,
155 const char* preferred_languages_pref) 159 const char* preferred_languages_pref)
156 : accept_languages_pref_(accept_languages_pref), 160 : accept_languages_pref_(accept_languages_pref), prefs_(user_prefs) {
157 prefs_(user_prefs) {
158 #if defined(OS_CHROMEOS) 161 #if defined(OS_CHROMEOS)
159 preferred_languages_pref_ = preferred_languages_pref; 162 preferred_languages_pref_ = preferred_languages_pref;
160 #else 163 #else
161 DCHECK(!preferred_languages_pref); 164 DCHECK(!preferred_languages_pref);
162 #endif 165 #endif
163 } 166 }
164 167
165 void TranslatePrefs::SetCountry(const std::string& country) { 168 void TranslatePrefs::SetCountry(const std::string& country) {
166 country_ = country; 169 country_ = country;
167 } 170 }
168 171
169 std::string TranslatePrefs::GetCountry() const { 172 std::string TranslatePrefs::GetCountry() const {
170 return country_; 173 return country_;
171 } 174 }
172 175
173 void TranslatePrefs::ResetToDefaults() { 176 void TranslatePrefs::ResetToDefaults() {
174 ClearBlockedLanguages(); 177 ClearBlockedLanguages();
175 ClearBlacklistedSites(); 178 ClearBlacklistedSites();
176 ClearWhitelistedLanguagePairs(); 179 ClearWhitelistedLanguagePairs();
177 180
178 std::vector<std::string> languages; 181 std::vector<std::string> languages;
179 GetLanguageList(&languages); 182 GetLanguageList(&languages);
180 for (std::vector<std::string>::const_iterator it = languages.begin(); 183 for (std::vector<std::string>::const_iterator it = languages.begin();
181 it != languages.end(); ++it) { 184 it != languages.end(); ++it) {
182 const std::string& language = *it; 185 const std::string& language = *it;
183 ResetTranslationAcceptedCount(language); 186 ResetTranslationAcceptedCount(language);
184 ResetTranslationDeniedCount(language); 187 ResetTranslationDeniedCount(language);
188 ResetTranslationIgnoredCount(language);
185 } 189 }
186 190
187 prefs_->ClearPref(kPrefTranslateLastDeniedTimeForLanguage); 191 prefs_->ClearPref(kPrefTranslateLastDeniedTimeForLanguage);
188 prefs_->ClearPref(kPrefTranslateTooOftenDeniedForLanguage); 192 prefs_->ClearPref(kPrefTranslateTooOftenDeniedForLanguage);
189 } 193 }
190 194
191 bool TranslatePrefs::IsBlockedLanguage( 195 bool TranslatePrefs::IsBlockedLanguage(
192 const std::string& original_language) const { 196 const std::string& original_language) const {
193 return IsValueBlacklisted(kPrefTranslateBlockedLanguages, 197 return IsValueBlacklisted(kPrefTranslateBlockedLanguages, original_language);
194 original_language);
195 } 198 }
196 199
197 void TranslatePrefs::BlockLanguage(const std::string& original_language) { 200 void TranslatePrefs::BlockLanguage(const std::string& original_language) {
198 BlacklistValue(kPrefTranslateBlockedLanguages, original_language); 201 BlacklistValue(kPrefTranslateBlockedLanguages, original_language);
199 202
200 // Add the language to the language list at chrome://settings/languages. 203 // Add the language to the language list at chrome://settings/languages.
201 std::string language = original_language; 204 std::string language = original_language;
202 translate::ToChromeLanguageSynonym(&language); 205 translate::ToChromeLanguageSynonym(&language);
203 206
204 std::vector<std::string> languages; 207 std::vector<std::string> languages;
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 int count = 0; 312 int count = 0;
310 dict->GetInteger(language, &count); 313 dict->GetInteger(language, &count);
311 dict->SetInteger(language, count + 1); 314 dict->SetInteger(language, count + 1);
312 } 315 }
313 316
314 void TranslatePrefs::ResetTranslationDeniedCount(const std::string& language) { 317 void TranslatePrefs::ResetTranslationDeniedCount(const std::string& language) {
315 DictionaryPrefUpdate update(prefs_, kPrefTranslateDeniedCount); 318 DictionaryPrefUpdate update(prefs_, kPrefTranslateDeniedCount);
316 update.Get()->SetInteger(language, 0); 319 update.Get()->SetInteger(language, 0);
317 } 320 }
318 321
322 int TranslatePrefs::GetTranslationIgnoredCount(
323 const std::string& language) const {
324 const base::DictionaryValue* dict =
325 prefs_->GetDictionary(kPrefTranslateIgnoredCount);
326 int count = 0;
327 return dict->GetInteger(language, &count) ? count : 0;
328 }
329
330 void TranslatePrefs::IncrementTranslationIgnoredCount(
331 const std::string& language) {
332 DictionaryPrefUpdate update(prefs_, kPrefTranslateIgnoredCount);
333 base::DictionaryValue* dict = update.Get();
334
335 int count = 0;
336 dict->GetInteger(language, &count);
337 dict->SetInteger(language, count + 1);
338 }
339
340 void TranslatePrefs::ResetTranslationIgnoredCount(const std::string& language) {
341 DictionaryPrefUpdate update(prefs_, kPrefTranslateIgnoredCount);
342 update.Get()->SetInteger(language, 0);
343 }
344
319 int TranslatePrefs::GetTranslationAcceptedCount(const std::string& language) { 345 int TranslatePrefs::GetTranslationAcceptedCount(const std::string& language) {
320 const base::DictionaryValue* dict = 346 const base::DictionaryValue* dict =
321 prefs_->GetDictionary(kPrefTranslateAcceptedCount); 347 prefs_->GetDictionary(kPrefTranslateAcceptedCount);
322 int count = 0; 348 int count = 0;
323 return dict->GetInteger(language, &count) ? count : 0; 349 return dict->GetInteger(language, &count) ? count : 0;
324 } 350 }
325 351
326 void TranslatePrefs::IncrementTranslationAcceptedCount( 352 void TranslatePrefs::IncrementTranslationAcceptedCount(
327 const std::string& language) { 353 const std::string& language) {
328 DictionaryPrefUpdate update(prefs_, kPrefTranslateAcceptedCount); 354 DictionaryPrefUpdate update(prefs_, kPrefTranslateAcceptedCount);
(...skipping 22 matching lines...) Expand all
351 return; 377 return;
352 378
353 if (now - oldest_denial_time <= base::TimeDelta::FromDays(1)) { 379 if (now - oldest_denial_time <= base::TimeDelta::FromDays(1)) {
354 DictionaryPrefUpdate update(prefs_, 380 DictionaryPrefUpdate update(prefs_,
355 kPrefTranslateTooOftenDeniedForLanguage); 381 kPrefTranslateTooOftenDeniedForLanguage);
356 update.Get()->SetBoolean(language, true); 382 update.Get()->SetBoolean(language, true);
357 } 383 }
358 } 384 }
359 385
360 bool TranslatePrefs::IsTooOftenDenied(const std::string& language) const { 386 bool TranslatePrefs::IsTooOftenDenied(const std::string& language) const {
361 const base::DictionaryValue* dict = 387 if (base::FeatureList::IsEnabled(kTranslateUI2016Q2)) {
362 prefs_->GetDictionary(kPrefTranslateTooOftenDeniedForLanguage); 388 // In the new logic, we only hide the bubble if user denied it more than
363 bool result = false; 389 // 3 times or the user ignored more than 10 times.
msw 2016/04/29 23:43:40 nit: 'ignored it'
ftang 2016/04/30 01:24:50 Done.
364 return dict->GetBoolean(language, &result) ? result : false; 390 return (GetTranslationDeniedCount(language) > 3) ||
391 (GetTranslationIgnoredCount(language) > 10);
392 } else {
393 const base::DictionaryValue* dict =
394 prefs_->GetDictionary(kPrefTranslateTooOftenDeniedForLanguage);
395 bool result = false;
396 return dict->GetBoolean(language, &result) ? result : false;
397 }
365 } 398 }
366 399
367 void TranslatePrefs::ResetDenialState() { 400 void TranslatePrefs::ResetDenialState() {
368 prefs_->ClearPref(kPrefTranslateLastDeniedTimeForLanguage); 401 prefs_->ClearPref(kPrefTranslateLastDeniedTimeForLanguage);
369 prefs_->ClearPref(kPrefTranslateTooOftenDeniedForLanguage); 402 prefs_->ClearPref(kPrefTranslateTooOftenDeniedForLanguage);
370 } 403 }
371 404
372 void TranslatePrefs::GetLanguageList( 405 void TranslatePrefs::GetLanguageList(
373 std::vector<std::string>* languages) const { 406 std::vector<std::string>* languages) const {
374 DCHECK(languages); 407 DCHECK(languages);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 479 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
447 registry->RegisterListPref(kPrefTranslateSiteBlacklist, 480 registry->RegisterListPref(kPrefTranslateSiteBlacklist,
448 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 481 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
449 registry->RegisterDictionaryPref( 482 registry->RegisterDictionaryPref(
450 kPrefTranslateWhitelists, 483 kPrefTranslateWhitelists,
451 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 484 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
452 registry->RegisterDictionaryPref( 485 registry->RegisterDictionaryPref(
453 kPrefTranslateDeniedCount, 486 kPrefTranslateDeniedCount,
454 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 487 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
455 registry->RegisterDictionaryPref( 488 registry->RegisterDictionaryPref(
489 kPrefTranslateIgnoredCount,
490 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
491 registry->RegisterDictionaryPref(
456 kPrefTranslateAcceptedCount, 492 kPrefTranslateAcceptedCount,
457 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 493 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
458 registry->RegisterListPref(kPrefTranslateBlockedLanguages, 494 registry->RegisterListPref(kPrefTranslateBlockedLanguages,
459 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 495 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
460 registry->RegisterDictionaryPref(kPrefTranslateLastDeniedTimeForLanguage); 496 registry->RegisterDictionaryPref(kPrefTranslateLastDeniedTimeForLanguage);
461 registry->RegisterDictionaryPref( 497 registry->RegisterDictionaryPref(
462 kPrefTranslateTooOftenDeniedForLanguage, 498 kPrefTranslateTooOftenDeniedForLanguage,
463 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 499 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
464 } 500 }
465 501
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 // should be translated instead of the blacklist. The blacklist is no longer 546 // should be translated instead of the blacklist. The blacklist is no longer
511 // used after launching the settings UI. 547 // used after launching the settings UI.
512 // After that, Set 'translate_languages_not_translate' to Accept languages to 548 // After that, Set 'translate_languages_not_translate' to Accept languages to
513 // enable settings for users. 549 // enable settings for users.
514 bool merged = user_prefs->HasPrefPath(kPrefTranslateBlockedLanguages); 550 bool merged = user_prefs->HasPrefPath(kPrefTranslateBlockedLanguages);
515 551
516 if (!merged) { 552 if (!merged) {
517 std::vector<std::string> blacklisted_languages; 553 std::vector<std::string> blacklisted_languages;
518 GetBlacklistedLanguages(user_prefs, &blacklisted_languages); 554 GetBlacklistedLanguages(user_prefs, &blacklisted_languages);
519 555
520 std::vector<std::string> accept_languages = base::SplitString( 556 std::vector<std::string> accept_languages =
521 user_prefs->GetString(accept_languages_pref), ",", 557 base::SplitString(user_prefs->GetString(accept_languages_pref), ",",
522 base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); 558 base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
523 559
524 std::vector<std::string> blocked_languages; 560 std::vector<std::string> blocked_languages;
525 CreateBlockedLanguages( 561 CreateBlockedLanguages(&blocked_languages, blacklisted_languages,
526 &blocked_languages, blacklisted_languages, accept_languages); 562 accept_languages);
527 563
528 // Create the new preference kPrefTranslateBlockedLanguages. 564 // Create the new preference kPrefTranslateBlockedLanguages.
529 { 565 {
530 base::ListValue blocked_languages_list; 566 base::ListValue blocked_languages_list;
531 for (std::vector<std::string>::const_iterator it = 567 for (std::vector<std::string>::const_iterator it =
532 blocked_languages.begin(); 568 blocked_languages.begin();
533 it != blocked_languages.end(); ++it) { 569 it != blocked_languages.end(); ++it) {
534 blocked_languages_list.Append(new base::StringValue(*it)); 570 blocked_languages_list.Append(new base::StringValue(*it));
535 } 571 }
536 ListPrefUpdate update(user_prefs, kPrefTranslateBlockedLanguages); 572 ListPrefUpdate update(user_prefs, kPrefTranslateBlockedLanguages);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 translate::ToTranslateLanguageSynonym(&lang); 623 translate::ToTranslateLanguageSynonym(&lang);
588 624
589 // Regarding http://crbug.com/36182, even though English exists in Accept 625 // Regarding http://crbug.com/36182, even though English exists in Accept
590 // language list, English could be translated on non-English locale. 626 // language list, English could be translated on non-English locale.
591 if (lang == "en" && !is_ui_english) 627 if (lang == "en" && !is_ui_english)
592 continue; 628 continue;
593 629
594 result.insert(lang); 630 result.insert(lang);
595 } 631 }
596 632
597 blocked_languages->insert( 633 blocked_languages->insert(blocked_languages->begin(), result.begin(),
598 blocked_languages->begin(), result.begin(), result.end()); 634 result.end());
599 } 635 }
600 636
601 bool TranslatePrefs::IsValueInList(const base::ListValue* list, 637 bool TranslatePrefs::IsValueInList(const base::ListValue* list,
602 const std::string& in_value) const { 638 const std::string& in_value) const {
603 for (size_t i = 0; i < list->GetSize(); ++i) { 639 for (size_t i = 0; i < list->GetSize(); ++i) {
604 std::string value; 640 std::string value;
605 if (list->GetString(i, &value) && value == in_value) 641 if (list->GetString(i, &value) && value == in_value)
606 return true; 642 return true;
607 } 643 }
608 return false; 644 return false;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 const base::ListValue* blacklist = prefs_->GetList(pref_id); 679 const base::ListValue* blacklist = prefs_->GetList(pref_id);
644 return (blacklist == NULL || blacklist->empty()); 680 return (blacklist == NULL || blacklist->empty());
645 } 681 }
646 682
647 bool TranslatePrefs::IsDictionaryEmpty(const char* pref_id) const { 683 bool TranslatePrefs::IsDictionaryEmpty(const char* pref_id) const {
648 const base::DictionaryValue* dict = prefs_->GetDictionary(pref_id); 684 const base::DictionaryValue* dict = prefs_->GetDictionary(pref_id);
649 return (dict == NULL || dict->empty()); 685 return (dict == NULL || dict->empty());
650 } 686 }
651 687
652 } // namespace translate 688 } // namespace translate
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698