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[] =
FILE_PATH_LITERAL("italian_page.html");
const base::FilePath::CharType kFrenchTestPath[] =
FILE_PATH_LITERAL("french_page.html");
const base::FilePath::CharType kGermanTestPath[] =
FILE_PATH_LITERAL("german_page.html");
static const char kTestValidScript[] =
"var google = {};"
......@@ -310,10 +312,10 @@ IN_PROC_BROWSER_TEST_F(TranslateLanguageBrowserTest, RecentTargetLanguage) {
EXPECT_EQ("zh-CN", GetLanguageState().current_language());
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.
ASSERT_NO_FATAL_FAILURE(CheckForTranslateUI(kEnglishTestPath, true));
EXPECT_EQ("en", GetLanguageState().current_language());
ASSERT_NO_FATAL_FAILURE(CheckForTranslateUI(kGermanTestPath, true));
EXPECT_EQ("de", GetLanguageState().current_language());
ASSERT_NO_FATAL_FAILURE(Translate(false));
EXPECT_EQ("es", GetLanguageState().current_language());
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 = [
"+components/language_usage_metrics",
"+components/pref_registry",
"+components/prefs",
"+components/strings/grit/components_locale_settings.h",
"+components/strings/grit/components_strings.h",
"+components/sync_preferences",
"+components/sync/protocol",
......
......@@ -351,9 +351,9 @@ TEST_F(TranslateManagerTest, OverrideTriggerWithIndiaEnglishExperiment) {
};
ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
.WillByDefault(Return(true));
TranslateAcceptLanguages accept_langugages(&prefs_, accept_languages_prefs);
TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
.WillByDefault(Return(&accept_langugages));
.WillByDefault(Return(&accept_languages));
ON_CALL(mock_translate_client_, ShowTranslateUI(_, _, _, _, _))
.WillByDefault(Return(true));
......@@ -546,8 +546,7 @@ TEST_F(TranslateManagerTest,
{{"override_model", "heuristic"}, {"enforce_ranker", "false"}});
TranslateManager::SetIgnoreMissingKeyForTesting(true);
mock_language_model_.details = {
MockLanguageModel::LanguageDetails("en", 1.0),
MockLanguageModel::LanguageDetails("hi", 0.5),
MockLanguageModel::LanguageDetails("hi", 1.),
};
ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
.WillByDefault(Return(true));
......@@ -566,11 +565,11 @@ TEST_F(TranslateManagerTest,
base::HistogramTester histogram_tester;
prefs_.SetBoolean(prefs::kOfferTranslateEnabled, true);
translate_manager_->GetLanguageState().LanguageDetermined("en", true);
translate_manager_->GetLanguageState().LanguageDetermined("fr", true);
network_notifier_.SimulateOnline();
EXPECT_EQ("hi", TranslateManager::GetTargetLanguage(
&translate_prefs_, &mock_language_model_, {"en"}));
translate_manager_->InitiateTranslation("en");
&translate_prefs_, &mock_language_model_, {}));
translate_manager_->InitiateTranslation("fr");
EXPECT_THAT(histogram_tester.GetAllSamples(kInitiationStatusName),
ElementsAre(Bucket(INITIATION_STATUS_SHOW_INFOBAR, 1),
Bucket(INITIATION_STATUS_SHOW_ICON, 1)));
......
......@@ -21,11 +21,13 @@
#include "base/value_conversions.h"
#include "base/values.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/locale_util.h"
#include "components/pref_registry/pref_registry_syncable.h"
#include "components/prefs/pref_service.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_download_manager.h"
#include "components/translate/core/browser/translate_pref_names.h"
......@@ -160,6 +162,7 @@ TranslatePrefs::TranslatePrefs(PrefService* user_prefs,
DCHECK(!preferred_languages_pref);
#endif
MigrateSitesBlacklist();
ResetEmptyBlockedLanguagesToDefaults();
}
bool TranslatePrefs::IsOfferTranslateEnabled() const {
......@@ -755,19 +758,28 @@ void TranslatePrefs::UpdateLanguageList(
bool TranslatePrefs::CanTranslateLanguage(
TranslateAcceptLanguages* accept_languages,
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 =
TranslateAcceptLanguages::CanBeAcceptLanguage(language);
bool is_accept_language = accept_languages->IsAcceptLanguage(language);
// Don't translate any user black-listed languages. 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.
return !IsBlockedLanguage(language) ||
(!is_accept_language && can_be_accept_language);
if (!is_accept_language && can_be_accept_language)
return true;
// Under this experiment, translate English page even though English may be
// blocked.
if (language == "en" && language::ShouldForceTriggerTranslateOnEnglishPages(
GetForceTriggerOnEnglishPagesCount()))
return true;
return false;
}
bool TranslatePrefs::ShouldAutoTranslate(const std::string& original_language,
......@@ -827,6 +839,7 @@ void TranslatePrefs::RegisterProfilePrefs(
kPrefTranslateAcceptedCount,
user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
registry->RegisterListPref(kPrefTranslateBlockedLanguages,
GetDefaultBlockedLanguages(),
user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
registry->RegisterDictionaryPref(kPrefTranslateLastDeniedTimeForLanguage);
registry->RegisterDictionaryPref(
......@@ -876,6 +889,11 @@ void TranslatePrefs::MigrateSitesBlacklist() {
migrated = true;
}
void TranslatePrefs::ResetEmptyBlockedLanguagesToDefaults() {
if (!HasBlockedLanguages())
ClearBlockedLanguages();
}
bool TranslatePrefs::IsValueInList(const base::ListValue* list,
const std::string& in_value) const {
for (size_t i = 0; i < list->GetSize(); ++i) {
......@@ -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
......@@ -7,6 +7,7 @@
#include <stddef.h>
#include <memory>
#include <string>
#include <vector>
......@@ -323,6 +324,10 @@ class TranslatePrefs {
// to a timestamp of the creation of this entry.
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);
private:
......@@ -387,6 +392,10 @@ class TranslatePrefs {
// accepted for a language, creating it if necessary.
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.
std::string country_; // The country the app runs in.
......
......@@ -10,12 +10,17 @@
#include <vector>
#include "base/json/json_reader.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/test_timeouts.h"
#include "base/values.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/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/common/translate_util.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/l10n/l10n_util.h"
......@@ -40,6 +45,18 @@ const char kTranslateBlockedLanguagesPref[] = "translate_blocked_languages";
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 {
protected:
TranslatePrefsTest()
......@@ -97,13 +114,7 @@ class TranslatePrefsTest : public testing::Test {
const std::vector<std::string>& list) const {
const base::ListValue* const blacklist =
prefs_->GetList(kTranslateBlockedLanguagesPref);
const int input_size = list.size();
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);
}
ExpectEqualLanguageLists(*blacklist, list);
}
// Returns a vector of language codes from the elements of the given
......@@ -149,6 +160,8 @@ class TranslatePrefsTest : public testing::Test {
// Shared time constants.
base::Time now_;
base::Time two_days_ago_;
base::test::ScopedFeatureList scoped_feature_list_;
};
TEST_F(TranslatePrefsTest, UpdateLastDeniedTime) {
......@@ -377,37 +390,39 @@ TEST_F(TranslatePrefsTest, GetLanguageInfoList) {
}
TEST_F(TranslatePrefsTest, BlockLanguage) {
// `en` is a default blocked language, it should be present already.
// One language.
translate_prefs_->BlockLanguage("en-UK");
ExpectBlockedLanguageListContent({"en"});
translate_prefs_->BlockLanguage("fr-CA");
ExpectBlockedLanguageListContent({"en", "fr"});
// Add a few more.
translate_prefs_->BlockLanguage("es-AR");
translate_prefs_->BlockLanguage("fr-CA");
ExpectBlockedLanguageListContent({"en", "es", "fr"});
translate_prefs_->BlockLanguage("de-de");
ExpectBlockedLanguageListContent({"en", "fr", "es", "de"});
// Add a duplicate.
translate_prefs_->ClearBlockedLanguages();
translate_prefs_->BlockLanguage("es-AR");
translate_prefs_->BlockLanguage("es-AR");
ExpectBlockedLanguageListContent({"es"});
ExpectBlockedLanguageListContent({"en", "es"});
// Two languages with the same base.
translate_prefs_->ClearBlockedLanguages();
translate_prefs_->BlockLanguage("fr-CA");
translate_prefs_->BlockLanguage("fr-FR");
ExpectBlockedLanguageListContent({"fr"});
ExpectBlockedLanguageListContent({"en", "fr"});
// Chinese is a special case.
translate_prefs_->ClearBlockedLanguages();
translate_prefs_->BlockLanguage("zh-MO");
translate_prefs_->BlockLanguage("zh-CN");
ExpectBlockedLanguageListContent({"zh-TW", "zh-CN"});
ExpectBlockedLanguageListContent({"en", "zh-TW", "zh-CN"});
translate_prefs_->ClearBlockedLanguages();
translate_prefs_->BlockLanguage("zh-TW");
translate_prefs_->BlockLanguage("zh-HK");
ExpectBlockedLanguageListContent({"zh-TW"});
ExpectBlockedLanguageListContent({"en", "zh-TW"});
}
TEST_F(TranslatePrefsTest, UnblockLanguage) {
......@@ -430,40 +445,40 @@ TEST_F(TranslatePrefsTest, UnblockLanguage) {
translate_prefs_->BlockLanguage("fr-FR");
translate_prefs_->BlockLanguage("es-AR");
translate_prefs_->UnblockLanguage("fr-FR");
ExpectBlockedLanguageListContent({"es"});
ExpectBlockedLanguageListContent({"en", "es"});
// Chinese is a special case.
translate_prefs_->ClearBlockedLanguages();
translate_prefs_->BlockLanguage("zh-MO");
translate_prefs_->BlockLanguage("zh-CN");
translate_prefs_->UnblockLanguage("zh-TW");
ExpectBlockedLanguageListContent({"zh-CN"});
ExpectBlockedLanguageListContent({"en", "zh-CN"});
translate_prefs_->ClearBlockedLanguages();
translate_prefs_->BlockLanguage("zh-MO");
translate_prefs_->BlockLanguage("zh-CN");
translate_prefs_->UnblockLanguage("zh-CN");
ExpectBlockedLanguageListContent({"zh-TW"});
ExpectBlockedLanguageListContent({"en", "zh-TW"});
}
TEST_F(TranslatePrefsTest, AddToLanguageList) {
std::vector<std::string> languages;
// Force blocked false, language not already in list.
languages = {"en-US"};
languages = {"en"};
translate_prefs_->UpdateLanguageList(languages);
translate_prefs_->ClearBlockedLanguages();
translate_prefs_->AddToLanguageList("it-IT", /*force_blocked=*/false);
ExpectLanguagePrefs("en-US,it-IT");
ExpectBlockedLanguageListContent({"it"});
ExpectLanguagePrefs("en,it-IT");
ExpectBlockedLanguageListContent({"en", "it"});
// 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_->ClearBlockedLanguages();
translate_prefs_->AddToLanguageList("es-ES", /*force_blocked=*/false);
ExpectLanguagePrefs("en-US,es-AR,es-ES");
ExpectBlockedLanguageListContent({});
ExpectLanguagePrefs("en,es-AR,es-ES");
ExpectBlockedLanguageListContent({"en"});
}
TEST_F(TranslatePrefsTest, RemoveFromLanguageList) {
......@@ -910,4 +925,48 @@ TEST_F(TranslatePrefsTest, SiteBlacklist) {
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
......@@ -477,9 +477,13 @@ js_compile_bundle("web_view_bundle") {
repack_locales("repack_locales") {
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 = [
"//components/strings:components_locale_settings",
"//components/strings:components_strings",
]
input_locales = ios_packed_locales
......
......@@ -33,6 +33,7 @@
#include "testing/platform_test.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)
#error "This file requires ARC support."
......@@ -54,9 +55,12 @@ NSString* const kTestFieldValue = @"FieldValue";
class CWVAutofillControllerTest : public PlatformTest {
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_);
l10n_util::OverrideLocaleWithCocoaLocale();
web_state_.SetBrowserState(&browser_state_);
CRWTestJSInjectionReceiver* injectionReceiver =
......@@ -81,6 +85,17 @@ class CWVAutofillControllerTest : public PlatformTest {
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::TestWebThreadBundle web_thread_bundle_;
ios_web_view::WebViewBrowserState browser_state_;
......
......@@ -30,6 +30,8 @@
#import "testing/gtest_mac.h"
#include "testing/platform_test.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)
#error "This file requires ARC support."
......@@ -47,7 +49,10 @@ using testing::Return;
class CWVSyncControllerTest : public PlatformTest {
protected:
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_(
SigninErrorController::AccountMode::ANY_ACCOUNT,
identity_test_env_.identity_manager()) {
......@@ -74,6 +79,7 @@ class CWVSyncControllerTest : public PlatformTest {
}
~CWVSyncControllerTest() override {
ui::ResourceBundle::CleanupSharedInstance();
EXPECT_CALL(*profile_sync_service_, RemoveObserver(_));
}
......@@ -86,6 +92,13 @@ class CWVSyncControllerTest : public PlatformTest {
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_;
ios_web_view::WebViewBrowserState browser_state_;
web::TestWebState web_state_;
......
......@@ -24,6 +24,7 @@
#include "testing/platform_test.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)
#error "This file requires ARC support."
......@@ -39,9 +40,11 @@ NSString* const kTestPageHost = @"www.chromium.org";
class CWVTranslationControllerTest : public PlatformTest {
protected:
CWVTranslationControllerTest() : browser_state_(/*off_the_record=*/false) {
l10n_util::OverrideLocaleWithCocoaLocale();
CWVTranslationControllerTest()
: browser_state_(
// Using comma-operator to perform required initialization before
// creating browser_state.
(InitializeLocaleAndResources(), /*off_the_record=*/false)) {
web_state_.SetBrowserState(&browser_state_);
auto test_navigation_manager =
std::make_unique<web::TestNavigationManager>();
......@@ -59,6 +62,7 @@ class CWVTranslationControllerTest : public PlatformTest {
~CWVTranslationControllerTest() override {
translate_prefs_->ResetToDefaults();
ui::ResourceBundle::CleanupSharedInstance();
}
// Checks if |lang_code| matches the OCMArg's CWVTranslationLanguage.
......@@ -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_;
WebViewBrowserState browser_state_;
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