diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-13 00:44:31 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-13 00:44:31 +0000 |
commit | 93b9d6948d212b630a115dc4b77bbe6bf2b3b671 (patch) | |
tree | 92e02d514f2b44cdd2b7f82063ed3e91af3773bf /chrome/browser/translate | |
parent | 71504b42e176b37b9324897a53908df5ba6c723e (diff) | |
download | chromium_src-93b9d6948d212b630a115dc4b77bbe6bf2b3b671.zip chromium_src-93b9d6948d212b630a115dc4b77bbe6bf2b3b671.tar.gz chromium_src-93b9d6948d212b630a115dc4b77bbe6bf2b3b671.tar.bz2 |
Move code that talks to spelling and translate out of content. I create ChromeRenderObserver, which is a RenderViewObserver for the Chrome layer. Also, I added a TranslateTabHelper to hold the per-tab language data and moved LanguageState back to chrome since it's not used by content.
Review URL: http://codereview.chromium.org/6824068
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@81341 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/translate')
-rw-r--r-- | chrome/browser/translate/translate_infobar_delegate.cc | 6 | ||||
-rw-r--r-- | chrome/browser/translate/translate_manager.cc | 51 | ||||
-rw-r--r-- | chrome/browser/translate/translate_manager_browsertest.cc | 140 | ||||
-rw-r--r-- | chrome/browser/translate/translate_tab_helper.cc | 61 | ||||
-rw-r--r-- | chrome/browser/translate/translate_tab_helper.h | 40 |
5 files changed, 207 insertions, 91 deletions
diff --git a/chrome/browser/translate/translate_infobar_delegate.cc b/chrome/browser/translate/translate_infobar_delegate.cc index e0a49fe..1835872 100644 --- a/chrome/browser/translate/translate_infobar_delegate.cc +++ b/chrome/browser/translate/translate_infobar_delegate.cc @@ -11,6 +11,8 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/translate/translate_infobar_view.h" #include "chrome/browser/translate/translate_manager.h" +#include "chrome/browser/translate/translate_tab_helper.h" +#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" #include "chrome/common/chrome_constants.h" #include "content/browser/tab_contents/tab_contents.h" #include "grit/generated_resources.h" @@ -128,7 +130,9 @@ void TranslateInfoBarDelegate::TranslationDeclined() { // translations when getting a LANGUAGE_DETERMINED from the page, which // happens when a load stops. That could happen multiple times, including // after the user already declined the translation.) - tab_contents_->language_state().set_translation_declined(true); + TranslateTabHelper* helper = TabContentsWrapper::GetCurrentWrapperForContents( + tab_contents_)->translate_tab_helper(); + helper->language_state().set_translation_declined(true); } bool TranslateInfoBarDelegate::IsLanguageBlacklisted() { diff --git a/chrome/browser/translate/translate_manager.cc b/chrome/browser/translate/translate_manager.cc index d6ba832..3322ca02 100644 --- a/chrome/browser/translate/translate_manager.cc +++ b/chrome/browser/translate/translate_manager.cc @@ -14,10 +14,12 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/prefs/pref_service.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/tab_contents/language_state.h" #include "chrome/browser/tab_contents/tab_util.h" #include "chrome/browser/tabs/tab_strip_model.h" #include "chrome/browser/translate/page_translated_details.h" #include "chrome/browser/translate/translate_infobar_delegate.h" +#include "chrome/browser/translate/translate_tab_helper.h" #include "chrome/browser/translate/translate_prefs.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list.h" @@ -29,7 +31,6 @@ #include "chrome/common/url_constants.h" #include "content/browser/renderer_host/render_process_host.h" #include "content/browser/renderer_host/render_view_host.h" -#include "content/browser/tab_contents/language_state.h" #include "content/browser/tab_contents/navigation_controller.h" #include "content/browser/tab_contents/navigation_entry.h" #include "content/browser/tab_contents/tab_contents.h" @@ -208,8 +209,16 @@ void TranslateManager::Observe(NotificationType type, NOTREACHED(); return; } + + TabContentsWrapper* wrapper = + TabContentsWrapper::GetCurrentWrapperForContents( + controller->tab_contents()); + if (!wrapper || !wrapper->translate_tab_helper()) + return; + + TranslateTabHelper* helper = wrapper->translate_tab_helper(); if (!load_details->is_main_frame && - controller->tab_contents()->language_state().translation_declined()) { + helper->language_state().translation_declined()) { // Some sites (such as Google map) may trigger sub-frame navigations // when the user interacts with the page. We don't want to show a new // infobar if the user already dismissed one in that case. @@ -230,15 +239,17 @@ void TranslateManager::Observe(NotificationType type, &TranslateManager::InitiateTranslationPosted, controller->tab_contents()->render_view_host()->process()->id(), controller->tab_contents()->render_view_host()->routing_id(), - controller->tab_contents()->language_state(). - original_language())); + helper->language_state().original_language())); break; } case NotificationType::TAB_LANGUAGE_DETERMINED: { TabContents* tab = Source<TabContents>(source).ptr(); // We may get this notifications multiple times. Make sure to translate // only once. - LanguageState& language_state = tab->language_state(); + TabContentsWrapper* wrapper = + TabContentsWrapper::GetCurrentWrapperForContents(tab); + LanguageState& language_state = + wrapper->translate_tab_helper()->language_state(); if (language_state.page_translatable() && !language_state.translation_pending() && !language_state.translation_declined() && @@ -407,7 +418,9 @@ void TranslateManager::InitiateTranslation(TabContents* tab, return; } - std::string auto_translate_to = tab->language_state().AutoTranslateTo(); + TranslateTabHelper* helper = TabContentsWrapper::GetCurrentWrapperForContents( + tab)->translate_tab_helper(); + std::string auto_translate_to = helper->language_state().AutoTranslateTo(); if (!auto_translate_to.empty()) { // This page was navigated through a click from a translated page. TranslatePage(tab, page_lang, auto_translate_to); @@ -423,7 +436,12 @@ void TranslateManager::InitiateTranslationPosted( int process_id, int render_id, const std::string& page_lang) { // The tab might have been closed. TabContents* tab = tab_util::GetTabContentsByID(process_id, render_id); - if (!tab || tab->language_state().translation_pending()) + if (!tab) + return; + + TranslateTabHelper* helper = TabContentsWrapper::GetCurrentWrapperForContents( + tab)->translate_tab_helper(); + if (helper->language_state().translation_pending()) return; InitiateTranslation(tab, page_lang); @@ -476,8 +494,11 @@ void TranslateManager::RevertTranslation(TabContents* tab_contents) { } tab_contents->render_view_host()->Send(new ViewMsg_RevertTranslation( tab_contents->render_view_host()->routing_id(), entry->page_id())); - tab_contents->language_state().set_current_language( - tab_contents->language_state().original_language()); + + TranslateTabHelper* helper = TabContentsWrapper::GetCurrentWrapperForContents( + tab_contents)->translate_tab_helper(); + helper->language_state().set_current_language( + helper->language_state().original_language()); } void TranslateManager::ReportLanguageDetectionError(TabContents* tab_contents) { @@ -487,7 +508,10 @@ void TranslateManager::ReportLanguageDetectionError(TabContents* tab_contents) { report_error_url += "?client=cr&action=langidc&u="; report_error_url += EscapeUrlEncodedData(page_url.spec()); report_error_url += "&sl="; - report_error_url += tab_contents->language_state().original_language(); + + TranslateTabHelper* helper = TabContentsWrapper::GetCurrentWrapperForContents( + tab_contents)->translate_tab_helper(); + report_error_url += helper->language_state().original_language(); report_error_url += "&hl="; report_error_url += GetLanguageCode(g_browser_process->GetApplicationLocale()); @@ -511,8 +535,11 @@ void TranslateManager::DoTranslatePage(TabContents* tab, return; } - tab->language_state().set_translation_pending(true); + TabContentsWrapper* wrapper = + TabContentsWrapper::GetCurrentWrapperForContents(tab); + wrapper->translate_tab_helper()->language_state().set_translation_pending( + true); tab->render_view_host()->Send(new ViewMsg_TranslatePage( tab->render_view_host()->routing_id(), entry->page_id(), translate_script, source_lang, target_lang)); @@ -521,8 +548,6 @@ void TranslateManager::DoTranslatePage(TabContents* tab, // but we don't have that yet. So before start translation, we clear the // current form and re-parse it in AutofillManager first to get the new // labels. - TabContentsWrapper* wrapper = - TabContentsWrapper::GetCurrentWrapperForContents(tab); if (wrapper) wrapper->autofill_manager()->Reset(); } diff --git a/chrome/browser/translate/translate_manager_browsertest.cc b/chrome/browser/translate/translate_manager_browsertest.cc index 7c37430..afbd9ff 100644 --- a/chrome/browser/translate/translate_manager_browsertest.cc +++ b/chrome/browser/translate/translate_manager_browsertest.cc @@ -13,6 +13,7 @@ #include "chrome/browser/translate/translate_infobar_delegate.h" #include "chrome/browser/translate/translate_manager.h" #include "chrome/browser/translate/translate_prefs.h" +#include "chrome/browser/ui/tab_contents/test_tab_contents_wrapper.h" #include "chrome/common/pref_names.h" #include "chrome/common/render_messages.h" #include "chrome/common/net/test_url_fetcher_factory.h" @@ -39,7 +40,7 @@ using testing::Pointee; using testing::Property; using WebKit::WebContextMenuData; -class TranslateManagerTest : public RenderViewHostTestHarness, +class TranslateManagerTest : public TabContentsWrapperTestHarness, public NotificationObserver { public: TranslateManagerTest() @@ -49,23 +50,16 @@ class TranslateManagerTest : public RenderViewHostTestHarness, // Simluates navigating to a page and getting the page contents and language // for that navigation. void SimulateNavigation(const GURL& url, - const std::string& contents, const std::string& lang, bool page_translatable) { NavigateAndCommit(url); - int page_id = RenderViewHostTestHarness::contents()->controller(). - GetLastCommittedEntry()->page_id(); - SimulateOnPageContents(url, page_id, contents, lang, page_translatable); + SimulateOnTranslateLanguageDetermined(lang, page_translatable); } - void SimulateOnPageContents(const GURL& url, int page_id, - const std::string& contents, - const std::string& lang, - bool page_translatable) { - rvh()->TestOnMessageReceived(ViewHostMsg_PageContents(0, url, page_id, - UTF8ToUTF16(contents), - lang, - page_translatable)); + void SimulateOnTranslateLanguageDetermined(const std::string& lang, + bool page_translatable) { + rvh()->TestOnMessageReceived(ViewHostMsg_TranslateLanguageDetermined( + 0, lang, page_translatable)); } bool GetTranslateMessage(int* page_id, @@ -162,7 +156,7 @@ class TranslateManagerTest : public RenderViewHostTestHarness, TranslateManager::GetInstance()-> set_translate_script_expiration_delay(60 * 60 * 1000); - RenderViewHostTestHarness::SetUp(); + TabContentsWrapperTestHarness::SetUp(); notification_registrar_.Add(this, NotificationType::TAB_CONTENTS_INFOBAR_REMOVED, @@ -176,7 +170,7 @@ class TranslateManagerTest : public RenderViewHostTestHarness, NotificationType::TAB_CONTENTS_INFOBAR_REMOVED, Source<TabContents>(contents())); - RenderViewHostTestHarness::TearDown(); + TabContentsWrapperTestHarness::TearDown(); URLFetcher::set_factory(NULL); } @@ -285,7 +279,7 @@ class TestRenderViewContextMenu : public RenderViewContextMenu { TEST_F(TranslateManagerTest, NormalTranslate) { // Simulate navigating to a page. - SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); + SimulateNavigation(GURL("http://www.google.fr"), "fr", true); // We should have an infobar. TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); @@ -353,7 +347,7 @@ TEST_F(TranslateManagerTest, NormalTranslate) { TEST_F(TranslateManagerTest, TranslateScriptNotAvailable) { // Simulate navigating to a page. - SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); + SimulateNavigation(GURL("http://www.google.fr"), "fr", true); // We should have an infobar. TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); @@ -380,7 +374,7 @@ TEST_F(TranslateManagerTest, TranslateScriptNotAvailable) { TEST_F(TranslateManagerTest, TranslateUnknownLanguage) { // Simulate navigating to a page ("und" is the string returned by the CLD for // languages it does not recognize). - SimulateNavigation(GURL("http://www.google.mys"), "G00g1e", "und", true); + 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); @@ -414,7 +408,7 @@ TEST_F(TranslateManagerTest, TranslateUnknownLanguage) { // Let's run the same steps but this time the server detects the page is // already in English. - SimulateNavigation(GURL("http://www.google.com"), "The Google", "und", true); + SimulateNavigation(GURL("http://www.google.com"), "und", true); menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); menu->Init(); menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE); @@ -427,7 +421,7 @@ TEST_F(TranslateManagerTest, TranslateUnknownLanguage) { // Let's run the same steps again but this time the server fails to detect the // page's language (it returns an empty string). - SimulateNavigation(GURL("http://www.google.com"), "The Google", "und", true); + SimulateNavigation(GURL("http://www.google.com"), "und", true); menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); menu->Init(); menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE); @@ -497,7 +491,7 @@ TEST_F(TranslateManagerTest, TestAllLanguages) { // Simulate navigating to a page. NavigateAndCommit(url); - SimulateOnPageContents(url, i, "", lang, true); + SimulateOnTranslateLanguageDetermined(lang, true); // Verify we have/don't have an info-bar as expected. infobar = GetTranslateInfoBar(); @@ -512,7 +506,7 @@ TEST_F(TranslateManagerTest, TestAllLanguages) { // Tests auto-translate on page. TEST_F(TranslateManagerTest, AutoTranslateOnNavigate) { // Simulate navigating to a page and getting its language. - SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); + SimulateNavigation(GURL("http://www.google.fr"), "fr", true); // Simulate the user translating. TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); @@ -525,7 +519,7 @@ TEST_F(TranslateManagerTest, AutoTranslateOnNavigate) { // Now navigate to a new page in the same language. process()->sink().ClearMessages(); - SimulateNavigation(GURL("http://news.google.fr"), "Les news", "fr", true); + SimulateNavigation(GURL("http://news.google.fr"), "fr", true); // This should have automatically triggered a translation. int page_id = 0; @@ -537,7 +531,7 @@ TEST_F(TranslateManagerTest, AutoTranslateOnNavigate) { // Now navigate to a page in a different language. process()->sink().ClearMessages(); - SimulateNavigation(GURL("http://news.google.es"), "Las news", "es", true); + SimulateNavigation(GURL("http://news.google.es"), "es", true); // This should not have triggered a translate. EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); @@ -546,31 +540,28 @@ TEST_F(TranslateManagerTest, AutoTranslateOnNavigate) { // Tests that multiple OnPageContents do not cause multiple infobars. TEST_F(TranslateManagerTest, MultipleOnPageContents) { // Simulate navigating to a page and getting its language. - SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); + SimulateNavigation(GURL("http://www.google.fr"), "fr", true); // Simulate clicking 'Nope' (don't translate). EXPECT_TRUE(DenyTranslation()); EXPECT_EQ(0U, contents()->infobar_count()); // Send a new PageContents, we should not show an infobar. - SimulateOnPageContents(GURL("http://www.google.fr"), 0, "Le Google", "fr", - true); + SimulateOnTranslateLanguageDetermined("fr", true); EXPECT_EQ(0U, contents()->infobar_count()); // Do the same steps but simulate closing the infobar this time. - SimulateNavigation(GURL("http://www.youtube.fr"), "Le YouTube", "fr", - true); + SimulateNavigation(GURL("http://www.youtube.fr"), "fr", true); EXPECT_TRUE(CloseTranslateInfoBar()); EXPECT_EQ(0U, contents()->infobar_count()); - SimulateOnPageContents(GURL("http://www.youtube.fr"), 1, "Le YouTube", "fr", - true); + SimulateOnTranslateLanguageDetermined("fr", true); EXPECT_EQ(0U, contents()->infobar_count()); } // Test that reloading the page brings back the infobar. TEST_F(TranslateManagerTest, Reload) { // Simulate navigating to a page and getting its language. - SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); + SimulateNavigation(GURL("http://www.google.fr"), "fr", true); // Close the infobar. EXPECT_TRUE(CloseTranslateInfoBar()); @@ -597,7 +588,7 @@ TEST_F(TranslateManagerTest, ReloadFromLocationBar) { GURL url("http://www.google.fr"); // Simulate navigating to a page and getting its language. - SimulateNavigation(url, "Le Google", "fr", true); + SimulateNavigation(url, "fr", true); // Close the infobar. EXPECT_TRUE(CloseTranslateInfoBar()); @@ -625,19 +616,18 @@ TEST_F(TranslateManagerTest, ReloadFromLocationBar) { // in-page. TEST_F(TranslateManagerTest, CloseInfoBarInPageNavigation) { // Simulate navigating to a page and getting its language. - SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); + SimulateNavigation(GURL("http://www.google.fr"), "fr", true); // Close the infobar. EXPECT_TRUE(CloseTranslateInfoBar()); // Navigate in page, no infobar should be shown. - SimulateNavigation(GURL("http://www.google.fr/#ref1"), "Le Google", "fr", + 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"), "Le Google", "fr", - true); + SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true); EXPECT_TRUE(GetTranslateInfoBar() != NULL); } @@ -645,7 +635,7 @@ TEST_F(TranslateManagerTest, CloseInfoBarInPageNavigation) { // in a subframe. (http://crbug.com/48215) TEST_F(TranslateManagerTest, CloseInfoBarInSubframeNavigation) { // Simulate navigating to a page and getting its language. - SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); + SimulateNavigation(GURL("http://www.google.fr"), "fr", true); // Close the infobar. EXPECT_TRUE(CloseTranslateInfoBar()); @@ -661,8 +651,7 @@ TEST_F(TranslateManagerTest, CloseInfoBarInSubframeNavigation) { EXPECT_TRUE(GetTranslateInfoBar() == NULL); // Navigate out of page, a new infobar should show. - SimulateNavigation(GURL("http://www.google.fr/foot"), "Le Google", "fr", - true); + SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true); EXPECT_TRUE(GetTranslateInfoBar() != NULL); } @@ -671,19 +660,17 @@ TEST_F(TranslateManagerTest, CloseInfoBarInSubframeNavigation) { // Tests that denying translation is sticky when navigating in page. TEST_F(TranslateManagerTest, DenyTranslateInPageNavigation) { // Simulate navigating to a page and getting its language. - SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); + 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"), "Le Google", "fr", - true); + 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"), "Le Google", "fr", - true); + SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true); EXPECT_TRUE(GetTranslateInfoBar() != NULL); } @@ -691,7 +678,7 @@ TEST_F(TranslateManagerTest, DenyTranslateInPageNavigation) { // return when navigating in page. TEST_F(TranslateManagerTest, TranslateCloseInfoBarInPageNavigation) { // Simulate navigating to a page and getting its language. - SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); + SimulateNavigation(GURL("http://www.google.fr"), "fr", true); // Simulate the user translating. TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); @@ -705,15 +692,14 @@ TEST_F(TranslateManagerTest, TranslateCloseInfoBarInPageNavigation) { EXPECT_TRUE(CloseTranslateInfoBar()); // Navigate in page, no infobar should be shown. - SimulateNavigation(GURL("http://www.google.fr/#ref1"), "Le Google", "fr", - true); + 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"), "Das Google", "de", true); + SimulateNavigation(GURL("http://www.google.de"), "de", true); EXPECT_TRUE(GetTranslateInfoBar() != NULL); } @@ -721,7 +707,7 @@ TEST_F(TranslateManagerTest, TranslateCloseInfoBarInPageNavigation) { // in-page. TEST_F(TranslateManagerTest, TranslateInPageNavigation) { // Simulate navigating to a page and getting its language. - SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); + SimulateNavigation(GURL("http://www.google.fr"), "fr", true); // Simulate the user translating. TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); @@ -736,7 +722,7 @@ TEST_F(TranslateManagerTest, TranslateInPageNavigation) { // Navigate in page, the same infobar should still be shown. ClearRemovedInfoBars(); - SimulateNavigation(GURL("http://www.google.fr/#ref1"), "Le Google", "fr", + SimulateNavigation(GURL("http://www.google.fr/#ref1"), "fr", true); EXPECT_FALSE(InfoBarRemoved()); EXPECT_EQ(infobar, GetTranslateInfoBar()); @@ -744,7 +730,7 @@ TEST_F(TranslateManagerTest, TranslateInPageNavigation) { // Navigate out of page, a new infobar should show. // See note in TranslateCloseInfoBarInPageNavigation test on why it is // important to navigate to a page in a different language for this test. - SimulateNavigation(GURL("http://www.google.de"), "Das Google", "de", true); + SimulateNavigation(GURL("http://www.google.de"), "de", true); // The old infobar is gone. EXPECT_TRUE(CheckInfoBarRemovedAndReset(infobar)); // And there is a new one. @@ -755,7 +741,7 @@ TEST_F(TranslateManagerTest, TranslateInPageNavigation) { // unsupported language. TEST_F(TranslateManagerTest, CLDReportsUnsupportedPageLanguage) { // Simulate navigating to a page and getting an unsupported language. - SimulateNavigation(GURL("http://www.google.com"), "Google", "qbz", true); + SimulateNavigation(GURL("http://www.google.com"), "qbz", true); // No info-bar should be shown. EXPECT_TRUE(GetTranslateInfoBar() == NULL); @@ -766,7 +752,7 @@ TEST_F(TranslateManagerTest, CLDReportsUnsupportedPageLanguage) { // The translation server might return a language we don't support. TEST_F(TranslateManagerTest, ServerReportsUnsupportedLanguage) { // Simulate navigating to a page and translating it. - SimulateNavigation(GURL("http://mail.google.fr"), "Le Google", "fr", true); + SimulateNavigation(GURL("http://mail.google.fr"), "fr", true); TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); ASSERT_TRUE(infobar != NULL); process()->sink().ClearMessages(); @@ -806,7 +792,7 @@ TEST_F(TranslateManagerTest, UnsupportedUILanguage) { // Simulate navigating to a page in a language supported by the translate // server. - SimulateNavigation(GURL("http://www.google.com"), "Google", "en", true); + SimulateNavigation(GURL("http://www.google.com"), "en", true); // No info-bar should be shown. EXPECT_TRUE(GetTranslateInfoBar() == NULL); @@ -821,7 +807,7 @@ TEST_F(TranslateManagerTest, TranslateEnabledPref) { prefs->SetBoolean(prefs::kEnableTranslate, true); // Simulate navigating to a page and getting its language. - SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); + SimulateNavigation(GURL("http://www.google.fr"), "fr", true); // An infobar should be shown. TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); @@ -838,7 +824,7 @@ TEST_F(TranslateManagerTest, TranslateEnabledPref) { // Simulate getting the page contents and language, that should not trigger // a translate infobar. - SimulateOnPageContents(url, 1, "Le YouTube", "fr", true); + SimulateOnTranslateLanguageDetermined("fr", true); infobar = GetTranslateInfoBar(); EXPECT_TRUE(infobar == NULL); } @@ -847,7 +833,7 @@ TEST_F(TranslateManagerTest, TranslateEnabledPref) { TEST_F(TranslateManagerTest, NeverTranslateLanguagePref) { // Simulate navigating to a page and getting its language. GURL url("http://www.google.fr"); - SimulateNavigation(url, "Le Google", "fr", true); + SimulateNavigation(url, "fr", true); // An infobar should be shown. EXPECT_TRUE(GetTranslateInfoBar() != NULL); @@ -870,7 +856,7 @@ TEST_F(TranslateManagerTest, NeverTranslateLanguagePref) { EXPECT_TRUE(CloseTranslateInfoBar()); // Navigate to a new page also in French. - SimulateNavigation(GURL("http://wwww.youtube.fr"), "Le YouTube", "fr", true); + SimulateNavigation(GURL("http://wwww.youtube.fr"), "fr", true); // There should not be a translate infobar. EXPECT_TRUE(GetTranslateInfoBar() == NULL); @@ -882,7 +868,7 @@ TEST_F(TranslateManagerTest, NeverTranslateLanguagePref) { EXPECT_TRUE(translate_prefs.CanTranslate(prefs, "fr", url)); // Navigate to a page in French. - SimulateNavigation(url, "Le Google", "fr", true); + SimulateNavigation(url, "fr", true); // There should be a translate infobar. EXPECT_TRUE(GetTranslateInfoBar() != NULL); @@ -893,7 +879,7 @@ TEST_F(TranslateManagerTest, NeverTranslateSitePref) { // Simulate navigating to a page and getting its language. GURL url("http://www.google.fr"); std::string host(url.host()); - SimulateNavigation(url, "Le Google", "fr", true); + SimulateNavigation(url, "fr", true); // An infobar should be shown. EXPECT_TRUE(GetTranslateInfoBar() != NULL); @@ -916,7 +902,7 @@ TEST_F(TranslateManagerTest, NeverTranslateSitePref) { EXPECT_TRUE(CloseTranslateInfoBar()); // Navigate to a new page also on the same site. - SimulateNavigation(GURL("http://www.google.fr/hello"), "Bonjour", "fr", true); + SimulateNavigation(GURL("http://www.google.fr/hello"), "fr", true); // There should not be a translate infobar. EXPECT_TRUE(GetTranslateInfoBar() == NULL); @@ -928,7 +914,7 @@ TEST_F(TranslateManagerTest, NeverTranslateSitePref) { EXPECT_TRUE(translate_prefs.CanTranslate(prefs, "fr", url)); // Navigate to a page in French. - SimulateNavigation(url, "Le Google", "fr", true); + SimulateNavigation(url, "fr", true); // There should be a translate infobar. EXPECT_TRUE(GetTranslateInfoBar() != NULL); @@ -947,7 +933,7 @@ TEST_F(TranslateManagerTest, AlwaysTranslateLanguagePref) { translate_prefs.WhitelistLanguagePair("fr", "en"); // Load a page in French. - SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); + SimulateNavigation(GURL("http://www.google.fr"), "fr", true); // It should have triggered an automatic translation to English. @@ -965,7 +951,7 @@ TEST_F(TranslateManagerTest, AlwaysTranslateLanguagePref) { process()->sink().ClearMessages(); // Try another language, it should not be autotranslated. - SimulateNavigation(GURL("http://www.google.es"), "El Google", "es", true); + SimulateNavigation(GURL("http://www.google.es"), "es", true); EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); EXPECT_TRUE(GetTranslateInfoBar() != NULL); EXPECT_TRUE(CloseTranslateInfoBar()); @@ -975,7 +961,7 @@ TEST_F(TranslateManagerTest, AlwaysTranslateLanguagePref) { TestingProfile* test_profile = static_cast<TestingProfile*>(contents()->profile()); test_profile->set_incognito(true); - SimulateNavigation(GURL("http://www.youtube.fr"), "Le YouTube", "fr", 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()); @@ -985,7 +971,7 @@ TEST_F(TranslateManagerTest, AlwaysTranslateLanguagePref) { // behavior, which is show a "before translate" infobar. SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateWhitelists); translate_prefs.RemoveLanguagePairFromWhitelist("fr", "en"); - SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); + SimulateNavigation(GURL("http://www.google.fr"), "fr", true); EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang)); infobar = GetTranslateInfoBar(); ASSERT_TRUE(infobar != NULL); @@ -1012,7 +998,7 @@ TEST_F(TranslateManagerTest, ContextMenu) { EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE)); // Simulate receiving the language. - SimulateOnPageContents(url, 0, "Le Google", "fr", true); + SimulateOnTranslateLanguageDetermined("fr", true); menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); menu->Init(); EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE)); @@ -1051,7 +1037,7 @@ TEST_F(TranslateManagerTest, ContextMenu) { // Test that selecting translate in the context menu WHILE the page is being // translated does nothing (this could happen if autotranslate kicks-in and // the user selects the menu while the translation is being performed). - SimulateNavigation(GURL("http://www.google.es"), "El Google", "es", true); + SimulateNavigation(GURL("http://www.google.es"), "es", true); infobar = GetTranslateInfoBar(); ASSERT_TRUE(infobar != NULL); infobar->Translate(); @@ -1066,7 +1052,7 @@ TEST_F(TranslateManagerTest, ContextMenu) { // Now test that selecting translate in the context menu AFTER the page has // been translated does nothing. - SimulateNavigation(GURL("http://www.google.de"), "Das Google", "de", true); + SimulateNavigation(GURL("http://www.google.de"), "de", true); infobar = GetTranslateInfoBar(); ASSERT_TRUE(infobar != NULL); infobar->Translate(); @@ -1083,7 +1069,7 @@ TEST_F(TranslateManagerTest, ContextMenu) { // Test that the translate context menu is enabled when the page is in an // unknown language. - SimulateNavigation(url, "G00g1e", "und", true); + SimulateNavigation(url, "und", true); menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); menu->Init(); EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE)); @@ -1091,7 +1077,7 @@ TEST_F(TranslateManagerTest, ContextMenu) { // Test that the translate context menu is disabled when the page is in an // unsupported language. - SimulateNavigation(url, "G00g1e", "qbz", true); + SimulateNavigation(url, "qbz", true); menu.reset(TestRenderViewContextMenu::CreateContextMenu(contents())); menu->Init(); EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE)); @@ -1117,7 +1103,7 @@ TEST_F(TranslateManagerTest, BeforeTranslateExtraButtons) { for (int i = 0; i < 8; ++i) { SCOPED_TRACE(::testing::Message() << "Iteration " << i << " incognito mode=" << test_profile->IsOffTheRecord()); - SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); + SimulateNavigation(GURL("http://www.google.fr"), "fr", true); infobar = GetTranslateInfoBar(); ASSERT_TRUE(infobar != NULL); EXPECT_EQ(TranslateInfoBarDelegate::BEFORE_TRANSLATE, infobar->type()); @@ -1149,7 +1135,7 @@ TEST_F(TranslateManagerTest, BeforeTranslateExtraButtons) { for (int i = 0; i < 8; ++i) { SCOPED_TRACE(::testing::Message() << "Iteration " << i << " incognito mode=" << test_profile->IsOffTheRecord()); - SimulateNavigation(GURL("http://www.google.de"), "Das Google", "de", true); + SimulateNavigation(GURL("http://www.google.de"), "de", true); infobar = GetTranslateInfoBar(); ASSERT_TRUE(infobar != NULL); EXPECT_EQ(TranslateInfoBarDelegate::BEFORE_TRANSLATE, infobar->type()); @@ -1175,7 +1161,7 @@ TEST_F(TranslateManagerTest, BeforeTranslateExtraButtons) { // should not be translated. TEST_F(TranslateManagerTest, NonTranslatablePage) { // Simulate navigating to a page. - SimulateNavigation(GURL("http://mail.google.fr"), "Le Google", "fr", false); + SimulateNavigation(GURL("http://mail.google.fr"), "fr", false); // We should not have an infobar. EXPECT_TRUE(GetTranslateInfoBar() == NULL); @@ -1193,7 +1179,7 @@ TEST_F(TranslateManagerTest, ScriptExpires) { ExpireTranslateScriptImmediately(); // Simulate navigating to a page and translating it. - SimulateNavigation(GURL("http://www.google.fr"), "Le Google", "fr", true); + SimulateNavigation(GURL("http://www.google.fr"), "fr", true); TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); ASSERT_TRUE(infobar != NULL); process()->sink().ClearMessages(); @@ -1206,7 +1192,7 @@ TEST_F(TranslateManagerTest, ScriptExpires) { MessageLoop::current()->RunAllPending(); // Do another navigation and translation. - SimulateNavigation(GURL("http://www.google.es"), "El Google", "es", true); + SimulateNavigation(GURL("http://www.google.es"), "es", true); infobar = GetTranslateInfoBar(); ASSERT_TRUE(infobar != NULL); process()->sink().ClearMessages(); diff --git a/chrome/browser/translate/translate_tab_helper.cc b/chrome/browser/translate/translate_tab_helper.cc new file mode 100644 index 0000000..d7ec4fc --- /dev/null +++ b/chrome/browser/translate/translate_tab_helper.cc @@ -0,0 +1,61 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/translate/translate_tab_helper.h" + +#include "chrome/browser/translate/page_translated_details.h" +#include "chrome/common/render_messages.h" +#include "content/browser/tab_contents/tab_contents.h" +#include "content/common/notification_service.h" + +TranslateTabHelper::TranslateTabHelper(TabContents* tab_contents) + : TabContentsObserver(tab_contents), + language_state_(&tab_contents->controller()) { +} + +TranslateTabHelper::~TranslateTabHelper() { +} + +bool TranslateTabHelper::OnMessageReceived(const IPC::Message& message) { + bool handled = true; + IPC_BEGIN_MESSAGE_MAP(TranslateTabHelper, message) + IPC_MESSAGE_HANDLER(ViewHostMsg_TranslateLanguageDetermined, + OnLanguageDetermined) + IPC_MESSAGE_HANDLER(ViewHostMsg_PageTranslated, OnPageTranslated) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + + return handled; +} + +void TranslateTabHelper::DidNavigateAnyFramePostCommit( + const NavigationController::LoadCommittedDetails& details, + const ViewHostMsg_FrameNavigate_Params& params) { + // Let the LanguageState clear its state. + language_state_.DidNavigate(details); +} + +void TranslateTabHelper::OnLanguageDetermined(const std::string& language, + bool page_translatable) { + language_state_.LanguageDetermined(language, page_translatable); + + std::string lang = language; + NotificationService::current()->Notify( + NotificationType::TAB_LANGUAGE_DETERMINED, + Source<TabContents>(tab_contents()), + Details<std::string>(&lang)); +} + +void TranslateTabHelper::OnPageTranslated(int32 page_id, + const std::string& original_lang, + const std::string& translated_lang, + TranslateErrors::Type error_type) { + language_state_.set_current_language(translated_lang); + language_state_.set_translation_pending(false); + PageTranslatedDetails details(original_lang, translated_lang, error_type); + NotificationService::current()->Notify( + NotificationType::PAGE_TRANSLATED, + Source<TabContents>(tab_contents()), + Details<PageTranslatedDetails>(&details)); +} diff --git a/chrome/browser/translate/translate_tab_helper.h b/chrome/browser/translate/translate_tab_helper.h new file mode 100644 index 0000000..874f47d --- /dev/null +++ b/chrome/browser/translate/translate_tab_helper.h @@ -0,0 +1,40 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_TRANSLATE_TRANSLATE_TAB_HELPER_H_ +#define CHROME_BROWSER_TRANSLATE_TRANSLATE_TAB_HELPER_H_ +#pragma once + +#include "chrome/browser/tab_contents/language_state.h" +#include "chrome/common/translate_errors.h" +#include "content/browser/tab_contents/tab_contents_observer.h" + +class TranslateTabHelper : public TabContentsObserver { + public: + explicit TranslateTabHelper(TabContents* tab_contents); + ~TranslateTabHelper(); + + LanguageState& language_state() { return language_state_; } + + private: + // TabContentsObserver implementation. + virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; + virtual void DidNavigateAnyFramePostCommit( + const NavigationController::LoadCommittedDetails& details, + const ViewHostMsg_FrameNavigate_Params& params) OVERRIDE; + + void OnLanguageDetermined(const std::string& language, + bool page_translatable); + void OnPageTranslated(int32 page_id, + const std::string& original_lang, + const std::string& translated_lang, + TranslateErrors::Type error_type); + + // Information about the language the page is in and has been translated to. + LanguageState language_state_; + + DISALLOW_COPY_AND_ASSIGN(TranslateTabHelper); +}; + +#endif // CHROME_BROWSER_TRANSLATE_TRANSLATE_TAB_HELPER_H_ |