Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4416)

Unified Diff: chrome/browser/translate/translate_manager_unittest.cc

Issue 186063007: Move TranslateManager unit tests out of the browser_tests target. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: translatetests: fixandroid Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/translate/translate_manager_browsertest.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/translate/translate_manager_unittest.cc
diff --git a/chrome/browser/translate/translate_manager_unittest.cc b/chrome/browser/translate/translate_manager_unittest.cc
index 5aee9ab8c5a730b6317485ab4d229c5d26ecbb1c..608689814af5c354653597061dcaedd1a027c547 100644
--- a/chrome/browser/translate/translate_manager_unittest.cc
+++ b/chrome/browser/translate/translate_manager_unittest.cc
@@ -4,8 +4,54 @@
#include "chrome/browser/translate/translate_manager.h"
+#include <algorithm>
+#include <set>
+#include <vector>
+
+#include "base/memory/scoped_ptr.h"
+#include "base/prefs/pref_change_registrar.h"
+#include "base/prefs/pref_service.h"
+#include "base/strings/stringprintf.h"
+#include "chrome/app/chrome_command_ids.h"
+#include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/extensions/test_extension_system.h"
+#include "chrome/browser/infobars/infobar.h"
+#include "chrome/browser/infobars/infobar_service.h"
+#include "chrome/browser/renderer_context_menu/render_view_context_menu.h"
+#include "chrome/browser/translate/translate_infobar_delegate.h"
+#include "chrome/browser/translate/translate_manager.h"
+#include "chrome/browser/translate/translate_service.h"
+#include "chrome/browser/translate/translate_tab_helper.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/render_messages.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/translate/core/browser/translate_accept_languages.h"
+#include "components/translate/core/browser/translate_download_manager.h"
+#include "components/translate/core/browser/translate_language_list.h"
+#include "components/translate/core/browser/translate_prefs.h"
+#include "components/translate/core/browser/translate_script.h"
+#include "components/translate/core/common/language_detection_details.h"
+#include "components/translate/core/common/translate_pref_names.h"
+#include "content/public/browser/navigation_details.h"
+#include "content/public/browser/navigation_entry.h"
+#include "content/public/browser/notification_details.h"
+#include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/web_contents.h"
#include "content/public/common/url_constants.h"
+#include "content/public/test/mock_render_process_host.h"
+#include "content/public/test/test_renderer_host.h"
+#include "net/url_request/test_url_fetcher_factory.h"
+#include "net/url_request/url_fetcher_delegate.h"
+#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/WebKit/public/web/WebContextMenuData.h"
#include "url/gurl.h"
#if defined(OS_CHROMEOS)
@@ -43,3 +89,1522 @@ TEST_F(TranslateManagerTest, CheckTranslatableURL) {
GURL right_url = GURL("http://www.tamurayukari.com/");
EXPECT_TRUE(TranslateManager::IsTranslatableURL(right_url));
}
+
+#if !defined(OS_ANDROID)
hajimehoshi 2014/03/04 02:35:57 Is it possible to execute these tests on Android?
danakj 2014/03/04 15:39:23 No, RenderViewContextMenu does not get compiled in
+
+// An observer that keeps track of whether a navigation entry was committed.
+class NavEntryCommittedObserver : public content::NotificationObserver {
+ public:
+ explicit NavEntryCommittedObserver(content::WebContents* web_contents) {
+ registrar_.Add(this,
+ content::NOTIFICATION_NAV_ENTRY_COMMITTED,
+ content::Source<content::NavigationController>(
+ &web_contents->GetController()));
+ }
+
+ virtual void Observe(int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) OVERRIDE {
+ DCHECK(type == content::NOTIFICATION_NAV_ENTRY_COMMITTED);
+ details_ =
+ *(content::Details<content::LoadCommittedDetails>(details).ptr());
+ }
+
+ const content::LoadCommittedDetails& load_committed_details() const {
+ return details_;
+ }
+
+ private:
+ content::LoadCommittedDetails details_;
+ content::NotificationRegistrar registrar_;
+
+ DISALLOW_COPY_AND_ASSIGN(NavEntryCommittedObserver);
+};
+
+class TranslateManagerRenderViewHostTest
+ : public ChromeRenderViewHostTestHarness,
+ public content::NotificationObserver {
+ public:
+ TranslateManagerRenderViewHostTest()
+ : pref_callback_(
+ base::Bind(&TranslateManagerRenderViewHostTest::OnPreferenceChanged,
+ base::Unretained(this))) {}
+
+ // Simulates navigating to a page and getting the page contents and language
+ // for that navigation.
+ void SimulateNavigation(const GURL& url,
+ const std::string& lang,
+ bool page_translatable) {
+ NavigateAndCommit(url);
+ SimulateOnTranslateLanguageDetermined(lang, page_translatable);
+ }
+
+ void SimulateOnTranslateLanguageDetermined(const std::string& lang,
+ bool page_translatable) {
+ LanguageDetectionDetails details;
+ details.adopted_language = lang;
+ content::RenderViewHostTester::TestOnMessageReceived(
+ rvh(),
+ ChromeViewHostMsg_TranslateLanguageDetermined(
+ 0, details, page_translatable));
+ }
+
+ void SimulateOnPageTranslated(int routing_id,
+ const std::string& source_lang,
+ const std::string& target_lang,
+ TranslateErrors::Type error) {
+ content::RenderViewHostTester::TestOnMessageReceived(
+ rvh(),
+ ChromeViewHostMsg_PageTranslated(
+ routing_id, 0, source_lang, target_lang, error));
+ }
+
+ void SimulateOnPageTranslated(const std::string& source_lang,
+ const std::string& target_lang) {
+ SimulateOnPageTranslated(
+ 0, source_lang, target_lang, TranslateErrors::NONE);
+ }
+
+ bool GetTranslateMessage(int* page_id,
+ std::string* original_lang,
+ std::string* target_lang) {
+ const IPC::Message* message = process()->sink().GetFirstMessageMatching(
+ ChromeViewMsg_TranslatePage::ID);
+ if (!message)
+ return false;
+ Tuple4<int, std::string, std::string, std::string> translate_param;
+ ChromeViewMsg_TranslatePage::Read(message, &translate_param);
+ if (page_id)
+ *page_id = translate_param.a;
+ // Ignore translate_param.b which is the script injected in the page.
+ if (original_lang)
+ *original_lang = translate_param.c;
+ if (target_lang)
+ *target_lang = translate_param.d;
+ return true;
+ }
+
+ InfoBarService* infobar_service() {
+ return InfoBarService::FromWebContents(web_contents());
+ }
+
+ // Returns the translate infobar if there is 1 infobar and it is a translate
+ // infobar.
+ TranslateInfoBarDelegate* GetTranslateInfoBar() {
+ return (infobar_service()->infobar_count() == 1)
+ ? infobar_service()
+ ->infobar_at(0)
+ ->delegate()
+ ->AsTranslateInfoBarDelegate()
+ : NULL;
+ }
+
+ // If there is 1 infobar and it is a translate infobar, closes it and returns
+ // true. Returns false otherwise.
+ bool CloseTranslateInfoBar() {
+ InfoBarDelegate* infobar = GetTranslateInfoBar();
+ if (!infobar)
+ return false;
+ infobar->InfoBarDismissed(); // Simulates closing the infobar.
+ infobar_service()->RemoveInfoBar(infobar_service()->infobar_at(0));
+ return true;
+ }
+
+ // Checks whether |infobar| has been removed and clears the removed infobar
+ // list.
+ bool CheckInfoBarRemovedAndReset(InfoBarDelegate* delegate) {
+ bool found = removed_infobars_.count(delegate) != 0;
+ removed_infobars_.clear();
+ return found;
+ }
+
+ void ExpireTranslateScriptImmediately() {
+ TranslateDownloadManager::GetInstance()->SetTranslateScriptExpirationDelay(
+ 0);
+ }
+
+ // If there is 1 infobar and it is a translate infobar, deny translation and
+ // returns true. Returns false otherwise.
+ bool DenyTranslation() {
+ TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
+ if (!infobar)
+ return false;
+ infobar->TranslationDeclined();
+ infobar_service()->RemoveInfoBar(infobar_service()->infobar_at(0));
+ return true;
+ }
+
+ void ReloadAndWait(bool successful_reload) {
+ NavEntryCommittedObserver nav_observer(web_contents());
+ if (successful_reload)
+ Reload();
+ else
+ FailedReload();
+
+ // Ensures it is really handled a reload.
+ const content::LoadCommittedDetails& nav_details =
+ nav_observer.load_committed_details();
+ EXPECT_TRUE(nav_details.entry != NULL); // There was a navigation.
+ EXPECT_EQ(content::NAVIGATION_TYPE_EXISTING_PAGE, nav_details.type);
+
+ // The TranslateManager class processes the navigation entry committed
+ // notification in a posted task; process that task.
+ base::MessageLoop::current()->RunUntilIdle();
+ }
+
+ virtual void Observe(int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) {
+ DCHECK_EQ(chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, type);
+ removed_infobars_.insert(
+ content::Details<InfoBar::RemovedDetails>(details)->first->delegate());
+ }
+
+ MOCK_METHOD1(OnPreferenceChanged, void(const std::string&));
+
+ protected:
+ virtual void SetUp() {
+ TranslateService::Initialize();
+ TranslateService::SetUseInfobar(true);
+
+ // Clears the translate script so it is fetched everytime and sets the
+ // expiration delay to a large value by default (in case it was zeroed in a
+ // previous test).
+ TranslateDownloadManager* download_manager =
+ TranslateDownloadManager::GetInstance();
+ download_manager->ClearTranslateScriptForTesting();
+ download_manager->SetTranslateScriptExpirationDelay(60 * 60 * 1000);
+
+ ChromeRenderViewHostTestHarness::SetUp();
+ InfoBarService::CreateForWebContents(web_contents());
+ TranslateTabHelper::CreateForWebContents(web_contents());
+ TranslateManager* manager =
+ TranslateTabHelper::GetManagerFromWebContents(web_contents());
+ manager->set_translate_max_reload_attemps(0);
+
+ notification_registrar_.Add(
+ this,
+ chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED,
+ content::Source<InfoBarService>(infobar_service()));
+ }
+
+ virtual void TearDown() {
+ process()->sink().ClearMessages();
+
+ notification_registrar_.Remove(
+ this,
+ chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED,
+ content::Source<InfoBarService>(infobar_service()));
+
+ ChromeRenderViewHostTestHarness::TearDown();
+ }
+
+ void SetApplicationLocale(const std::string& locale) {
+ g_browser_process->SetApplicationLocale(locale);
+ TranslateDownloadManager::GetInstance()->set_application_locale(
+ g_browser_process->GetApplicationLocale());
+ }
+
+ void SimulateTranslateScriptURLFetch(bool success) {
+ net::TestURLFetcher* fetcher =
+ url_fetcher_factory_.GetFetcherByID(TranslateScript::kFetcherId);
+ ASSERT_TRUE(fetcher);
+ net::URLRequestStatus status;
+ status.set_status(success ? net::URLRequestStatus::SUCCESS
+ : net::URLRequestStatus::FAILED);
+ fetcher->set_url(fetcher->GetOriginalURL());
+ fetcher->set_status(status);
+ fetcher->set_response_code(success ? 200 : 500);
+ fetcher->delegate()->OnURLFetchComplete(fetcher);
+ }
+
+ void SimulateSupportedLanguagesURLFetch(
+ bool success,
+ const std::vector<std::string>& languages,
+ bool use_alpha_languages,
+ const std::vector<std::string>& alpha_languages) {
+ net::URLRequestStatus status;
+ status.set_status(success ? net::URLRequestStatus::SUCCESS
+ : net::URLRequestStatus::FAILED);
+
+ std::string data;
+ if (success) {
+ data =
+ base::StringPrintf("%s{\"sl\": {\"bla\": \"bla\"}, \"%s\": {",
+ TranslateLanguageList::kLanguageListCallbackName,
+ TranslateLanguageList::kTargetLanguagesKey);
+ const char* comma = "";
+ for (size_t i = 0; i < languages.size(); ++i) {
+ data += base::StringPrintf(
+ "%s\"%s\": \"UnusedFullName\"", comma, languages[i].c_str());
+ if (i == 0)
+ comma = ",";
+ }
+
+ if (use_alpha_languages) {
+ data += base::StringPrintf("},\"%s\": {",
+ TranslateLanguageList::kAlphaLanguagesKey);
+ comma = "";
+ for (size_t i = 0; i < alpha_languages.size(); ++i) {
+ data += base::StringPrintf(
+ "%s\"%s\": 1", comma, alpha_languages[i].c_str());
+ if (i == 0)
+ comma = ",";
+ }
+ }
+
+ data += "}})";
+ }
+ net::TestURLFetcher* fetcher =
+ url_fetcher_factory_.GetFetcherByID(TranslateLanguageList::kFetcherId);
+ ASSERT_TRUE(fetcher != NULL);
+ fetcher->set_url(fetcher->GetOriginalURL());
+ fetcher->set_status(status);
+ fetcher->set_response_code(success ? 200 : 500);
+ fetcher->SetResponseString(data);
+ fetcher->delegate()->OnURLFetchComplete(fetcher);
+ }
+
+ void SetPrefObserverExpectation(const char* path) {
+ EXPECT_CALL(*this, OnPreferenceChanged(std::string(path)));
+ }
+
+ PrefChangeRegistrar::NamedChangeCallback pref_callback_;
+
+ private:
+ content::NotificationRegistrar notification_registrar_;
+ net::TestURLFetcherFactory url_fetcher_factory_;
+
+ // The infobars that have been removed.
+ // WARNING: the pointers point to deleted objects, use only for comparison.
+ std::set<InfoBarDelegate*> removed_infobars_;
+
+ DISALLOW_COPY_AND_ASSIGN(TranslateManagerRenderViewHostTest);
+};
+
+class MockTranslateBubbleFactory : public TranslateBubbleFactory {
+ public:
+ MockTranslateBubbleFactory() {}
+
+ virtual void ShowImplementation(BrowserWindow* window,
+ content::WebContents* web_contents,
+ TranslateTabHelper::TranslateStep step,
+ TranslateErrors::Type error_type) OVERRIDE {
+ if (model_) {
+ model_->SetViewState(
+ TranslateBubbleModelImpl::TranslateStepToViewState(step));
+ return;
+ }
+
+ TranslateTabHelper* translate_tab_helper =
+ TranslateTabHelper::FromWebContents(web_contents);
+ std::string source_language =
+ translate_tab_helper->GetLanguageState().original_language();
+ std::string target_language = TranslateDownloadManager::GetLanguageCode(
+ g_browser_process->GetApplicationLocale());
+ scoped_ptr<TranslateUIDelegate> ui_delegate(new TranslateUIDelegate(
+ web_contents, source_language, target_language));
+ model_.reset(new TranslateBubbleModelImpl(step, ui_delegate.Pass()));
+ }
+
+ TranslateBubbleModel* model() { return model_.get(); }
+
+ private:
+ scoped_ptr<TranslateBubbleModel> model_;
+
+ DISALLOW_COPY_AND_ASSIGN(MockTranslateBubbleFactory);
+};
+
+namespace {
+
+class TestRenderViewContextMenu : public RenderViewContextMenu {
+ public:
+ static TestRenderViewContextMenu* CreateContextMenu(
+ content::WebContents* web_contents) {
+ content::ContextMenuParams params;
+ params.media_type = blink::WebContextMenuData::MediaTypeNone;
+ params.x = 0;
+ params.y = 0;
+ params.has_image_contents = true;
+ params.media_flags = 0;
+ params.spellcheck_enabled = false;
+ params.is_editable = false;
+ params.page_url = web_contents->GetController().GetActiveEntry()->GetURL();
+#if defined(OS_MACOSX)
+ params.writing_direction_default = 0;
+ params.writing_direction_left_to_right = 0;
+ params.writing_direction_right_to_left = 0;
+#endif // OS_MACOSX
+ params.edit_flags = blink::WebContextMenuData::CanTranslate;
+ return new TestRenderViewContextMenu(web_contents->GetMainFrame(), params);
+ }
+
+ bool IsItemPresent(int id) {
+ return menu_model_.GetIndexOfCommandId(id) != -1;
+ }
+
+ virtual void PlatformInit() OVERRIDE {}
+ virtual void PlatformCancel() OVERRIDE {}
+ virtual bool GetAcceleratorForCommandId(int command_id,
+ ui::Accelerator* accelerator)
+ OVERRIDE {
+ return false;
+ }
+
+ private:
+ TestRenderViewContextMenu(content::RenderFrameHost* render_frame_host,
+ const content::ContextMenuParams& params)
+ : RenderViewContextMenu(render_frame_host, params) {}
+
+ DISALLOW_COPY_AND_ASSIGN(TestRenderViewContextMenu);
+};
+
+} // namespace
+
+TEST_F(TranslateManagerRenderViewHostTest, NormalTranslate) {
+ SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
+
+ // We should have an infobar.
+ TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ EXPECT_EQ(TranslateTabHelper::BEFORE_TRANSLATE, infobar->translate_step());
+
+ // Simulate clicking translate.
+ process()->sink().ClearMessages();
+ infobar->Translate();
+
+ // The "Translating..." infobar should be showing.
+ infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ EXPECT_EQ(TranslateTabHelper::TRANSLATING, infobar->translate_step());
+
+ // Simulate the translate script being retrieved (it only needs to be done
+ // once in the test as it is cached).
+ SimulateTranslateScriptURLFetch(true);
+
+ // Test that we sent the right message to the renderer.
+ int page_id = 0;
+ std::string original_lang, target_lang;
+ EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
+ EXPECT_EQ("fr", original_lang);
+ EXPECT_EQ("en", target_lang);
+
+ // Simulate the render notifying the translation has been done.
+ SimulateOnPageTranslated("fr", "en");
+
+ // The after translate infobar should be showing.
+ infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ EXPECT_EQ(TranslateTabHelper::AFTER_TRANSLATE, infobar->translate_step());
+
+ // Simulate changing the original language and translating.
+ process()->sink().ClearMessages();
+ std::string new_original_lang = infobar->language_code_at(0);
+ infobar->UpdateOriginalLanguageIndex(0);
+ infobar->Translate();
+ EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
+ EXPECT_EQ(new_original_lang, original_lang);
+ EXPECT_EQ("en", target_lang);
+ // Simulate the render notifying the translation has been done.
+ SimulateOnPageTranslated(new_original_lang, "en");
+ infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+
+ // Simulate changing the target language and translating.
+ process()->sink().ClearMessages();
+ std::string new_target_lang = infobar->language_code_at(1);
+ infobar->UpdateTargetLanguageIndex(1);
+ infobar->Translate();
+ EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
+ EXPECT_EQ(new_original_lang, original_lang);
+ EXPECT_EQ(new_target_lang, target_lang);
+ // Simulate the render notifying the translation has been done.
+ SimulateOnPageTranslated(new_original_lang, new_target_lang);
+ infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ EXPECT_EQ(new_target_lang, infobar->target_language_code());
+
+ // Reloading should trigger translation iff Always Translate is on.
+ ReloadAndWait(true);
+ infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ EXPECT_EQ(TranslateTabHelper::BEFORE_TRANSLATE, infobar->translate_step());
+ infobar->UpdateTargetLanguageIndex(1);
+ infobar->ToggleAlwaysTranslate();
+ ReloadAndWait(true);
+ infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ EXPECT_EQ(TranslateTabHelper::TRANSLATING, infobar->translate_step());
+ EXPECT_EQ(new_target_lang, infobar->target_language_code());
+}
+
+TEST_F(TranslateManagerRenderViewHostTest, TranslateScriptNotAvailable) {
+ SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
+
+ // We should have an infobar.
+ TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ EXPECT_EQ(TranslateTabHelper::BEFORE_TRANSLATE, infobar->translate_step());
+
+ // Simulate clicking translate.
+ process()->sink().ClearMessages();
+ infobar->Translate();
+ SimulateTranslateScriptURLFetch(false);
+
+ // We should not have sent any message to translate to the renderer.
+ EXPECT_FALSE(GetTranslateMessage(NULL, NULL, NULL));
+
+ // And we should have an error infobar showing.
+ infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ EXPECT_EQ(TranslateTabHelper::TRANSLATE_ERROR, infobar->translate_step());
+}
+
+// Ensures we deal correctly with pages for which the browser does not recognize
+// the language (the translate server may or not detect the language).
+TEST_F(TranslateManagerRenderViewHostTest, TranslateUnknownLanguage) {
+ // Simulate navigating to a page ("und" is the string returned by the CLD for
+ // languages it does not recognize).
+ SimulateNavigation(GURL("http://www.google.mys"), "und", true);
+
+ // We should not have an infobar as we don't know the language.
+ ASSERT_TRUE(GetTranslateInfoBar() == NULL);
+
+ // Translate the page anyway throught the context menu.
+ scoped_ptr<TestRenderViewContextMenu> menu(
+ TestRenderViewContextMenu::CreateContextMenu(web_contents()));
+ menu->Init();
+ menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
+
+ // To test that bug #49018 if fixed, make sure we deal correctly with errors.
+ // Simulate a failure to fetch the translate script.
+ SimulateTranslateScriptURLFetch(false);
+ TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ EXPECT_EQ(TranslateTabHelper::TRANSLATE_ERROR, infobar->translate_step());
+ EXPECT_TRUE(infobar->is_error());
+ infobar->MessageInfoBarButtonPressed();
+ SimulateTranslateScriptURLFetch(true); // This time succeed.
+
+ // Simulate the render notifying the translation has been done, the server
+ // having detected the page was in a known and supported language.
+ SimulateOnPageTranslated("fr", "en");
+
+ // The after translate infobar should be showing.
+ infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ EXPECT_EQ(TranslateTabHelper::AFTER_TRANSLATE, infobar->translate_step());
+ EXPECT_EQ("fr", infobar->original_language_code());
+ EXPECT_EQ("en", infobar->target_language_code());
+
+ // Let's run the same steps but this time the server detects the page is
+ // already in English.
+ SimulateNavigation(GURL("http://www.google.com"), "und", true);
+ menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
+ menu->Init();
+ menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
+ SimulateOnPageTranslated(1, "en", "en", TranslateErrors::IDENTICAL_LANGUAGES);
+ infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ EXPECT_EQ(TranslateTabHelper::TRANSLATE_ERROR, infobar->translate_step());
+ EXPECT_EQ(TranslateErrors::IDENTICAL_LANGUAGES, infobar->error_type());
+
+ // Let's run the same steps again but this time the server fails to detect the
+ // page's language (it returns an empty string).
+ SimulateNavigation(GURL("http://www.google.com"), "und", true);
+ menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
+ menu->Init();
+ menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
+ SimulateOnPageTranslated(
+ 2, std::string(), "en", TranslateErrors::UNKNOWN_LANGUAGE);
+ infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ EXPECT_EQ(TranslateTabHelper::TRANSLATE_ERROR, infobar->translate_step());
+ EXPECT_EQ(TranslateErrors::UNKNOWN_LANGUAGE, infobar->error_type());
+}
+
+// Tests that we show/don't show an info-bar for the languages.
+TEST_F(TranslateManagerRenderViewHostTest, TestLanguages) {
+ 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);
+
+ // We should not have a translate infobar.
+ TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar == NULL);
+
+ SimulateNavigation(url, lang, true);
+
+ // Verify we have/don't have an info-bar as expected.
+ infobar = GetTranslateInfoBar();
+ bool expected =
+ TranslateDownloadManager::IsSupportedLanguage(lang) && lang != "en";
+ EXPECT_EQ(expected, infobar != NULL);
+
+ if (infobar != NULL)
+ EXPECT_TRUE(CloseTranslateInfoBar());
+ }
+}
+
+// Test the fetching of languages from the translate server
+TEST_F(TranslateManagerRenderViewHostTest, FetchLanguagesFromTranslateServer) {
+ std::vector<std::string> server_languages;
+ // A list of languages to fake being returned by the translate server.
+ server_languages.push_back("aa");
+ server_languages.push_back("ak");
+ server_languages.push_back("ab");
+ server_languages.push_back("en-CA");
+ server_languages.push_back("zh");
+ server_languages.push_back("yi");
+ server_languages.push_back("fr-FR");
+ server_languages.push_back("xx");
+
+ std::vector<std::string> alpha_languages;
+ alpha_languages.push_back("aa");
+ alpha_languages.push_back("yi");
+
+ // First, get the default languages list. Note that calling
+ // GetSupportedLanguages() invokes RequestLanguageList() internally.
+ std::vector<std::string> default_supported_languages;
+ TranslateDownloadManager::GetSupportedLanguages(&default_supported_languages);
+ // To make sure we got the defaults and don't confuse them with the mocks.
+ ASSERT_NE(default_supported_languages.size(), server_languages.size());
+
+ // Check that we still get the defaults until the URLFetch has completed.
+ std::vector<std::string> current_supported_languages;
+ TranslateDownloadManager::GetSupportedLanguages(&current_supported_languages);
+ EXPECT_EQ(default_supported_languages, current_supported_languages);
+
+ // Also check that it didn't change if we failed the URL fetch.
+ SimulateSupportedLanguagesURLFetch(
+ false, std::vector<std::string>(), true, std::vector<std::string>());
+ current_supported_languages.clear();
+ TranslateDownloadManager::GetSupportedLanguages(&current_supported_languages);
+ EXPECT_EQ(default_supported_languages, current_supported_languages);
+
+ // Now check that we got the appropriate set of languages from the server.
+ SimulateSupportedLanguagesURLFetch(
+ true, server_languages, true, alpha_languages);
+ current_supported_languages.clear();
+ TranslateDownloadManager::GetSupportedLanguages(&current_supported_languages);
+ // "xx" can't be displayed in the Translate inforbar, so this is eliminated.
+ EXPECT_EQ(server_languages.size() - 1, current_supported_languages.size());
+ // Not sure we need to guarantee the order of languages, so we find them.
+ for (size_t i = 0; i < server_languages.size(); ++i) {
+ const std::string& lang = server_languages[i];
+ if (lang == "xx")
+ continue;
+ EXPECT_NE(current_supported_languages.end(),
+ std::find(current_supported_languages.begin(),
+ current_supported_languages.end(),
+ lang));
+ bool is_alpha =
+ std::find(alpha_languages.begin(), alpha_languages.end(), lang) !=
+ alpha_languages.end();
+ EXPECT_EQ(TranslateDownloadManager::IsAlphaLanguage(lang), is_alpha);
+ }
+}
+
+// Test the fetching of languages from the translate server without 'al'
+// parameter.
+TEST_F(TranslateManagerRenderViewHostTest,
+ FetchLanguagesFromTranslateServerWithoutAlpha) {
+ std::vector<std::string> server_languages;
+ server_languages.push_back("aa");
+ server_languages.push_back("ak");
+ server_languages.push_back("ab");
+ server_languages.push_back("en-CA");
+ server_languages.push_back("zh");
+ server_languages.push_back("yi");
+ server_languages.push_back("fr-FR");
+ server_languages.push_back("xx");
+
+ std::vector<std::string> alpha_languages;
+ alpha_languages.push_back("aa");
+ alpha_languages.push_back("yi");
+
+ // call GetSupportedLanguages to call RequestLanguageList internally.
+ std::vector<std::string> default_supported_languages;
+ TranslateDownloadManager::GetSupportedLanguages(&default_supported_languages);
+
+ SimulateSupportedLanguagesURLFetch(
+ true, server_languages, false, alpha_languages);
+
+ std::vector<std::string> current_supported_languages;
+ TranslateDownloadManager::GetSupportedLanguages(&current_supported_languages);
+
+ // "xx" can't be displayed in the Translate inforbar, so this is eliminated.
+ EXPECT_EQ(server_languages.size() - 1, current_supported_languages.size());
+
+ for (size_t i = 0; i < server_languages.size(); ++i) {
+ const std::string& lang = server_languages[i];
+ if (lang == "xx")
+ continue;
+ EXPECT_NE(current_supported_languages.end(),
+ std::find(current_supported_languages.begin(),
+ current_supported_languages.end(),
+ lang));
+ EXPECT_FALSE(TranslateDownloadManager::IsAlphaLanguage(lang));
+ }
+}
+
+// Tests auto-translate on page.
+TEST_F(TranslateManagerRenderViewHostTest, AutoTranslateOnNavigate) {
+ SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
+
+ // Simulate the user translating.
+ TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ infobar->Translate();
+ // Simulate the translate script being retrieved.
+ SimulateTranslateScriptURLFetch(true);
+ SimulateOnPageTranslated("fr", "en");
+
+ // Now navigate to a new page in the same language.
+ process()->sink().ClearMessages();
+ SimulateNavigation(GURL("http://news.google.fr"), "fr", true);
+
+ // This should have automatically triggered a translation.
+ int page_id = 0;
+ std::string original_lang, target_lang;
+ EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
+ EXPECT_EQ(1, page_id);
+ EXPECT_EQ("fr", original_lang);
+ EXPECT_EQ("en", target_lang);
+
+ // Now navigate to a page in a different language.
+ process()->sink().ClearMessages();
+ SimulateNavigation(GURL("http://news.google.es"), "es", true);
+
+ // This should not have triggered a translate.
+ EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
+}
+
+// Tests that multiple OnPageContents do not cause multiple infobars.
+TEST_F(TranslateManagerRenderViewHostTest, MultipleOnPageContents) {
+ SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
+
+ // Simulate clicking 'Nope' (don't translate).
+ EXPECT_TRUE(DenyTranslation());
+ EXPECT_EQ(0U, infobar_service()->infobar_count());
+
+ // Send a new PageContents, we should not show an infobar.
+ SimulateOnTranslateLanguageDetermined("fr", true);
+ EXPECT_EQ(0U, infobar_service()->infobar_count());
+
+ // Do the same steps but simulate closing the infobar this time.
+ SimulateNavigation(GURL("http://www.youtube.fr"), "fr", true);
+ EXPECT_TRUE(CloseTranslateInfoBar());
+ EXPECT_EQ(0U, infobar_service()->infobar_count());
+ SimulateOnTranslateLanguageDetermined("fr", true);
+ EXPECT_EQ(0U, infobar_service()->infobar_count());
+}
+
+// Test that reloading the page brings back the infobar if the
+// reload succeeded and does not bring it back the reload fails.
+TEST_F(TranslateManagerRenderViewHostTest, Reload) {
+ SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
+
+ EXPECT_TRUE(CloseTranslateInfoBar());
+
+ // Reload should bring back the infobar if the reload succeeds.
+ ReloadAndWait(true);
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL);
+ EXPECT_TRUE(CloseTranslateInfoBar());
+
+ // ...But not show it if the reload fails.
+ ReloadAndWait(false);
+ EXPECT_TRUE(GetTranslateInfoBar() == NULL);
+
+ // If we set reload attempts to a high value, we will not see the infobar
+ // immediately.
+ TranslateManager* manager =
+ TranslateTabHelper::GetManagerFromWebContents(web_contents());
+ manager->set_translate_max_reload_attemps(100);
+ ReloadAndWait(true);
+ EXPECT_TRUE(GetTranslateInfoBar() == NULL);
+}
+
+// Test that reloading the page by way of typing again the URL in the
+// location bar brings back the infobar.
+TEST_F(TranslateManagerRenderViewHostTest, ReloadFromLocationBar) {
+ GURL url("http://www.google.fr");
+ SimulateNavigation(url, "fr", true);
+
+ EXPECT_TRUE(CloseTranslateInfoBar());
+
+ // Create a pending navigation and simulate a page load. That should be the
+ // equivalent of typing the URL again in the location bar.
+ NavEntryCommittedObserver nav_observer(web_contents());
+ web_contents()->GetController().LoadURL(
+ url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string());
+ rvh_tester()->SendNavigate(0, url);
+
+ // Test that we are really getting a same page navigation, the test would be
+ // useless if it was not the case.
+ const content::LoadCommittedDetails& nav_details =
+ nav_observer.load_committed_details();
+ EXPECT_TRUE(nav_details.entry != NULL); // There was a navigation.
+ EXPECT_EQ(content::NAVIGATION_TYPE_SAME_PAGE, nav_details.type);
+
+ // The TranslateManager class processes the navigation entry committed
+ // notification in a posted task; process that task.
+ base::MessageLoop::current()->RunUntilIdle();
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL);
+}
+
+// Tests that a closed translate infobar does not reappear when navigating
+// in-page.
+TEST_F(TranslateManagerRenderViewHostTest, CloseInfoBarInPageNavigation) {
+ SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
+
+ EXPECT_TRUE(CloseTranslateInfoBar());
+
+ // Navigate in page, no infobar should be shown.
+ SimulateNavigation(GURL("http://www.google.fr/#ref1"), "fr", true);
+ EXPECT_TRUE(GetTranslateInfoBar() == NULL);
+
+ // Navigate out of page, a new infobar should show.
+ SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true);
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL);
+}
+
+// Tests that a closed translate infobar does not reappear when navigating
+// in a subframe. (http://crbug.com/48215)
+TEST_F(TranslateManagerRenderViewHostTest, CloseInfoBarInSubframeNavigation) {
+ SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
+
+ EXPECT_TRUE(CloseTranslateInfoBar());
+
+ // Simulate a sub-frame auto-navigating.
+ rvh_tester()->SendNavigateWithTransition(
+ 1, GURL("http://pub.com"), content::PAGE_TRANSITION_AUTO_SUBFRAME);
+ EXPECT_TRUE(GetTranslateInfoBar() == NULL);
+
+ // Simulate the user navigating in a sub-frame.
+ rvh_tester()->SendNavigateWithTransition(
+ 2, GURL("http://pub.com"), content::PAGE_TRANSITION_MANUAL_SUBFRAME);
+ EXPECT_TRUE(GetTranslateInfoBar() == NULL);
+
+ // Navigate out of page, a new infobar should show.
+ SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true);
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL);
+}
+
+// Tests that denying translation is sticky when navigating in page.
+TEST_F(TranslateManagerRenderViewHostTest, DenyTranslateInPageNavigation) {
+ SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
+
+ // Simulate clicking 'Nope' (don't translate).
+ EXPECT_TRUE(DenyTranslation());
+
+ // Navigate in page, no infobar should be shown.
+ SimulateNavigation(GURL("http://www.google.fr/#ref1"), "fr", true);
+ EXPECT_TRUE(GetTranslateInfoBar() == NULL);
+
+ // Navigate out of page, a new infobar should show.
+ SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true);
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL);
+}
+
+// Tests that after translating and closing the infobar, the infobar does not
+// return when navigating in page.
+TEST_F(TranslateManagerRenderViewHostTest,
+ TranslateCloseInfoBarInPageNavigation) {
+ SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
+
+ // Simulate the user translating.
+ TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ infobar->Translate();
+ // Simulate the translate script being retrieved.
+ SimulateTranslateScriptURLFetch(true);
+ SimulateOnPageTranslated("fr", "en");
+
+ EXPECT_TRUE(CloseTranslateInfoBar());
+
+ // Navigate in page, no infobar should be shown.
+ SimulateNavigation(GURL("http://www.google.fr/#ref1"), "fr", true);
+ EXPECT_TRUE(GetTranslateInfoBar() == NULL);
+
+ // Navigate out of page, a new infobar should show.
+ // Note that we navigate to a page in a different language so we don't trigger
+ // the auto-translate feature (it would translate the page automatically and
+ // the before translate inforbar would not be shown).
+ SimulateNavigation(GURL("http://www.google.de"), "de", true);
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL);
+}
+
+// Tests that the after translate the infobar still shows when navigating
+// in-page.
+TEST_F(TranslateManagerRenderViewHostTest, TranslateInPageNavigation) {
+ SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
+
+ // Simulate the user translating.
+ TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ infobar->Translate();
+ SimulateTranslateScriptURLFetch(true);
+ SimulateOnPageTranslated("fr", "en");
+ // The after translate infobar is showing.
+ infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+
+ // Navigate out of page, a new infobar should show.
+ // See note in TranslateCloseInfoBarInPageNavigation test on why it is
+ // important to navigate to a page in a different language for this test.
+ SimulateNavigation(GURL("http://www.google.de"), "de", true);
+ // The old infobar is gone.
+ EXPECT_TRUE(CheckInfoBarRemovedAndReset(infobar));
+ // And there is a new one.
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL);
+}
+
+// Tests that no translate infobar is shown when navigating to a page in an
+// unsupported language.
+TEST_F(TranslateManagerRenderViewHostTest, CLDReportsUnsupportedPageLanguage) {
+ // Simulate navigating to a page and getting an unsupported language.
+ SimulateNavigation(GURL("http://www.google.com"), "qbz", true);
+
+ // No info-bar should be shown.
+ EXPECT_TRUE(GetTranslateInfoBar() == NULL);
+}
+
+// Tests that we deal correctly with unsupported languages returned by the
+// server.
+// The translation server might return a language we don't support.
+TEST_F(TranslateManagerRenderViewHostTest, ServerReportsUnsupportedLanguage) {
+ SimulateNavigation(GURL("http://mail.google.fr"), "fr", true);
+ TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ process()->sink().ClearMessages();
+ infobar->Translate();
+ SimulateTranslateScriptURLFetch(true);
+ // Simulate the render notifying the translation has been done, but it
+ // reports a language we don't support.
+ SimulateOnPageTranslated("qbz", "en");
+
+ // An error infobar should be showing to report that we don't support this
+ // language.
+ infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ EXPECT_EQ(TranslateTabHelper::TRANSLATE_ERROR, infobar->translate_step());
+
+ // This infobar should have a button (so the string should not be empty).
+ ASSERT_FALSE(infobar->GetMessageInfoBarButtonText().empty());
+
+ // Pressing the button on that infobar should revert to the original language.
+ process()->sink().ClearMessages();
+ infobar->MessageInfoBarButtonPressed();
+ const IPC::Message* message = process()->sink().GetFirstMessageMatching(
+ ChromeViewMsg_RevertTranslation::ID);
+ EXPECT_TRUE(message != NULL);
+ // And it should have removed the infobar.
+ EXPECT_TRUE(GetTranslateInfoBar() == NULL);
+}
+
+// Tests that no translate infobar is shown and context menu is disabled, when
+// Chrome is in a language that the translate server does not support.
+TEST_F(TranslateManagerRenderViewHostTest, UnsupportedUILanguage) {
+ std::string original_lang = g_browser_process->GetApplicationLocale();
+ SetApplicationLocale("qbz");
+
+ // Make sure that the accept language list only contains unsupported languages
+ Profile* profile =
+ Profile::FromBrowserContext(web_contents()->GetBrowserContext());
+ PrefService* prefs = profile->GetPrefs();
+ prefs->SetString(prefs::kAcceptLanguages, "qbz");
+
+ // Simulate navigating to a page in a language supported by the translate
+ // server.
+ SimulateNavigation(GURL("http://www.google.com"), "en", true);
+
+ // No info-bar should be shown.
+ EXPECT_TRUE(GetTranslateInfoBar() == NULL);
+
+ // And the context menu option should be disabled too.
+ scoped_ptr<TestRenderViewContextMenu> menu(
+ TestRenderViewContextMenu::CreateContextMenu(web_contents()));
+ menu->Init();
+ EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
+ EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
+
+ SetApplicationLocale(original_lang);
+}
+
+// Tests that the first supported accept language is selected
+TEST_F(TranslateManagerRenderViewHostTest, TranslateAcceptLanguage) {
+ // Set locate to non-existant language
+ std::string original_lang = g_browser_process->GetApplicationLocale();
+ SetApplicationLocale("qbz");
+
+ // Set Qbz and French as the only accepted languages
+ Profile* profile =
+ Profile::FromBrowserContext(web_contents()->GetBrowserContext());
+ PrefService* prefs = profile->GetPrefs();
+ prefs->SetString(prefs::kAcceptLanguages, "qbz,fr");
+
+ // Go to a German page
+ SimulateNavigation(GURL("http://google.de"), "de", true);
+
+ // Expect the infobar to pop up
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL);
+
+ // Set Qbz and English-US as the only accepted languages to test the country
+ // code removal code which was causing a crash as filed in Issue 90106,
+ // a crash caused by a language with a country code that wasn't recognized.
+ prefs->SetString(prefs::kAcceptLanguages, "qbz,en-us");
+
+ // Go to a German page
+ SimulateNavigation(GURL("http://google.de"), "de", true);
+
+ // Expect the infobar to pop up
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL);
+}
+
+// Tests that the translate enabled preference is honored.
+TEST_F(TranslateManagerRenderViewHostTest, TranslateEnabledPref) {
+ // Make sure the pref allows translate.
+ Profile* profile =
+ Profile::FromBrowserContext(web_contents()->GetBrowserContext());
+ PrefService* prefs = profile->GetPrefs();
+ prefs->SetBoolean(prefs::kEnableTranslate, true);
+
+ SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
+
+ // An infobar should be shown.
+ TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
+ EXPECT_TRUE(infobar != NULL);
+
+ // Disable translate.
+ prefs->SetBoolean(prefs::kEnableTranslate, false);
+
+ // Navigate to a new page, that should close the previous infobar.
+ GURL url("http://www.youtube.fr");
+ NavigateAndCommit(url);
+ infobar = GetTranslateInfoBar();
+ EXPECT_TRUE(infobar == NULL);
+
+ // Simulate getting the page contents and language, that should not trigger
+ // a translate infobar.
+ SimulateOnTranslateLanguageDetermined("fr", true);
+ infobar = GetTranslateInfoBar();
+ EXPECT_TRUE(infobar == NULL);
+}
+
+// Tests the "Never translate <language>" pref.
+TEST_F(TranslateManagerRenderViewHostTest, NeverTranslateLanguagePref) {
+ GURL url("http://www.google.fr");
+ SimulateNavigation(url, "fr", true);
+
+ // An infobar should be shown.
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL);
+
+ // Select never translate this language.
+ Profile* profile =
+ Profile::FromBrowserContext(web_contents()->GetBrowserContext());
+ PrefService* prefs = profile->GetPrefs();
+ PrefChangeRegistrar registrar;
+ registrar.Init(prefs);
+ registrar.Add(TranslatePrefs::kPrefTranslateBlockedLanguages, pref_callback_);
+ scoped_ptr<TranslatePrefs> translate_prefs(
+ TranslateTabHelper::CreateTranslatePrefs(prefs));
+ EXPECT_FALSE(translate_prefs->IsBlockedLanguage("fr"));
+ TranslateAcceptLanguages* accept_languages =
+ TranslateTabHelper::GetTranslateAcceptLanguages(profile);
+ EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
+ SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateBlockedLanguages);
+ translate_prefs->BlockLanguage("fr");
+ EXPECT_TRUE(translate_prefs->IsBlockedLanguage("fr"));
+ EXPECT_FALSE(translate_prefs->IsSiteBlacklisted(url.host()));
+ EXPECT_FALSE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
+
+ EXPECT_TRUE(CloseTranslateInfoBar());
+
+ // Navigate to a new page also in French.
+ SimulateNavigation(GURL("http://wwww.youtube.fr"), "fr", true);
+
+ // There should not be a translate infobar.
+ EXPECT_TRUE(GetTranslateInfoBar() == NULL);
+
+ // Remove the language from the blacklist.
+ SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateBlockedLanguages);
+ translate_prefs->UnblockLanguage("fr");
+ EXPECT_FALSE(translate_prefs->IsBlockedLanguage("fr"));
+ EXPECT_FALSE(translate_prefs->IsSiteBlacklisted(url.host()));
+ EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
+
+ // Navigate to a page in French.
+ SimulateNavigation(url, "fr", true);
+
+ // There should be a translate infobar.
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL);
+}
+
+// Tests the "Never translate this site" pref.
+TEST_F(TranslateManagerRenderViewHostTest, NeverTranslateSitePref) {
+ GURL url("http://www.google.fr");
+ std::string host(url.host());
+ SimulateNavigation(url, "fr", true);
+
+ // An infobar should be shown.
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL);
+
+ // Select never translate this site.
+ Profile* profile =
+ Profile::FromBrowserContext(web_contents()->GetBrowserContext());
+ PrefService* prefs = profile->GetPrefs();
+ PrefChangeRegistrar registrar;
+ registrar.Init(prefs);
+ registrar.Add(TranslatePrefs::kPrefTranslateSiteBlacklist, pref_callback_);
+ scoped_ptr<TranslatePrefs> translate_prefs(
+ TranslateTabHelper::CreateTranslatePrefs(prefs));
+ EXPECT_FALSE(translate_prefs->IsSiteBlacklisted(host));
+ TranslateAcceptLanguages* accept_languages =
+ TranslateTabHelper::GetTranslateAcceptLanguages(profile);
+ EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
+ SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateSiteBlacklist);
+ translate_prefs->BlacklistSite(host);
+ EXPECT_TRUE(translate_prefs->IsSiteBlacklisted(host));
+ EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
+
+ EXPECT_TRUE(CloseTranslateInfoBar());
+
+ // Navigate to a new page also on the same site.
+ SimulateNavigation(GURL("http://www.google.fr/hello"), "fr", true);
+
+ // There should not be a translate infobar.
+ EXPECT_TRUE(GetTranslateInfoBar() == NULL);
+
+ // Remove the site from the blacklist.
+ SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateSiteBlacklist);
+ translate_prefs->RemoveSiteFromBlacklist(host);
+ EXPECT_FALSE(translate_prefs->IsSiteBlacklisted(host));
+ EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
+
+ // Navigate to a page in French.
+ SimulateNavigation(url, "fr", true);
+
+ // There should be a translate infobar.
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL);
+}
+
+// Tests the "Always translate this language" pref.
+TEST_F(TranslateManagerRenderViewHostTest, AlwaysTranslateLanguagePref) {
+ // Select always translate French to English.
+ Profile* profile =
+ Profile::FromBrowserContext(web_contents()->GetBrowserContext());
+ PrefService* prefs = profile->GetPrefs();
+ PrefChangeRegistrar registrar;
+ registrar.Init(prefs);
+ registrar.Add(TranslatePrefs::kPrefTranslateWhitelists, pref_callback_);
+ scoped_ptr<TranslatePrefs> translate_prefs(
+ TranslateTabHelper::CreateTranslatePrefs(prefs));
+ SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateWhitelists);
+ translate_prefs->WhitelistLanguagePair("fr", "en");
+
+ // Load a page in French.
+ SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
+
+ // It should have triggered an automatic translation to English.
+
+ // The translating infobar should be showing.
+ TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ EXPECT_EQ(TranslateTabHelper::TRANSLATING, infobar->translate_step());
+ SimulateTranslateScriptURLFetch(true);
+ int page_id = 0;
+ std::string original_lang, target_lang;
+ EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
+ EXPECT_EQ("fr", original_lang);
+ EXPECT_EQ("en", target_lang);
+ process()->sink().ClearMessages();
+
+ // Try another language, it should not be autotranslated.
+ SimulateNavigation(GURL("http://www.google.es"), "es", true);
+ EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL);
+ EXPECT_TRUE(CloseTranslateInfoBar());
+
+ // Let's switch to incognito mode, it should not be autotranslated in that
+ // case either.
+ TestingProfile* test_profile =
+ static_cast<TestingProfile*>(web_contents()->GetBrowserContext());
+ test_profile->ForceIncognito(true);
+ SimulateNavigation(GURL("http://www.youtube.fr"), "fr", true);
+ EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL);
+ EXPECT_TRUE(CloseTranslateInfoBar());
+ test_profile->ForceIncognito(false); // Get back to non incognito.
+
+ // Now revert the always translate pref and make sure we go back to expected
+ // behavior, which is show a "before translate" infobar.
+ SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateWhitelists);
+ translate_prefs->RemoveLanguagePairFromWhitelist("fr", "en");
+ SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
+ EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
+ infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ EXPECT_EQ(TranslateTabHelper::BEFORE_TRANSLATE, infobar->translate_step());
+}
+
+// Context menu.
+TEST_F(TranslateManagerRenderViewHostTest, ContextMenu) {
+ // Blacklist www.google.fr and French for translation.
+ GURL url("http://www.google.fr");
+ Profile* profile =
+ Profile::FromBrowserContext(web_contents()->GetBrowserContext());
+ scoped_ptr<TranslatePrefs> translate_prefs(
+ TranslateTabHelper::CreateTranslatePrefs(profile->GetPrefs()));
+ translate_prefs->BlockLanguage("fr");
+ translate_prefs->BlacklistSite(url.host());
+ EXPECT_TRUE(translate_prefs->IsBlockedLanguage("fr"));
+ EXPECT_TRUE(translate_prefs->IsSiteBlacklisted(url.host()));
+
+ // Simulate navigating to a page in French. The translate menu should show but
+ // should only be enabled when the page language has been received.
+ NavigateAndCommit(url);
+ scoped_ptr<TestRenderViewContextMenu> menu(
+ TestRenderViewContextMenu::CreateContextMenu(web_contents()));
+ menu->Init();
+ EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
+ EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
+
+ // Simulate receiving the language.
+ SimulateOnTranslateLanguageDetermined("fr", true);
+ menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
+ menu->Init();
+ EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
+ EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
+
+ // Use the menu to translate the page.
+ menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
+
+ // That should have triggered a translation.
+ // The "translating..." infobar should be showing.
+ TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ EXPECT_EQ(TranslateTabHelper::TRANSLATING, infobar->translate_step());
+ SimulateTranslateScriptURLFetch(true);
+ int page_id = 0;
+ std::string original_lang, target_lang;
+ EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
+ EXPECT_EQ("fr", original_lang);
+ EXPECT_EQ("en", target_lang);
+ process()->sink().ClearMessages();
+
+ // This should also have reverted the blacklisting of this site and language.
+ EXPECT_FALSE(translate_prefs->IsBlockedLanguage("fr"));
+ EXPECT_FALSE(translate_prefs->IsSiteBlacklisted(url.host()));
+
+ // Let's simulate the page being translated.
+ SimulateOnPageTranslated("fr", "en");
+
+ // The translate menu should now be disabled.
+ menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
+ menu->Init();
+ EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
+ EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
+
+ // Test that selecting translate in the context menu WHILE the page is being
+ // translated does nothing (this could happen if autotranslate kicks-in and
+ // the user selects the menu while the translation is being performed).
+ SimulateNavigation(GURL("http://www.google.es"), "es", true);
+ infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ infobar->Translate();
+ EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
+ process()->sink().ClearMessages();
+ menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
+ menu->Init();
+ EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
+ menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
+ // No message expected since the translation should have been ignored.
+ EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
+
+ // Now test that selecting translate in the context menu AFTER the page has
+ // been translated does nothing.
+ SimulateNavigation(GURL("http://www.google.de"), "de", true);
+ infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ infobar->Translate();
+ EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
+ process()->sink().ClearMessages();
+ menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
+ menu->Init();
+ EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
+ SimulateOnPageTranslated("de", "en");
+ menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
+ // No message expected since the translation should have been ignored.
+ EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
+
+ // Test that the translate context menu is enabled when the page is in an
+ // unknown language.
+ SimulateNavigation(url, "und", true);
+ menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
+ menu->Init();
+ EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
+ EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
+
+ // Test that the translate context menu is enabled even if the page is in an
+ // unsupported language.
+ SimulateNavigation(url, "qbz", true);
+ menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
+ menu->Init();
+ EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
+ EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
+}
+
+// Tests that an extra always/never translate button is shown on the "before
+// translate" infobar when the translation is accepted/declined 3 times,
+// only when not in incognito mode.
+TEST_F(TranslateManagerRenderViewHostTest, BeforeTranslateExtraButtons) {
+ Profile* profile =
+ Profile::FromBrowserContext(web_contents()->GetBrowserContext());
+ scoped_ptr<TranslatePrefs> translate_prefs(
+ TranslateTabHelper::CreateTranslatePrefs(profile->GetPrefs()));
+ translate_prefs->ResetTranslationAcceptedCount("fr");
+ translate_prefs->ResetTranslationDeniedCount("fr");
+ translate_prefs->ResetTranslationAcceptedCount("de");
+ translate_prefs->ResetTranslationDeniedCount("de");
+
+ // We'll do 4 times in incognito mode first to make sure the button is not
+ // shown in that case, then 4 times in normal mode.
+ TranslateInfoBarDelegate* infobar;
+ TestingProfile* test_profile =
+ static_cast<TestingProfile*>(web_contents()->GetBrowserContext());
+ static_cast<extensions::TestExtensionSystem*>(
+ extensions::ExtensionSystem::Get(test_profile))->CreateProcessManager();
+ 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(TranslateTabHelper::BEFORE_TRANSLATE, infobar->translate_step());
+ if (i < 7) {
+ EXPECT_FALSE(infobar->ShouldShowAlwaysTranslateShortcut());
+ infobar->Translate();
+ process()->sink().ClearMessages();
+ } else {
+ EXPECT_TRUE(infobar->ShouldShowAlwaysTranslateShortcut());
+ }
+ if (i == 3)
+ test_profile->ForceIncognito(false);
+ }
+ // Simulate the user pressing "Always translate French".
+ infobar->AlwaysTranslatePageLanguage();
+ EXPECT_TRUE(translate_prefs->IsLanguagePairWhitelisted("fr", "en"));
+ // Simulate the translate script being retrieved (it only needs to be done
+ // once in the test as it is cached).
+ SimulateTranslateScriptURLFetch(true);
+ // That should have triggered a page translate.
+ int page_id = 0;
+ std::string original_lang, target_lang;
+ EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
+ process()->sink().ClearMessages();
+
+ // Now test that declining the translation causes a "never translate" button
+ // to be shown (in non incognito mode only).
+ 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(TranslateTabHelper::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);
+ }
+ // Simulate the user pressing "Never translate French".
+ infobar->NeverTranslatePageLanguage();
+ EXPECT_TRUE(translate_prefs->IsBlockedLanguage("de"));
+ // No translation should have occured and the infobar should be gone.
+ EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
+ process()->sink().ClearMessages();
+ ASSERT_TRUE(GetTranslateInfoBar() == NULL);
+}
+
+// Tests that we don't show a translate infobar when a page instructs that it
+// should not be translated.
+TEST_F(TranslateManagerRenderViewHostTest, NonTranslatablePage) {
+ SimulateNavigation(GURL("http://mail.google.fr"), "fr", false);
+
+ // We should not have an infobar.
+ EXPECT_TRUE(GetTranslateInfoBar() == NULL);
+
+ // The context menu is enabled to allow users to force translation.
+ scoped_ptr<TestRenderViewContextMenu> menu(
+ TestRenderViewContextMenu::CreateContextMenu(web_contents()));
+ menu->Init();
+ EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
+ EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
+}
+
+// Tests that the script is expired and refetched as expected.
+TEST_F(TranslateManagerRenderViewHostTest, ScriptExpires) {
+ ExpireTranslateScriptImmediately();
+
+ SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
+ TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ process()->sink().ClearMessages();
+ infobar->Translate();
+ SimulateTranslateScriptURLFetch(true);
+ SimulateOnPageTranslated("fr", "en");
+
+ // A task should have been posted to clear the script, run it.
+ base::MessageLoop::current()->RunUntilIdle();
+
+ // Do another navigation and translation.
+ SimulateNavigation(GURL("http://www.google.es"), "es", true);
+ infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar != NULL);
+ process()->sink().ClearMessages();
+ infobar->Translate();
+ // If we don't simulate the URL fetch, the TranslateManager should be waiting
+ // for the script and no message should have been sent to the renderer.
+ EXPECT_TRUE(process()->sink().GetFirstMessageMatching(
+ ChromeViewMsg_TranslatePage::ID) == NULL);
+ // Now simulate the URL fetch.
+ SimulateTranslateScriptURLFetch(true);
+ // Now the message should have been sent.
+ int page_id = 0;
+ std::string original_lang, target_lang;
+ EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
+ EXPECT_EQ("es", original_lang);
+ EXPECT_EQ("en", target_lang);
+}
+
+TEST_F(TranslateManagerRenderViewHostTest, DownloadsAndHistoryNotTranslated) {
+ ASSERT_FALSE(
+ TranslateManager::IsTranslatableURL(GURL(chrome::kChromeUIDownloadsURL)));
+ ASSERT_FALSE(
+ TranslateManager::IsTranslatableURL(GURL(chrome::kChromeUIHistoryURL)));
+}
+
+#if defined(USE_AURA)
+
+TEST_F(TranslateManagerRenderViewHostTest, BubbleNormalTranslate) {
+ // Prepare for the bubble
+ TranslateService::SetUseInfobar(false);
+ MockTranslateBubbleFactory* factory = new MockTranslateBubbleFactory;
+ scoped_ptr<TranslateBubbleFactory> factory_ptr(factory);
+ TranslateBubbleFactory::SetFactory(factory);
+
+ SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
+
+ // Check the bubble exists instead of the infobar.
+ TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar == NULL);
+ TranslateBubbleModel* bubble = factory->model();
+ ASSERT_TRUE(bubble != NULL);
+ EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE,
+ bubble->GetViewState());
+
+ // Simulate clicking translate.
+ process()->sink().ClearMessages();
+ bubble->Translate();
+
+ // Check the bubble shows "Translating...".
+ bubble = factory->model();
+ ASSERT_TRUE(bubble != NULL);
+ EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_TRANSLATING,
+ bubble->GetViewState());
+
+ // Simulate the translate script being retrieved (it only needs to be done
+ // once in the test as it is cached).
+ SimulateTranslateScriptURLFetch(true);
+
+ // Simulate the render notifying the translation has been done.
+ SimulateOnPageTranslated("fr", "en");
+
+ // Check the bubble shows "Translated."
+ bubble = factory->model();
+ ASSERT_TRUE(bubble != NULL);
+ EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE,
+ bubble->GetViewState());
+}
+
+TEST_F(TranslateManagerRenderViewHostTest, BubbleTranslateScriptNotAvailable) {
+ // Prepare for the bubble
+ TranslateService::SetUseInfobar(false);
+ MockTranslateBubbleFactory* factory = new MockTranslateBubbleFactory;
+ scoped_ptr<TranslateBubbleFactory> factory_ptr(factory);
+ TranslateBubbleFactory::SetFactory(factory);
+
+ SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
+
+ // Check the bubble exists instead of the infobar.
+ TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar == NULL);
+ TranslateBubbleModel* bubble = factory->model();
+ ASSERT_TRUE(bubble != NULL);
+ EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE,
+ bubble->GetViewState());
+
+ // Simulate clicking translate.
+ process()->sink().ClearMessages();
+ bubble->Translate();
+ SimulateTranslateScriptURLFetch(false);
+
+ // We should not have sent any message to translate to the renderer.
+ EXPECT_FALSE(GetTranslateMessage(NULL, NULL, NULL));
+
+ // And we should have an error infobar showing.
+ bubble = factory->model();
+ ASSERT_TRUE(bubble != NULL);
+ EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_ERROR, bubble->GetViewState());
+}
+
+TEST_F(TranslateManagerRenderViewHostTest, BubbleUnknownLanguage) {
+ // Prepare for the bubble
+ TranslateService::SetUseInfobar(false);
+ MockTranslateBubbleFactory* factory = new MockTranslateBubbleFactory;
+ scoped_ptr<TranslateBubbleFactory> factory_ptr(factory);
+ TranslateBubbleFactory::SetFactory(factory);
+
+ // Simulate navigating to a page ("und" is the string returned by the CLD for
+ // languages it does not recognize).
+ SimulateNavigation(GURL("http://www.google.mys"), "und", true);
+
+ // We should not have a bubble as we don't know the language.
+ ASSERT_TRUE(factory->model() == NULL);
+
+ // Translate the page anyway throught the context menu.
+ scoped_ptr<TestRenderViewContextMenu> menu(
+ TestRenderViewContextMenu::CreateContextMenu(web_contents()));
+ menu->Init();
+ menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
+
+ // Check the bubble exists instead of the infobar.
+ TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
+ ASSERT_TRUE(infobar == NULL);
+ TranslateBubbleModel* bubble = factory->model();
+ ASSERT_TRUE(bubble != NULL);
+ EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_TRANSLATING,
+ bubble->GetViewState());
+}
+
+#endif // defined(USE_AURA)
+#endif // !defined(OS_ANDROID)
« no previous file with comments | « chrome/browser/translate/translate_manager_browsertest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698