summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormad@chromium.org <mad@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-08-10 04:09:16 +0000
committermad@chromium.org <mad@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-08-10 04:09:16 +0000
commitdd81a7cffbcd74216cfa630b02b3109401a448bd (patch)
tree99abdacbb096036ea6f8be44ea77857dfc144905
parent4fe827a4470d67eb2e9c6b71f3f60580a33cc8a4 (diff)
downloadchromium_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
-rw-r--r--chrome/browser/translate/translate_infobar_delegate.cc11
-rw-r--r--chrome/browser/translate/translate_infobar_delegate.h11
-rw-r--r--chrome/browser/translate/translate_manager.cc20
-rw-r--r--chrome/browser/translate/translate_manager_browsertest.cc11
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.