summaryrefslogtreecommitdiffstats
path: root/chrome/browser/translate
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-13 00:44:31 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-13 00:44:31 +0000
commit93b9d6948d212b630a115dc4b77bbe6bf2b3b671 (patch)
tree92e02d514f2b44cdd2b7f82063ed3e91af3773bf /chrome/browser/translate
parent71504b42e176b37b9324897a53908df5ba6c723e (diff)
downloadchromium_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.cc6
-rw-r--r--chrome/browser/translate/translate_manager.cc51
-rw-r--r--chrome/browser/translate/translate_manager_browsertest.cc140
-rw-r--r--chrome/browser/translate/translate_tab_helper.cc61
-rw-r--r--chrome/browser/translate/translate_tab_helper.h40
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_