| 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.h" |
| 14 #include "chrome/browser/infobars/infobar_service.h" | 14 #include "chrome/browser/infobars/infobar_service.h" |
| 15 #include "chrome/browser/profiles/profile.h" | 15 #include "chrome/browser/profiles/profile.h" |
| 16 #include "chrome/browser/translate/translate_accept_languages.h" | 16 #include "chrome/browser/translate/translate_accept_languages.h" |
| 17 #include "chrome/browser/translate/translate_browser_metrics.h" | |
| 18 #include "chrome/browser/translate/translate_manager.h" | 17 #include "chrome/browser/translate/translate_manager.h" |
| 19 #include "chrome/browser/translate/translate_tab_helper.h" | 18 #include "chrome/browser/translate/translate_tab_helper.h" |
| 20 #include "chrome/browser/translate/translate_ui_delegate.h" | |
| 21 #include "components/translate/common/translate_constants.h" | 19 #include "components/translate/common/translate_constants.h" |
| 22 #include "content/public/browser/navigation_details.h" | 20 #include "content/public/browser/navigation_details.h" |
| 23 #include "content/public/browser/navigation_entry.h" | 21 #include "content/public/browser/navigation_entry.h" |
| 24 #include "content/public/browser/web_contents.h" | 22 #include "content/public/browser/web_contents.h" |
| 25 #include "grit/generated_resources.h" | 23 #include "grit/generated_resources.h" |
| 26 #include "grit/theme_resources.h" | 24 #include "grit/theme_resources.h" |
| 27 #include "third_party/icu/source/i18n/unicode/coll.h" | 25 #include "third_party/icu/source/i18n/unicode/coll.h" |
| 28 #include "ui/base/l10n/l10n_util.h" | 26 #include "ui/base/l10n/l10n_util.h" |
| 29 | 27 |
| 30 | 28 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 if (old_delegate) { | 74 if (old_delegate) { |
| 77 if (!replace_existing_infobar) | 75 if (!replace_existing_infobar) |
| 78 return; | 76 return; |
| 79 break; | 77 break; |
| 80 } | 78 } |
| 81 } | 79 } |
| 82 | 80 |
| 83 // Add the new delegate. | 81 // Add the new delegate. |
| 84 scoped_ptr<InfoBar> infobar(CreateInfoBar( | 82 scoped_ptr<InfoBar> infobar(CreateInfoBar( |
| 85 scoped_ptr<TranslateInfoBarDelegate>(new TranslateInfoBarDelegate( | 83 scoped_ptr<TranslateInfoBarDelegate>(new TranslateInfoBarDelegate( |
| 86 infobar_type, old_delegate, original_language, target_language, | 84 web_contents, infobar_type, old_delegate, original_language, |
| 87 error_type, prefs, shortcut_config)))); | 85 target_language, error_type, prefs, shortcut_config)))); |
| 88 if (old_delegate) | 86 if (old_delegate) |
| 89 infobar_service->ReplaceInfoBar(old_infobar, infobar.Pass()); | 87 infobar_service->ReplaceInfoBar(old_infobar, infobar.Pass()); |
| 90 else | 88 else |
| 91 infobar_service->AddInfoBar(infobar.Pass()); | 89 infobar_service->AddInfoBar(infobar.Pass()); |
| 92 } | 90 } |
| 93 | 91 |
| 94 | 92 |
| 95 void TranslateInfoBarDelegate::UpdateOriginalLanguageIndex( | 93 void TranslateInfoBarDelegate::UpdateOriginalLanguageIndex( |
| 96 size_t language_index) { | 94 size_t language_index) { |
| 97 if (original_language_index_ == language_index) | 95 ui_delegate_.UpdateOriginalLanguageIndex(language_index); |
| 98 return; | |
| 99 | |
| 100 UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | |
| 101 TranslateBrowserMetrics::UMA_MODIFY_ORIGINAL_LANG), true); | |
| 102 original_language_index_ = language_index; | |
| 103 } | 96 } |
| 104 | 97 |
| 105 void TranslateInfoBarDelegate::UpdateTargetLanguageIndex( | 98 void TranslateInfoBarDelegate::UpdateTargetLanguageIndex( |
| 106 size_t language_index) { | 99 size_t language_index) { |
| 107 if (target_language_index_ == language_index) | 100 ui_delegate_.UpdateTargetLanguageIndex(language_index); |
| 108 return; | |
| 109 | |
| 110 DCHECK_LT(language_index, num_languages()); | |
| 111 UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | |
| 112 TranslateBrowserMetrics::UMA_MODIFY_TARGET_LANG), true); | |
| 113 target_language_index_ = language_index; | |
| 114 } | 101 } |
| 115 | 102 |
| 116 void TranslateInfoBarDelegate::Translate() { | 103 void TranslateInfoBarDelegate::Translate() { |
| 117 if (!web_contents()->GetBrowserContext()->IsOffTheRecord()) { | 104 ui_delegate_.Translate(); |
| 118 prefs_.ResetTranslationDeniedCount(original_language_code()); | |
| 119 prefs_.IncrementTranslationAcceptedCount(original_language_code()); | |
| 120 } | |
| 121 TranslateManager::GetInstance()->TranslatePage(web_contents(), | |
| 122 original_language_code(), | |
| 123 target_language_code()); | |
| 124 | |
| 125 UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | |
| 126 TranslateBrowserMetrics::UMA_PERFORM_TRANSLATE), true); | |
| 127 } | 105 } |
| 128 | 106 |
| 129 void TranslateInfoBarDelegate::RevertTranslation() { | 107 void TranslateInfoBarDelegate::RevertTranslation() { |
| 130 TranslateManager::GetInstance()->RevertTranslation(web_contents()); | 108 ui_delegate_.RevertTranslation(); |
| 131 UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | |
| 132 TranslateBrowserMetrics::UMA_REVERT_TRANSLATION), true); | |
| 133 infobar()->RemoveSelf(); | 109 infobar()->RemoveSelf(); |
| 134 } | 110 } |
| 135 | 111 |
| 136 void TranslateInfoBarDelegate::ReportLanguageDetectionError() { | 112 void TranslateInfoBarDelegate::ReportLanguageDetectionError() { |
| 137 TranslateManager::GetInstance()->ReportLanguageDetectionError( | 113 TranslateManager::GetInstance()->ReportLanguageDetectionError( |
| 138 web_contents()); | 114 web_contents()); |
| 139 } | 115 } |
| 140 | 116 |
| 141 void TranslateInfoBarDelegate::TranslationDeclined() { | 117 void TranslateInfoBarDelegate::TranslationDeclined() { |
| 142 if (!web_contents()->GetBrowserContext()->IsOffTheRecord()) { | 118 ui_delegate_.TranslationDeclined(); |
| 143 prefs_.ResetTranslationAcceptedCount(original_language_code()); | |
| 144 prefs_.IncrementTranslationDeniedCount(original_language_code()); | |
| 145 } | |
| 146 | |
| 147 // Remember that the user declined the translation so as to prevent showing a | |
| 148 // translate infobar for that page again. (TranslateManager initiates | |
| 149 // translations when getting a LANGUAGE_DETERMINED from the page, which | |
| 150 // happens when a load stops. That could happen multiple times, including | |
| 151 // after the user already declined the translation.) | |
| 152 TranslateTabHelper::FromWebContents(web_contents())-> | |
| 153 language_state().set_translation_declined(true); | |
| 154 | |
| 155 UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | |
| 156 TranslateBrowserMetrics::UMA_DECLINE_TRANSLATE), true); | |
| 157 } | 119 } |
| 158 | 120 |
| 159 bool TranslateInfoBarDelegate::IsTranslatableLanguageByPrefs() { | 121 bool TranslateInfoBarDelegate::IsTranslatableLanguageByPrefs() { |
| 160 Profile* profile = | 122 Profile* profile = |
| 161 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); | 123 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); |
| 162 Profile* original_profile = profile->GetOriginalProfile(); | 124 Profile* original_profile = profile->GetOriginalProfile(); |
| 163 return TranslatePrefs::CanTranslateLanguage(original_profile, | 125 return TranslatePrefs::CanTranslateLanguage(original_profile, |
| 164 original_language_code()); | 126 original_language_code()); |
| 165 } | 127 } |
| 166 | 128 |
| 167 void TranslateInfoBarDelegate::ToggleTranslatableLanguageByPrefs() { | 129 void TranslateInfoBarDelegate::ToggleTranslatableLanguageByPrefs() { |
| 168 if (prefs_.IsBlockedLanguage(original_language_code())) { | 130 if (ui_delegate_.IsLanguageBlocked()) { |
| 169 prefs_.UnblockLanguage(original_language_code()); | 131 ui_delegate_.SetLanguageBlocked(false); |
| 170 } else { | 132 } else { |
| 171 prefs_.BlockLanguage(original_language_code()); | 133 ui_delegate_.SetLanguageBlocked(true); |
| 172 TranslateTabHelper* translate_tab_helper = | |
| 173 TranslateTabHelper::FromWebContents(web_contents()); | |
| 174 DCHECK(translate_tab_helper); | |
| 175 translate_tab_helper->language_state().SetTranslateEnabled(false); | |
| 176 infobar()->RemoveSelf(); | 134 infobar()->RemoveSelf(); |
| 177 } | 135 } |
| 178 | |
| 179 UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | |
| 180 TranslateBrowserMetrics::UMA_NEVER_TRANSLATE_LANG), true); | |
| 181 } | 136 } |
| 182 | 137 |
| 183 bool TranslateInfoBarDelegate::IsSiteBlacklisted() { | 138 bool TranslateInfoBarDelegate::IsSiteBlacklisted() { |
| 184 std::string host = TranslateUIDelegate::GetPageHost(web_contents()); | 139 return ui_delegate_.IsSiteBlacklisted(); |
| 185 return !host.empty() && prefs_.IsSiteBlacklisted(host); | |
| 186 } | 140 } |
| 187 | 141 |
| 188 void TranslateInfoBarDelegate::ToggleSiteBlacklist() { | 142 void TranslateInfoBarDelegate::ToggleSiteBlacklist() { |
| 189 std::string host = TranslateUIDelegate::GetPageHost(web_contents()); | 143 if (ui_delegate_.IsSiteBlacklisted()) { |
| 190 if (host.empty()) | 144 ui_delegate_.SetSiteBlacklist(false); |
| 191 return; | |
| 192 | |
| 193 if (prefs_.IsSiteBlacklisted(host)) { | |
| 194 prefs_.RemoveSiteFromBlacklist(host); | |
| 195 } else { | 145 } else { |
| 196 prefs_.BlacklistSite(host); | 146 ui_delegate_.SetSiteBlacklist(true); |
| 197 TranslateTabHelper* translate_tab_helper = | |
| 198 TranslateTabHelper::FromWebContents(web_contents()); | |
| 199 DCHECK(translate_tab_helper); | |
| 200 translate_tab_helper->language_state().SetTranslateEnabled(false); | |
| 201 infobar()->RemoveSelf(); | 147 infobar()->RemoveSelf(); |
| 202 } | 148 } |
| 203 | |
| 204 UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | |
| 205 TranslateBrowserMetrics::UMA_NEVER_TRANSLATE_SITE), true); | |
| 206 } | 149 } |
| 207 | 150 |
| 208 bool TranslateInfoBarDelegate::ShouldAlwaysTranslate() { | 151 bool TranslateInfoBarDelegate::ShouldAlwaysTranslate() { |
| 209 return prefs_.IsLanguagePairWhitelisted(original_language_code(), | 152 return ui_delegate_.ShouldAlwaysTranslate(); |
| 210 target_language_code()); | |
| 211 } | 153 } |
| 212 | 154 |
| 213 void TranslateInfoBarDelegate::ToggleAlwaysTranslate() { | 155 void TranslateInfoBarDelegate::ToggleAlwaysTranslate() { |
| 214 const std::string& original_lang = original_language_code(); | 156 ui_delegate_.SetAlwaysTranslate(!ui_delegate_.ShouldAlwaysTranslate()); |
| 215 const std::string& target_lang = target_language_code(); | |
| 216 if (prefs_.IsLanguagePairWhitelisted(original_lang, target_lang)) | |
| 217 prefs_.RemoveLanguagePairFromWhitelist(original_lang, target_lang); | |
| 218 else | |
| 219 prefs_.WhitelistLanguagePair(original_lang, target_lang); | |
| 220 | |
| 221 UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | |
| 222 TranslateBrowserMetrics::UMA_ALWAYS_TRANSLATE_LANG), true); | |
| 223 } | 157 } |
| 224 | 158 |
| 225 void TranslateInfoBarDelegate::AlwaysTranslatePageLanguage() { | 159 void TranslateInfoBarDelegate::AlwaysTranslatePageLanguage() { |
| 226 const std::string& original_lang = original_language_code(); | 160 DCHECK(!ui_delegate_.ShouldAlwaysTranslate()); |
| 227 const std::string& target_lang = target_language_code(); | 161 ui_delegate_.SetAlwaysTranslate(true); |
| 228 DCHECK(!prefs_.IsLanguagePairWhitelisted(original_lang, target_lang)); | |
| 229 prefs_.WhitelistLanguagePair(original_lang, target_lang); | |
| 230 UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | |
| 231 TranslateBrowserMetrics::UMA_ALWAYS_TRANSLATE_LANG), true); | |
| 232 | |
| 233 Translate(); | 162 Translate(); |
| 234 } | 163 } |
| 235 | 164 |
| 236 void TranslateInfoBarDelegate::NeverTranslatePageLanguage() { | 165 void TranslateInfoBarDelegate::NeverTranslatePageLanguage() { |
| 237 prefs_.BlockLanguage(original_language_code()); | 166 DCHECK(!ui_delegate_.IsLanguageBlocked()); |
| 238 TranslateTabHelper* translate_tab_helper = | 167 ui_delegate_.SetLanguageBlocked(true); |
| 239 TranslateTabHelper::FromWebContents(web_contents()); | |
| 240 DCHECK(translate_tab_helper); | |
| 241 translate_tab_helper->language_state().SetTranslateEnabled(false); | |
| 242 UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | |
| 243 TranslateBrowserMetrics::UMA_NEVER_TRANSLATE_LANG), true); | |
| 244 | |
| 245 infobar()->RemoveSelf(); | 168 infobar()->RemoveSelf(); |
| 246 } | 169 } |
| 247 | 170 |
| 248 string16 TranslateInfoBarDelegate::GetMessageInfoBarText() { | 171 string16 TranslateInfoBarDelegate::GetMessageInfoBarText() { |
| 249 if (infobar_type_ == TRANSLATING) { | 172 if (infobar_type_ == TRANSLATING) { |
| 250 string16 target_language_name = language_name_at(target_language_index()); | 173 string16 target_language_name = language_name_at(target_language_index()); |
| 251 return l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_TRANSLATING_TO, | 174 return l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_TRANSLATING_TO, |
| 252 target_language_name); | 175 target_language_name); |
| 253 } | 176 } |
| 254 | 177 |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 *swap_languages = (offsets[0] > offsets[1]); | 280 *swap_languages = (offsets[0] > offsets[1]); |
| 358 if (*swap_languages) | 281 if (*swap_languages) |
| 359 std::swap(offsets[0], offsets[1]); | 282 std::swap(offsets[0], offsets[1]); |
| 360 | 283 |
| 361 strings->push_back(text.substr(0, offsets[0])); | 284 strings->push_back(text.substr(0, offsets[0])); |
| 362 strings->push_back(text.substr(offsets[0], offsets[1] - offsets[0])); | 285 strings->push_back(text.substr(offsets[0], offsets[1] - offsets[0])); |
| 363 strings->push_back(text.substr(offsets[1])); | 286 strings->push_back(text.substr(offsets[1])); |
| 364 } | 287 } |
| 365 | 288 |
| 366 TranslateInfoBarDelegate::TranslateInfoBarDelegate( | 289 TranslateInfoBarDelegate::TranslateInfoBarDelegate( |
| 290 content::WebContents* web_contents, |
| 367 Type infobar_type, | 291 Type infobar_type, |
| 368 TranslateInfoBarDelegate* old_delegate, | 292 TranslateInfoBarDelegate* old_delegate, |
| 369 const std::string& original_language, | 293 const std::string& original_language, |
| 370 const std::string& target_language, | 294 const std::string& target_language, |
| 371 TranslateErrors::Type error_type, | 295 TranslateErrors::Type error_type, |
| 372 PrefService* prefs, | 296 PrefService* prefs, |
| 373 ShortcutConfiguration shortcut_config) | 297 ShortcutConfiguration shortcut_config) |
| 374 : InfoBarDelegate(), | 298 : InfoBarDelegate(), |
| 375 infobar_type_(infobar_type), | 299 infobar_type_(infobar_type), |
| 376 background_animation_(NONE), | 300 background_animation_(NONE), |
| 377 original_language_index_(kNoIndex), | 301 ui_delegate_(web_contents, original_language, target_language, |
| 378 target_language_index_(kNoIndex), | 302 error_type), |
| 379 error_type_(error_type), | 303 error_type_(error_type), |
| 380 prefs_(prefs), | 304 prefs_(prefs), |
| 381 shortcut_config_(shortcut_config) { | 305 shortcut_config_(shortcut_config) { |
| 382 DCHECK_NE((infobar_type_ == TRANSLATION_ERROR), | 306 DCHECK_NE((infobar_type_ == TRANSLATION_ERROR), |
| 383 (error_type_ == TranslateErrors::NONE)); | 307 (error_type_ == TranslateErrors::NONE)); |
| 384 | 308 |
| 385 if (old_delegate && (old_delegate->is_error() != is_error())) | 309 if (old_delegate && (old_delegate->is_error() != is_error())) |
| 386 background_animation_ = is_error() ? NORMAL_TO_ERROR : ERROR_TO_NORMAL; | 310 background_animation_ = is_error() ? NORMAL_TO_ERROR : ERROR_TO_NORMAL; |
| 387 | |
| 388 languages_ = TranslateUIDelegate::GetSortedLanguageNames( | |
| 389 g_browser_process->GetApplicationLocale()); | |
| 390 | |
| 391 for (std::vector<LanguageNamePair>::const_iterator iter = languages_.begin(); | |
| 392 iter != languages_.end(); ++iter) { | |
| 393 std::string language_code = iter->first; | |
| 394 if (language_code == original_language) | |
| 395 original_language_index_ = iter - languages_.begin(); | |
| 396 if (language_code == target_language) | |
| 397 target_language_index_ = iter - languages_.begin(); | |
| 398 } | |
| 399 } | 311 } |
| 400 | 312 |
| 401 // TranslateInfoBarDelegate::CreateInfoBar() is implemented in platform-specific | 313 // TranslateInfoBarDelegate::CreateInfoBar() is implemented in platform-specific |
| 402 // files. | 314 // files. |
| 403 | 315 |
| 404 void TranslateInfoBarDelegate::InfoBarDismissed() { | 316 void TranslateInfoBarDelegate::InfoBarDismissed() { |
| 405 if (infobar_type_ != BEFORE_TRANSLATE) | 317 if (infobar_type_ != BEFORE_TRANSLATE) |
| 406 return; | 318 return; |
| 407 | 319 |
| 408 // The user closed the infobar without clicking the translate button. | 320 // The user closed the infobar without clicking the translate button. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 425 if (!details.is_navigation_to_different_page() && !details.is_main_frame) | 337 if (!details.is_navigation_to_different_page() && !details.is_main_frame) |
| 426 return false; | 338 return false; |
| 427 | 339 |
| 428 return InfoBarDelegate::ShouldExpireInternal(details); | 340 return InfoBarDelegate::ShouldExpireInternal(details); |
| 429 } | 341 } |
| 430 | 342 |
| 431 TranslateInfoBarDelegate* | 343 TranslateInfoBarDelegate* |
| 432 TranslateInfoBarDelegate::AsTranslateInfoBarDelegate() { | 344 TranslateInfoBarDelegate::AsTranslateInfoBarDelegate() { |
| 433 return this; | 345 return this; |
| 434 } | 346 } |
| OLD | NEW |