Commit 3332bf2f authored by Alexandre Frechette's avatar Alexandre Frechette Committed by Commit Bot

Block default languages.

We want the default languages (accept languages for Chrome, preferred languages for ChromeOS) to be blocked so that we don't offer translation by default.
This is achieved by:
(1) Giving a default to translate's blocked language pref when initialized.
(2) Resetting empty blocked languages to the (new) default (to fix current users' prefs).

This changes also means that blocked languages aren't empty in tests anymore, and that translate pref registration now requires string resources to be available.
Hence, a few translate behavior tests needed to be adjusted.

Bug: 902354, 872096
Change-Id: I7fae351d85eca47f68325a2acfe3abc5073ce3c7
Reviewed-on: https://chromium-review.googlesource.com/c/1473431Reviewed-by: default avatarColin Blundell <blundell@chromium.org>
Reviewed-by: default avatarJohn Wu <jzw@chromium.org>
Reviewed-by: default avataranthonyvd <anthonyvd@chromium.org>
Commit-Queue: Alexandre Frechette <frechette@chromium.org>
Cr-Commit-Position: refs/heads/master@{#635653}
parent 3bdeed90
...@@ -44,6 +44,8 @@ const base::FilePath::CharType kItalianTestPath[] = ...@@ -44,6 +44,8 @@ const base::FilePath::CharType kItalianTestPath[] =
FILE_PATH_LITERAL("italian_page.html"); FILE_PATH_LITERAL("italian_page.html");
const base::FilePath::CharType kFrenchTestPath[] = const base::FilePath::CharType kFrenchTestPath[] =
FILE_PATH_LITERAL("french_page.html"); FILE_PATH_LITERAL("french_page.html");
const base::FilePath::CharType kGermanTestPath[] =
FILE_PATH_LITERAL("german_page.html");
static const char kTestValidScript[] = static const char kTestValidScript[] =
"var google = {};" "var google = {};"
...@@ -310,10 +312,10 @@ IN_PROC_BROWSER_TEST_F(TranslateLanguageBrowserTest, RecentTargetLanguage) { ...@@ -310,10 +312,10 @@ IN_PROC_BROWSER_TEST_F(TranslateLanguageBrowserTest, RecentTargetLanguage) {
EXPECT_EQ("zh-CN", GetLanguageState().current_language()); EXPECT_EQ("zh-CN", GetLanguageState().current_language());
EXPECT_EQ("es", GetTranslatePrefs()->GetRecentTargetLanguage()); EXPECT_EQ("es", GetTranslatePrefs()->GetRecentTargetLanguage());
// Load an English page. This should offer to translate to Spanish, since that // Load a German page. This should offer to translate to Spanish, since that
// is our recent target language. // is our recent target language.
ASSERT_NO_FATAL_FAILURE(CheckForTranslateUI(kEnglishTestPath, true)); ASSERT_NO_FATAL_FAILURE(CheckForTranslateUI(kGermanTestPath, true));
EXPECT_EQ("en", GetLanguageState().current_language()); EXPECT_EQ("de", GetLanguageState().current_language());
ASSERT_NO_FATAL_FAILURE(Translate(false)); ASSERT_NO_FATAL_FAILURE(Translate(false));
EXPECT_EQ("es", GetLanguageState().current_language()); EXPECT_EQ("es", GetLanguageState().current_language());
EXPECT_EQ("es", GetTranslatePrefs()->GetRecentTargetLanguage()); EXPECT_EQ("es", GetTranslatePrefs()->GetRecentTargetLanguage());
......
<html>
<head><title>Diese Seite ist in deutsch</title></head>
<body>
Kein Witz! Dies ist eine Seite in Deutsch. Großartig, findest du nicht?
Deutsch wird in vielen Ländern gesprochen und ist eine schöne Sprache. Ich hoffe, das ist genug Text, um CLD auszulösen.
</body>
</html>
...@@ -6,6 +6,7 @@ include_rules = [ ...@@ -6,6 +6,7 @@ include_rules = [
"+components/language_usage_metrics", "+components/language_usage_metrics",
"+components/pref_registry", "+components/pref_registry",
"+components/prefs", "+components/prefs",
"+components/strings/grit/components_locale_settings.h",
"+components/strings/grit/components_strings.h", "+components/strings/grit/components_strings.h",
"+components/sync_preferences", "+components/sync_preferences",
"+components/sync/protocol", "+components/sync/protocol",
......
...@@ -351,9 +351,9 @@ TEST_F(TranslateManagerTest, OverrideTriggerWithIndiaEnglishExperiment) { ...@@ -351,9 +351,9 @@ TEST_F(TranslateManagerTest, OverrideTriggerWithIndiaEnglishExperiment) {
}; };
ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL())) ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
.WillByDefault(Return(true)); .WillByDefault(Return(true));
TranslateAcceptLanguages accept_langugages(&prefs_, accept_languages_prefs); TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages()) ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
.WillByDefault(Return(&accept_langugages)); .WillByDefault(Return(&accept_languages));
ON_CALL(mock_translate_client_, ShowTranslateUI(_, _, _, _, _)) ON_CALL(mock_translate_client_, ShowTranslateUI(_, _, _, _, _))
.WillByDefault(Return(true)); .WillByDefault(Return(true));
...@@ -546,8 +546,7 @@ TEST_F(TranslateManagerTest, ...@@ -546,8 +546,7 @@ TEST_F(TranslateManagerTest,
{{"override_model", "heuristic"}, {"enforce_ranker", "false"}}); {{"override_model", "heuristic"}, {"enforce_ranker", "false"}});
TranslateManager::SetIgnoreMissingKeyForTesting(true); TranslateManager::SetIgnoreMissingKeyForTesting(true);
mock_language_model_.details = { mock_language_model_.details = {
MockLanguageModel::LanguageDetails("en", 1.0), MockLanguageModel::LanguageDetails("hi", 1.),
MockLanguageModel::LanguageDetails("hi", 0.5),
}; };
ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL())) ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
.WillByDefault(Return(true)); .WillByDefault(Return(true));
...@@ -566,11 +565,11 @@ TEST_F(TranslateManagerTest, ...@@ -566,11 +565,11 @@ TEST_F(TranslateManagerTest,
base::HistogramTester histogram_tester; base::HistogramTester histogram_tester;
prefs_.SetBoolean(prefs::kOfferTranslateEnabled, true); prefs_.SetBoolean(prefs::kOfferTranslateEnabled, true);
translate_manager_->GetLanguageState().LanguageDetermined("en", true); translate_manager_->GetLanguageState().LanguageDetermined("fr", true);
network_notifier_.SimulateOnline(); network_notifier_.SimulateOnline();
EXPECT_EQ("hi", TranslateManager::GetTargetLanguage( EXPECT_EQ("hi", TranslateManager::GetTargetLanguage(
&translate_prefs_, &mock_language_model_, {"en"})); &translate_prefs_, &mock_language_model_, {}));
translate_manager_->InitiateTranslation("en"); translate_manager_->InitiateTranslation("fr");
EXPECT_THAT(histogram_tester.GetAllSamples(kInitiationStatusName), EXPECT_THAT(histogram_tester.GetAllSamples(kInitiationStatusName),
ElementsAre(Bucket(INITIATION_STATUS_SHOW_INFOBAR, 1), ElementsAre(Bucket(INITIATION_STATUS_SHOW_INFOBAR, 1),
Bucket(INITIATION_STATUS_SHOW_ICON, 1))); Bucket(INITIATION_STATUS_SHOW_ICON, 1)));
......
...@@ -21,11 +21,13 @@ ...@@ -21,11 +21,13 @@
#include "base/value_conversions.h" #include "base/value_conversions.h"
#include "base/values.h" #include "base/values.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "components/language/core/browser/language_prefs.h"
#include "components/language/core/common/language_experiments.h" #include "components/language/core/common/language_experiments.h"
#include "components/language/core/common/locale_util.h" #include "components/language/core/common/locale_util.h"
#include "components/pref_registry/pref_registry_syncable.h" #include "components/pref_registry/pref_registry_syncable.h"
#include "components/prefs/pref_service.h" #include "components/prefs/pref_service.h"
#include "components/prefs/scoped_user_pref_update.h" #include "components/prefs/scoped_user_pref_update.h"
#include "components/strings/grit/components_locale_settings.h"
#include "components/translate/core/browser/translate_accept_languages.h" #include "components/translate/core/browser/translate_accept_languages.h"
#include "components/translate/core/browser/translate_download_manager.h" #include "components/translate/core/browser/translate_download_manager.h"
#include "components/translate/core/browser/translate_pref_names.h" #include "components/translate/core/browser/translate_pref_names.h"
...@@ -160,6 +162,7 @@ TranslatePrefs::TranslatePrefs(PrefService* user_prefs, ...@@ -160,6 +162,7 @@ TranslatePrefs::TranslatePrefs(PrefService* user_prefs,
DCHECK(!preferred_languages_pref); DCHECK(!preferred_languages_pref);
#endif #endif
MigrateSitesBlacklist(); MigrateSitesBlacklist();
ResetEmptyBlockedLanguagesToDefaults();
} }
bool TranslatePrefs::IsOfferTranslateEnabled() const { bool TranslatePrefs::IsOfferTranslateEnabled() const {
...@@ -755,19 +758,28 @@ void TranslatePrefs::UpdateLanguageList( ...@@ -755,19 +758,28 @@ void TranslatePrefs::UpdateLanguageList(
bool TranslatePrefs::CanTranslateLanguage( bool TranslatePrefs::CanTranslateLanguage(
TranslateAcceptLanguages* accept_languages, TranslateAcceptLanguages* accept_languages,
const std::string& language) { const std::string& language) {
// Don't translate any user black-listed languages.
if (!IsBlockedLanguage(language))
return true;
// Checking |is_accept_language| is necessary because if the user eliminates
// the language from the preference, it is natural to forget whether or not
// the language should be translated. Checking |cannot_be_accept_language| is
// also necessary because some minor languages can't be selected in the
// language preference even though the language is available in Translate
// server.
bool can_be_accept_language = bool can_be_accept_language =
TranslateAcceptLanguages::CanBeAcceptLanguage(language); TranslateAcceptLanguages::CanBeAcceptLanguage(language);
bool is_accept_language = accept_languages->IsAcceptLanguage(language); bool is_accept_language = accept_languages->IsAcceptLanguage(language);
if (!is_accept_language && can_be_accept_language)
return true;
// Don't translate any user black-listed languages. Checking // Under this experiment, translate English page even though English may be
// |is_accept_language| is necessary because if the user eliminates the // blocked.
// language from the preference, it is natural to forget whether or not if (language == "en" && language::ShouldForceTriggerTranslateOnEnglishPages(
// the language should be translated. Checking |cannot_be_accept_language| GetForceTriggerOnEnglishPagesCount()))
// is also necessary because some minor languages can't be selected in the return true;
// language preference even though the language is available in Translate return false;
// server.
return !IsBlockedLanguage(language) ||
(!is_accept_language && can_be_accept_language);
} }
bool TranslatePrefs::ShouldAutoTranslate(const std::string& original_language, bool TranslatePrefs::ShouldAutoTranslate(const std::string& original_language,
...@@ -827,6 +839,7 @@ void TranslatePrefs::RegisterProfilePrefs( ...@@ -827,6 +839,7 @@ void TranslatePrefs::RegisterProfilePrefs(
kPrefTranslateAcceptedCount, kPrefTranslateAcceptedCount,
user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
registry->RegisterListPref(kPrefTranslateBlockedLanguages, registry->RegisterListPref(kPrefTranslateBlockedLanguages,
GetDefaultBlockedLanguages(),
user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
registry->RegisterDictionaryPref(kPrefTranslateLastDeniedTimeForLanguage); registry->RegisterDictionaryPref(kPrefTranslateLastDeniedTimeForLanguage);
registry->RegisterDictionaryPref( registry->RegisterDictionaryPref(
...@@ -876,6 +889,11 @@ void TranslatePrefs::MigrateSitesBlacklist() { ...@@ -876,6 +889,11 @@ void TranslatePrefs::MigrateSitesBlacklist() {
migrated = true; migrated = true;
} }
void TranslatePrefs::ResetEmptyBlockedLanguagesToDefaults() {
if (!HasBlockedLanguages())
ClearBlockedLanguages();
}
bool TranslatePrefs::IsValueInList(const base::ListValue* list, bool TranslatePrefs::IsValueInList(const base::ListValue* list,
const std::string& in_value) const { const std::string& in_value) const {
for (size_t i = 0; i < list->GetSize(); ++i) { for (size_t i = 0; i < list->GetSize(); ++i) {
...@@ -953,4 +971,25 @@ void TranslatePrefs::PurgeUnsupportedLanguagesInLanguageFamily( ...@@ -953,4 +971,25 @@ void TranslatePrefs::PurgeUnsupportedLanguagesInLanguageFamily(
} }
} }
base::Value TranslatePrefs::GetDefaultBlockedLanguages() {
#if defined(OS_CHROMEOS)
// Preferred languages.
std::vector<std::string> languages = {language::kFallbackInputMethodLocale};
#else
// Accept languages.
std::vector<std::string> languages =
base::SplitString(l10n_util::GetStringUTF8(IDS_ACCEPT_LANGUAGES), ",",
base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
#endif
base::ListValue language_values;
for (std::string& language : languages) {
translate::ToTranslateLanguageSynonym(&language);
if (std::find(language_values.GetList().begin(),
language_values.GetList().end(),
base::Value(language)) == language_values.GetList().end())
language_values.GetList().emplace_back(language);
}
return std::move(language_values);
}
} // namespace translate } // namespace translate
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <stddef.h> #include <stddef.h>
#include <memory>
#include <string> #include <string>
#include <vector> #include <vector>
...@@ -323,6 +324,10 @@ class TranslatePrefs { ...@@ -323,6 +324,10 @@ class TranslatePrefs {
// to a timestamp of the creation of this entry. // to a timestamp of the creation of this entry.
void MigrateSitesBlacklist(); void MigrateSitesBlacklist();
// Prevent empty blocked languages by resetting them to the default value.
// (crbug.com/902354)
void ResetEmptyBlockedLanguagesToDefaults();
static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
private: private:
...@@ -387,6 +392,10 @@ class TranslatePrefs { ...@@ -387,6 +392,10 @@ class TranslatePrefs {
// accepted for a language, creating it if necessary. // accepted for a language, creating it if necessary.
base::DictionaryValue* GetTranslationAcceptedCountDictionary() const; base::DictionaryValue* GetTranslationAcceptedCountDictionary() const;
// Returns the languages that should be blocked by default as a
// base::(List)Value.
static base::Value GetDefaultBlockedLanguages();
PrefService* prefs_; // Weak. PrefService* prefs_; // Weak.
std::string country_; // The country the app runs in. std::string country_; // The country the app runs in.
......
...@@ -10,12 +10,17 @@ ...@@ -10,12 +10,17 @@
#include <vector> #include <vector>
#include "base/json/json_reader.h" #include "base/json/json_reader.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/test_timeouts.h" #include "base/test/test_timeouts.h"
#include "base/values.h" #include "base/values.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "components/language/core/browser/language_prefs.h"
#include "components/language/core/common/language_experiments.h"
#include "components/prefs/scoped_user_pref_update.h" #include "components/prefs/scoped_user_pref_update.h"
#include "components/sync_preferences/testing_pref_service_syncable.h" #include "components/sync_preferences/testing_pref_service_syncable.h"
#include "components/translate/core/browser/translate_accept_languages.h"
#include "components/translate/core/browser/translate_download_manager.h" #include "components/translate/core/browser/translate_download_manager.h"
#include "components/translate/core/common/translate_util.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
...@@ -40,6 +45,18 @@ const char kTranslateBlockedLanguagesPref[] = "translate_blocked_languages"; ...@@ -40,6 +45,18 @@ const char kTranslateBlockedLanguagesPref[] = "translate_blocked_languages";
namespace translate { namespace translate {
static void ExpectEqualLanguageLists(
const base::ListValue& language_values,
const std::vector<std::string>& languages) {
const int input_size = languages.size();
ASSERT_EQ(input_size, static_cast<int>(language_values.GetSize()));
for (int i = 0; i < input_size; ++i) {
std::string value;
language_values.GetString(i, &value);
EXPECT_EQ(languages[i], value);
}
}
class TranslatePrefsTest : public testing::Test { class TranslatePrefsTest : public testing::Test {
protected: protected:
TranslatePrefsTest() TranslatePrefsTest()
...@@ -97,13 +114,7 @@ class TranslatePrefsTest : public testing::Test { ...@@ -97,13 +114,7 @@ class TranslatePrefsTest : public testing::Test {
const std::vector<std::string>& list) const { const std::vector<std::string>& list) const {
const base::ListValue* const blacklist = const base::ListValue* const blacklist =
prefs_->GetList(kTranslateBlockedLanguagesPref); prefs_->GetList(kTranslateBlockedLanguagesPref);
const int input_size = list.size(); ExpectEqualLanguageLists(*blacklist, list);
ASSERT_EQ(input_size, static_cast<int>(blacklist->GetSize()));
for (int i = 0; i < input_size; ++i) {
std::string value;
blacklist->GetString(i, &value);
EXPECT_EQ(list[i], value);
}
} }
// Returns a vector of language codes from the elements of the given // Returns a vector of language codes from the elements of the given
...@@ -149,6 +160,8 @@ class TranslatePrefsTest : public testing::Test { ...@@ -149,6 +160,8 @@ class TranslatePrefsTest : public testing::Test {
// Shared time constants. // Shared time constants.
base::Time now_; base::Time now_;
base::Time two_days_ago_; base::Time two_days_ago_;
base::test::ScopedFeatureList scoped_feature_list_;
}; };
TEST_F(TranslatePrefsTest, UpdateLastDeniedTime) { TEST_F(TranslatePrefsTest, UpdateLastDeniedTime) {
...@@ -377,37 +390,39 @@ TEST_F(TranslatePrefsTest, GetLanguageInfoList) { ...@@ -377,37 +390,39 @@ TEST_F(TranslatePrefsTest, GetLanguageInfoList) {
} }
TEST_F(TranslatePrefsTest, BlockLanguage) { TEST_F(TranslatePrefsTest, BlockLanguage) {
// `en` is a default blocked language, it should be present already.
// One language. // One language.
translate_prefs_->BlockLanguage("en-UK"); translate_prefs_->BlockLanguage("fr-CA");
ExpectBlockedLanguageListContent({"en"}); ExpectBlockedLanguageListContent({"en", "fr"});
// Add a few more. // Add a few more.
translate_prefs_->BlockLanguage("es-AR"); translate_prefs_->BlockLanguage("es-AR");
translate_prefs_->BlockLanguage("fr-CA"); translate_prefs_->BlockLanguage("de-de");
ExpectBlockedLanguageListContent({"en", "es", "fr"}); ExpectBlockedLanguageListContent({"en", "fr", "es", "de"});
// Add a duplicate. // Add a duplicate.
translate_prefs_->ClearBlockedLanguages(); translate_prefs_->ClearBlockedLanguages();
translate_prefs_->BlockLanguage("es-AR"); translate_prefs_->BlockLanguage("es-AR");
translate_prefs_->BlockLanguage("es-AR"); translate_prefs_->BlockLanguage("es-AR");
ExpectBlockedLanguageListContent({"es"}); ExpectBlockedLanguageListContent({"en", "es"});
// Two languages with the same base. // Two languages with the same base.
translate_prefs_->ClearBlockedLanguages(); translate_prefs_->ClearBlockedLanguages();
translate_prefs_->BlockLanguage("fr-CA"); translate_prefs_->BlockLanguage("fr-CA");
translate_prefs_->BlockLanguage("fr-FR"); translate_prefs_->BlockLanguage("fr-FR");
ExpectBlockedLanguageListContent({"fr"}); ExpectBlockedLanguageListContent({"en", "fr"});
// Chinese is a special case. // Chinese is a special case.
translate_prefs_->ClearBlockedLanguages(); translate_prefs_->ClearBlockedLanguages();
translate_prefs_->BlockLanguage("zh-MO"); translate_prefs_->BlockLanguage("zh-MO");
translate_prefs_->BlockLanguage("zh-CN"); translate_prefs_->BlockLanguage("zh-CN");
ExpectBlockedLanguageListContent({"zh-TW", "zh-CN"}); ExpectBlockedLanguageListContent({"en", "zh-TW", "zh-CN"});
translate_prefs_->ClearBlockedLanguages(); translate_prefs_->ClearBlockedLanguages();
translate_prefs_->BlockLanguage("zh-TW"); translate_prefs_->BlockLanguage("zh-TW");
translate_prefs_->BlockLanguage("zh-HK"); translate_prefs_->BlockLanguage("zh-HK");
ExpectBlockedLanguageListContent({"zh-TW"}); ExpectBlockedLanguageListContent({"en", "zh-TW"});
} }
TEST_F(TranslatePrefsTest, UnblockLanguage) { TEST_F(TranslatePrefsTest, UnblockLanguage) {
...@@ -430,40 +445,40 @@ TEST_F(TranslatePrefsTest, UnblockLanguage) { ...@@ -430,40 +445,40 @@ TEST_F(TranslatePrefsTest, UnblockLanguage) {
translate_prefs_->BlockLanguage("fr-FR"); translate_prefs_->BlockLanguage("fr-FR");
translate_prefs_->BlockLanguage("es-AR"); translate_prefs_->BlockLanguage("es-AR");
translate_prefs_->UnblockLanguage("fr-FR"); translate_prefs_->UnblockLanguage("fr-FR");
ExpectBlockedLanguageListContent({"es"}); ExpectBlockedLanguageListContent({"en", "es"});
// Chinese is a special case. // Chinese is a special case.
translate_prefs_->ClearBlockedLanguages(); translate_prefs_->ClearBlockedLanguages();
translate_prefs_->BlockLanguage("zh-MO"); translate_prefs_->BlockLanguage("zh-MO");
translate_prefs_->BlockLanguage("zh-CN"); translate_prefs_->BlockLanguage("zh-CN");
translate_prefs_->UnblockLanguage("zh-TW"); translate_prefs_->UnblockLanguage("zh-TW");
ExpectBlockedLanguageListContent({"zh-CN"}); ExpectBlockedLanguageListContent({"en", "zh-CN"});
translate_prefs_->ClearBlockedLanguages(); translate_prefs_->ClearBlockedLanguages();
translate_prefs_->BlockLanguage("zh-MO"); translate_prefs_->BlockLanguage("zh-MO");
translate_prefs_->BlockLanguage("zh-CN"); translate_prefs_->BlockLanguage("zh-CN");
translate_prefs_->UnblockLanguage("zh-CN"); translate_prefs_->UnblockLanguage("zh-CN");
ExpectBlockedLanguageListContent({"zh-TW"}); ExpectBlockedLanguageListContent({"en", "zh-TW"});
} }
TEST_F(TranslatePrefsTest, AddToLanguageList) { TEST_F(TranslatePrefsTest, AddToLanguageList) {
std::vector<std::string> languages; std::vector<std::string> languages;
// Force blocked false, language not already in list. // Force blocked false, language not already in list.
languages = {"en-US"}; languages = {"en"};
translate_prefs_->UpdateLanguageList(languages); translate_prefs_->UpdateLanguageList(languages);
translate_prefs_->ClearBlockedLanguages(); translate_prefs_->ClearBlockedLanguages();
translate_prefs_->AddToLanguageList("it-IT", /*force_blocked=*/false); translate_prefs_->AddToLanguageList("it-IT", /*force_blocked=*/false);
ExpectLanguagePrefs("en-US,it-IT"); ExpectLanguagePrefs("en,it-IT");
ExpectBlockedLanguageListContent({"it"}); ExpectBlockedLanguageListContent({"en", "it"});
// Force blocked false, language from same family already in list. // Force blocked false, language from same family already in list.
languages = {"en-US", "es-AR"}; languages = {"en", "es-AR"};
translate_prefs_->UpdateLanguageList(languages); translate_prefs_->UpdateLanguageList(languages);
translate_prefs_->ClearBlockedLanguages(); translate_prefs_->ClearBlockedLanguages();
translate_prefs_->AddToLanguageList("es-ES", /*force_blocked=*/false); translate_prefs_->AddToLanguageList("es-ES", /*force_blocked=*/false);
ExpectLanguagePrefs("en-US,es-AR,es-ES"); ExpectLanguagePrefs("en,es-AR,es-ES");
ExpectBlockedLanguageListContent({}); ExpectBlockedLanguageListContent({"en"});
} }
TEST_F(TranslatePrefsTest, RemoveFromLanguageList) { TEST_F(TranslatePrefsTest, RemoveFromLanguageList) {
...@@ -910,4 +925,48 @@ TEST_F(TranslatePrefsTest, SiteBlacklist) { ...@@ -910,4 +925,48 @@ TEST_F(TranslatePrefsTest, SiteBlacklist) {
EXPECT_FALSE(translate_prefs_->IsSiteBlacklisted("b.com")); EXPECT_FALSE(translate_prefs_->IsSiteBlacklisted("b.com"));
} }
TEST_F(TranslatePrefsTest, DefaultBlockedLanguages) {
translate_prefs_->ResetToDefaults();
// The default blocked languages should be the unique language codes in the
// default accept languages for Chrome (resource IDS_ACCEPT_LANGUAGES,
// provided by components_locale_settings_en-US.pak), and
// language::kFallbackInputMethodLocale for ChromeOS. For the tests, the
// resources are given by .
std::vector<std::string> blocked_languages_expected = {"en"};
ExpectBlockedLanguageListContent(blocked_languages_expected);
}
TEST_F(TranslatePrefsTest, CanTranslateLanguage) {
prefs_->SetString(kAcceptLanguagesPref, "en");
TranslateDownloadManager::GetInstance()->set_application_locale("en");
translate_prefs_->ResetToDefaults();
TranslateAcceptLanguages translate_accept_languages(prefs_.get(),
kAcceptLanguagesPref);
// Unblocked language.
EXPECT_TRUE(translate_prefs_->CanTranslateLanguage(
&translate_accept_languages, "fr"));
// Blocked language.
translate_prefs_->BlockLanguage("en");
EXPECT_FALSE(translate_prefs_->CanTranslateLanguage(
&translate_accept_languages, "en"));
// Blocked language that is not in accept languages.
translate_prefs_->BlockLanguage("de");
EXPECT_TRUE(translate_prefs_->CanTranslateLanguage(
&translate_accept_languages, "de"));
// English in force translate experiment.
scoped_feature_list_.InitAndEnableFeatureWithParameters(
language::kOverrideTranslateTriggerInIndia,
{{"override_model", "heuristic"},
{"enforce_ranker", "false"},
{"backoff_threshold", "1"}});
EXPECT_TRUE(translate_prefs_->CanTranslateLanguage(
&translate_accept_languages, "en"));
}
} // namespace translate } // namespace translate
...@@ -477,9 +477,13 @@ js_compile_bundle("web_view_bundle") { ...@@ -477,9 +477,13 @@ js_compile_bundle("web_view_bundle") {
repack_locales("repack_locales") { repack_locales("repack_locales") {
visibility = [ ":web_view_resources" ] visibility = [ ":web_view_resources" ]
source_patterns = [ "${root_gen_dir}/components/strings/components_strings_" ] source_patterns = [
"${root_gen_dir}/components/strings/components_strings_",
"${root_gen_dir}/components/strings/components_locale_settings_",
]
deps = [ deps = [
"//components/strings:components_locale_settings",
"//components/strings:components_strings", "//components/strings:components_strings",
] ]
input_locales = ios_packed_locales input_locales = ios_packed_locales
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include "testing/platform_test.h" #include "testing/platform_test.h"
#import "third_party/ocmock/OCMock/OCMock.h" #import "third_party/ocmock/OCMock/OCMock.h"
#include "ui/base/l10n/l10n_util_mac.h" #include "ui/base/l10n/l10n_util_mac.h"
#include "ui/base/resource/resource_bundle.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support." #error "This file requires ARC support."
...@@ -54,9 +55,12 @@ NSString* const kTestFieldValue = @"FieldValue"; ...@@ -54,9 +55,12 @@ NSString* const kTestFieldValue = @"FieldValue";
class CWVAutofillControllerTest : public PlatformTest { class CWVAutofillControllerTest : public PlatformTest {
protected: protected:
CWVAutofillControllerTest() : browser_state_(/*off_the_record=*/false) { CWVAutofillControllerTest()
: browser_state_(
// Using comma-operator to perform required initialization before
// creating browser_state.
(InitializeLocaleAndResources(), /*off_the_record=*/false)) {
web::SetWebClient(&web_client_); web::SetWebClient(&web_client_);
l10n_util::OverrideLocaleWithCocoaLocale();
web_state_.SetBrowserState(&browser_state_); web_state_.SetBrowserState(&browser_state_);
CRWTestJSInjectionReceiver* injectionReceiver = CRWTestJSInjectionReceiver* injectionReceiver =
...@@ -81,6 +85,17 @@ class CWVAutofillControllerTest : public PlatformTest { ...@@ -81,6 +85,17 @@ class CWVAutofillControllerTest : public PlatformTest {
std::make_unique<autofill::TestFormActivityTabHelper>(&web_state_); std::make_unique<autofill::TestFormActivityTabHelper>(&web_state_);
} }
~CWVAutofillControllerTest() override {
ui::ResourceBundle::CleanupSharedInstance();
}
static void InitializeLocaleAndResources() {
l10n_util::OverrideLocaleWithCocoaLocale();
ui::ResourceBundle::InitSharedInstanceWithLocale(
l10n_util::GetLocaleOverride(), /*delegate=*/nullptr,
ui::ResourceBundle::DO_NOT_LOAD_COMMON_RESOURCES);
}
web::WebClient web_client_; web::WebClient web_client_;
web::TestWebThreadBundle web_thread_bundle_; web::TestWebThreadBundle web_thread_bundle_;
ios_web_view::WebViewBrowserState browser_state_; ios_web_view::WebViewBrowserState browser_state_;
......
...@@ -30,6 +30,8 @@ ...@@ -30,6 +30,8 @@
#import "testing/gtest_mac.h" #import "testing/gtest_mac.h"
#include "testing/platform_test.h" #include "testing/platform_test.h"
#import "third_party/ocmock/OCMock/OCMock.h" #import "third_party/ocmock/OCMock/OCMock.h"
#include "ui/base/l10n/l10n_util_mac.h"
#include "ui/base/resource/resource_bundle.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support." #error "This file requires ARC support."
...@@ -47,7 +49,10 @@ using testing::Return; ...@@ -47,7 +49,10 @@ using testing::Return;
class CWVSyncControllerTest : public PlatformTest { class CWVSyncControllerTest : public PlatformTest {
protected: protected:
CWVSyncControllerTest() CWVSyncControllerTest()
: browser_state_(/*off_the_record=*/false), : browser_state_(
// Using comma-operator to perform required initialization before
// creating browser_state.
(InitializeLocaleAndResources(), /*off_the_record=*/false)),
signin_error_controller_( signin_error_controller_(
SigninErrorController::AccountMode::ANY_ACCOUNT, SigninErrorController::AccountMode::ANY_ACCOUNT,
identity_test_env_.identity_manager()) { identity_test_env_.identity_manager()) {
...@@ -74,6 +79,7 @@ class CWVSyncControllerTest : public PlatformTest { ...@@ -74,6 +79,7 @@ class CWVSyncControllerTest : public PlatformTest {
} }
~CWVSyncControllerTest() override { ~CWVSyncControllerTest() override {
ui::ResourceBundle::CleanupSharedInstance();
EXPECT_CALL(*profile_sync_service_, RemoveObserver(_)); EXPECT_CALL(*profile_sync_service_, RemoveObserver(_));
} }
...@@ -86,6 +92,13 @@ class CWVSyncControllerTest : public PlatformTest { ...@@ -86,6 +92,13 @@ class CWVSyncControllerTest : public PlatformTest {
profile_sync_service_.get()); profile_sync_service_.get());
} }
static void InitializeLocaleAndResources() {
l10n_util::OverrideLocaleWithCocoaLocale();
ui::ResourceBundle::InitSharedInstanceWithLocale(
l10n_util::GetLocaleOverride(), /*delegate=*/nullptr,
ui::ResourceBundle::DO_NOT_LOAD_COMMON_RESOURCES);
}
web::TestWebThreadBundle web_thread_bundle_; web::TestWebThreadBundle web_thread_bundle_;
ios_web_view::WebViewBrowserState browser_state_; ios_web_view::WebViewBrowserState browser_state_;
web::TestWebState web_state_; web::TestWebState web_state_;
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "testing/platform_test.h" #include "testing/platform_test.h"
#import "third_party/ocmock/OCMock/OCMock.h" #import "third_party/ocmock/OCMock/OCMock.h"
#include "ui/base/l10n/l10n_util_mac.h" #include "ui/base/l10n/l10n_util_mac.h"
#include "ui/base/resource/resource_bundle.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support." #error "This file requires ARC support."
...@@ -39,9 +40,11 @@ NSString* const kTestPageHost = @"www.chromium.org"; ...@@ -39,9 +40,11 @@ NSString* const kTestPageHost = @"www.chromium.org";
class CWVTranslationControllerTest : public PlatformTest { class CWVTranslationControllerTest : public PlatformTest {
protected: protected:
CWVTranslationControllerTest() : browser_state_(/*off_the_record=*/false) { CWVTranslationControllerTest()
l10n_util::OverrideLocaleWithCocoaLocale(); : browser_state_(
// Using comma-operator to perform required initialization before
// creating browser_state.
(InitializeLocaleAndResources(), /*off_the_record=*/false)) {
web_state_.SetBrowserState(&browser_state_); web_state_.SetBrowserState(&browser_state_);
auto test_navigation_manager = auto test_navigation_manager =
std::make_unique<web::TestNavigationManager>(); std::make_unique<web::TestNavigationManager>();
...@@ -59,6 +62,7 @@ class CWVTranslationControllerTest : public PlatformTest { ...@@ -59,6 +62,7 @@ class CWVTranslationControllerTest : public PlatformTest {
~CWVTranslationControllerTest() override { ~CWVTranslationControllerTest() override {
translate_prefs_->ResetToDefaults(); translate_prefs_->ResetToDefaults();
ui::ResourceBundle::CleanupSharedInstance();
} }
// Checks if |lang_code| matches the OCMArg's CWVTranslationLanguage. // Checks if |lang_code| matches the OCMArg's CWVTranslationLanguage.
...@@ -68,6 +72,13 @@ class CWVTranslationControllerTest : public PlatformTest { ...@@ -68,6 +72,13 @@ class CWVTranslationControllerTest : public PlatformTest {
}]; }];
} }
static void InitializeLocaleAndResources() {
l10n_util::OverrideLocaleWithCocoaLocale();
ui::ResourceBundle::InitSharedInstanceWithLocale(
l10n_util::GetLocaleOverride(), /*delegate=*/nullptr,
ui::ResourceBundle::DO_NOT_LOAD_COMMON_RESOURCES);
}
web::TestWebThreadBundle web_thread_bundle_; web::TestWebThreadBundle web_thread_bundle_;
WebViewBrowserState browser_state_; WebViewBrowserState browser_state_;
std::unique_ptr<FakeWebViewTranslateClient> translate_client_; std::unique_ptr<FakeWebViewTranslateClient> translate_client_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment