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