diff options
author | jcivelli@chromium.org <jcivelli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-19 00:06:23 +0000 |
---|---|---|
committer | jcivelli@chromium.org <jcivelli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-19 00:06:23 +0000 |
commit | b3b4a0c6f16541f5eea81821c2b2f9fb73d6ccf8 (patch) | |
tree | ccddcca65a211cbaa50d92f9c96c5e2ec2b90228 /chrome/browser/translate | |
parent | 483d295ffb20a3eb03e87e75b538b9f1b3d08749 (diff) | |
download | chromium_src-b3b4a0c6f16541f5eea81821c2b2f9fb73d6ccf8.zip chromium_src-b3b4a0c6f16541f5eea81821c2b2f9fb73d6ccf8.tar.gz chromium_src-b3b4a0c6f16541f5eea81821c2b2f9fb73d6ccf8.tar.bz2 |
When Chrome translates a page, the translate server might detect that the page is in a different language than the one Chrome detected.
If that language is not in the list of languages that Chrome supports for translation, then we do not know what to show and we were crashing.
This CL makes it so that we show an error infobar instead.
Note that in the future we should improve the "after translate" infobar to support showing the original language as unknown. (http://crbug.com/9390)
BUG=48918
TEST=Not sure how to test without changing the code.
Review URL: http://codereview.chromium.org/3011008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@52876 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/translate')
-rw-r--r-- | chrome/browser/translate/translate_infobar_delegate.cc | 11 | ||||
-rw-r--r-- | chrome/browser/translate/translate_manager.cc | 8 | ||||
-rw-r--r-- | chrome/browser/translate/translate_manager_unittest.cc | 45 |
3 files changed, 57 insertions, 7 deletions
diff --git a/chrome/browser/translate/translate_infobar_delegate.cc b/chrome/browser/translate/translate_infobar_delegate.cc index be616b4..2233991 100644 --- a/chrome/browser/translate/translate_infobar_delegate.cc +++ b/chrome/browser/translate/translate_infobar_delegate.cc @@ -275,6 +275,10 @@ string16 TranslateInfoBarDelegate::GetMessageInfoBarText() { case TranslateErrors::UNKNOWN_LANGUAGE: return l10n_util::GetStringUTF16( IDS_TRANSLATE_INFOBAR_UNKNOWN_PAGE_LANGUAGE); + case TranslateErrors::UNSUPPORTED_LANGUAGE: + return l10n_util::GetStringFUTF16( + IDS_TRANSLATE_INFOBAR_UNSUPPORTED_PAGE_LANGUAGE, + GetLanguageDisplayableNameAt(target_language_index_)); case TranslateErrors::IDENTICAL_LANGUAGES: return l10n_util::GetStringFUTF16( IDS_TRANSLATE_INFOBAR_ERROR_SAME_LANGUAGE, @@ -299,6 +303,8 @@ string16 TranslateInfoBarDelegate::GetMessageInfoBarButtonText() { // No retry button, we would fail again with the same error. return string16(); } + if (error_ == TranslateErrors::UNSUPPORTED_LANGUAGE) + return l10n_util::GetStringUTF16(IDS_TRANSLATE_INFOBAR_REVERT); return l10n_util::GetStringUTF16(IDS_TRANSLATE_INFOBAR_RETRY); default: NOTREACHED(); @@ -308,6 +314,11 @@ string16 TranslateInfoBarDelegate::GetMessageInfoBarButtonText() { void TranslateInfoBarDelegate::MessageInfoBarButtonPressed() { DCHECK(type_ == kTranslationError); + if (error_ == TranslateErrors::UNSUPPORTED_LANGUAGE) { + RevertTranslation(); + return; + } + // This is the "Try again..." case. Singleton<TranslateManager>::get()->TranslatePage( tab_contents_, GetOriginalLanguageCode(), GetTargetLanguageCode()); } diff --git a/chrome/browser/translate/translate_manager.cc b/chrome/browser/translate/translate_manager.cc index 0956028..8a8e645 100644 --- a/chrome/browser/translate/translate_manager.cc +++ b/chrome/browser/translate/translate_manager.cc @@ -479,6 +479,14 @@ void TranslateManager::PageTranslated(TabContents* tab, infobar = TranslateInfoBarDelegate::CreateErrorDelegate( details->error_type, tab, details->source_language, details->target_language); + } else if (!IsSupportedLanguage(details->source_language)) { + // TODO(jcivelli): http://crbug.com/9390 We should change the "after + // translate" infobar to support unknown as the original + // language. + UMA_HISTOGRAM_COUNTS("Translate.ServerReportedUnsupportedLanguage", 1); + infobar = TranslateInfoBarDelegate::CreateErrorDelegate( + TranslateErrors::UNSUPPORTED_LANGUAGE, tab, + details->source_language, details->target_language); } else { infobar = TranslateInfoBarDelegate::CreateDelegate( TranslateInfoBarDelegate::kAfterTranslate, tab, diff --git a/chrome/browser/translate/translate_manager_unittest.cc b/chrome/browser/translate/translate_manager_unittest.cc index 47c83b7..41d8c3d 100644 --- a/chrome/browser/translate/translate_manager_unittest.cc +++ b/chrome/browser/translate/translate_manager_unittest.cc @@ -31,11 +31,6 @@ using testing::Pointee; using testing::Property; using WebKit::WebContextMenuData; -class TestTranslateManager : public TranslateManager { - public: - TestTranslateManager() {} -}; - class TranslateManagerTest : public RenderViewHostTestHarness, public NotificationObserver { public: @@ -193,7 +188,6 @@ class TranslateManagerTest : public RenderViewHostTestHarness, private: NotificationRegistrar notification_registrar_; - scoped_ptr<TestTranslateManager> translate_manager_; TestURLFetcherFactory url_fetcher_factory_; // The list of infobars that have been removed. @@ -711,7 +705,7 @@ TEST_F(TranslateManagerTest, TranslateInPageNavigation) { // Tests that no translate infobar is shown when navigating to a page in an // unsupported language. -TEST_F(TranslateManagerTest, UnsupportedPageLanguage) { +TEST_F(TranslateManagerTest, CLDReportsUnsupportedPageLanguage) { // Simulate navigating to a page and getting an unsupported language. SimulateNavigation(GURL("http://www.google.com"), 0, "Google", "qbz", true); @@ -719,6 +713,42 @@ TEST_F(TranslateManagerTest, UnsupportedPageLanguage) { EXPECT_TRUE(GetTranslateInfoBar() == NULL); } +// Tests that we deal correctly with unsupported languages returned by the +// server. +// The translation server might return a language we don't support. +TEST_F(TranslateManagerTest, ServerReportsUnsupportedLanguage) { + // Simulate navigating to a page and translating it. + SimulateNavigation(GURL("http://mail.google.fr"), 0, "Le Google", "fr", + true); + TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + process()->sink().ClearMessages(); + infobar->Translate(); + SimulateURLFetch(true); + // Simulate the render notifying the translation has been done, but it + // reports a language we don't support. + rvh()->TestOnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "qbz", "en", + TranslateErrors::NONE)); + + // An error infobar should be showing to report that we don't support this + // language. + infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar != NULL); + EXPECT_EQ(TranslateInfoBarDelegate::kTranslationError, infobar->type()); + + // This infobar should have a button (so the string should not be empty). + ASSERT_FALSE(infobar->GetMessageInfoBarButtonText().empty()); + + // Pressing the button on that infobar should revert to the original language. + process()->sink().ClearMessages(); + infobar->MessageInfoBarButtonPressed(); + const IPC::Message* message = + process()->sink().GetFirstMessageMatching(ViewMsg_RevertTranslation::ID); + EXPECT_TRUE(message != NULL); + // And it should have removed the infobar. + EXPECT_TRUE(GetTranslateInfoBar() == NULL); +} + // Tests that no translate infobar is shown when Chrome is in a language that // the translate server does not support. TEST_F(TranslateManagerTest, UnsupportedUILanguage) { @@ -1088,3 +1118,4 @@ TEST_F(TranslateManagerTest, NonTranslatablePage) { EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE)); EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE)); } + |