#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include <stddef.h>
#include <memory>
#include <set>
#include <tuple>
#include <utility>
#include <vector>
#include "base/command_line.h"
#include "base/containers/contains.h"
#include "base/functional/bind.h"
#include "base/memory/raw_ptr.h"
#include "base/run_loop.h"
#include "base/scoped_observation.h"
#include "base/strings/stringprintf.h"
#include "build/build_config.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/extensions/test_extension_system.h"
#include "chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h"
#include "chrome/browser/translate/chrome_translate_client.h"
#include "chrome/browser/translate/fake_translate_agent.h"
#include "chrome/browser/translate/translate_service.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/translate/translate_bubble_factory.h"
#include "chrome/browser/ui/translate/translate_bubble_model.h"
#include "chrome/browser/ui/translate/translate_bubble_model_impl.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile.h"
#include "components/infobars/content/content_infobar_manager.h"
#include "components/infobars/core/infobar.h"
#include "components/infobars/core/infobar_manager.h"
#include "components/language/core/browser/accept_languages_service.h"
#include "components/prefs/pref_change_registrar.h"
#include "components/prefs/pref_service.h"
#include "components/translate/content/browser/content_translate_driver.h"
#include "components/translate/content/common/translate.mojom.h"
#include "components/translate/core/browser/translate_download_manager.h"
#include "components/translate/core/browser/translate_infobar_delegate.h"
#include "components/translate/core/browser/translate_language_list.h"
#include "components/translate/core/browser/translate_manager.h"
#include "components/translate/core/browser/translate_pref_names.h"
#include "components/translate/core/browser/translate_prefs.h"
#include "components/translate/core/browser/translate_script.h"
#include "components/translate/core/browser/translate_ui_delegate.h"
#include "components/translate/core/common/language_detection_details.h"
#include "components/variations/scoped_variations_ids_provider.h"
#include "content/public/browser/navigation_details.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/url_constants.h"
#include "content/public/test/navigation_simulator.h"
#include "content/public/test/test_renderer_host.h"
#include "net/base/net_errors.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "services/network/test/test_url_loader_factory.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "third_party/blink/public/common/context_menu_data/edit_flags.h"
#include "third_party/blink/public/mojom/context_menu/context_menu.mojom.h"
#include "ui/base/page_transition_types.h"
#include "url/gurl.h"
namespace translate {
namespace {
class MockTranslateBubbleFactory : public TranslateBubbleFactory { … };
class TranslateManagerRenderViewHostTest
: public ChromeRenderViewHostTestHarness,
public infobars::InfoBarManager::Observer { … };
static const char* kInvalidLocale = …;
class TranslateManagerRenderViewHostInvalidLocaleTest
: public TranslateManagerRenderViewHostTest { … };
static const char* kServerLanguageList[] = …;
TEST_F(TranslateManagerRenderViewHostTest, FetchLanguagesFromTranslateServer) { … }
#if !defined(USE_AURA) && !BUILDFLAG(IS_MAC)
TEST_F(TranslateManagerRenderViewHostTest, NormalTranslate) {
if (TranslateService::IsTranslateBubbleEnabled())
return;
return;
SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
translate::TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
EXPECT_EQ(translate::TRANSLATE_STEP_BEFORE_TRANSLATE,
infobar->translate_step());
infobar->Translate();
infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
EXPECT_EQ(translate::TRANSLATE_STEP_TRANSLATING, infobar->translate_step());
SimulateTranslateScriptURLFetch(true);
std::string source_lang, target_lang;
EXPECT_TRUE(GetTranslateMessage(&source_lang, &target_lang));
EXPECT_EQ("fr", source_lang);
EXPECT_EQ("en", target_lang);
SimulateOnPageTranslated("fr", "en");
infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
EXPECT_EQ(translate::TRANSLATE_STEP_AFTER_TRANSLATE,
infobar->translate_step());
std::string new_source_lang = infobar->language_code_at(0);
infobar->UpdateSourceLanguage(new_source_lang);
infobar->Translate();
EXPECT_TRUE(GetTranslateMessage(&source_lang, &target_lang));
EXPECT_EQ(new_source_lang, source_lang);
EXPECT_EQ("en", target_lang);
SimulateOnPageTranslated(new_source_lang, "en");
infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
std::string new_target_lang = infobar->language_code_at(1);
infobar->UpdateTargetLanguage(new_target_lang);
infobar->Translate();
EXPECT_TRUE(GetTranslateMessage(&source_lang, &target_lang));
EXPECT_EQ(new_source_lang, source_lang);
EXPECT_EQ(new_target_lang, target_lang);
SimulateOnPageTranslated(new_source_lang, new_target_lang);
infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
EXPECT_EQ(new_target_lang, infobar->target_language_code());
ReloadAndWait(true);
infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
EXPECT_EQ(translate::TRANSLATE_STEP_BEFORE_TRANSLATE,
infobar->translate_step());
infobar->UpdateTargetLanguage(new_target_lang);
infobar->ToggleAlwaysTranslate();
ReloadAndWait(true);
infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
EXPECT_EQ(translate::TRANSLATE_STEP_TRANSLATING, infobar->translate_step());
EXPECT_EQ(new_target_lang, infobar->target_language_code());
}
TEST_F(TranslateManagerRenderViewHostTest, TranslateScriptNotAvailable) {
if (TranslateService::IsTranslateBubbleEnabled())
return;
SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
translate::TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
EXPECT_EQ(translate::TRANSLATE_STEP_BEFORE_TRANSLATE,
infobar->translate_step());
infobar->Translate();
SimulateTranslateScriptURLFetch(false);
EXPECT_FALSE(GetTranslateMessage(NULL, NULL));
infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
EXPECT_EQ(translate::TRANSLATE_STEP_TRANSLATE_ERROR,
infobar->translate_step());
}
TEST_F(TranslateManagerRenderViewHostTest, TranslateUnknownLanguage) {
if (TranslateService::IsTranslateBubbleEnabled())
return;
SimulateNavigation(GURL("http://www.google.mys"), "und", true);
ASSERT_TRUE(GetTranslateInfoBar() == NULL);
std::unique_ptr<TestRenderViewContextMenu> menu(CreateContextMenu());
menu->Init();
menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
SimulateTranslateScriptURLFetch(false);
translate::TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
EXPECT_EQ(translate::TRANSLATE_STEP_TRANSLATE_ERROR,
infobar->translate_step());
EXPECT_TRUE(infobar->is_error());
infobar->MessageInfoBarButtonPressed();
SimulateTranslateScriptURLFetch(true);
SimulateOnPageTranslated("fr", "en");
infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
EXPECT_EQ(translate::TRANSLATE_STEP_AFTER_TRANSLATE,
infobar->translate_step());
EXPECT_EQ("fr", infobar->source_language_code());
EXPECT_EQ("en", infobar->target_language_code());
SimulateNavigation(GURL("http://www.google.com"), "und", true);
menu.reset(CreateContextMenu());
menu->Init();
menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
SimulateOnPageTranslated("en", "en",
translate::TranslateErrors::IDENTICAL_LANGUAGES);
infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
EXPECT_EQ(translate::TRANSLATE_STEP_TRANSLATE_ERROR,
infobar->translate_step());
EXPECT_EQ(translate::TranslateErrors::IDENTICAL_LANGUAGES,
infobar->error_type());
SimulateNavigation(GURL("http://www.google.com"), "und", true);
menu.reset(CreateContextMenu());
menu->Init();
menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
SimulateOnPageTranslated(std::string(), "en",
translate::TranslateErrors::UNKNOWN_LANGUAGE);
infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
EXPECT_EQ(translate::TRANSLATE_STEP_TRANSLATE_ERROR,
infobar->translate_step());
EXPECT_EQ(translate::TranslateErrors::UNKNOWN_LANGUAGE,
infobar->error_type());
}
TEST_F(TranslateManagerRenderViewHostTest, TestLanguages) {
if (TranslateService::IsTranslateBubbleEnabled())
return;
std::vector<std::string> languages;
languages.push_back("en");
languages.push_back("ja");
languages.push_back("fr");
languages.push_back("ht");
languages.push_back("xx");
languages.push_back("zh");
languages.push_back("zh-CN");
languages.push_back("und");
GURL url("http://www.google.com");
for (size_t i = 0; i < languages.size(); ++i) {
std::string lang = languages[i];
SCOPED_TRACE(::testing::Message() << "Iteration " << i
<< " language=" << lang);
translate::TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar == NULL);
SimulateNavigation(url, lang, true);
infobar = GetTranslateInfoBar();
bool expected =
translate::TranslateDownloadManager::IsSupportedLanguage(lang) &&
lang != "en";
EXPECT_EQ(expected, infobar != NULL);
if (infobar != NULL)
EXPECT_TRUE(CloseTranslateInfoBar());
}
}
TEST_F(TranslateManagerRenderViewHostTest, AutoTranslateOnNavigate) {
EnableBubbleTest();
SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
SimulateTranslatePress();
SimulateTranslateScriptURLFetch(true);
SimulateOnPageTranslated("fr", "en");
SimulateNavigation(GURL("http://news.google.fr"), "fr", true);
std::string source_lang, target_lang;
EXPECT_TRUE(GetTranslateMessage(&source_lang, &target_lang));
EXPECT_EQ("fr", source_lang);
EXPECT_EQ("en", target_lang);
SimulateNavigation(GURL("http://news.google.es"), "es", true);
EXPECT_FALSE(GetTranslateMessage(&source_lang, &target_lang));
}
TEST_F(TranslateManagerRenderViewHostTest, MultipleOnPageContents) {
EnableBubbleTest();
SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
EXPECT_TRUE(TranslateUiVisible());
EXPECT_TRUE(DenyTranslation());
EXPECT_FALSE(TranslateUiVisible());
SimulateOnTranslateLanguageDetermined("fr", true);
EXPECT_FALSE(TranslateUiVisible());
SimulateNavigation(GURL("http://www.youtube.de"), "de", true);
EXPECT_TRUE(TranslateUiVisible());
EXPECT_TRUE(CloseTranslateUi());
EXPECT_FALSE(TranslateUiVisible());
SimulateOnTranslateLanguageDetermined("de", true);
EXPECT_FALSE(TranslateUiVisible());
}
TEST_F(TranslateManagerRenderViewHostTest, Reload) {
EnableBubbleTest();
SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
EXPECT_TRUE(CloseTranslateUi());
ReloadAndWait(true);
EXPECT_TRUE(TranslateUiVisible());
EXPECT_TRUE(CloseTranslateUi());
ReloadAndWait(false);
EXPECT_FALSE(TranslateUiVisible());
ChromeTranslateClient::FromWebContents(web_contents())
->translate_driver()
->set_translate_max_reload_attempts(100);
ReloadAndWait(true);
EXPECT_FALSE(TranslateUiVisible());
}
TEST_F(TranslateManagerRenderViewHostTest, ReloadFromLocationBar) {
EnableBubbleTest();
GURL url("http://www.google.fr");
SimulateNavigation(url, "fr", true);
EXPECT_TRUE(CloseTranslateUi());
web_contents()->GetController().LoadURL(
url, content::Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
int pending_id =
web_contents()->GetController().GetPendingEntry()->GetUniqueID();
content::RenderFrameHostTester::For(web_contents()->GetPrimaryMainFrame())
->SendNavigateWithTransition(pending_id, false, url,
ui::PAGE_TRANSITION_TYPED);
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(CloseTranslateUi());
}
TEST_F(TranslateManagerRenderViewHostTest, CloseInfoBarSameDocumentNavigation) {
EnableBubbleTest();
SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
EXPECT_TRUE(CloseTranslateUi());
SimulateNavigation(GURL("http://www.google.fr/#ref1"), "fr", true);
EXPECT_FALSE(TranslateUiVisible());
if (!TranslateService::IsTranslateBubbleEnabled()) {
SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true);
EXPECT_TRUE(TranslateUiVisible());
}
}
TEST_F(TranslateManagerRenderViewHostTest, CloseInfoBarInSubframeNavigation) {
EnableBubbleTest();
SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
EXPECT_TRUE(CloseTranslateUi());
content::RenderFrameHostTester* subframe_tester =
content::RenderFrameHostTester::For(
content::RenderFrameHostTester::For(main_rfh())
->AppendChild("subframe"));
subframe_tester->SendNavigateWithTransition(
0, false, GURL("http://pub.com"), ui::PAGE_TRANSITION_AUTO_SUBFRAME);
EXPECT_FALSE(TranslateUiVisible());
subframe_tester->SendNavigateWithTransition(
1, true, GURL("http://pub.com"), ui::PAGE_TRANSITION_MANUAL_SUBFRAME);
EXPECT_FALSE(TranslateUiVisible());
if (!TranslateService::IsTranslateBubbleEnabled()) {
SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true);
EXPECT_TRUE(TranslateUiVisible());
}
}
TEST_F(TranslateManagerRenderViewHostTest,
DenyTranslateSameDocumentNavigation) {
EnableBubbleTest();
SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
EXPECT_TRUE(DenyTranslation());
SimulateNavigation(GURL("http://www.google.fr/#ref1"), "fr", true);
EXPECT_FALSE(TranslateUiVisible());
SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true);
EXPECT_NE(TranslateService::IsTranslateBubbleEnabled(), TranslateUiVisible());
}
TEST_F(TranslateManagerRenderViewHostTest,
TranslateCloseInfoBarSameDocumentNavigation) {
EnableBubbleTest();
SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
SimulateTranslatePress();
SimulateTranslateScriptURLFetch(true);
SimulateOnPageTranslated("fr", "en");
EXPECT_TRUE(CloseTranslateUi());
SimulateNavigation(GURL("http://www.google.fr/#ref1"), "fr", true);
EXPECT_FALSE(TranslateUiVisible());
SimulateNavigation(GURL("http://www.google.de"), "de", true);
EXPECT_TRUE(TranslateUiVisible());
}
TEST_F(TranslateManagerRenderViewHostTest, TranslateSameDocumentNavigation) {
EnableBubbleTest();
SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
SimulateTranslatePress();
SimulateTranslateScriptURLFetch(true);
SimulateOnPageTranslated("fr", "en");
EXPECT_TRUE(TranslateUiVisible());
translate::TranslateInfoBarDelegate* infobar = nullptr;
if (!TranslateService::IsTranslateBubbleEnabled())
infobar = GetTranslateInfoBar();
SimulateNavigation(GURL("http://www.google.de"), "de", true);
if (!TranslateService::IsTranslateBubbleEnabled())
EXPECT_TRUE(CheckInfoBarRemovedAndReset(infobar));
EXPECT_TRUE(TranslateUiVisible());
}
TEST_F(TranslateManagerRenderViewHostTest, CLDReportsUnsupportedPageLanguage) {
EnableBubbleTest();
SimulateNavigation(GURL("http://www.google.com"), kInvalidLocale, true);
EXPECT_FALSE(TranslateUiVisible());
}
TEST_F(TranslateManagerRenderViewHostTest, ServerReportsUnsupportedLanguage) {
EnableBubbleTest();
SimulateNavigation(GURL("http://mail.google.fr"), "fr", true);
SimulateTranslatePress();
SimulateTranslateScriptURLFetch(true);
SimulateOnPageTranslated(kInvalidLocale, "en");
EXPECT_EQ(translate::TRANSLATE_STEP_TRANSLATE_ERROR, CurrentStep());
if (!TranslateService::IsTranslateBubbleEnabled()) {
translate::TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar);
ASSERT_FALSE(infobar->GetMessageInfoBarButtonText().empty());
infobar->MessageInfoBarButtonPressed();
EXPECT_TRUE(IsTranslationReverted());
EXPECT_TRUE(GetTranslateInfoBar() == NULL);
}
}
TEST_F(TranslateManagerRenderViewHostInvalidLocaleTest, UnsupportedUILanguage) {
if (TranslateService::IsTranslateBubbleEnabled())
return;
Profile* profile =
Profile::FromBrowserContext(web_contents()->GetBrowserContext());
PrefService* prefs = profile->GetPrefs();
prefs->SetString(prefs::kAcceptLanguages, kInvalidLocale);
SimulateNavigation(GURL("http://www.google.com"), "en", true);
EXPECT_TRUE(GetTranslateInfoBar() == NULL);
std::unique_ptr<TestRenderViewContextMenu> menu(CreateContextMenu());
menu->Init();
EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
}
TEST_F(TranslateManagerRenderViewHostInvalidLocaleTest,
TranslateAcceptLanguage) {
if (TranslateService::IsTranslateBubbleEnabled())
return;
Profile* profile =
Profile::FromBrowserContext(web_contents()->GetBrowserContext());
PrefService* prefs = profile->GetPrefs();
prefs->SetString(prefs::kAcceptLanguages,
std::string(kInvalidLocale) + ",fr");
SimulateNavigation(GURL("http://google.de"), "de", true);
EXPECT_TRUE(GetTranslateInfoBar() != NULL);
prefs->SetString(prefs::kAcceptLanguages,
std::string(kInvalidLocale) + ",en-us");
SimulateNavigation(GURL("http://google.de"), "de", true);
EXPECT_TRUE(GetTranslateInfoBar() != NULL);
}
TEST_F(TranslateManagerRenderViewHostTest, TranslateEnabledPref) {
if (TranslateService::IsTranslateBubbleEnabled())
return;
Profile* profile =
Profile::FromBrowserContext(web_contents()->GetBrowserContext());
PrefService* prefs = profile->GetPrefs();
prefs->SetBoolean(translate::prefs::kOfferTranslateEnabled, true);
SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
translate::TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
EXPECT_TRUE(infobar != NULL);
prefs->SetBoolean(translate::prefs::kOfferTranslateEnabled, false);
GURL url("http://www.youtube.fr");
NavigateAndCommit(url);
infobar = GetTranslateInfoBar();
EXPECT_TRUE(infobar == NULL);
SimulateOnTranslateLanguageDetermined("fr", true);
infobar = GetTranslateInfoBar();
EXPECT_TRUE(infobar == NULL);
}
TEST_F(TranslateManagerRenderViewHostTest, NeverTranslateLanguagePref) {
if (TranslateService::IsTranslateBubbleEnabled())
return;
GURL url("http://www.google.fr");
SimulateNavigation(url, "fr", true);
EXPECT_TRUE(GetTranslateInfoBar() != NULL);
Profile* profile =
Profile::FromBrowserContext(web_contents()->GetBrowserContext());
PrefService* prefs = profile->GetPrefs();
PrefChangeRegistrar registrar;
registrar.Init(prefs);
registrar.Add(translate::TranslatePrefs::kPrefTranslateBlockedLanguages,
pref_callback_);
std::unique_ptr<translate::TranslatePrefs> translate_prefs(
ChromeTranslateClient::CreateTranslatePrefs(prefs));
EXPECT_FALSE(translate_prefs->IsBlockedLanguage("fr"));
language::AcceptLanguagesService* accept_languages =
ChromeTranslateClient::GetAcceptLanguagesService(profile);
EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
SetPrefObserverExpectation(
translate::TranslatePrefs::kPrefTranslateBlockedLanguages);
translate_prefs->AddToLanguageList("fr", true);
EXPECT_TRUE(translate_prefs->IsBlockedLanguage("fr"));
EXPECT_FALSE(translate_prefs->IsSiteOnNeverPromptList(url.host()));
EXPECT_FALSE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
EXPECT_TRUE(CloseTranslateInfoBar());
SimulateNavigation(GURL("http://wwww.youtube.fr"), "fr", true);
EXPECT_TRUE(GetTranslateInfoBar() == NULL);
SetPrefObserverExpectation(
translate::TranslatePrefs::kPrefTranslateBlockedLanguages);
translate_prefs->UnblockLanguage("fr");
EXPECT_FALSE(translate_prefs->IsBlockedLanguage("fr"));
EXPECT_FALSE(translate_prefs->IsSiteOnNeverPromptList(url.host()));
EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
SimulateNavigation(url, "fr", true);
EXPECT_TRUE(GetTranslateInfoBar() != NULL);
}
TEST_F(TranslateManagerRenderViewHostTest, NeverTranslateSitePref) {
if (TranslateService::IsTranslateBubbleEnabled())
return;
GURL url("http://www.google.fr");
std::string host(url.host());
SimulateNavigation(url, "fr", true);
EXPECT_TRUE(GetTranslateInfoBar() != NULL);
Profile* profile =
Profile::FromBrowserContext(web_contents()->GetBrowserContext());
PrefService* prefs = profile->GetPrefs();
PrefChangeRegistrar registrar;
registrar.Init(prefs);
registrar.Add(translate::TranslatePrefs::kPrefNeverPromptSitesDeprecated,
pref_callback_);
std::unique_ptr<translate::TranslatePrefs> translate_prefs(
ChromeTranslateClient::CreateTranslatePrefs(prefs));
EXPECT_FALSE(translate_prefs->IsSiteOnNeverPromptList(host));
language::AcceptLanguagesService* accept_languages =
ChromeTranslateClient::GetAcceptLanguagesService(profile);
EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
SetPrefObserverExpectation(
translate::TranslatePrefs::kPrefNeverPromptSitesDeprecated);
translate_prefs->AddSiteToNeverPromptList(host);
EXPECT_TRUE(translate_prefs->IsSiteOnNeverPromptList(host));
EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
EXPECT_TRUE(CloseTranslateInfoBar());
SimulateNavigation(GURL("http://www.google.fr/hello"), "fr", true);
EXPECT_TRUE(GetTranslateInfoBar() == NULL);
SetPrefObserverExpectation(
translate::TranslatePrefs::kPrefNeverPromptSitesDeprecated);
translate_prefs->RemoveSiteFromNeverPromptList(host);
EXPECT_FALSE(translate_prefs->IsSiteOnNeverPromptList(host));
EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
SimulateNavigation(url, "fr", true);
EXPECT_TRUE(GetTranslateInfoBar() != NULL);
}
TEST_F(TranslateManagerRenderViewHostTest, AlwaysTranslateLanguagePref) {
if (TranslateService::IsTranslateBubbleEnabled())
return;
Profile* profile =
Profile::FromBrowserContext(web_contents()->GetBrowserContext());
PrefService* prefs = profile->GetPrefs();
PrefChangeRegistrar registrar;
registrar.Init(prefs);
registrar.Add(translate::prefs::kPrefAlwaysTranslateList, pref_callback_);
std::unique_ptr<translate::TranslatePrefs> translate_prefs(
ChromeTranslateClient::CreateTranslatePrefs(prefs));
SetPrefObserverExpectation(translate::prefs::kPrefAlwaysTranslateList);
translate_prefs->AddLanguagePairToAlwaysTranslateList("fr", "en");
SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
translate::TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
EXPECT_EQ(translate::TRANSLATE_STEP_TRANSLATING, infobar->translate_step());
SimulateTranslateScriptURLFetch(true);
std::string source_lang, target_lang;
EXPECT_TRUE(GetTranslateMessage(&source_lang, &target_lang));
EXPECT_EQ("fr", source_lang);
EXPECT_EQ("en", target_lang);
SimulateNavigation(GURL("http://www.google.es"), "es", true);
EXPECT_FALSE(GetTranslateMessage(&source_lang, &target_lang));
EXPECT_TRUE(GetTranslateInfoBar() != NULL);
EXPECT_TRUE(CloseTranslateInfoBar());
TestingProfile* test_profile =
static_cast<TestingProfile*>(web_contents()->GetBrowserContext());
test_profile->ForceIncognito(true);
SimulateNavigation(GURL("http://www.youtube.fr"), "fr", true);
EXPECT_FALSE(GetTranslateMessage(&source_lang, &target_lang));
EXPECT_TRUE(GetTranslateInfoBar() != NULL);
EXPECT_TRUE(CloseTranslateInfoBar());
test_profile->ForceIncognito(false);
SetPrefObserverExpectation(translate::prefs::kPrefAlwaysTranslateList);
translate_prefs->RemoveLanguagePairFromAlwaysTranslateList("fr", "en");
SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
EXPECT_FALSE(GetTranslateMessage(&source_lang, &target_lang));
infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
EXPECT_EQ(translate::TRANSLATE_STEP_BEFORE_TRANSLATE,
infobar->translate_step());
}
TEST_F(TranslateManagerRenderViewHostTest, ContextMenu) {
if (TranslateService::IsTranslateBubbleEnabled())
return;
GURL url("http://www.google.fr");
Profile* profile =
Profile::FromBrowserContext(web_contents()->GetBrowserContext());
std::unique_ptr<translate::TranslatePrefs> translate_prefs(
ChromeTranslateClient::CreateTranslatePrefs(profile->GetPrefs()));
translate_prefs->AddToLanguageList("fr", true);
translate_prefs->AddSiteToNeverPromptList(url.host());
EXPECT_TRUE(translate_prefs->IsBlockedLanguage("fr"));
EXPECT_TRUE(translate_prefs->IsSiteOnNeverPromptList(url.host()));
NavigateAndCommit(url);
std::unique_ptr<TestRenderViewContextMenu> menu(CreateContextMenu());
menu->Init();
EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
SimulateOnTranslateLanguageDetermined("fr", true);
menu.reset(CreateContextMenu());
menu->Init();
EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
translate::TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
EXPECT_EQ(translate::TRANSLATE_STEP_TRANSLATING, infobar->translate_step());
SimulateTranslateScriptURLFetch(true);
std::string source_lang, target_lang;
EXPECT_TRUE(GetTranslateMessage(&source_lang, &target_lang));
EXPECT_EQ("fr", source_lang);
EXPECT_EQ("en", target_lang);
EXPECT_FALSE(translate_prefs->IsBlockedLanguage("fr"));
EXPECT_FALSE(translate_prefs->IsSiteOnNeverPromptList(url.host()));
SimulateOnPageTranslated("fr", "en");
menu.reset(CreateContextMenu());
menu->Init();
EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
SimulateNavigation(GURL("http://www.google.es"), "es", true);
infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
infobar->Translate();
EXPECT_TRUE(GetTranslateMessage(&source_lang, &target_lang));
menu.reset(CreateContextMenu());
menu->Init();
EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
EXPECT_FALSE(GetTranslateMessage(&source_lang, &target_lang));
SimulateNavigation(GURL("http://www.google.de"), "de", true);
infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
infobar->Translate();
EXPECT_TRUE(GetTranslateMessage(&source_lang, &target_lang));
menu.reset(CreateContextMenu());
menu->Init();
EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
SimulateOnPageTranslated("de", "en");
menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
EXPECT_FALSE(GetTranslateMessage(&source_lang, &target_lang));
SimulateNavigation(url, "und", true);
menu.reset(CreateContextMenu());
menu->Init();
EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
SimulateNavigation(url, kInvalidLocale, true);
menu.reset(CreateContextMenu());
menu->Init();
EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
}
TEST_F(TranslateManagerRenderViewHostTest, BeforeTranslateExtraButtons) {
if (TranslateService::IsTranslateBubbleEnabled())
return;
Profile* profile =
Profile::FromBrowserContext(web_contents()->GetBrowserContext());
std::unique_ptr<translate::TranslatePrefs> translate_prefs(
ChromeTranslateClient::CreateTranslatePrefs(profile->GetPrefs()));
translate_prefs->ResetTranslationAcceptedCount("fr");
translate_prefs->ResetTranslationDeniedCount("fr");
translate_prefs->ResetTranslationAcceptedCount("de");
translate_prefs->ResetTranslationDeniedCount("de");
translate::TranslateInfoBarDelegate* infobar;
TestingProfile* test_profile =
static_cast<TestingProfile*>(web_contents()->GetBrowserContext());
test_profile->ForceIncognito(true);
for (int i = 0; i < 8; ++i) {
SCOPED_TRACE(::testing::Message() << "Iteration " << i << " incognito mode="
<< test_profile->IsOffTheRecord());
SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
EXPECT_EQ(translate::TRANSLATE_STEP_BEFORE_TRANSLATE,
infobar->translate_step());
if (i < 7) {
EXPECT_FALSE(infobar->ShouldShowAlwaysTranslateShortcut());
infobar->Translate();
} else {
EXPECT_TRUE(infobar->ShouldShowAlwaysTranslateShortcut());
}
if (i == 3)
test_profile->ForceIncognito(false);
}
infobar->AlwaysTranslatePageLanguage();
EXPECT_TRUE(translate_prefs->IsLanguagePairOnAlwaysTranslateList("fr", "en"));
SimulateTranslateScriptURLFetch(true);
std::string source_lang, target_lang;
EXPECT_TRUE(GetTranslateMessage(&source_lang, &target_lang));
test_profile->ForceIncognito(true);
for (int i = 0; i < 8; ++i) {
SCOPED_TRACE(::testing::Message() << "Iteration " << i << " incognito mode="
<< test_profile->IsOffTheRecord());
SimulateNavigation(GURL("http://www.google.de"), "de", true);
infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
EXPECT_EQ(translate::TRANSLATE_STEP_BEFORE_TRANSLATE,
infobar->translate_step());
if (i < 7) {
EXPECT_FALSE(infobar->ShouldShowNeverTranslateShortcut());
infobar->TranslationDeclined();
} else {
EXPECT_TRUE(infobar->ShouldShowNeverTranslateShortcut());
}
if (i == 3)
test_profile->ForceIncognito(false);
}
infobar->NeverTranslatePageLanguage();
EXPECT_TRUE(translate_prefs->IsBlockedLanguage("de"));
EXPECT_FALSE(GetTranslateMessage(&source_lang, &target_lang));
ASSERT_TRUE(GetTranslateInfoBar() == NULL);
}
TEST_F(TranslateManagerRenderViewHostTest, NonTranslatablePage) {
if (TranslateService::IsTranslateBubbleEnabled())
return;
SimulateNavigation(GURL("http://mail.google.fr"), "fr", false);
EXPECT_TRUE(GetTranslateInfoBar() == NULL);
std::unique_ptr<TestRenderViewContextMenu> menu(CreateContextMenu());
menu->Init();
EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
}
TEST_F(TranslateManagerRenderViewHostTest, ScriptExpires) {
if (TranslateService::IsTranslateBubbleEnabled())
return;
ExpireTranslateScriptImmediately();
SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
translate::TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
infobar->Translate();
SimulateTranslateScriptURLFetch(true);
EXPECT_TRUE(GetTranslateMessage(NULL, NULL));
SimulateOnPageTranslated("fr", "en");
base::RunLoop().RunUntilIdle();
SimulateNavigation(GURL("http://www.google.es"), "es", true);
infobar = GetTranslateInfoBar();
ASSERT_TRUE(infobar != NULL);
infobar->Translate();
EXPECT_FALSE(GetTranslateMessage(NULL, NULL));
SimulateTranslateScriptURLFetch(true);
std::string source_lang, target_lang;
EXPECT_TRUE(GetTranslateMessage(&source_lang, &target_lang));
EXPECT_EQ("es", source_lang);
EXPECT_EQ("en", target_lang);
}
#else
TEST_F(TranslateManagerRenderViewHostTest, BubbleNormalTranslate) { … }
TEST_F(TranslateManagerRenderViewHostTest, BubbleTranslateScriptNotAvailable) { … }
TEST_F(TranslateManagerRenderViewHostTest, BubbleUnknownLanguage) { … }
#endif
}
}