// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/translate/translate_prefs.h" #include "base/string_util.h" #include "chrome/browser/prefs/pref_service.h" #include "chrome/browser/prefs/scoped_user_pref_update.h" const char TranslatePrefs::kPrefTranslateLanguageBlacklist[] = "translate_language_blacklist"; const char TranslatePrefs::kPrefTranslateSiteBlacklist[] = "translate_site_blacklist"; const char TranslatePrefs::kPrefTranslateWhitelists[] = "translate_whitelists"; const char TranslatePrefs::kPrefTranslateDeniedCount[] = "translate_denied_count"; const char TranslatePrefs::kPrefTranslateAcceptedCount[] = "translate_accepted_count"; // TranslatePrefs: public: ----------------------------------------------------- TranslatePrefs::TranslatePrefs(PrefService* user_prefs) : prefs_(user_prefs) { } bool TranslatePrefs::IsLanguageBlacklisted( const std::string& original_language) { return IsValueBlacklisted(kPrefTranslateLanguageBlacklist, original_language); } void TranslatePrefs::BlacklistLanguage(const std::string& original_language) { BlacklistValue(kPrefTranslateLanguageBlacklist, original_language); } void TranslatePrefs::RemoveLanguageFromBlacklist( const std::string& original_language) { RemoveValueFromBlacklist(kPrefTranslateLanguageBlacklist, original_language); } bool TranslatePrefs::IsSiteBlacklisted(const std::string& site) { return IsValueBlacklisted(kPrefTranslateSiteBlacklist, site); } void TranslatePrefs::BlacklistSite(const std::string& site) { BlacklistValue(kPrefTranslateSiteBlacklist, site); } void TranslatePrefs::RemoveSiteFromBlacklist(const std::string& site) { RemoveValueFromBlacklist(kPrefTranslateSiteBlacklist, site); } bool TranslatePrefs::IsLanguagePairWhitelisted( const std::string& original_language, const std::string& target_language) { const DictionaryValue* dict = prefs_->GetDictionary(kPrefTranslateWhitelists); if (dict && !dict->empty()) { std::string auto_target_lang; if (dict->GetString(original_language, &auto_target_lang) && auto_target_lang == target_language) return true; } return false; } void TranslatePrefs::WhitelistLanguagePair( const std::string& original_language, const std::string& target_language) { DictionaryPrefUpdate update(prefs_, kPrefTranslateWhitelists); DictionaryValue* dict = update.Get(); if (!dict) { NOTREACHED() << "Unregistered translate whitelist pref"; return; } dict->SetString(original_language, target_language); prefs_->ScheduleSavePersistentPrefs(); } void TranslatePrefs::RemoveLanguagePairFromWhitelist( const std::string& original_language, const std::string& target_language) { DictionaryPrefUpdate update(prefs_, kPrefTranslateWhitelists); DictionaryValue* dict = update.Get(); if (!dict) { NOTREACHED() << "Unregistered translate whitelist pref"; return; } if (dict->Remove(original_language, NULL)) prefs_->ScheduleSavePersistentPrefs(); } int TranslatePrefs::GetTranslationDeniedCount(const std::string& language) { const DictionaryValue* dict = prefs_->GetDictionary(kPrefTranslateDeniedCount); int count = 0; return dict->GetInteger(language, &count) ? count : 0; } void TranslatePrefs::IncrementTranslationDeniedCount( const std::string& language) { DictionaryPrefUpdate update(prefs_, kPrefTranslateDeniedCount); DictionaryValue* dict = update.Get(); int count = 0; dict->GetInteger(language, &count); dict->SetInteger(language, count + 1); } void TranslatePrefs::ResetTranslationDeniedCount(const std::string& language) { DictionaryPrefUpdate update(prefs_, kPrefTranslateDeniedCount); update.Get()->SetInteger(language, 0); } int TranslatePrefs::GetTranslationAcceptedCount(const std::string& language) { const DictionaryValue* dict = prefs_->GetDictionary(kPrefTranslateAcceptedCount); int count = 0; return dict->GetInteger(language, &count) ? count : 0; } void TranslatePrefs::IncrementTranslationAcceptedCount( const std::string& language) { DictionaryPrefUpdate update(prefs_, kPrefTranslateAcceptedCount); DictionaryValue* dict = update.Get(); int count = 0; dict->GetInteger(language, &count); dict->SetInteger(language, count + 1); } void TranslatePrefs::ResetTranslationAcceptedCount( const std::string& language) { DictionaryPrefUpdate update(prefs_, kPrefTranslateAcceptedCount); update.Get()->SetInteger(language, 0); } // TranslatePrefs: public, static: --------------------------------------------- bool TranslatePrefs::CanTranslate(PrefService* user_prefs, const std::string& original_language, const GURL& url) { TranslatePrefs prefs(user_prefs); if (prefs.IsSiteBlacklisted(url.HostNoBrackets())) return false; return (!prefs.IsLanguageBlacklisted(original_language)); } bool TranslatePrefs::ShouldAutoTranslate(PrefService* user_prefs, const std::string& original_language, std::string* target_language) { TranslatePrefs prefs(user_prefs); return prefs.IsLanguageWhitelisted(original_language, target_language); } void TranslatePrefs::RegisterUserPrefs(PrefService* user_prefs) { if (!user_prefs->FindPreference(kPrefTranslateLanguageBlacklist)) user_prefs->RegisterListPref(kPrefTranslateLanguageBlacklist); if (!user_prefs->FindPreference(kPrefTranslateSiteBlacklist)) user_prefs->RegisterListPref(kPrefTranslateSiteBlacklist); if (!user_prefs->FindPreference(kPrefTranslateWhitelists)) { user_prefs->RegisterDictionaryPref(kPrefTranslateWhitelists); MigrateTranslateWhitelists(user_prefs); } if (!user_prefs->FindPreference(kPrefTranslateDeniedCount)) user_prefs->RegisterDictionaryPref(kPrefTranslateDeniedCount); if (!user_prefs->FindPreference(kPrefTranslateAcceptedCount)) user_prefs->RegisterDictionaryPref(kPrefTranslateAcceptedCount); } // TranslatePrefs: private, static: -------------------------------------------- void TranslatePrefs::MigrateTranslateWhitelists(PrefService* user_prefs) { // Old format of kPrefTranslateWhitelists // - original language -> list of target langs to auto-translate // - list of langs is in order of being enabled i.e. last in list is the // most recent language that user enabled via // Always translate |source_lang| to |target_lang|" // - this results in a one-to-n relationship between source lang and target // langs. // New format: // - original language -> one target language to auto-translate // - each time that the user enables the "Always translate..." option, that // target lang overwrites the previous one. // - this results in a one-to-one relationship between source lang and target // lang // - we replace old list of target langs with the last target lang in list, // assuming the last (i.e. most recent) target lang is what user wants to // keep auto-translated. DictionaryPrefUpdate update(user_prefs, kPrefTranslateWhitelists); DictionaryValue* dict = update.Get(); if (!dict || dict->empty()) return; bool save_prefs = false; for (DictionaryValue::key_iterator iter(dict->begin_keys()); iter != dict->end_keys(); ++iter) { ListValue* list = NULL; if (!dict->GetList(*iter, &list) || !list) break; // Dictionary has either been migrated or new format. save_prefs = true; std::string target_lang; if (list->empty() || !list->GetString(list->GetSize() - 1, &target_lang) || target_lang.empty()) dict->Remove(*iter, NULL); else dict->SetString(*iter, target_lang); } if (!save_prefs) return; user_prefs->ScheduleSavePersistentPrefs(); } // TranslatePrefs: private: ---------------------------------------------------- bool TranslatePrefs::IsValueInList(const ListValue* list, const std::string& in_value) { for (size_t i = 0; i < list->GetSize(); ++i) { std::string value; if (list->GetString(i, &value) && value == in_value) return true; } return false; } bool TranslatePrefs::IsValueBlacklisted(const char* pref_id, const std::string& value) { const ListValue* blacklist = prefs_->GetList(pref_id); return (blacklist && !blacklist->empty() && IsValueInList(blacklist, value)); } void TranslatePrefs::BlacklistValue(const char* pref_id, const std::string& value) { { ListPrefUpdate update(prefs_, pref_id); ListValue* blacklist = update.Get(); if (!blacklist) { NOTREACHED() << "Unregistered translate blacklist pref"; return; } blacklist->Append(new StringValue(value)); } prefs_->ScheduleSavePersistentPrefs(); } void TranslatePrefs::RemoveValueFromBlacklist(const char* pref_id, const std::string& value) { bool schedule_save = false; { ListPrefUpdate update(prefs_, pref_id); ListValue* blacklist = update.Get(); if (!blacklist) { NOTREACHED() << "Unregistered translate blacklist pref"; return; } StringValue string_value(value); schedule_save = blacklist->Remove(string_value) != -1; } if (schedule_save) prefs_->ScheduleSavePersistentPrefs(); } bool TranslatePrefs::IsLanguageWhitelisted( const std::string& original_language, std::string* target_language) { const DictionaryValue* dict = prefs_->GetDictionary(kPrefTranslateWhitelists); if (dict && dict->GetString(original_language, target_language)) { DCHECK(!target_language->empty()); return !target_language->empty(); } return false; }