| Index: chrome/browser/translate/translate_infobar_delegate.cc | 
| =================================================================== | 
| --- chrome/browser/translate/translate_infobar_delegate.cc	(revision 175396) | 
| +++ chrome/browser/translate/translate_infobar_delegate.cc	(working copy) | 
| @@ -25,48 +25,51 @@ | 
| // static | 
| const size_t TranslateInfoBarDelegate::kNoIndex = static_cast<size_t>(-1); | 
|  | 
| -// static | 
| -TranslateInfoBarDelegate* TranslateInfoBarDelegate::CreateDelegate( | 
| -    Type infobar_type, | 
| -    InfoBarService* infobar_service, | 
| -    PrefService* prefs, | 
| -    const std::string& original_language, | 
| -    const std::string& target_language) { | 
| -  DCHECK_NE(TRANSLATION_ERROR, infobar_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(TranslateManager::IsSupportedLanguage(original_language) || | 
| -         ((infobar_type == TRANSLATING) && | 
| -          (original_language == chrome::kUnknownLanguageCode))); | 
| -  TranslateInfoBarDelegate* delegate = | 
| -      new TranslateInfoBarDelegate(infobar_type, | 
| -                                   TranslateErrors::NONE, | 
| -                                   infobar_service, | 
| -                                   prefs, | 
| -                                   original_language, | 
| -                                   target_language); | 
| -  DCHECK_NE(kNoIndex, delegate->target_language_index()); | 
| -  return delegate; | 
| +TranslateInfoBarDelegate::~TranslateInfoBarDelegate() { | 
| } | 
|  | 
| -TranslateInfoBarDelegate* TranslateInfoBarDelegate::CreateErrorDelegate( | 
| -    TranslateErrors::Type error_type, | 
| -    InfoBarService* infobar_service, | 
| -    PrefService* prefs, | 
| -    const std::string& original_language, | 
| -    const std::string& target_language) { | 
| -  return new TranslateInfoBarDelegate(TRANSLATION_ERROR, | 
| -                                      error_type, | 
| -                                      infobar_service, | 
| -                                      prefs, | 
| -                                      original_language, | 
| -                                      target_language); | 
| -} | 
| +// static | 
| +void TranslateInfoBarDelegate::Create(InfoBarService* infobar_service, | 
| +                                      bool replace_existing_infobar, | 
| +                                      Type infobar_type, | 
| +                                      TranslateErrors::Type error_type, | 
| +                                      PrefService* prefs, | 
| +                                      const std::string& original_language, | 
| +                                      const std::string& target_language) { | 
| +  // Check preconditions. | 
| +  if (infobar_type != TRANSLATION_ERROR) { | 
| +    DCHECK(TranslateManager::IsSupportedLanguage(target_language)); | 
| +    if (!TranslateManager::IsSupportedLanguage(original_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_EQ(TRANSLATING, infobar_type); | 
| +      DCHECK_EQ(chrome::kUnknownLanguageCode, original_language); | 
| +    } | 
| +  } | 
|  | 
| -TranslateInfoBarDelegate::~TranslateInfoBarDelegate() { | 
| +  // Find any existing translate infobar delegate. | 
| +  TranslateInfoBarDelegate* old_delegate = NULL; | 
| +  for (size_t i = 0; i < infobar_service->GetInfoBarCount(); ++i) { | 
| +    old_delegate = | 
| +        infobar_service->GetInfoBarDelegateAt(i)->AsTranslateInfoBarDelegate(); | 
| +    if (old_delegate) | 
| +      break; | 
| +  } | 
| + | 
| +  // Create the new delegate. | 
| +  scoped_ptr<TranslateInfoBarDelegate> infobar( | 
| +      new TranslateInfoBarDelegate(infobar_type, error_type, infobar_service, | 
| +                                   prefs, original_language, target_language)); | 
| +  infobar->UpdateBackgroundAnimation(old_delegate); | 
| + | 
| +  // Add the new delegate if necessary. | 
| +  if (!old_delegate) { | 
| +    infobar_service->AddInfoBar(infobar.PassAs<InfoBarDelegate>()); | 
| +  } else if (replace_existing_infobar) { | 
| +    infobar_service->ReplaceInfoBar(old_delegate, | 
| +                                    infobar.PassAs<InfoBarDelegate>()); | 
| +  } | 
| } | 
|  | 
| void TranslateInfoBarDelegate::Translate() { | 
|  |