diff options
Diffstat (limited to 'chrome/browser/translate/translate_manager_unittest.cc')
-rw-r--r-- | chrome/browser/translate/translate_manager_unittest.cc | 1168 |
1 files changed, 1168 insertions, 0 deletions
diff --git a/chrome/browser/translate/translate_manager_unittest.cc b/chrome/browser/translate/translate_manager_unittest.cc new file mode 100644 index 0000000..1b1598d --- /dev/null +++ b/chrome/browser/translate/translate_manager_unittest.cc @@ -0,0 +1,1168 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/renderer_host/test/test_render_view_host.h" + +#include "base/utf_string_conversions.h" +#include "chrome/app/chrome_dll_resource.h" +#include "chrome/browser/renderer_host/mock_render_process_host.h" +#include "chrome/browser/tab_contents/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_prefs.h" +#include "chrome/common/ipc_test_sink.h" +#include "chrome/common/notification_details.h" +#include "chrome/common/notification_observer_mock.h" +#include "chrome/common/notification_registrar.h" +#include "chrome/common/notification_service.h" +#include "chrome/common/notification_type.h" +#include "chrome/common/pref_names.h" +#include "chrome/common/render_messages.h" +#include "chrome/common/net/test_url_fetcher_factory.h" +#include "chrome/test/testing_browser_process.h" +#include "grit/generated_resources.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "third_party/cld/languages/public/languages.h" +#include "third_party/WebKit/WebKit/chromium/public/WebContextMenuData.h" + +using testing::_; +using testing::Pointee; +using testing::Property; +using WebKit::WebContextMenuData; + +class TranslateManagerTest : public RenderViewHostTestHarness, + public NotificationObserver { + public: + TranslateManagerTest() {} + + // Simluates navigating to a page and getting the page contents and language + // for that navigation. + void SimulateNavigation(const GURL& url, int page_id, + const std::string& contents, + const std::string& lang, + bool page_translatable) { + NavigateAndCommit(url); + SimulateOnPageContents(url, page_id, contents, lang, page_translatable); + } + + void SimulateOnPageContents(const GURL& url, int page_id, + const std::string& contents, + const std::string& lang, + bool page_translatable) { + rvh()->TestOnMessageReceived(ViewHostMsg_PageContents(0, url, page_id, + UTF8ToUTF16(contents), + lang, + page_translatable)); + } + + bool GetTranslateMessage(int* page_id, + std::string* original_lang, + std::string* target_lang) { + const IPC::Message* message = + process()->sink().GetFirstMessageMatching(ViewMsg_TranslatePage::ID); + if (!message) + return false; + Tuple4<int, std::string, std::string, std::string> translate_param; + ViewMsg_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; + } + + // Returns the translate infobar if there is 1 infobar and it is a translate + // infobar. + TranslateInfoBarDelegate* GetTranslateInfoBar() { + if (contents()->infobar_delegate_count() != 1) + return NULL; + return contents()->GetInfoBarDelegateAt(0)->AsTranslateInfoBarDelegate(); + } + + // If there is 1 infobar and it is a translate infobar, closes it and returns + // true. Returns false otherwise. + bool CloseTranslateInfoBar() { + TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); + if (!infobar) + return false; + infobar->InfoBarDismissed(); // Simulates closing the infobar. + contents()->RemoveInfoBar(infobar); + return true; + } + + // Checks whether |infobar| has been removed and clears the removed infobar + // list. + bool CheckInfoBarRemovedAndReset(InfoBarDelegate* infobar) { + bool found = std::find(removed_infobars_.begin(), removed_infobars_.end(), + infobar) != removed_infobars_.end(); + removed_infobars_.clear(); + return found; + } + + // Returns true if at least one infobar was closed. + bool InfoBarRemoved() { + return !removed_infobars_.empty(); + } + + // Clears the list of stored removed infobars. + void ClearRemovedInfoBars() { + removed_infobars_.clear(); + } + + void ExpireTranslateScriptImmediately() { + Singleton<TranslateManager>::get()-> + set_translate_script_expiration_delay(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(); + contents()->RemoveInfoBar(infobar); + return true; + } + + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) { + DCHECK(type == NotificationType::TAB_CONTENTS_INFOBAR_REMOVED); + removed_infobars_.push_back(Details<InfoBarDelegate>(details).ptr()); + } + + protected: + virtual void SetUp() { + URLFetcher::set_factory(&url_fetcher_factory_); + + // Access the TranslateManager singleton so it is created before we call + // RenderViewHostTestHarness::SetUp() to match what's done in Chrome, where + // the TranslateManager is created before the TabContents. This matters as + // they both register for similar events and we want the notifications to + // happen in the same sequence (TranslateManager first, TabContents second). + // Also 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). + Singleton<TranslateManager>::get()->ClearTranslateScript(); + Singleton<TranslateManager>::get()-> + set_translate_script_expiration_delay(60 * 60 * 1000); + + RenderViewHostTestHarness::SetUp(); + + notification_registrar_.Add( + this, + NotificationType::TAB_CONTENTS_INFOBAR_REMOVED, + Source<TabContents>(contents())); + } + + virtual void TearDown() { + process()->sink().ClearMessages(); + + notification_registrar_.Remove( + this, + NotificationType::TAB_CONTENTS_INFOBAR_REMOVED, + Source<TabContents>(contents())); + + RenderViewHostTestHarness::TearDown(); + + URLFetcher::set_factory(NULL); + } + + void SimulateURLFetch(bool success) { + TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); + ASSERT_TRUE(fetcher); + URLRequestStatus status; + status.set_status(success ? URLRequestStatus::SUCCESS : + URLRequestStatus::FAILED); + fetcher->delegate()->OnURLFetchComplete(fetcher, fetcher->original_url(), + status, success ? 200 : 500, + ResponseCookies(), + std::string()); + } + + void SetPrefObserverExpectation(const wchar_t* path) { + EXPECT_CALL( + pref_observer_, + Observe(NotificationType(NotificationType::PREF_CHANGED), + _, + Property(&Details<std::wstring>::ptr, Pointee(path)))); + } + + NotificationObserverMock pref_observer_; + + private: + NotificationRegistrar notification_registrar_; + TestURLFetcherFactory url_fetcher_factory_; + + // The list of infobars that have been removed. + // WARNING: the pointers points to deleted objects, use only for comparison. + std::vector<InfoBarDelegate*> removed_infobars_; + + DISALLOW_COPY_AND_ASSIGN(TranslateManagerTest); +}; + +// An observer that keeps track of whether a navigation entry was committed. +class NavEntryCommittedObserver : public NotificationObserver { + public: + explicit NavEntryCommittedObserver(TabContents* tab_contents) { + registrar_.Add(this, NotificationType::NAV_ENTRY_COMMITTED, + Source<NavigationController>(&tab_contents->controller())); + } + + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) { + DCHECK(type == NotificationType::NAV_ENTRY_COMMITTED); + details_ = + *(Details<NavigationController::LoadCommittedDetails>(details).ptr()); + } + + const NavigationController::LoadCommittedDetails& + get_load_commited_details() const { + return details_; + } + + private: + NavigationController::LoadCommittedDetails details_; + NotificationRegistrar registrar_; + + DISALLOW_COPY_AND_ASSIGN(NavEntryCommittedObserver); +}; + +class TestRenderViewContextMenu : public RenderViewContextMenu { + public: + static TestRenderViewContextMenu* CreateContextMenu( + TabContents* tab_contents) { + ContextMenuParams params; + params.media_type = WebKit::WebContextMenuData::MediaTypeNone; + params.x = 0; + params.y = 0; + params.is_image_blocked = false; + params.media_flags = 0; + params.spellcheck_enabled = false; + params.is_editable = false; + params.page_url = tab_contents->controller().GetActiveEntry()->url(); +#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 = WebContextMenuData::CanTranslate; + return new TestRenderViewContextMenu(tab_contents, params); + } + + bool IsItemPresent(int id) { + return menu_model_.GetIndexOfCommandId(id) != -1; + } + + virtual void PlatformInit() { } + virtual bool GetAcceleratorForCommandId( + int command_id, + menus::Accelerator* accelerator) { return false; } + + private: + TestRenderViewContextMenu(TabContents* tab_contents, + const ContextMenuParams& params) + : RenderViewContextMenu(tab_contents, params) { + } + + DISALLOW_COPY_AND_ASSIGN(TestRenderViewContextMenu); +}; + +TEST_F(TranslateManagerTest, NormalTranslate) { + // Simulate navigating to a page. + SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr", true); + + // We should have an infobar. + TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + EXPECT_EQ(TranslateInfoBarDelegate::BEFORE_TRANSLATE, infobar->type()); + + // Simulate clicking translate. + process()->sink().ClearMessages(); + infobar->Translate(); + + // The "Translating..." infobar should be showing. + infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + EXPECT_EQ(TranslateInfoBarDelegate::TRANSLATING, infobar->type()); + + // Simulate the translate script being retrieved (it only needs to be done + // once in the test as it is cached). + SimulateURLFetch(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(0, page_id); + EXPECT_EQ("fr", original_lang); + EXPECT_EQ("en", target_lang); + + // Simulate the render notifying the translation has been done. + rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "fr", "en", + TranslateErrors::NONE)); + + // The after translate infobar should be showing. + infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + EXPECT_EQ(TranslateInfoBarDelegate::AFTER_TRANSLATE, infobar->type()); + + // Simulate changing the original language, this should trigger a translation. + process()->sink().ClearMessages(); + std::string new_original_lang = infobar->GetLanguageCodeAt(0); + infobar->SetOriginalLanguage(0); + EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); + EXPECT_EQ(0, page_id); + EXPECT_EQ(new_original_lang, original_lang); + EXPECT_EQ("en", target_lang); + // Simulate the render notifying the translation has been done. + rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, + new_original_lang, "en", TranslateErrors::NONE)); + // infobar is now invalid. + TranslateInfoBarDelegate* new_infobar = GetTranslateInfoBar(); + ASSERT_TRUE(new_infobar != NULL); + infobar = new_infobar; + + // Simulate changing the target language, this should trigger a translation. + process()->sink().ClearMessages(); + std::string new_target_lang = infobar->GetLanguageCodeAt(1); + infobar->SetTargetLanguage(1); + EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); + EXPECT_EQ(0, page_id); + EXPECT_EQ(new_original_lang, original_lang); + EXPECT_EQ(new_target_lang, target_lang); + // Simulate the render notifying the translation has been done. + rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, + new_original_lang, new_target_lang, TranslateErrors::NONE)); + // infobar is now invalid. + new_infobar = GetTranslateInfoBar(); + ASSERT_TRUE(new_infobar != NULL); +} + +TEST_F(TranslateManagerTest, TranslateScriptNotAvailable) { + // Simulate navigating to a page. + SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr", true); + + // We should have an infobar. + TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + EXPECT_EQ(TranslateInfoBarDelegate::BEFORE_TRANSLATE, infobar->type()); + + // Simulate clicking translate. + process()->sink().ClearMessages(); + infobar->Translate(); + // Simulate a failure retrieving the translate script. + SimulateURLFetch(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(TranslateInfoBarDelegate::TRANSLATION_ERROR, infobar->type()); +} + +// 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(TranslateManagerTest, 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"), 0, "G00g1e", "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(contents())); + menu->Init(); + menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE); + SimulateURLFetch(true); // Simulate receiving the translate script. + + // Simulate the render notifying the translation has been done, the server + // having detected the page was in a known and supported language. + rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "fr", "en", + TranslateErrors::NONE)); + + // The after translate infobar should be showing. + TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + EXPECT_EQ(TranslateInfoBarDelegate::AFTER_TRANSLATE, infobar->type()); + EXPECT_EQ("fr", infobar->GetOriginalLanguageCode()); + EXPECT_EQ("en", infobar->GetTargetLanguageCode()); + + // Let's run the same steps but this time the server detects the page is + // already in English. + SimulateNavigation(GURL("http://www.google.com"), 1, "The Google", "und", + true); + menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); + menu->Init(); + menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE); + rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(1, 0, "en", "en", + TranslateErrors::IDENTICAL_LANGUAGES)); + infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + EXPECT_EQ(TranslateInfoBarDelegate::TRANSLATION_ERROR, infobar->type()); + EXPECT_EQ(TranslateErrors::IDENTICAL_LANGUAGES, infobar->error()); + + // 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"), 2, "The Google", "und", + true); + menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); + menu->Init(); + menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE); + rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(2, 0, "", "en", + TranslateErrors::UNKNOWN_LANGUAGE)); + infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + EXPECT_EQ(TranslateInfoBarDelegate::TRANSLATION_ERROR, infobar->type()); + EXPECT_EQ(TranslateErrors::UNKNOWN_LANGUAGE, infobar->error()); +} + +// Tests that we show/don't show an info-bar for all languages the CLD can +// report. +TEST_F(TranslateManagerTest, TestAllLanguages) { + // The index in kExpectation are the Language enum (see languages.pb.h). + // true if we expect a translate infobar for that language. + // Note the supported languages are in translation_manager.cc, see + // kSupportedLanguages. + bool kExpectations[] = { + // 0-9 + false, true, true, true, true, true, true, true, true, true, + // 10-19 + true, true, true, true, true, true, true, true, true, true, + // 20-29 + true, true, true, true, true, false, false, true, true, true, + // 30-39 + true, true, true, true, true, true, true, false, true, false, + // 40-49 + true, false, true, false, false, true, false, true, false, false, + // 50-59 + true, false, false, true, true, true, false, true, false, false, + // 60-69 + false, false, true, true, false, true, true, false, true, true, + // 70-79 + false, false, false, false, true, true, false, true, false, false, + // 80-89 + false, false, false, false, false, false, false, false, false, false, + // 90-99 + false, true, false, false, false, false, false, true, false, false, + // 100-109 + false, true, false, false, false, false, false, false, false, false, + // 110-119 + false, false, false, false, false, false, false, false, false, false, + // 120-129 + false, false, false, false, false, false, false, false, false, false, + // 130-139 + false, false, false, false, false, false, false, false, false, true, + // 140-149 + false, false, false, false, false, false, false, false, false, false, + // 150-159 + false, false, false, false, false, false, false, false, false, false, + // 160 + false + }; + + GURL url("http://www.google.com"); + for (size_t i = 0; i < arraysize(kExpectations); ++i) { + ASSERT_LT(i, static_cast<size_t>(NUM_LANGUAGES)); + + std::string lang = LanguageCodeWithDialects(static_cast<Language>(i)); + SCOPED_TRACE(::testing::Message::Message() << "Iteration " << i << + " language=" << lang); + + // We should not have a translate infobar. + TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar == NULL); + + // Simulate navigating to a page. + NavigateAndCommit(url); + SimulateOnPageContents(url, i, "", lang, true); + + // Verify we have/don't have an info-bar as expected. + infobar = GetTranslateInfoBar(); + EXPECT_EQ(kExpectations[i], infobar != NULL); + + // Close the info-bar if applicable. + if (infobar != NULL) + EXPECT_TRUE(CloseTranslateInfoBar()); + } +} + +// Tests auto-translate on page. +TEST_F(TranslateManagerTest, AutoTranslateOnNavigate) { + // Simulate navigating to a page and getting its language. + SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr", true); + + // Simulate the user translating. + TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + infobar->Translate(); + SimulateURLFetch(true); // Simulate the translate script being retrieved. + + rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "fr", "en", + TranslateErrors::NONE)); + + // Now navigate to a new page in the same language. + process()->sink().ClearMessages(); + SimulateNavigation(GURL("http://news.google.fr"), 1, "Les news", "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"), 1, "Las news", "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(TranslateManagerTest, MultipleOnPageContents) { + // Simulate navigating to a page and getting its language. + SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr", true); + + // Simulate clicking 'Nope' (don't translate). + EXPECT_TRUE(DenyTranslation()); + EXPECT_EQ(0, contents()->infobar_delegate_count()); + + // Send a new PageContents, we should not show an infobar. + SimulateOnPageContents(GURL("http://www.google.fr"), 0, "Le Google", "fr", + true); + EXPECT_EQ(0, contents()->infobar_delegate_count()); + + // Do the same steps but simulate closing the infobar this time. + SimulateNavigation(GURL("http://www.youtube.fr"), 1, "Le YouTube", "fr", + true); + EXPECT_TRUE(CloseTranslateInfoBar()); + EXPECT_EQ(0, contents()->infobar_delegate_count()); + SimulateOnPageContents(GURL("http://www.youtube.fr"), 1, "Le YouTube", "fr", + true); + EXPECT_EQ(0, contents()->infobar_delegate_count()); +} + +// Test that reloading the page brings back the infobar. +TEST_F(TranslateManagerTest, Reload) { + // Simulate navigating to a page and getting its language. + SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr", true); + + // Close the infobar. + EXPECT_TRUE(CloseTranslateInfoBar()); + + // Reload should bring back the infobar. + NavEntryCommittedObserver nav_observer(contents()); + Reload(); + + // Ensures it is really handled a reload. + const NavigationController::LoadCommittedDetails& nav_details = + nav_observer.get_load_commited_details(); + EXPECT_TRUE(nav_details.entry != NULL); // There was a navigation. + EXPECT_EQ(NavigationType::EXISTING_PAGE, nav_details.type); + + // The TranslateManager class processes the navigation entry committed + // notification in a posted task; process that task. + MessageLoop::current()->RunAllPending(); + 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(TranslateManagerTest, ReloadFromLocationBar) { + GURL url("http://www.google.fr"); + + // Simulate navigating to a page and getting its language. + SimulateNavigation(url, 0, "Le Google", "fr", true); + + // Close the infobar. + 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(contents()); + contents()->controller().LoadURL(url, GURL(), PageTransition::TYPED); + rvh()->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 NavigationController::LoadCommittedDetails& nav_details = + nav_observer.get_load_commited_details(); + EXPECT_TRUE(nav_details.entry != NULL); // There was a navigation. + EXPECT_EQ(NavigationType::SAME_PAGE, nav_details.type); + + // The TranslateManager class processes the navigation entry committed + // notification in a posted task; process that task. + MessageLoop::current()->RunAllPending(); + EXPECT_TRUE(GetTranslateInfoBar() != NULL); +} + +// Tests that a close translate infobar does not reappear when navigating +// in-page. +TEST_F(TranslateManagerTest, CloseInfoBarInPageNavigation) { + // Simulate navigating to a page and getting its language. + SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr", true); + + // Close the infobar. + EXPECT_TRUE(CloseTranslateInfoBar()); + + // Navigate in page, no infobar should be shown. + SimulateNavigation(GURL("http://www.google.fr/#ref1"), 0, "Le Google", "fr", + true); + EXPECT_TRUE(GetTranslateInfoBar() == NULL); + + // Navigate out of page, a new infobar should show. + SimulateNavigation(GURL("http://www.google.fr/foot"), 0, "Le Google", "fr", + true); + EXPECT_TRUE(GetTranslateInfoBar() != NULL); +} + +// Tests that denying translation is sticky when navigating in page. +TEST_F(TranslateManagerTest, DenyTranslateInPageNavigation) { + // Simulate navigating to a page and getting its language. + SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "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"), 0, "Le Google", "fr", + true); + EXPECT_TRUE(GetTranslateInfoBar() == NULL); + + // Navigate out of page, a new infobar should show. + SimulateNavigation(GURL("http://www.google.fr/foot"), 0, "Le Google", "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(TranslateManagerTest, TranslateCloseInfoBarInPageNavigation) { + // Simulate navigating to a page and getting its language. + SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr", true); + + // Simulate the user translating. + TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + infobar->Translate(); + SimulateURLFetch(true); // Simulate the translate script being retrieved. + rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "fr", "en", + TranslateErrors::NONE)); + + // Close the infobar. + EXPECT_TRUE(CloseTranslateInfoBar()); + + // Navigate in page, no infobar should be shown. + SimulateNavigation(GURL("http://www.google.fr/#ref1"), 0, "Le Google", "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"), 0, "Das Google", "de", true); + EXPECT_TRUE(GetTranslateInfoBar() != NULL); +} + +// Tests that the after translate the infobar still shows when navigating +// in-page. +TEST_F(TranslateManagerTest, TranslateInPageNavigation) { + // Simulate navigating to a page and getting its language. + SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr", true); + + // Simulate the user translating. + TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + infobar->Translate(); + SimulateURLFetch(true); // Simulate the translate script being retrieved. + rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "fr", "en", + TranslateErrors::NONE)); + // The after translate infobar is showing. + infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + + // Navigate in page, the same infobar should still be shown. + ClearRemovedInfoBars(); + SimulateNavigation(GURL("http://www.google.fr/#ref1"), 0, "Le Google", "fr", + true); + EXPECT_FALSE(InfoBarRemoved()); + EXPECT_EQ(infobar, GetTranslateInfoBar()); + + // 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"), 0, "Das Google", "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(TranslateManagerTest, CLDReportsUnsupportedPageLanguage) { + // Simulate navigating to a page and getting an unsupported language. + SimulateNavigation(GURL("http://www.google.com"), 0, "Google", "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(TranslateManagerTest, ServerReportsUnsupportedLanguage) { + // Simulate navigating to a page and translating it. + SimulateNavigation(GURL("http://mail.google.fr"), 0, "Le Google", "fr", + true); + TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + process()->sink().ClearMessages(); + infobar->Translate(); + SimulateURLFetch(true); + // Simulate the render notifying the translation has been done, but it + // reports a language we don't support. + rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "qbz", "en", + TranslateErrors::NONE)); + + // An error infobar should be showing to report that we don't support this + // language. + infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + EXPECT_EQ(TranslateInfoBarDelegate::TRANSLATION_ERROR, infobar->type()); + + // 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(ViewMsg_RevertTranslation::ID); + EXPECT_TRUE(message != NULL); + // And it should have removed the infobar. + EXPECT_TRUE(GetTranslateInfoBar() == NULL); +} + +// Tests that no translate infobar is shown when Chrome is in a language that +// the translate server does not support. +TEST_F(TranslateManagerTest, UnsupportedUILanguage) { + TestingBrowserProcess* browser_process = + static_cast<TestingBrowserProcess*>(g_browser_process); + std::string original_lang = browser_process->GetApplicationLocale(); + browser_process->SetApplicationLocale("qbz"); + + // Simulate navigating to a page in a language supported by the translate + // server. + SimulateNavigation(GURL("http://www.google.com"), 0, "Google", "en", true); + + // No info-bar should be shown. + EXPECT_TRUE(GetTranslateInfoBar() == NULL); + + browser_process->SetApplicationLocale(original_lang); +} + +// Tests that the translate enabled preference is honored. +TEST_F(TranslateManagerTest, TranslateEnabledPref) { + // Make sure the pref allows translate. + PrefService* prefs = contents()->profile()->GetPrefs(); + prefs->SetBoolean(prefs::kEnableTranslate, true); + + // Simulate navigating to a page and getting its language. + SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "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. + SimulateOnPageContents(url, 1, "Le YouTube", "fr", true); + infobar = GetTranslateInfoBar(); + EXPECT_TRUE(infobar == NULL); +} + +// Tests the "Never translate <language>" pref. +TEST_F(TranslateManagerTest, NeverTranslateLanguagePref) { + // Simulate navigating to a page and getting its language. + GURL url("http://www.google.fr"); + SimulateNavigation(url, 0, "Le Google", "fr", true); + + // An infobar should be shown. + EXPECT_TRUE(GetTranslateInfoBar() != NULL); + + // Select never translate this language. + PrefService* prefs = contents()->profile()->GetPrefs(); + prefs->AddPrefObserver(TranslatePrefs::kPrefTranslateLanguageBlacklist, + &pref_observer_); + TranslatePrefs translate_prefs(prefs); + EXPECT_FALSE(translate_prefs.IsLanguageBlacklisted("fr")); + EXPECT_TRUE(translate_prefs.CanTranslate(prefs, "fr", url)); + SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateLanguageBlacklist); + translate_prefs.BlacklistLanguage("fr"); + EXPECT_TRUE(translate_prefs.IsLanguageBlacklisted("fr")); + EXPECT_FALSE(translate_prefs.CanTranslate(prefs, "fr", url)); + + // Close the infobar. + EXPECT_TRUE(CloseTranslateInfoBar()); + + // Navigate to a new page also in French. + SimulateNavigation(GURL("http://wwww.youtube.fr"), 1, "Le YouTube", "fr", + true); + + // There should not be a translate infobar. + EXPECT_TRUE(GetTranslateInfoBar() == NULL); + + // Remove the language from the blacklist. + SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateLanguageBlacklist); + translate_prefs.RemoveLanguageFromBlacklist("fr"); + EXPECT_FALSE(translate_prefs.IsLanguageBlacklisted("fr")); + EXPECT_TRUE(translate_prefs.CanTranslate(prefs, "fr", url)); + + // Navigate to a page in French. + SimulateNavigation(url, 2, "Le Google", "fr", true); + + // There should be a translate infobar. + EXPECT_TRUE(GetTranslateInfoBar() != NULL); + prefs->RemovePrefObserver(TranslatePrefs::kPrefTranslateLanguageBlacklist, + &pref_observer_); +} + +// Tests the "Never translate this site" pref. +TEST_F(TranslateManagerTest, NeverTranslateSitePref) { + // Simulate navigating to a page and getting its language. + GURL url("http://www.google.fr"); + std::string host(url.host()); + SimulateNavigation(url, 0, "Le Google", "fr", true); + + // An infobar should be shown. + EXPECT_TRUE(GetTranslateInfoBar() != NULL); + + // Select never translate this site. + PrefService* prefs = contents()->profile()->GetPrefs(); + prefs->AddPrefObserver(TranslatePrefs::kPrefTranslateSiteBlacklist, + &pref_observer_); + TranslatePrefs translate_prefs(prefs); + EXPECT_FALSE(translate_prefs.IsSiteBlacklisted(host)); + EXPECT_TRUE(translate_prefs.CanTranslate(prefs, "fr", url)); + SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateSiteBlacklist); + translate_prefs.BlacklistSite(host); + EXPECT_TRUE(translate_prefs.IsSiteBlacklisted(host)); + EXPECT_FALSE(translate_prefs.CanTranslate(prefs, "fr", url)); + + // Close the infobar. + EXPECT_TRUE(CloseTranslateInfoBar()); + + // Navigate to a new page also on the same site. + SimulateNavigation(GURL("http://www.google.fr/hello"), 1, "Bonjour", "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.CanTranslate(prefs, "fr", url)); + + // Navigate to a page in French. + SimulateNavigation(url, 0, "Le Google", "fr", true); + + // There should be a translate infobar. + EXPECT_TRUE(GetTranslateInfoBar() != NULL); + prefs->RemovePrefObserver(TranslatePrefs::kPrefTranslateSiteBlacklist, + &pref_observer_); +} + +// Tests the "Always translate this language" pref. +TEST_F(TranslateManagerTest, AlwaysTranslateLanguagePref) { + // Select always translate French to English. + PrefService* prefs = contents()->profile()->GetPrefs(); + prefs->AddPrefObserver(TranslatePrefs::kPrefTranslateWhitelists, + &pref_observer_); + TranslatePrefs translate_prefs(prefs); + SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateWhitelists); + translate_prefs.WhitelistLanguagePair("fr", "en"); + + // Load a page in French. + SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr", true); + + // It should have triggered an automatic translation to English. + SimulateURLFetch(true); // Simulate the translate script being retrieved. + int page_id = 0; + std::string original_lang, target_lang; + EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); + EXPECT_EQ(0, page_id); + EXPECT_EQ("fr", original_lang); + EXPECT_EQ("en", target_lang); + process()->sink().ClearMessages(); + // And we should have no infobar (since we don't send the page translated + // notification, the after translate infobar is not shown). + EXPECT_TRUE(GetTranslateInfoBar() == NULL); + + // Try another language, it should not be autotranslated. + SimulateNavigation(GURL("http://www.google.es"), 1, "El Google", "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*>(contents()->profile()); + test_profile->set_off_the_record(true); + SimulateNavigation(GURL("http://www.youtube.fr"), 2, "Le YouTube", "fr", + true); + EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); + EXPECT_TRUE(GetTranslateInfoBar() != NULL); + EXPECT_TRUE(CloseTranslateInfoBar()); + test_profile->set_off_the_record(false); // Get back to non incognito. + + // Now revert the always translate pref and make sure we go back to expected + // behavior, which is show an infobar. + SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateWhitelists); + translate_prefs.RemoveLanguagePairFromWhitelist("fr", "en"); + SimulateNavigation(GURL("http://www.google.fr"), 3, "Le Google", "fr", true); + EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); + EXPECT_TRUE(GetTranslateInfoBar() != NULL); + prefs->RemovePrefObserver(TranslatePrefs::kPrefTranslateWhitelists, + &pref_observer_); +} + +// Context menu. +TEST_F(TranslateManagerTest, ContextMenu) { + // Blacklist www.google.fr and French for translation. + GURL url("http://www.google.fr"); + TranslatePrefs translate_prefs(contents()->profile()->GetPrefs()); + translate_prefs.BlacklistLanguage("fr"); + translate_prefs.BlacklistSite(url.host()); + EXPECT_TRUE(translate_prefs.IsLanguageBlacklisted("fr")); + EXPECT_TRUE(translate_prefs.IsSiteBlacklisted(url.host())); + + // Simulate navigating to a page in French. The translate menu should show. + SimulateNavigation(url, 0, "Le Google", "fr", true); + scoped_ptr<TestRenderViewContextMenu> menu( + TestRenderViewContextMenu::CreateContextMenu(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); + + // That should have triggered a translation. + SimulateURLFetch(true); // Simulate the translate script being retrieved. + int page_id = 0; + std::string original_lang, target_lang; + EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); + EXPECT_EQ(0, page_id); + 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.IsLanguageBlacklisted("fr")); + EXPECT_FALSE(translate_prefs.IsSiteBlacklisted(url.host())); + + // Let's simulate the page being translated. + rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "fr", "en", + TranslateErrors::NONE)); + + // The translate menu should now be disabled. + menu.reset(TestRenderViewContextMenu::CreateContextMenu(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"), 1, "El Google", "es", true); + TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + infobar->Translate(); + EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); + EXPECT_EQ(1, page_id); + process()->sink().ClearMessages(); + menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); + menu->Init(); + EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE)); + menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE); + // 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"), 2, "Das Google", "de", true); + infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + infobar->Translate(); + EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); + EXPECT_EQ(2, page_id); + process()->sink().ClearMessages(); + menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); + menu->Init(); + EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE)); + rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "de", "en", + TranslateErrors::NONE)); + menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE); + // 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 disabled when the page is in the + // same language as the UI. + SimulateNavigation(url, 0, "Google", "en", true); + menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); + menu->Init(); + EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE)); + EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE)); + + // Test that the translate context menu is enabled when the page is in an + // unknown language as the UI. + SimulateNavigation(url, 0, "G00g1e", "und", true); + menu.reset(TestRenderViewContextMenu::CreateContextMenu(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. +TEST_F(TranslateManagerTest, BeforeTranslateExtraButtons) { + TranslatePrefs translate_prefs(contents()->profile()->GetPrefs()); + translate_prefs.ResetTranslationAcceptedCount("fr"); + translate_prefs.ResetTranslationDeniedCount("fr"); + translate_prefs.ResetTranslationAcceptedCount("de"); + translate_prefs.ResetTranslationDeniedCount("de"); + + TranslateInfoBarDelegate* infobar; + for (int i = 0; i < 4; ++i) { + SimulateNavigation(GURL("http://www.google.fr"), 1, "Le Google", "fr", + true); + infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + EXPECT_EQ(TranslateInfoBarDelegate::BEFORE_TRANSLATE, infobar->type()); + if (i < 3) { + EXPECT_FALSE(infobar->ShouldShowAlwaysTranslateButton()); + infobar->Translate(); + process()->sink().ClearMessages(); + } else { + EXPECT_TRUE(infobar->ShouldShowAlwaysTranslateButton()); + } + } + // 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). + SimulateURLFetch(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. + for (int i = 0; i < 4; ++i) { + SimulateNavigation(GURL("http://www.google.de"), 1, "Das Google", "de", + true); + infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + EXPECT_EQ(TranslateInfoBarDelegate::BEFORE_TRANSLATE, infobar->type()); + if (i < 3) { + EXPECT_FALSE(infobar->ShouldShowNeverTranslateButton()); + infobar->TranslationDeclined(); + } else { + EXPECT_TRUE(infobar->ShouldShowNeverTranslateButton()); + } + } + // Simulate the user pressing "Never translate French". + infobar->NeverTranslatePageLanguage(); + EXPECT_TRUE(translate_prefs.IsLanguageBlacklisted("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(TranslateManagerTest, NonTranslatablePage) { + // Simulate navigating to a page. + SimulateNavigation(GURL("http://mail.google.fr"), 0, "Le Google", "fr", + false); + + // We should not have an infobar. + EXPECT_TRUE(GetTranslateInfoBar() == NULL); + + // The context menu should be disabled. + scoped_ptr<TestRenderViewContextMenu> menu( + TestRenderViewContextMenu::CreateContextMenu(contents())); + menu->Init(); + EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE)); + EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE)); +} + +// Tests that the script is expired and refetched as expected. +TEST_F(TranslateManagerTest, ScriptExpires) { + ExpireTranslateScriptImmediately(); + + // Simulate navigating to a page and translating it. + SimulateNavigation(GURL("http://www.google.fr"), 0, "Le Google", "fr", true); + TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + process()->sink().ClearMessages(); + infobar->Translate(); + SimulateURLFetch(true); + rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "fr", "en", + TranslateErrors::NONE)); + + // A task should have been posted to clear the script, run it. + MessageLoop::current()->RunAllPending(); + + // Do another navigation and translation. + SimulateNavigation(GURL("http://www.google.es"), 1, "El Google", "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(ViewMsg_TranslatePage::ID) == + NULL); + // Now simulate the URL fetch. + SimulateURLFetch(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(1, page_id); + EXPECT_EQ("es", original_lang); + EXPECT_EQ("en", target_lang); +} |