diff options
author | mad@chromium.org <mad@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-10 04:09:16 +0000 |
---|---|---|
committer | mad@chromium.org <mad@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-10 04:09:16 +0000 |
commit | dd81a7cffbcd74216cfa630b02b3109401a448bd (patch) | |
tree | 99abdacbb096036ea6f8be44ea77857dfc144905 | |
parent | 4fe827a4470d67eb2e9c6b71f3f60580a33cc8a4 (diff) | |
download | chromium_src-dd81a7cffbcd74216cfa630b02b3109401a448bd.zip chromium_src-dd81a7cffbcd74216cfa630b02b3109401a448bd.tar.gz chromium_src-dd81a7cffbcd74216cfa630b02b3109401a448bd.tar.bz2 |
Fix a crash in the translate info bar.
A language from the accepted list was converted before being validated, but the unconverted version was returned.
BUG=90106
Review URL: http://codereview.chromium.org/7589002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@96125 0039d316-1c4b-4281-b951-d872f2087c98
4 files changed, 29 insertions, 24 deletions
diff --git a/chrome/browser/translate/translate_infobar_delegate.cc b/chrome/browser/translate/translate_infobar_delegate.cc index 813889e..2054199 100644 --- a/chrome/browser/translate/translate_infobar_delegate.cc +++ b/chrome/browser/translate/translate_infobar_delegate.cc @@ -30,15 +30,14 @@ TranslateInfoBarDelegate* TranslateInfoBarDelegate::CreateDelegate( const std::string& original_language, const std::string& target_language) { DCHECK_NE(TRANSLATION_ERROR, type); + // These must be validated by our callers. + DCHECK(TranslateManager::IsSupportedLanguage(target_language)); // The original language can only be "unknown" for the "translating" // infobar, which is the case when the user started a translation from the // context menu. - DCHECK(type == TRANSLATING || - original_language != chrome::kUnknownLanguageCode); - if ((original_language != chrome::kUnknownLanguageCode && - !TranslateManager::IsSupportedLanguage(original_language)) || - !TranslateManager::IsSupportedLanguage(target_language)) - return NULL; + DCHECK(TranslateManager::IsSupportedLanguage(original_language) || + ((type == TRANSLATING) && + (original_language == chrome::kUnknownLanguageCode))); TranslateInfoBarDelegate* delegate = new TranslateInfoBarDelegate(type, TranslateErrors::NONE, tab_contents, original_language, target_language); diff --git a/chrome/browser/translate/translate_infobar_delegate.h b/chrome/browser/translate/translate_infobar_delegate.h index c94893c..6010d4e 100644 --- a/chrome/browser/translate/translate_infobar_delegate.h +++ b/chrome/browser/translate/translate_infobar_delegate.h @@ -36,11 +36,12 @@ class TranslateInfoBarDelegate : public InfoBarDelegate { static const size_t kNoIndex; - // Factory method to create a non-error translate infobar. - // The original and target language specified are the ASCII language codes - // (ex: en, fr...). - // Returns NULL if it failed, typically if |original_language| or - // |target_language| is not a supported language. + // Factory method to create a non-error translate infobar. |original_language| + // and |target_language| must be ASCII language codes (e.g. "en", "fr", etc.) + // for languages the TranslateManager supports translating. The lone exception + // is when the user initiates translation from the context menu, in which case + // it's legal to call this with |type| == TRANSLATING and + // |originalLanguage| == kUnknownLanguageCode. static TranslateInfoBarDelegate* CreateDelegate( Type infobar_type, TabContents* tab_contents, diff --git a/chrome/browser/translate/translate_manager.cc b/chrome/browser/translate/translate_manager.cc index 725e691..b2a51d5 100644 --- a/chrome/browser/translate/translate_manager.cc +++ b/chrome/browser/translate/translate_manager.cc @@ -507,7 +507,7 @@ void TranslateManager::InitiateTranslation(TabContents* tab, // Prompts the user if he/she wants the page translated. wrapper->AddInfoBar(TranslateInfoBarDelegate::CreateDelegate( TranslateInfoBarDelegate::BEFORE_TRANSLATE, tab, language_code, - target_lang)); + target_lang)); } void TranslateManager::InitiateTranslationPosted( @@ -534,17 +534,9 @@ void TranslateManager::TranslatePage(TabContents* tab_contents, return; } - TranslateInfoBarDelegate* infobar = TranslateInfoBarDelegate::CreateDelegate( + ShowInfoBar(tab_contents, TranslateInfoBarDelegate::CreateDelegate( TranslateInfoBarDelegate::TRANSLATING, tab_contents, - source_lang, target_lang); - if (!infobar) { - // This means the source or target languages are not supported, which should - // not happen as we won't show a translate infobar or have the translate - // context menu activated in such cases. - NOTREACHED(); - return; - } - ShowInfoBar(tab_contents, infobar); + source_lang, target_lang)); if (!translate_script_.empty()) { DoTranslatePage(tab_contents, translate_script_, source_lang, target_lang); @@ -749,6 +741,7 @@ void TranslateManager::RequestTranslateScript() { void TranslateManager::ShowInfoBar(TabContents* tab, TranslateInfoBarDelegate* infobar) { + DCHECK(infobar != NULL); TranslateInfoBarDelegate* old_infobar = GetTranslateInfoBarDelegate(tab); infobar->UpdateBackgroundAnimation(old_infobar); TabContentsWrapper* wrapper = @@ -781,8 +774,9 @@ std::string TranslateManager::GetTargetLanguage(PrefService* prefs) { std::vector<std::string>::iterator iter; for (iter = accept_langs_list.begin(); iter != accept_langs_list.end(); ++iter) { - if (IsSupportedLanguage(GetLanguageCode(*iter))) - return *iter; + std::string lang_code = GetLanguageCode(*iter); + if (IsSupportedLanguage(lang_code)) + return lang_code; } return std::string(); } diff --git a/chrome/browser/translate/translate_manager_browsertest.cc b/chrome/browser/translate/translate_manager_browsertest.cc index 7545b26..250e948 100644 --- a/chrome/browser/translate/translate_manager_browsertest.cc +++ b/chrome/browser/translate/translate_manager_browsertest.cc @@ -903,6 +903,17 @@ TEST_F(TranslateManagerTest, TranslateAcceptLanguage) { // 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. |