Home | History | Annotate | Download | only in browser
      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
      3 // found in the LICENSE file.
      4 
      5 #ifndef COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_PREFS_H_
      6 #define COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_PREFS_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/gtest_prod_util.h"
     12 #include "url/gurl.h"
     13 
     14 class PrefService;
     15 class Profile;
     16 
     17 namespace base {
     18 class DictionaryValue;
     19 class ListValue;
     20 }
     21 
     22 namespace user_prefs {
     23 class PrefRegistrySyncable;
     24 }
     25 
     26 namespace translate {
     27 
     28 class TranslateAcceptLanguages;
     29 
     30 // The wrapper of PrefService object for Translate.
     31 //
     32 // It is assumed that |prefs_| is alive while this instance is alive.
     33 class TranslatePrefs {
     34  public:
     35   static const char kPrefTranslateLanguageBlacklist[];
     36   static const char kPrefTranslateSiteBlacklist[];
     37   static const char kPrefTranslateWhitelists[];
     38   static const char kPrefTranslateDeniedCount[];
     39   static const char kPrefTranslateAcceptedCount[];
     40   static const char kPrefTranslateBlockedLanguages[];
     41   static const char kPrefTranslateLastDeniedTime[];
     42   static const char kPrefTranslateTooOftenDenied[];
     43 
     44   // |preferred_languages_pref| is only used on Chrome OS, other platforms must
     45   // pass NULL.
     46   TranslatePrefs(PrefService* user_prefs,
     47                  const char* accept_languages_pref,
     48                  const char* preferred_languages_pref);
     49 
     50   // Resets the blocked languages list, the sites blacklist, the languages
     51   // whitelist, and the accepted/denied counts.
     52   void ResetToDefaults();
     53 
     54   bool IsBlockedLanguage(const std::string& original_language) const;
     55   void BlockLanguage(const std::string& original_language);
     56   void UnblockLanguage(const std::string& original_language);
     57 
     58   // Removes a language from the old blacklist. Only used internally for
     59   // diagnostics. Don't use this if there is no special reason.
     60   void RemoveLanguageFromLegacyBlacklist(const std::string& original_language);
     61 
     62   bool IsSiteBlacklisted(const std::string& site) const;
     63   void BlacklistSite(const std::string& site);
     64   void RemoveSiteFromBlacklist(const std::string& site);
     65 
     66   bool HasWhitelistedLanguagePairs() const;
     67 
     68   bool IsLanguagePairWhitelisted(const std::string& original_language,
     69                                  const std::string& target_language);
     70   void WhitelistLanguagePair(const std::string& original_language,
     71                              const std::string& target_language);
     72   void RemoveLanguagePairFromWhitelist(const std::string& original_language,
     73                                        const std::string& target_language);
     74 
     75   // Will return true if at least one language has been blacklisted.
     76   bool HasBlockedLanguages() const;
     77 
     78   // Will return true if at least one site has been blacklisted.
     79   bool HasBlacklistedSites() const;
     80 
     81   // These methods are used to track how many times the user has denied the
     82   // translation for a specific language. (So we can present a UI to black-list
     83   // that language if the user keeps denying translations).
     84   int GetTranslationDeniedCount(const std::string& language) const;
     85   void IncrementTranslationDeniedCount(const std::string& language);
     86   void ResetTranslationDeniedCount(const std::string& language);
     87 
     88   // These methods are used to track how many times the user has accepted the
     89   // translation for a specific language. (So we can present a UI to white-list
     90   // that language if the user keeps accepting translations).
     91   int GetTranslationAcceptedCount(const std::string& language);
     92   void IncrementTranslationAcceptedCount(const std::string& language);
     93   void ResetTranslationAcceptedCount(const std::string& language);
     94 
     95   // Update the last time on closing the Translate UI without translation.
     96   void UpdateLastDeniedTime();
     97 
     98   // Returns true if translation is denied too often.
     99   bool IsTooOftenDenied() const;
    100 
    101   // Resets the prefs of denial state. Only used internally for diagnostics.
    102   void ResetDenialState();
    103 
    104   // Gets the language list of the language settings.
    105   void GetLanguageList(std::vector<std::string>* languages);
    106 
    107   // Updates the language list of the language settings.
    108   void UpdateLanguageList(const std::vector<std::string>& languages);
    109 
    110   bool CanTranslateLanguage(TranslateAcceptLanguages* accept_languages,
    111                             const std::string& language);
    112   bool ShouldAutoTranslate(const std::string& original_language,
    113                            std::string* target_language);
    114   static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
    115   static void MigrateUserPrefs(PrefService* user_prefs,
    116                                const char* accept_languages_pref);
    117 
    118   // Converts the language code for Translate. This removes the sub code (like
    119   // -US) except for Chinese, and converts the synonyms.
    120   // The same logic exists at language_options.js, and please keep consistency
    121   // with the JavaScript file.
    122   static std::string ConvertLangCodeForTranslation(const std::string& lang);
    123 
    124  private:
    125   friend class TranslatePrefsTest;
    126   FRIEND_TEST_ALL_PREFIXES(TranslatePrefsTest, CreateBlockedLanguages);
    127   FRIEND_TEST_ALL_PREFIXES(TranslatePrefsTest,
    128                            CreateBlockedLanguagesNonEnglishUI);
    129 
    130   // Merges two language sets to migrate to the language setting UI.
    131   static void CreateBlockedLanguages(
    132       std::vector<std::string>* blocked_languages,
    133       const std::vector<std::string>& blacklisted_languages,
    134       const std::vector<std::string>& accept_languages);
    135 
    136   void ClearBlockedLanguages();
    137   void ClearBlacklistedSites();
    138   void ClearWhitelistedLanguagePairs();
    139   bool IsValueBlacklisted(const char* pref_id, const std::string& value) const;
    140   void BlacklistValue(const char* pref_id, const std::string& value);
    141   void RemoveValueFromBlacklist(const char* pref_id, const std::string& value);
    142   bool IsValueInList(const base::ListValue* list,
    143                      const std::string& value) const;
    144   bool IsListEmpty(const char* pref_id) const;
    145   bool IsDictionaryEmpty(const char* pref_id) const;
    146 
    147   // Path to the preference storing the accept languages.
    148   const std::string accept_languages_pref_;
    149 #if defined(OS_CHROMEOS)
    150   // Path to the preference storing the preferred languages.
    151   // Only used on ChromeOS.
    152   std::string preferred_languages_pref_;
    153 #endif
    154 
    155   // Retrieves the dictionary mapping the number of times translation has been
    156   // denied for a language, creating it if necessary.
    157   base::DictionaryValue* GetTranslationDeniedCountDictionary();
    158 
    159   // Retrieves the dictionary mapping the number of times translation has been
    160   // accepted for a language, creating it if necessary.
    161   base::DictionaryValue* GetTranslationAcceptedCountDictionary() const;
    162 
    163   PrefService* prefs_;  // Weak.
    164 
    165   DISALLOW_COPY_AND_ASSIGN(TranslatePrefs);
    166 };
    167 
    168 }  // namespace translate
    169 
    170 #endif  // COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_PREFS_H_
    171