| 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.h" |
| 13 #include "chrome/browser/infobars/infobar_service.h" | 14 #include "chrome/browser/infobars/infobar_service.h" |
| 14 #include "chrome/browser/profiles/profile.h" | 15 #include "chrome/browser/profiles/profile.h" |
| 15 #include "chrome/browser/translate/translate_accept_languages.h" | 16 #include "chrome/browser/translate/translate_accept_languages.h" |
| 16 #include "chrome/browser/translate/translate_manager.h" | 17 #include "chrome/browser/translate/translate_manager.h" |
| 17 #include "chrome/browser/translate/translate_tab_helper.h" | 18 #include "chrome/browser/translate/translate_tab_helper.h" |
| 18 #include "content/public/browser/navigation_details.h" | 19 #include "content/public/browser/navigation_details.h" |
| 19 #include "content/public/browser/navigation_entry.h" | 20 #include "content/public/browser/navigation_entry.h" |
| 20 #include "content/public/browser/web_contents.h" | 21 #include "content/public/browser/web_contents.h" |
| 21 #include "grit/generated_resources.h" | 22 #include "grit/generated_resources.h" |
| 22 #include "grit/theme_resources.h" | 23 #include "grit/theme_resources.h" |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 DCHECK(TranslateManager::IsSupportedLanguage(target_language)); | 60 DCHECK(TranslateManager::IsSupportedLanguage(target_language)); |
| 60 if (!TranslateManager::IsSupportedLanguage(original_language)) { | 61 if (!TranslateManager::IsSupportedLanguage(original_language)) { |
| 61 // The original language can only be "unknown" for the "translating" | 62 // The original language can only be "unknown" for the "translating" |
| 62 // infobar, which is the case when the user started a translation from the | 63 // infobar, which is the case when the user started a translation from the |
| 63 // context menu. | 64 // context menu. |
| 64 DCHECK(infobar_type == TRANSLATING || infobar_type == AFTER_TRANSLATE); | 65 DCHECK(infobar_type == TRANSLATING || infobar_type == AFTER_TRANSLATE); |
| 65 DCHECK_EQ(chrome::kUnknownLanguageCode, original_language); | 66 DCHECK_EQ(chrome::kUnknownLanguageCode, original_language); |
| 66 } | 67 } |
| 67 } | 68 } |
| 68 | 69 |
| 70 // Do not create the after translate infobar if we are auto translating. |
| 71 if ((infobar_type == TranslateInfoBarDelegate::AFTER_TRANSLATE) || |
| 72 (infobar_type == TranslateInfoBarDelegate::TRANSLATING)) { |
| 73 TranslateTabHelper* translate_tab_helper = |
| 74 TranslateTabHelper::FromWebContents(infobar_service->web_contents()); |
| 75 if (!translate_tab_helper || |
| 76 translate_tab_helper->language_state().InTranslateNavigation()) |
| 77 return; |
| 78 } |
| 79 |
| 69 // Find any existing translate infobar delegate. | 80 // Find any existing translate infobar delegate. |
| 81 InfoBar* old_infobar = NULL; |
| 70 TranslateInfoBarDelegate* old_delegate = NULL; | 82 TranslateInfoBarDelegate* old_delegate = NULL; |
| 71 for (size_t i = 0; i < infobar_service->infobar_count(); ++i) { | 83 for (size_t i = 0; i < infobar_service->infobar_count(); ++i) { |
| 72 old_delegate = infobar_service->infobar_at(i)->AsTranslateInfoBarDelegate(); | 84 old_infobar = infobar_service->infobar_at(i); |
| 85 old_delegate = old_infobar->delegate()->AsTranslateInfoBarDelegate(); |
| 73 if (old_delegate) { | 86 if (old_delegate) { |
| 74 if (!replace_existing_infobar) | 87 if (!replace_existing_infobar) |
| 75 return; | 88 return; |
| 76 break; | 89 break; |
| 77 } | 90 } |
| 78 } | 91 } |
| 79 | 92 |
| 80 // Create the new delegate. | 93 // Add the new delegate. |
| 81 scoped_ptr<TranslateInfoBarDelegate> infobar( | 94 scoped_ptr<InfoBar> infobar(CreateInfoBar( |
| 82 new TranslateInfoBarDelegate(infobar_service, infobar_type, old_delegate, | 95 scoped_ptr<TranslateInfoBarDelegate>(new TranslateInfoBarDelegate( |
| 83 original_language, target_language, | 96 infobar_type, old_delegate, original_language, target_language, |
| 84 error_type, prefs, shortcut_config)); | 97 error_type, prefs, shortcut_config)))); |
| 85 | 98 if (old_delegate) |
| 86 // Do not create the after translate infobar if we are auto translating. | 99 infobar_service->ReplaceInfoBar(old_infobar, infobar.Pass()); |
| 87 if ((infobar_type == TranslateInfoBarDelegate::AFTER_TRANSLATE) || | 100 else |
| 88 (infobar_type == TranslateInfoBarDelegate::TRANSLATING)) { | 101 infobar_service->AddInfoBar(infobar.Pass()); |
| 89 TranslateTabHelper* translate_tab_helper = | |
| 90 TranslateTabHelper::FromWebContents(infobar_service->web_contents()); | |
| 91 if (!translate_tab_helper || | |
| 92 translate_tab_helper->language_state().InTranslateNavigation()) | |
| 93 return; | |
| 94 } | |
| 95 | |
| 96 // Add the new delegate if necessary. | |
| 97 if (!old_delegate) { | |
| 98 infobar_service->AddInfoBar(infobar.PassAs<InfoBarDelegate>()); | |
| 99 } else { | |
| 100 DCHECK(replace_existing_infobar); | |
| 101 infobar_service->ReplaceInfoBar(old_delegate, | |
| 102 infobar.PassAs<InfoBarDelegate>()); | |
| 103 } | |
| 104 } | 102 } |
| 105 | 103 |
| 106 void TranslateInfoBarDelegate::Translate() { | 104 void TranslateInfoBarDelegate::Translate() { |
| 107 if (!web_contents()->GetBrowserContext()->IsOffTheRecord()) { | 105 if (!web_contents()->GetBrowserContext()->IsOffTheRecord()) { |
| 108 prefs_.ResetTranslationDeniedCount(original_language_code()); | 106 prefs_.ResetTranslationDeniedCount(original_language_code()); |
| 109 prefs_.IncrementTranslationAcceptedCount(original_language_code()); | 107 prefs_.IncrementTranslationAcceptedCount(original_language_code()); |
| 110 } | 108 } |
| 111 | 109 |
| 112 TranslateManager::GetInstance()->TranslatePage(web_contents(), | 110 TranslateManager::GetInstance()->TranslatePage(web_contents(), |
| 113 original_language_code(), | 111 original_language_code(), |
| 114 target_language_code()); | 112 target_language_code()); |
| 115 | 113 |
| 116 UMA_HISTOGRAM_BOOLEAN(kPerformTranslate, true); | 114 UMA_HISTOGRAM_BOOLEAN(kPerformTranslate, true); |
| 117 } | 115 } |
| 118 | 116 |
| 119 void TranslateInfoBarDelegate::RevertTranslation() { | 117 void TranslateInfoBarDelegate::RevertTranslation() { |
| 120 TranslateManager::GetInstance()->RevertTranslation(web_contents()); | 118 TranslateManager::GetInstance()->RevertTranslation(web_contents()); |
| 121 RemoveSelf(); | 119 infobar()->RemoveSelf(); |
| 122 | 120 |
| 123 UMA_HISTOGRAM_BOOLEAN(kRevertTranslation, true); | 121 UMA_HISTOGRAM_BOOLEAN(kRevertTranslation, true); |
| 124 } | 122 } |
| 125 | 123 |
| 126 void TranslateInfoBarDelegate::ReportLanguageDetectionError() { | 124 void TranslateInfoBarDelegate::ReportLanguageDetectionError() { |
| 127 TranslateManager::GetInstance()->ReportLanguageDetectionError( | 125 TranslateManager::GetInstance()->ReportLanguageDetectionError( |
| 128 web_contents()); | 126 web_contents()); |
| 129 } | 127 } |
| 130 | 128 |
| 131 void TranslateInfoBarDelegate::TranslationDeclined() { | 129 void TranslateInfoBarDelegate::TranslationDeclined() { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 152 return TranslatePrefs::CanTranslateLanguage(original_profile, | 150 return TranslatePrefs::CanTranslateLanguage(original_profile, |
| 153 original_language_code()); | 151 original_language_code()); |
| 154 } | 152 } |
| 155 | 153 |
| 156 void TranslateInfoBarDelegate::ToggleTranslatableLanguageByPrefs() { | 154 void TranslateInfoBarDelegate::ToggleTranslatableLanguageByPrefs() { |
| 157 const std::string& original_lang = original_language_code(); | 155 const std::string& original_lang = original_language_code(); |
| 158 if (prefs_.IsBlockedLanguage(original_lang)) { | 156 if (prefs_.IsBlockedLanguage(original_lang)) { |
| 159 prefs_.UnblockLanguage(original_lang); | 157 prefs_.UnblockLanguage(original_lang); |
| 160 } else { | 158 } else { |
| 161 prefs_.BlockLanguage(original_lang); | 159 prefs_.BlockLanguage(original_lang); |
| 162 RemoveSelf(); | 160 infobar()->RemoveSelf(); |
| 163 } | 161 } |
| 164 | 162 |
| 165 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateLang, true); | 163 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateLang, true); |
| 166 } | 164 } |
| 167 | 165 |
| 168 bool TranslateInfoBarDelegate::IsSiteBlacklisted() { | 166 bool TranslateInfoBarDelegate::IsSiteBlacklisted() { |
| 169 std::string host = GetPageHost(); | 167 std::string host = GetPageHost(); |
| 170 return !host.empty() && prefs_.IsSiteBlacklisted(host); | 168 return !host.empty() && prefs_.IsSiteBlacklisted(host); |
| 171 } | 169 } |
| 172 | 170 |
| 173 void TranslateInfoBarDelegate::ToggleSiteBlacklist() { | 171 void TranslateInfoBarDelegate::ToggleSiteBlacklist() { |
| 174 std::string host = GetPageHost(); | 172 std::string host = GetPageHost(); |
| 175 if (host.empty()) | 173 if (host.empty()) |
| 176 return; | 174 return; |
| 177 | 175 |
| 178 if (prefs_.IsSiteBlacklisted(host)) { | 176 if (prefs_.IsSiteBlacklisted(host)) { |
| 179 prefs_.RemoveSiteFromBlacklist(host); | 177 prefs_.RemoveSiteFromBlacklist(host); |
| 180 } else { | 178 } else { |
| 181 prefs_.BlacklistSite(host); | 179 prefs_.BlacklistSite(host); |
| 182 RemoveSelf(); | 180 infobar()->RemoveSelf(); |
| 183 } | 181 } |
| 184 | 182 |
| 185 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateSite, true); | 183 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateSite, true); |
| 186 } | 184 } |
| 187 | 185 |
| 188 bool TranslateInfoBarDelegate::ShouldAlwaysTranslate() { | 186 bool TranslateInfoBarDelegate::ShouldAlwaysTranslate() { |
| 189 return prefs_.IsLanguagePairWhitelisted(original_language_code(), | 187 return prefs_.IsLanguagePairWhitelisted(original_language_code(), |
| 190 target_language_code()); | 188 target_language_code()); |
| 191 } | 189 } |
| 192 | 190 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 205 const std::string& original_lang = original_language_code(); | 203 const std::string& original_lang = original_language_code(); |
| 206 const std::string& target_lang = target_language_code(); | 204 const std::string& target_lang = target_language_code(); |
| 207 DCHECK(!prefs_.IsLanguagePairWhitelisted(original_lang, target_lang)); | 205 DCHECK(!prefs_.IsLanguagePairWhitelisted(original_lang, target_lang)); |
| 208 prefs_.WhitelistLanguagePair(original_lang, target_lang); | 206 prefs_.WhitelistLanguagePair(original_lang, target_lang); |
| 209 Translate(); | 207 Translate(); |
| 210 } | 208 } |
| 211 | 209 |
| 212 void TranslateInfoBarDelegate::NeverTranslatePageLanguage() { | 210 void TranslateInfoBarDelegate::NeverTranslatePageLanguage() { |
| 213 std::string original_lang = original_language_code(); | 211 std::string original_lang = original_language_code(); |
| 214 prefs_.BlockLanguage(original_lang); | 212 prefs_.BlockLanguage(original_lang); |
| 215 RemoveSelf(); | 213 infobar()->RemoveSelf(); |
| 216 } | 214 } |
| 217 | 215 |
| 218 string16 TranslateInfoBarDelegate::GetMessageInfoBarText() { | 216 string16 TranslateInfoBarDelegate::GetMessageInfoBarText() { |
| 219 if (infobar_type_ == TRANSLATING) { | 217 if (infobar_type_ == TRANSLATING) { |
| 220 return l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_TRANSLATING_TO, | 218 return l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_TRANSLATING_TO, |
| 221 language_name_at(target_language_index_)); | 219 language_name_at(target_language_index_)); |
| 222 } | 220 } |
| 223 | 221 |
| 224 DCHECK_EQ(TRANSLATION_ERROR, infobar_type_); | 222 DCHECK_EQ(TRANSLATION_ERROR, infobar_type_); |
| 225 UMA_HISTOGRAM_ENUMERATION(kShowErrorInfobar, | 223 UMA_HISTOGRAM_ENUMERATION(kShowErrorInfobar, |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 326 *swap_languages = (offsets[0] > offsets[1]); | 324 *swap_languages = (offsets[0] > offsets[1]); |
| 327 if (*swap_languages) | 325 if (*swap_languages) |
| 328 std::swap(offsets[0], offsets[1]); | 326 std::swap(offsets[0], offsets[1]); |
| 329 | 327 |
| 330 strings->push_back(text.substr(0, offsets[0])); | 328 strings->push_back(text.substr(0, offsets[0])); |
| 331 strings->push_back(text.substr(offsets[0], offsets[1] - offsets[0])); | 329 strings->push_back(text.substr(offsets[0], offsets[1] - offsets[0])); |
| 332 strings->push_back(text.substr(offsets[1])); | 330 strings->push_back(text.substr(offsets[1])); |
| 333 } | 331 } |
| 334 | 332 |
| 335 TranslateInfoBarDelegate::TranslateInfoBarDelegate( | 333 TranslateInfoBarDelegate::TranslateInfoBarDelegate( |
| 336 InfoBarService* infobar_service, | |
| 337 Type infobar_type, | 334 Type infobar_type, |
| 338 TranslateInfoBarDelegate* old_delegate, | 335 TranslateInfoBarDelegate* old_delegate, |
| 339 const std::string& original_language, | 336 const std::string& original_language, |
| 340 const std::string& target_language, | 337 const std::string& target_language, |
| 341 TranslateErrors::Type error_type, | 338 TranslateErrors::Type error_type, |
| 342 PrefService* prefs, | 339 PrefService* prefs, |
| 343 ShortcutConfiguration shortcut_config) | 340 ShortcutConfiguration shortcut_config) |
| 344 : InfoBarDelegate(infobar_service), | 341 : InfoBarDelegate(), |
| 345 infobar_type_(infobar_type), | 342 infobar_type_(infobar_type), |
| 346 background_animation_(NONE), | 343 background_animation_(NONE), |
| 347 original_language_index_(kNoIndex), | 344 original_language_index_(kNoIndex), |
| 348 initial_original_language_index_(kNoIndex), | 345 initial_original_language_index_(kNoIndex), |
| 349 target_language_index_(kNoIndex), | 346 target_language_index_(kNoIndex), |
| 350 error_type_(error_type), | 347 error_type_(error_type), |
| 351 prefs_(prefs), | 348 prefs_(prefs), |
| 352 shortcut_config_(shortcut_config) { | 349 shortcut_config_(shortcut_config) { |
| 353 DCHECK_NE((infobar_type_ == TRANSLATION_ERROR), | 350 DCHECK_NE((infobar_type_ == TRANSLATION_ERROR), |
| 354 (error_type_ == TranslateErrors::NONE)); | 351 (error_type_ == TranslateErrors::NONE)); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 if (language_code == original_language) { | 385 if (language_code == original_language) { |
| 389 original_language_index_ = iter - languages_.begin(); | 386 original_language_index_ = iter - languages_.begin(); |
| 390 initial_original_language_index_ = original_language_index_; | 387 initial_original_language_index_ = original_language_index_; |
| 391 } | 388 } |
| 392 if (language_code == target_language) | 389 if (language_code == target_language) |
| 393 target_language_index_ = iter - languages_.begin(); | 390 target_language_index_ = iter - languages_.begin(); |
| 394 } | 391 } |
| 395 DCHECK_NE(kNoIndex, target_language_index_); | 392 DCHECK_NE(kNoIndex, target_language_index_); |
| 396 } | 393 } |
| 397 | 394 |
| 395 // TranslateInfoBarDelegate::CreateInfoBar() is implemented in platform-specific |
| 396 // files. |
| 397 |
| 398 void TranslateInfoBarDelegate::InfoBarDismissed() { | 398 void TranslateInfoBarDelegate::InfoBarDismissed() { |
| 399 if (infobar_type_ != BEFORE_TRANSLATE) | 399 if (infobar_type_ != BEFORE_TRANSLATE) |
| 400 return; | 400 return; |
| 401 | 401 |
| 402 // The user closed the infobar without clicking the translate button. | 402 // The user closed the infobar without clicking the translate button. |
| 403 TranslationDeclined(); | 403 TranslationDeclined(); |
| 404 UMA_HISTOGRAM_BOOLEAN(kCloseInfobar, true); | 404 UMA_HISTOGRAM_BOOLEAN(kCloseInfobar, true); |
| 405 } | 405 } |
| 406 | 406 |
| 407 int TranslateInfoBarDelegate::GetIconID() const { | 407 int TranslateInfoBarDelegate::GetIconID() const { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 424 | 424 |
| 425 TranslateInfoBarDelegate* | 425 TranslateInfoBarDelegate* |
| 426 TranslateInfoBarDelegate::AsTranslateInfoBarDelegate() { | 426 TranslateInfoBarDelegate::AsTranslateInfoBarDelegate() { |
| 427 return this; | 427 return this; |
| 428 } | 428 } |
| 429 | 429 |
| 430 std::string TranslateInfoBarDelegate::GetPageHost() { | 430 std::string TranslateInfoBarDelegate::GetPageHost() { |
| 431 NavigationEntry* entry = web_contents()->GetController().GetActiveEntry(); | 431 NavigationEntry* entry = web_contents()->GetController().GetActiveEntry(); |
| 432 return entry ? entry->GetURL().HostNoBrackets() : std::string(); | 432 return entry ? entry->GetURL().HostNoBrackets() : std::string(); |
| 433 } | 433 } |
| OLD | NEW |