Index: chrome/browser/translate/translate_manager_unittest.cc |
=================================================================== |
--- chrome/browser/translate/translate_manager_unittest.cc (revision 75925) |
+++ chrome/browser/translate/translate_manager_unittest.cc (working copy) |
@@ -1,1230 +0,0 @@ |
-// Copyright (c) 2011 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 <set> |
- |
-#include "base/utf_string_conversions.h" |
-#include "chrome/app/chrome_command_ids.h" |
-#include "chrome/browser/prefs/pref_service.h" |
-#include "chrome/browser/prefs/pref_change_registrar.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/notification_details.h" |
-#include "chrome/common/notification_observer_mock.h" |
-#include "chrome/common/notification_registrar.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 "chrome/test/testing_profile.h" |
-#include "content/browser/renderer_host/mock_render_process_host.h" |
-#include "content/browser/renderer_host/test_render_view_host.h" |
-#include "content/browser/tab_contents/navigation_controller.h" |
-#include "content/browser/tab_contents/test_tab_contents.h" |
-#include "grit/generated_resources.h" |
-#include "ipc/ipc_test_sink.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "third_party/cld/languages/public/languages.h" |
-#include "third_party/WebKit/Source/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, |
- const std::string& contents, |
- const std::string& lang, |
- bool page_translatable) { |
- NavigateAndCommit(url); |
- int page_id = RenderViewHostTestHarness::contents()->controller(). |
- GetLastCommittedEntry()->page_id(); |
- 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() { |
- return (contents()->infobar_count() == 1) ? |
- contents()->GetInfoBarDelegateAt(0)->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. |
- contents()->RemoveInfoBar(infobar); |
- 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; |
- } |
- |
- // 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() { |
- TranslateManager::GetInstance()->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_EQ(NotificationType::TAB_CONTENTS_INFOBAR_REMOVED, type.value); |
- removed_infobars_.insert(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). |
- TranslateManager::GetInstance()->ClearTranslateScript(); |
- TranslateManager::GetInstance()-> |
- 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); |
- net::URLRequestStatus status; |
- status.set_status(success ? net::URLRequestStatus::SUCCESS : |
- net::URLRequestStatus::FAILED); |
- fetcher->delegate()->OnURLFetchComplete(fetcher, fetcher->original_url(), |
- status, success ? 200 : 500, |
- ResponseCookies(), |
- std::string()); |
- } |
- |
- void SetPrefObserverExpectation(const char* path) { |
- EXPECT_CALL( |
- pref_observer_, |
- Observe(NotificationType(NotificationType::PREF_CHANGED), |
- _, |
- Property(&Details<std::string>::ptr, Pointee(path)))); |
- } |
- |
- NotificationObserverMock pref_observer_; |
- |
- private: |
- NotificationRegistrar notification_registrar_; |
- 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(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, |
- ui::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"), "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("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(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(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"), "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"), "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); |
- |
- // To test that bug #49018 if fixed, make sure we deal correctly with errors. |
- SimulateURLFetch(false); // Simulate a failure to fetch the translate script. |
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); |
- ASSERT_TRUE(infobar != NULL); |
- EXPECT_EQ(TranslateInfoBarDelegate::TRANSLATION_ERROR, infobar->type()); |
- EXPECT_TRUE(infobar->IsError()); |
- infobar->MessageInfoBarButtonPressed(); |
- SimulateURLFetch(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. |
- 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()); |
- 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"), "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"), "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"), "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"), "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"), "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"), "Le Google", "fr", true); |
- |
- // Simulate clicking 'Nope' (don't translate). |
- EXPECT_TRUE(DenyTranslation()); |
- EXPECT_EQ(0U, contents()->infobar_count()); |
- |
- // Send a new PageContents, we should not show an infobar. |
- SimulateOnPageContents(GURL("http://www.google.fr"), 0, "Le Google", "fr", |
- true); |
- EXPECT_EQ(0U, contents()->infobar_count()); |
- |
- // Do the same steps but simulate closing the infobar this time. |
- SimulateNavigation(GURL("http://www.youtube.fr"), "Le YouTube", "fr", |
- true); |
- EXPECT_TRUE(CloseTranslateInfoBar()); |
- EXPECT_EQ(0U, contents()->infobar_count()); |
- SimulateOnPageContents(GURL("http://www.youtube.fr"), 1, "Le YouTube", "fr", |
- true); |
- EXPECT_EQ(0U, contents()->infobar_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"), "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, "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 closed 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"), "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"), "Le Google", "fr", |
- true); |
- EXPECT_TRUE(GetTranslateInfoBar() == NULL); |
- |
- // Navigate out of page, a new infobar should show. |
- SimulateNavigation(GURL("http://www.google.fr/foot"), "Le Google", "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(TranslateManagerTest, CloseInfoBarInSubframeNavigation) { |
- // Simulate navigating to a page and getting its language. |
- SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); |
- |
- // Close the infobar. |
- EXPECT_TRUE(CloseTranslateInfoBar()); |
- |
- // Simulate a sub-frame auto-navigating. |
- rvh()->SendNavigateWithTransition(1, GURL("http://pub.com"), |
- PageTransition::AUTO_SUBFRAME); |
- EXPECT_TRUE(GetTranslateInfoBar() == NULL); |
- |
- // Simulate the user navigating in a sub-frame. |
- rvh()->SendNavigateWithTransition(2, GURL("http://pub.com"), |
- PageTransition::MANUAL_SUBFRAME); |
- EXPECT_TRUE(GetTranslateInfoBar() == NULL); |
- |
- // Navigate out of page, a new infobar should show. |
- SimulateNavigation(GURL("http://www.google.fr/foot"), "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"), "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"), "Le Google", "fr", |
- true); |
- EXPECT_TRUE(GetTranslateInfoBar() == NULL); |
- |
- // Navigate out of page, a new infobar should show. |
- SimulateNavigation(GURL("http://www.google.fr/foot"), "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"), "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"), "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"), "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"), "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"), "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"), "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"), "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"), "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"), "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"), "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, "Le Google", "fr", true); |
- |
- // An infobar should be shown. |
- EXPECT_TRUE(GetTranslateInfoBar() != NULL); |
- |
- // Select never translate this language. |
- PrefService* prefs = contents()->profile()->GetPrefs(); |
- PrefChangeRegistrar registrar; |
- registrar.Init(prefs); |
- registrar.Add(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"), "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, "Le Google", "fr", true); |
- |
- // There should be a translate infobar. |
- EXPECT_TRUE(GetTranslateInfoBar() != NULL); |
-} |
- |
-// 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, "Le Google", "fr", true); |
- |
- // An infobar should be shown. |
- EXPECT_TRUE(GetTranslateInfoBar() != NULL); |
- |
- // Select never translate this site. |
- PrefService* prefs = contents()->profile()->GetPrefs(); |
- PrefChangeRegistrar registrar; |
- registrar.Init(prefs); |
- registrar.Add(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"), "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, "Le Google", "fr", true); |
- |
- // There should be a translate infobar. |
- EXPECT_TRUE(GetTranslateInfoBar() != NULL); |
-} |
- |
-// Tests the "Always translate this language" pref. |
-TEST_F(TranslateManagerTest, AlwaysTranslateLanguagePref) { |
- // Select always translate French to English. |
- PrefService* prefs = contents()->profile()->GetPrefs(); |
- PrefChangeRegistrar registrar; |
- registrar.Init(prefs); |
- registrar.Add(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"), "Le Google", "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(TranslateInfoBarDelegate::TRANSLATING, infobar->type()); |
- |
- 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("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"), "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"), "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 a "before translate" infobar. |
- SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateWhitelists); |
- translate_prefs.RemoveLanguagePairFromWhitelist("fr", "en"); |
- SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); |
- EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); |
- infobar = GetTranslateInfoBar(); |
- ASSERT_TRUE(infobar != NULL); |
- EXPECT_EQ(TranslateInfoBarDelegate::BEFORE_TRANSLATE, infobar->type()); |
-} |
- |
-// 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 but |
- // should only be enabled when the page language has been received. |
- NavigateAndCommit(url); |
- 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)); |
- |
- // Simulate receiving the language. |
- SimulateOnPageContents(url, 0, "Le Google", "fr", true); |
- menu.reset(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. |
- // The "translating..." infobar should be showing. |
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); |
- ASSERT_TRUE(infobar != NULL); |
- EXPECT_EQ(TranslateInfoBarDelegate::TRANSLATING, infobar->type()); |
- 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("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"), "El Google", "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(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"), "Das Google", "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(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, "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. |
- SimulateNavigation(url, "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)); |
- |
- // Test that the translate context menu is disabled when the page is in an |
- // unsupported language. |
- SimulateNavigation(url, "G00g1e", "qbz", true); |
- menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); |
- menu->Init(); |
- EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE)); |
- EXPECT_FALSE(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(TranslateManagerTest, BeforeTranslateExtraButtons) { |
- TranslatePrefs translate_prefs(contents()->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*>(contents()->profile()); |
- test_profile->set_off_the_record(true); |
- for (int i = 0; i < 8; ++i) { |
- SCOPED_TRACE(::testing::Message::Message() << "Iteration " << i << |
- " incognito mode=" << test_profile->IsOffTheRecord()); |
- SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); |
- infobar = GetTranslateInfoBar(); |
- ASSERT_TRUE(infobar != NULL); |
- EXPECT_EQ(TranslateInfoBarDelegate::BEFORE_TRANSLATE, infobar->type()); |
- if (i < 7) { |
- EXPECT_FALSE(infobar->ShouldShowAlwaysTranslateButton()); |
- infobar->Translate(); |
- process()->sink().ClearMessages(); |
- } else { |
- EXPECT_TRUE(infobar->ShouldShowAlwaysTranslateButton()); |
- } |
- if (i == 3) |
- test_profile->set_off_the_record(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). |
- 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 (in non incognito mode only). |
- test_profile->set_off_the_record(true); |
- for (int i = 0; i < 8; ++i) { |
- SCOPED_TRACE(::testing::Message::Message() << "Iteration " << i << |
- " incognito mode=" << test_profile->IsOffTheRecord()); |
- SimulateNavigation(GURL("http://www.google.de"), "Das Google", "de", true); |
- infobar = GetTranslateInfoBar(); |
- ASSERT_TRUE(infobar != NULL); |
- EXPECT_EQ(TranslateInfoBarDelegate::BEFORE_TRANSLATE, infobar->type()); |
- if (i < 7) { |
- EXPECT_FALSE(infobar->ShouldShowNeverTranslateButton()); |
- infobar->TranslationDeclined(); |
- } else { |
- EXPECT_TRUE(infobar->ShouldShowNeverTranslateButton()); |
- } |
- if (i == 3) |
- test_profile->set_off_the_record(false); |
- } |
- // 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"), "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"), "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"), "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("es", original_lang); |
- EXPECT_EQ("en", target_lang); |
-} |