Chromium Code Reviews| OLD | NEW | 
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "chrome/browser/translate/translate_infobar_delegate.h" | 5 #include "chrome/browser/translate/translate_infobar_delegate.h" | 
| 6 | 6 | 
| 7 #include <algorithm> | 7 #include <algorithm> | 
| 8 | 8 | 
| 9 #include "base/i18n/string_compare.h" | 9 #include "base/i18n/string_compare.h" | 
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" | 
| 11 #include "base/prefs/pref_service.h" | 11 #include "base/prefs/pref_service.h" | 
| 12 #include "chrome/browser/browser_process.h" | 12 #include "chrome/browser/browser_process.h" | 
| 13 #include "chrome/browser/infobars/infobar_service.h" | 13 #include "chrome/browser/infobars/infobar_service.h" | 
| 14 #include "chrome/browser/profiles/profile.h" | 14 #include "chrome/browser/profiles/profile.h" | 
| 15 #include "chrome/browser/translate/translate_accept_languages.h" | 15 #include "chrome/browser/translate/translate_accept_languages.h" | 
| 16 #include "chrome/browser/translate/translate_manager.h" | 16 #include "chrome/browser/translate/translate_manager.h" | 
| 17 #include "chrome/browser/translate/translate_tab_helper.h" | 17 #include "chrome/browser/translate/translate_tab_helper.h" | 
| 18 #include "content/public/browser/navigation_details.h" | 18 #include "content/public/browser/navigation_details.h" | 
| 19 #include "content/public/browser/navigation_entry.h" | 19 #include "content/public/browser/navigation_entry.h" | 
| 20 #include "content/public/browser/web_contents.h" | 20 #include "content/public/browser/web_contents.h" | 
| 21 #include "grit/generated_resources.h" | 21 #include "grit/generated_resources.h" | 
| 22 #include "grit/theme_resources.h" | 22 #include "grit/theme_resources.h" | 
| 23 #include "third_party/icu/source/i18n/unicode/coll.h" | 23 #include "third_party/icu/source/i18n/unicode/coll.h" | 
| 24 #include "ui/base/l10n/l10n_util.h" | 24 #include "ui/base/l10n/l10n_util.h" | 
| 25 | 25 | 
| 26 using content::NavigationEntry; | 26 using content::NavigationEntry; | 
| 27 | 27 | 
| 28 namespace { | 28 namespace { | 
| 29 | 29 | 
| 30 const char kDeclineTranslate[] = "Translate.DeclineTranslate"; | |
| 31 const char kCloseInfobar[] = "Translate.DeclineTranslateCloseInfobar"; | 30 const char kCloseInfobar[] = "Translate.DeclineTranslateCloseInfobar"; | 
| 32 const char kRevertTranslation[] = "Translate.RevertTranslation"; | |
| 33 const char kShowErrorInfobar[] = "Translate.ShowErrorInfobar"; | 31 const char kShowErrorInfobar[] = "Translate.ShowErrorInfobar"; | 
| 34 const char kPerformTranslate[] = "Translate.Translate"; | |
| 35 const char kNeverTranslateLang[] = "Translate.NeverTranslateLang"; | |
| 36 const char kNeverTranslateSite[] = "Translate.NeverTranslateSite"; | |
| 37 const char kAlwaysTranslateLang[] = "Translate.AlwaysTranslateLang"; | |
| 38 | 32 | 
| 39 } // namespace | 33 } // namespace | 
| 40 | 34 | 
| 41 // static | 35 const size_t TranslateInfoBarDelegate::kNoIndex = TranslateUIDelegate::kNoIndex; | 
| 
 
tapted
2013/10/03 10:03:11
This change (I think) has managed to add a static
 
hajimehoshi
2013/10/03 10:11:08
I guess the cause is that TranslateUIDelegate::kNo
 
 | |
| 42 const size_t TranslateInfoBarDelegate::kNoIndex = static_cast<size_t>(-1); | |
| 43 | 36 | 
| 44 TranslateInfoBarDelegate::~TranslateInfoBarDelegate() { | 37 TranslateInfoBarDelegate::~TranslateInfoBarDelegate() { | 
| 45 } | 38 } | 
| 46 | 39 | 
| 47 // static | 40 // static | 
| 48 void TranslateInfoBarDelegate::Create( | 41 void TranslateInfoBarDelegate::Create( | 
| 49 bool replace_existing_infobar, | 42 bool replace_existing_infobar, | 
| 50 InfoBarService* infobar_service, | 43 InfoBarService* infobar_service, | 
| 51 Type infobar_type, | 44 Type infobar_type, | 
| 52 const std::string& original_language, | 45 const std::string& original_language, | 
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 97 if (!old_delegate) { | 90 if (!old_delegate) { | 
| 98 infobar_service->AddInfoBar(infobar.PassAs<InfoBarDelegate>()); | 91 infobar_service->AddInfoBar(infobar.PassAs<InfoBarDelegate>()); | 
| 99 } else { | 92 } else { | 
| 100 DCHECK(replace_existing_infobar); | 93 DCHECK(replace_existing_infobar); | 
| 101 infobar_service->ReplaceInfoBar(old_delegate, | 94 infobar_service->ReplaceInfoBar(old_delegate, | 
| 102 infobar.PassAs<InfoBarDelegate>()); | 95 infobar.PassAs<InfoBarDelegate>()); | 
| 103 } | 96 } | 
| 104 } | 97 } | 
| 105 | 98 | 
| 106 void TranslateInfoBarDelegate::Translate() { | 99 void TranslateInfoBarDelegate::Translate() { | 
| 107 if (!web_contents()->GetBrowserContext()->IsOffTheRecord()) { | 100 ui_delegate_.Translate(); | 
| 108 prefs_.ResetTranslationDeniedCount(original_language_code()); | |
| 109 prefs_.IncrementTranslationAcceptedCount(original_language_code()); | |
| 110 } | |
| 111 | |
| 112 TranslateManager::GetInstance()->TranslatePage(web_contents(), | |
| 113 original_language_code(), | |
| 114 target_language_code()); | |
| 115 | |
| 116 UMA_HISTOGRAM_BOOLEAN(kPerformTranslate, true); | |
| 117 } | 101 } | 
| 118 | 102 | 
| 119 void TranslateInfoBarDelegate::RevertTranslation() { | 103 void TranslateInfoBarDelegate::RevertTranslation() { | 
| 120 TranslateManager::GetInstance()->RevertTranslation(web_contents()); | 104 ui_delegate_.RevertTranslation(); | 
| 121 RemoveSelf(); | 105 RemoveSelf(); | 
| 122 | |
| 123 UMA_HISTOGRAM_BOOLEAN(kRevertTranslation, true); | |
| 124 } | 106 } | 
| 125 | 107 | 
| 126 void TranslateInfoBarDelegate::ReportLanguageDetectionError() { | 108 void TranslateInfoBarDelegate::ReportLanguageDetectionError() { | 
| 127 TranslateManager::GetInstance()->ReportLanguageDetectionError( | 109 TranslateManager::GetInstance()->ReportLanguageDetectionError( | 
| 128 web_contents()); | 110 web_contents()); | 
| 129 } | 111 } | 
| 130 | 112 | 
| 131 void TranslateInfoBarDelegate::TranslationDeclined() { | 113 void TranslateInfoBarDelegate::TranslationDeclined() { | 
| 132 if (!web_contents()->GetBrowserContext()->IsOffTheRecord()) { | 114 ui_delegate_.TranslationDeclined(); | 
| 133 prefs_.ResetTranslationAcceptedCount(original_language_code()); | |
| 134 prefs_.IncrementTranslationDeniedCount(original_language_code()); | |
| 135 } | |
| 136 | |
| 137 // Remember that the user declined the translation so as to prevent showing a | |
| 138 // translate infobar for that page again. (TranslateManager initiates | |
| 139 // translations when getting a LANGUAGE_DETERMINED from the page, which | |
| 140 // happens when a load stops. That could happen multiple times, including | |
| 141 // after the user already declined the translation.) | |
| 142 TranslateTabHelper::FromWebContents(web_contents())-> | |
| 143 language_state().set_translation_declined(true); | |
| 144 | |
| 145 UMA_HISTOGRAM_BOOLEAN(kDeclineTranslate, true); | |
| 146 } | 115 } | 
| 147 | 116 | 
| 148 bool TranslateInfoBarDelegate::IsTranslatableLanguageByPrefs() { | 117 bool TranslateInfoBarDelegate::IsTranslatableLanguageByPrefs() { | 
| 149 Profile* profile = | 118 Profile* profile = | 
| 150 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); | 119 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); | 
| 151 Profile* original_profile = profile->GetOriginalProfile(); | 120 Profile* original_profile = profile->GetOriginalProfile(); | 
| 152 return TranslatePrefs::CanTranslateLanguage(original_profile, | 121 return TranslatePrefs::CanTranslateLanguage(original_profile, | 
| 153 original_language_code()); | 122 original_language_code()); | 
| 154 } | 123 } | 
| 155 | 124 | 
| 156 void TranslateInfoBarDelegate::ToggleTranslatableLanguageByPrefs() { | 125 void TranslateInfoBarDelegate::ToggleTranslatableLanguageByPrefs() { | 
| 157 const std::string& original_lang = original_language_code(); | 126 if (ui_delegate_.IsLanguageBlocked()) { | 
| 158 if (prefs_.IsBlockedLanguage(original_lang)) { | 127 ui_delegate_.SetLanguageBlocked(false); | 
| 159 prefs_.UnblockLanguage(original_lang); | |
| 160 } else { | 128 } else { | 
| 161 prefs_.BlockLanguage(original_lang); | 129 ui_delegate_.SetLanguageBlocked(true); | 
| 162 RemoveSelf(); | 130 RemoveSelf(); | 
| 163 } | 131 } | 
| 164 | |
| 165 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateLang, true); | |
| 166 } | 132 } | 
| 167 | 133 | 
| 168 bool TranslateInfoBarDelegate::IsSiteBlacklisted() { | 134 bool TranslateInfoBarDelegate::IsSiteBlacklisted() { | 
| 169 std::string host = GetPageHost(); | 135 return ui_delegate_.IsSiteBlacklisted(); | 
| 170 return !host.empty() && prefs_.IsSiteBlacklisted(host); | |
| 171 } | 136 } | 
| 172 | 137 | 
| 173 void TranslateInfoBarDelegate::ToggleSiteBlacklist() { | 138 void TranslateInfoBarDelegate::ToggleSiteBlacklist() { | 
| 174 std::string host = GetPageHost(); | 139 if (ui_delegate_.IsSiteBlacklisted()) { | 
| 175 if (host.empty()) | 140 ui_delegate_.SetSiteBlacklist(false); | 
| 176 return; | |
| 177 | |
| 178 if (prefs_.IsSiteBlacklisted(host)) { | |
| 179 prefs_.RemoveSiteFromBlacklist(host); | |
| 180 } else { | 141 } else { | 
| 181 prefs_.BlacklistSite(host); | 142 ui_delegate_.SetSiteBlacklist(true); | 
| 182 RemoveSelf(); | 143 RemoveSelf(); | 
| 183 } | 144 } | 
| 184 | |
| 185 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateSite, true); | |
| 186 } | 145 } | 
| 187 | 146 | 
| 188 bool TranslateInfoBarDelegate::ShouldAlwaysTranslate() { | 147 bool TranslateInfoBarDelegate::ShouldAlwaysTranslate() { | 
| 189 return prefs_.IsLanguagePairWhitelisted(original_language_code(), | 148 return ui_delegate_.ShouldAlwaysTranslate(); | 
| 190 target_language_code()); | |
| 191 } | 149 } | 
| 192 | 150 | 
| 193 void TranslateInfoBarDelegate::ToggleAlwaysTranslate() { | 151 void TranslateInfoBarDelegate::ToggleAlwaysTranslate() { | 
| 194 const std::string& original_lang = original_language_code(); | 152 ui_delegate_.SetAlwaysTranslate(!ui_delegate_.ShouldAlwaysTranslate()); | 
| 195 const std::string& target_lang = target_language_code(); | |
| 196 if (prefs_.IsLanguagePairWhitelisted(original_lang, target_lang)) | |
| 197 prefs_.RemoveLanguagePairFromWhitelist(original_lang, target_lang); | |
| 198 else | |
| 199 prefs_.WhitelistLanguagePair(original_lang, target_lang); | |
| 200 | |
| 201 UMA_HISTOGRAM_BOOLEAN(kAlwaysTranslateLang, true); | |
| 202 } | 153 } | 
| 203 | 154 | 
| 204 void TranslateInfoBarDelegate::AlwaysTranslatePageLanguage() { | 155 void TranslateInfoBarDelegate::AlwaysTranslatePageLanguage() { | 
| 205 const std::string& original_lang = original_language_code(); | 156 DCHECK(!ui_delegate_.ShouldAlwaysTranslate()); | 
| 206 const std::string& target_lang = target_language_code(); | 157 ui_delegate_.SetAlwaysTranslate(true); | 
| 207 DCHECK(!prefs_.IsLanguagePairWhitelisted(original_lang, target_lang)); | |
| 208 prefs_.WhitelistLanguagePair(original_lang, target_lang); | |
| 209 Translate(); | 158 Translate(); | 
| 210 } | 159 } | 
| 211 | 160 | 
| 212 void TranslateInfoBarDelegate::NeverTranslatePageLanguage() { | 161 void TranslateInfoBarDelegate::NeverTranslatePageLanguage() { | 
| 213 std::string original_lang = original_language_code(); | 162 DCHECK(!ui_delegate_.IsLanguageBlocked()); | 
| 214 prefs_.BlockLanguage(original_lang); | 163 ui_delegate_.SetLanguageBlocked(true); | 
| 215 RemoveSelf(); | 164 RemoveSelf(); | 
| 216 } | 165 } | 
| 217 | 166 | 
| 218 string16 TranslateInfoBarDelegate::GetMessageInfoBarText() { | 167 string16 TranslateInfoBarDelegate::GetMessageInfoBarText() { | 
| 219 if (infobar_type_ == TRANSLATING) { | 168 if (infobar_type_ == TRANSLATING) { | 
| 169 string16 target_language_name = language_name_at(target_language_index()); | |
| 220 return l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_TRANSLATING_TO, | 170 return l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_TRANSLATING_TO, | 
| 221 language_name_at(target_language_index_)); | 171 target_language_name); | 
| 222 } | 172 } | 
| 223 | 173 | 
| 224 DCHECK_EQ(TRANSLATION_ERROR, infobar_type_); | 174 DCHECK_EQ(TRANSLATION_ERROR, infobar_type_); | 
| 225 UMA_HISTOGRAM_ENUMERATION(kShowErrorInfobar, | 175 UMA_HISTOGRAM_ENUMERATION(kShowErrorInfobar, | 
| 226 error_type_, | 176 error_type_, | 
| 227 TranslateErrors::TRANSLATE_ERROR_MAX); | 177 TranslateErrors::TRANSLATE_ERROR_MAX); | 
| 228 switch (error_type_) { | 178 switch (error_type_) { | 
| 229 case TranslateErrors::NETWORK: | 179 case TranslateErrors::NETWORK: | 
| 230 return l10n_util::GetStringUTF16( | 180 return l10n_util::GetStringUTF16( | 
| 231 IDS_TRANSLATE_INFOBAR_ERROR_CANT_CONNECT); | 181 IDS_TRANSLATE_INFOBAR_ERROR_CANT_CONNECT); | 
| 232 case TranslateErrors::INITIALIZATION_ERROR: | 182 case TranslateErrors::INITIALIZATION_ERROR: | 
| 233 case TranslateErrors::TRANSLATION_ERROR: | 183 case TranslateErrors::TRANSLATION_ERROR: | 
| 234 return l10n_util::GetStringUTF16( | 184 return l10n_util::GetStringUTF16( | 
| 235 IDS_TRANSLATE_INFOBAR_ERROR_CANT_TRANSLATE); | 185 IDS_TRANSLATE_INFOBAR_ERROR_CANT_TRANSLATE); | 
| 236 case TranslateErrors::UNKNOWN_LANGUAGE: | 186 case TranslateErrors::UNKNOWN_LANGUAGE: | 
| 237 return l10n_util::GetStringUTF16( | 187 return l10n_util::GetStringUTF16( | 
| 238 IDS_TRANSLATE_INFOBAR_UNKNOWN_PAGE_LANGUAGE); | 188 IDS_TRANSLATE_INFOBAR_UNKNOWN_PAGE_LANGUAGE); | 
| 239 case TranslateErrors::UNSUPPORTED_LANGUAGE: | 189 case TranslateErrors::UNSUPPORTED_LANGUAGE: | 
| 240 return l10n_util::GetStringFUTF16( | 190 return l10n_util::GetStringFUTF16( | 
| 241 IDS_TRANSLATE_INFOBAR_UNSUPPORTED_PAGE_LANGUAGE, | 191 IDS_TRANSLATE_INFOBAR_UNSUPPORTED_PAGE_LANGUAGE, | 
| 242 language_name_at(target_language_index_)); | 192 language_name_at(target_language_index())); | 
| 243 case TranslateErrors::IDENTICAL_LANGUAGES: | 193 case TranslateErrors::IDENTICAL_LANGUAGES: | 
| 244 return l10n_util::GetStringFUTF16( | 194 return l10n_util::GetStringFUTF16( | 
| 245 IDS_TRANSLATE_INFOBAR_ERROR_SAME_LANGUAGE, | 195 IDS_TRANSLATE_INFOBAR_ERROR_SAME_LANGUAGE, | 
| 246 language_name_at(target_language_index_)); | 196 language_name_at(target_language_index())); | 
| 247 default: | 197 default: | 
| 248 NOTREACHED(); | 198 NOTREACHED(); | 
| 249 return string16(); | 199 return string16(); | 
| 250 } | 200 } | 
| 251 } | 201 } | 
| 252 | 202 | 
| 253 string16 TranslateInfoBarDelegate::GetMessageInfoBarButtonText() { | 203 string16 TranslateInfoBarDelegate::GetMessageInfoBarButtonText() { | 
| 254 if (infobar_type_ != TRANSLATION_ERROR) { | 204 if (infobar_type_ != TRANSLATION_ERROR) { | 
| 255 DCHECK_EQ(TRANSLATING, infobar_type_); | 205 DCHECK_EQ(TRANSLATING, infobar_type_); | 
| 256 } else if ((error_type_ != TranslateErrors::IDENTICAL_LANGUAGES) && | 206 } else if ((error_type_ != TranslateErrors::IDENTICAL_LANGUAGES) && | 
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 337 Type infobar_type, | 287 Type infobar_type, | 
| 338 TranslateInfoBarDelegate* old_delegate, | 288 TranslateInfoBarDelegate* old_delegate, | 
| 339 const std::string& original_language, | 289 const std::string& original_language, | 
| 340 const std::string& target_language, | 290 const std::string& target_language, | 
| 341 TranslateErrors::Type error_type, | 291 TranslateErrors::Type error_type, | 
| 342 PrefService* prefs, | 292 PrefService* prefs, | 
| 343 ShortcutConfiguration shortcut_config) | 293 ShortcutConfiguration shortcut_config) | 
| 344 : InfoBarDelegate(infobar_service), | 294 : InfoBarDelegate(infobar_service), | 
| 345 infobar_type_(infobar_type), | 295 infobar_type_(infobar_type), | 
| 346 background_animation_(NONE), | 296 background_animation_(NONE), | 
| 347 original_language_index_(kNoIndex), | 297 ui_delegate_(web_contents(), original_language, target_language), | 
| 348 initial_original_language_index_(kNoIndex), | |
| 349 target_language_index_(kNoIndex), | |
| 350 error_type_(error_type), | 298 error_type_(error_type), | 
| 351 prefs_(prefs), | 299 prefs_(prefs), | 
| 352 shortcut_config_(shortcut_config) { | 300 shortcut_config_(shortcut_config) { | 
| 353 DCHECK_NE((infobar_type_ == TRANSLATION_ERROR), | 301 DCHECK_NE((infobar_type_ == TRANSLATION_ERROR), | 
| 354 (error_type_ == TranslateErrors::NONE)); | 302 (error_type_ == TranslateErrors::NONE)); | 
| 355 | 303 | 
| 356 if (old_delegate && (old_delegate->is_error() != is_error())) | 304 if (old_delegate && (old_delegate->is_error() != is_error())) | 
| 357 background_animation_ = is_error() ? NORMAL_TO_ERROR : ERROR_TO_NORMAL; | 305 background_animation_ = is_error() ? NORMAL_TO_ERROR : ERROR_TO_NORMAL; | 
| 358 | |
| 359 std::vector<std::string> language_codes; | |
| 360 TranslateManager::GetSupportedLanguages(&language_codes); | |
| 361 | |
| 362 // Preparing for the alphabetical order in the locale. | |
| 363 UErrorCode error = U_ZERO_ERROR; | |
| 364 std::string locale = g_browser_process->GetApplicationLocale(); | |
| 365 icu::Locale loc(locale.c_str()); | |
| 366 scoped_ptr<icu::Collator> collator(icu::Collator::createInstance(loc, error)); | |
| 367 collator->setStrength(icu::Collator::PRIMARY); | |
| 368 | |
| 369 languages_.reserve(language_codes.size()); | |
| 370 for (std::vector<std::string>::const_iterator iter = language_codes.begin(); | |
| 371 iter != language_codes.end(); ++iter) { | |
| 372 std::string language_code = *iter; | |
| 373 | |
| 374 string16 language_name = GetLanguageDisplayableName(language_code); | |
| 375 // Insert the language in languages_ in alphabetical order. | |
| 376 std::vector<LanguageNamePair>::iterator iter2; | |
| 377 for (iter2 = languages_.begin(); iter2 != languages_.end(); ++iter2) { | |
| 378 if (base::i18n::CompareString16WithCollator(collator.get(), | |
| 379 language_name, iter2->second) == UCOL_LESS) { | |
| 380 break; | |
| 381 } | |
| 382 } | |
| 383 languages_.insert(iter2, LanguageNamePair(language_code, language_name)); | |
| 384 } | |
| 385 for (std::vector<LanguageNamePair>::const_iterator iter = languages_.begin(); | |
| 386 iter != languages_.end(); ++iter) { | |
| 387 std::string language_code = iter->first; | |
| 388 if (language_code == original_language) { | |
| 389 original_language_index_ = iter - languages_.begin(); | |
| 390 initial_original_language_index_ = original_language_index_; | |
| 391 } | |
| 392 if (language_code == target_language) | |
| 393 target_language_index_ = iter - languages_.begin(); | |
| 394 } | |
| 395 DCHECK_NE(kNoIndex, target_language_index_); | |
| 396 } | 306 } | 
| 397 | 307 | 
| 398 void TranslateInfoBarDelegate::InfoBarDismissed() { | 308 void TranslateInfoBarDelegate::InfoBarDismissed() { | 
| 399 if (infobar_type_ != BEFORE_TRANSLATE) | 309 if (infobar_type_ != BEFORE_TRANSLATE) | 
| 400 return; | 310 return; | 
| 401 | 311 | 
| 402 // The user closed the infobar without clicking the translate button. | 312 // The user closed the infobar without clicking the translate button. | 
| 403 TranslationDeclined(); | 313 TranslationDeclined(); | 
| 404 UMA_HISTOGRAM_BOOLEAN(kCloseInfobar, true); | 314 UMA_HISTOGRAM_BOOLEAN(kCloseInfobar, true); | 
| 405 } | 315 } | 
| (...skipping 13 matching lines...) Expand all Loading... | |
| 419 if (!details.is_navigation_to_different_page() && !details.is_main_frame) | 329 if (!details.is_navigation_to_different_page() && !details.is_main_frame) | 
| 420 return false; | 330 return false; | 
| 421 | 331 | 
| 422 return InfoBarDelegate::ShouldExpireInternal(details); | 332 return InfoBarDelegate::ShouldExpireInternal(details); | 
| 423 } | 333 } | 
| 424 | 334 | 
| 425 TranslateInfoBarDelegate* | 335 TranslateInfoBarDelegate* | 
| 426 TranslateInfoBarDelegate::AsTranslateInfoBarDelegate() { | 336 TranslateInfoBarDelegate::AsTranslateInfoBarDelegate() { | 
| 427 return this; | 337 return this; | 
| 428 } | 338 } | 
| 429 | |
| 430 std::string TranslateInfoBarDelegate::GetPageHost() { | |
| 431 NavigationEntry* entry = web_contents()->GetController().GetActiveEntry(); | |
| 432 return entry ? entry->GetURL().HostNoBrackets() : std::string(); | |
| 433 } | |
| OLD | NEW |