Index: chrome/browser/translate/translate_manager2_unittest.cc |
diff --git a/chrome/browser/translate/translate_manager2_unittest.cc b/chrome/browser/translate/translate_manager2_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6ad168d8d4f8113755178fb7da75d7aba61dba59 |
--- /dev/null |
+++ b/chrome/browser/translate/translate_manager2_unittest.cc |
@@ -0,0 +1,999 @@ |
+// 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 "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_delegate2.h" |
+#include "chrome/browser/translate/translate_manager2.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" |
+ |
+using testing::_; |
+using testing::Pointee; |
+using testing::Property; |
+ |
+class TestTranslateManager2 : public TranslateManager2 { |
+ public: |
+ TestTranslateManager2() {} |
+}; |
+ |
+class TranslateManager2Test : public RenderViewHostTestHarness, |
+ public NotificationObserver { |
+ public: |
+ TranslateManager2Test() {} |
+ |
+ // 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::wstring& contents, |
+ const std::string& lang) { |
+ NavigateAndCommit(url); |
+ SimulateOnPageContents(url, page_id, contents, lang); |
+ } |
+ |
+ void SimulateOnPageContents(const GURL& url, int page_id, |
+ const std::wstring& contents, |
+ const std::string& lang) { |
+ rvh()->TestOnMessageReceived(ViewHostMsg_PageContents(0, url, page_id, |
+ contents, lang)); |
+ } |
+ |
+ 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. |
+ TranslateInfoBarDelegate2* GetTranslateInfoBar() { |
+ if (contents()->infobar_delegate_count() != 1) |
+ return NULL; |
+ return contents()->GetInfoBarDelegateAt(0)->AsTranslateInfoBarDelegate2(); |
+ } |
+ |
+ // If there is 1 infobar and it is a translate infobar, closes it and returns |
+ // true. Returns false otherwise. |
+ bool CloseTranslateInfoBar() { |
+ TranslateInfoBarDelegate2* 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(); |
+ } |
+ |
+ // If there is 1 infobar and it is a translate infobar, deny translation and |
+ // returns true. Returns false otherwise. |
+ bool DenyTranslation() { |
+ TranslateInfoBarDelegate2* 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. |
+ Singleton<TranslateManager2>::get()->ClearTranslateScript(); |
+ |
+ RenderViewHostTestHarness::SetUp(); |
+ |
+ notification_registrar_.Add( |
+ this, |
+ NotificationType::TAB_CONTENTS_INFOBAR_REMOVED, |
+ Source<TabContents>(contents())); |
+ } |
+ |
+ virtual void TearDown() { |
+ 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_; |
+ scoped_ptr<TestTranslateManager2> translate_manager_; |
+ 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(TranslateManager2Test); |
+}; |
+ |
+// 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 = 0; |
+ 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(TranslateManager2Test, NormalTranslate) { |
+ // Simulate navigating to a page. |
+ SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); |
+ |
+ // We should have an infobar. |
+ TranslateInfoBarDelegate2* infobar = GetTranslateInfoBar(); |
+ ASSERT_TRUE(infobar != NULL); |
+ EXPECT_EQ(TranslateInfoBarDelegate2::BEFORE_TRANSLATE, infobar->type()); |
+ |
+ // Simulate clicking translate. |
+ process()->sink().ClearMessages(); |
+ infobar->Translate(); |
+ |
+ // 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); |
+ |
+ // The "Translating..." infobar should be showing. |
+ infobar = GetTranslateInfoBar(); |
+ ASSERT_TRUE(infobar != NULL); |
+ EXPECT_EQ(TranslateInfoBarDelegate2::TRANSLATING, infobar->type()); |
+ |
+ // 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(TranslateInfoBarDelegate2::AFTER_TRANSLATE, infobar->type()); |
+ |
+ // Simulate translating again from there but with 2 different languages. |
+ infobar->SetOriginalLanguage(0); |
+ infobar->SetTargetLanguage(1); |
+ std::string new_original_lang = infobar->GetOriginalLanguageCode(); |
+ std::string new_target_lang = infobar->GetTargetLanguageCode(); |
+ process()->sink().ClearMessages(); |
+ infobar->Translate(); |
+ |
+ // Test that we sent the right message to the renderer. |
+ 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); |
+} |
+ |
+TEST_F(TranslateManager2Test, TranslateScriptNotAvailable) { |
+ // Simulate navigating to a page. |
+ SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); |
+ |
+ // We should have an infobar. |
+ TranslateInfoBarDelegate2* infobar = GetTranslateInfoBar(); |
+ ASSERT_TRUE(infobar != NULL); |
+ EXPECT_EQ(TranslateInfoBarDelegate2::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(TranslateInfoBarDelegate2::TRANSLATION_ERROR, infobar->type()); |
+} |
+ |
+// Tests that we show/don't show an info-bar for all languages the CLD can |
+// report. |
+TEST_F(TranslateManager2Test, 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_service.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 |
+ false, false, false, true, true, true, false, false, false, false, |
+ // 60-69 |
+ false, false, true, true, false, true, true, false, true, true, |
+ // 70-79 |
+ false, false, false, false, false, false, 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, false, 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, false, |
+ // 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. |
+ TranslateInfoBarDelegate2* infobar = GetTranslateInfoBar(); |
+ ASSERT_TRUE(infobar == NULL); |
+ |
+ // Simulate navigating to a page. |
+ NavigateAndCommit(url); |
+ SimulateOnPageContents(url, i, L"", lang); |
+ |
+ // 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(TranslateManager2Test, AutoTranslateOnNavigate) { |
+ // Simulate navigating to a page and getting its language. |
+ SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); |
+ |
+ // Simulate the user translating. |
+ TranslateInfoBarDelegate2* 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, L"Les news", "fr"); |
+ |
+ // 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, L"Las news", "es"); |
+ |
+ // 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(TranslateManager2Test, MultipleOnPageContents) { |
+ // Simulate navigating to a page and getting its language. |
+ SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); |
+ |
+ // 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, L"Le Google", "fr"); |
+ 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, L"Le YouTube", "fr"); |
+ EXPECT_TRUE(CloseTranslateInfoBar()); |
+ EXPECT_EQ(0, contents()->infobar_delegate_count()); |
+ SimulateOnPageContents(GURL("http://www.youtube.fr"), 1, L"Le YouTube", "fr"); |
+ EXPECT_EQ(0, contents()->infobar_delegate_count()); |
+} |
+ |
+// Test that reloading the page brings back the infobar. |
+TEST_F(TranslateManager2Test, Reload) { |
+ // Simulate navigating to a page and getting its language. |
+ SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); |
+ |
+ // 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(TranslateManager2Test, ReloadFromLocationBar) { |
+ GURL url("http://www.google.fr"); |
+ |
+ // Simulate navigating to a page and getting its language. |
+ SimulateNavigation(url, 0, L"Le Google", "fr"); |
+ |
+ // 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(TranslateManager2Test, CloseInfoBarInPageNavigation) { |
+ // Simulate navigating to a page and getting its language. |
+ SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); |
+ |
+ // Close the infobar. |
+ EXPECT_TRUE(CloseTranslateInfoBar()); |
+ |
+ // Navigate in page, no infobar should be shown. |
+ SimulateNavigation(GURL("http://www.google.fr/#ref1"), 0, L"Le Google", "fr"); |
+ EXPECT_TRUE(GetTranslateInfoBar() == NULL); |
+ |
+ // Navigate out of page, a new infobar should show. |
+ SimulateNavigation(GURL("http://www.google.fr/foot"), 0, L"Le Google", "fr"); |
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL); |
+} |
+ |
+// Tests that denying translation is sticky when navigating in page. |
+TEST_F(TranslateManager2Test, DenyTranslateInPageNavigation) { |
+ // Simulate navigating to a page and getting its language. |
+ SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); |
+ |
+ // 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, L"Le Google", "fr"); |
+ EXPECT_TRUE(GetTranslateInfoBar() == NULL); |
+ |
+ // Navigate out of page, a new infobar should show. |
+ SimulateNavigation(GURL("http://www.google.fr/foot"), 0, L"Le Google", "fr"); |
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL); |
+} |
+ |
+// Tests that after translating and closing the infobar, the infobar does not |
+// return when navigating in page. |
+TEST_F(TranslateManager2Test, TranslateCloseInfoBarInPageNavigation) { |
+ // Simulate navigating to a page and getting its language. |
+ SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); |
+ |
+ // Simulate the user translating. |
+ TranslateInfoBarDelegate2* 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, L"Le Google", "fr"); |
+ 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, L"Das Google", "de"); |
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL); |
+} |
+ |
+// Tests that the after translate the infobar still shows when navigating |
+// in-page. |
+TEST_F(TranslateManager2Test, TranslateInPageNavigation) { |
+ // Simulate navigating to a page and getting its language. |
+ SimulateNavigation(GURL("http://www.google.fr"), 0, L"Le Google", "fr"); |
+ |
+ // Simulate the user translating. |
+ TranslateInfoBarDelegate2* 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, L"Le Google", "fr"); |
+ 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, L"Das Google", "de"); |
+ // 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(TranslateManager2Test, UnsupportedPageLanguage) { |
+ // Simulate navigating to a page and getting an unsupported language. |
+ SimulateNavigation(GURL("http://www.google.com"), 0, L"Google", "qbz"); |
+ |
+ // No info-bar should be shown. |
+ 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(TranslateManager2Test, 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, L"Google", "en"); |
+ |
+ // 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(TranslateManager2Test, 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, L"Le Google", "fr"); |
+ |
+ // An infobar should be shown. |
+ TranslateInfoBarDelegate2* 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, L"Le YouTube", "fr"); |
+ infobar = GetTranslateInfoBar(); |
+ EXPECT_TRUE(infobar == NULL); |
+} |
+ |
+// Tests the "Never translate <language>" pref. |
+TEST_F(TranslateManager2Test, NeverTranslateLanguagePref) { |
+ // Simulate navigating to a page and getting its language. |
+ GURL url("http://www.google.fr"); |
+ SimulateNavigation(url, 0, L"Le Google", "fr"); |
+ |
+ // 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, L"Le YouTube", "fr"); |
+ |
+ // 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, L"Le Google", "fr"); |
+ |
+ // 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(TranslateManager2Test, NeverTranslateSitePref) { |
+ // Simulate navigating to a page and getting its language. |
+ GURL url("http://www.google.fr"); |
+ std::string host(url.host()); |
+ SimulateNavigation(url, 0, L"Le Google", "fr"); |
+ |
+ // 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, L"Bonjour", "fr"); |
+ |
+ // 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, L"Le Google", "fr"); |
+ |
+ // 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(TranslateManager2Test, 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, L"Le Google", "fr"); |
+ |
+ // 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, L"El Google", "es"); |
+ 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, L"Le YouTube", "fr"); |
+ 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, L"Le Google", "fr"); |
+ EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); |
+ EXPECT_TRUE(GetTranslateInfoBar() != NULL); |
+ prefs->RemovePrefObserver(TranslatePrefs::kPrefTranslateWhitelists, |
+ &pref_observer_); |
+} |
+/* |
+ |
+// Context menu. |
+TEST_F(TranslateManager2Test, 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, L"Le Google", "fr"); |
+ scoped_ptr<TestRenderViewContextMenu> menu( |
+ TestRenderViewContextMenu::CreateContextMenu(contents())); |
+ menu->Init(); |
+ EXPECT_TRUE(menu->IsItemPresent(IDS_CONTENT_CONTEXT_TRANSLATE)); |
+ EXPECT_TRUE(menu->TestIsCommandIdEnabled(IDS_CONTENT_CONTEXT_TRANSLATE)); |
+ |
+ // Use the menu to translate the page. |
+ menu->TestExecuteItemCommand(IDS_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(IDS_CONTENT_CONTEXT_TRANSLATE)); |
+ EXPECT_FALSE(menu->TestIsCommandIdEnabled(IDS_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, L"El Google", "es"); |
+ TranslateInfoBarDelegate2* 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->TestIsCommandIdEnabled(IDS_CONTENT_CONTEXT_TRANSLATE)); |
+ menu->TestExecuteItemCommand(IDS_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, L"Das Google", "de"); |
+ 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->TestIsCommandIdEnabled(IDS_CONTENT_CONTEXT_TRANSLATE)); |
+ rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "de", "en", |
+ TranslateErrors::NONE)); |
+ menu->TestExecuteItemCommand(IDS_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, L"Google", "en"); |
+ menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); |
+ menu->Init(); |
+ EXPECT_TRUE(menu->IsItemPresent(IDS_CONTENT_CONTEXT_TRANSLATE)); |
+ EXPECT_FALSE(menu->TestIsCommandIdEnabled(IDS_CONTENT_CONTEXT_TRANSLATE)); |
+} |
+*/ |
+ |
+// Context menu. |
+TEST_F(TranslateManager2Test, 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, L"Le Google", "fr"); |
+ 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, L"El Google", "es"); |
+ TranslateInfoBarDelegate2* 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, L"Das Google", "de"); |
+ 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, L"Google", "en"); |
+ menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); |
+ menu->Init(); |
+ EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE)); |
+ EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE)); |
+} |