| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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" | |
| 12 #include "chrome/browser/infobars/infobar_service.h" | |
| 13 #include "components/infobars/core/infobar.h" | 11 #include "components/infobars/core/infobar.h" |
| 12 #include "components/infobars/core/infobar_manager.h" |
| 14 #include "components/translate/core/browser/language_state.h" | 13 #include "components/translate/core/browser/language_state.h" |
| 15 #include "components/translate/core/browser/translate_accept_languages.h" | 14 #include "components/translate/core/browser/translate_accept_languages.h" |
| 16 #include "components/translate/core/browser/translate_client.h" | 15 #include "components/translate/core/browser/translate_client.h" |
| 17 #include "components/translate/core/browser/translate_download_manager.h" | 16 #include "components/translate/core/browser/translate_download_manager.h" |
| 18 #include "components/translate/core/browser/translate_driver.h" | 17 #include "components/translate/core/browser/translate_driver.h" |
| 19 #include "components/translate/core/browser/translate_manager.h" | 18 #include "components/translate/core/browser/translate_manager.h" |
| 20 #include "components/translate/core/common/translate_constants.h" | 19 #include "components/translate/core/common/translate_constants.h" |
| 21 #include "content/public/browser/web_contents.h" | |
| 22 #include "grit/component_strings.h" | 20 #include "grit/component_strings.h" |
| 23 #include "grit/theme_resources.h" | 21 #include "grit/theme_resources.h" |
| 24 #include "third_party/icu/source/i18n/unicode/coll.h" | 22 #include "third_party/icu/source/i18n/unicode/coll.h" |
| 25 #include "ui/base/l10n/l10n_util.h" | 23 #include "ui/base/l10n/l10n_util.h" |
| 26 | 24 |
| 27 namespace { | 25 namespace { |
| 28 | 26 |
| 29 // Counts used to decide whether infobars should be shown. | 27 // Counts used to decide whether infobars should be shown. |
| 30 // Android and iOS implementations do not offer a drop down (for space reasons), | 28 // Android and iOS implementations do not offer a drop down (for space reasons), |
| 31 // so we are more aggressive about showing the shortcut to never translate. | 29 // so we are more aggressive about showing the shortcut to never translate. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 48 | 46 |
| 49 const size_t TranslateInfoBarDelegate::kNoIndex = TranslateUIDelegate::NO_INDEX; | 47 const size_t TranslateInfoBarDelegate::kNoIndex = TranslateUIDelegate::NO_INDEX; |
| 50 | 48 |
| 51 TranslateInfoBarDelegate::~TranslateInfoBarDelegate() { | 49 TranslateInfoBarDelegate::~TranslateInfoBarDelegate() { |
| 52 } | 50 } |
| 53 | 51 |
| 54 // static | 52 // static |
| 55 void TranslateInfoBarDelegate::Create( | 53 void TranslateInfoBarDelegate::Create( |
| 56 bool replace_existing_infobar, | 54 bool replace_existing_infobar, |
| 57 const base::WeakPtr<TranslateManager>& translate_manager, | 55 const base::WeakPtr<TranslateManager>& translate_manager, |
| 58 InfoBarService* infobar_service, | 56 infobars::InfoBarManager* infobar_manager, |
| 59 bool is_off_the_record, | 57 bool is_off_the_record, |
| 60 translate::TranslateStep step, | 58 translate::TranslateStep step, |
| 61 const std::string& original_language, | 59 const std::string& original_language, |
| 62 const std::string& target_language, | 60 const std::string& target_language, |
| 63 TranslateErrors::Type error_type, | 61 TranslateErrors::Type error_type, |
| 64 PrefService* prefs, | |
| 65 bool triggered_from_menu) { | 62 bool triggered_from_menu) { |
| 66 DCHECK(translate_manager); | 63 DCHECK(translate_manager); |
| 67 DCHECK(infobar_service); | 64 DCHECK(infobar_manager); |
| 68 | 65 |
| 69 // Check preconditions. | 66 // Check preconditions. |
| 70 if (step != translate::TRANSLATE_STEP_TRANSLATE_ERROR) { | 67 if (step != translate::TRANSLATE_STEP_TRANSLATE_ERROR) { |
| 71 DCHECK(TranslateDownloadManager::IsSupportedLanguage(target_language)); | 68 DCHECK(TranslateDownloadManager::IsSupportedLanguage(target_language)); |
| 72 if (!TranslateDownloadManager::IsSupportedLanguage(original_language)) { | 69 if (!TranslateDownloadManager::IsSupportedLanguage(original_language)) { |
| 73 // The original language can only be "unknown" for the "translating" | 70 // The original language can only be "unknown" for the "translating" |
| 74 // infobar, which is the case when the user started a translation from the | 71 // infobar, which is the case when the user started a translation from the |
| 75 // context menu. | 72 // context menu. |
| 76 DCHECK(step == translate::TRANSLATE_STEP_TRANSLATING || | 73 DCHECK(step == translate::TRANSLATE_STEP_TRANSLATING || |
| 77 step == translate::TRANSLATE_STEP_AFTER_TRANSLATE); | 74 step == translate::TRANSLATE_STEP_AFTER_TRANSLATE); |
| 78 DCHECK_EQ(translate::kUnknownLanguageCode, original_language); | 75 DCHECK_EQ(translate::kUnknownLanguageCode, original_language); |
| 79 } | 76 } |
| 80 } | 77 } |
| 81 | 78 |
| 82 // Do not create the after translate infobar if we are auto translating. | 79 // Do not create the after translate infobar if we are auto translating. |
| 83 if (((step == translate::TRANSLATE_STEP_AFTER_TRANSLATE) || | 80 if (((step == translate::TRANSLATE_STEP_AFTER_TRANSLATE) || |
| 84 (step == translate::TRANSLATE_STEP_TRANSLATING)) && | 81 (step == translate::TRANSLATE_STEP_TRANSLATING)) && |
| 85 translate_manager->translate_client()->GetTranslateDriver() | 82 translate_manager->translate_client()->GetTranslateDriver() |
| 86 ->GetLanguageState().InTranslateNavigation()) { | 83 ->GetLanguageState().InTranslateNavigation()) { |
| 87 return; | 84 return; |
| 88 } | 85 } |
| 89 | 86 |
| 90 // Find any existing translate infobar delegate. | 87 // Find any existing translate infobar delegate. |
| 91 infobars::InfoBar* old_infobar = NULL; | 88 infobars::InfoBar* old_infobar = NULL; |
| 92 TranslateInfoBarDelegate* old_delegate = NULL; | 89 TranslateInfoBarDelegate* old_delegate = NULL; |
| 93 for (size_t i = 0; i < infobar_service->infobar_count(); ++i) { | 90 for (size_t i = 0; i < infobar_manager->infobar_count(); ++i) { |
| 94 old_infobar = infobar_service->infobar_at(i); | 91 old_infobar = infobar_manager->infobar_at(i); |
| 95 old_delegate = old_infobar->delegate()->AsTranslateInfoBarDelegate(); | 92 old_delegate = old_infobar->delegate()->AsTranslateInfoBarDelegate(); |
| 96 if (old_delegate) { | 93 if (old_delegate) { |
| 97 if (!replace_existing_infobar) | 94 if (!replace_existing_infobar) |
| 98 return; | 95 return; |
| 99 break; | 96 break; |
| 100 } | 97 } |
| 101 } | 98 } |
| 102 | 99 |
| 103 // Add the new delegate. | 100 // Add the new delegate. |
| 104 scoped_ptr<infobars::InfoBar> infobar(CreateInfoBar( | 101 scoped_ptr<infobars::InfoBar> infobar(CreateInfoBar( |
| 105 scoped_ptr<TranslateInfoBarDelegate>(new TranslateInfoBarDelegate( | 102 scoped_ptr<TranslateInfoBarDelegate>(new TranslateInfoBarDelegate( |
| 106 translate_manager, is_off_the_record, step, old_delegate, | 103 translate_manager, is_off_the_record, step, old_delegate, |
| 107 original_language, target_language, error_type, prefs, | 104 original_language, target_language, error_type, |
| 108 triggered_from_menu)))); | 105 triggered_from_menu)))); |
| 109 if (old_delegate) | 106 if (old_delegate) |
| 110 infobar_service->ReplaceInfoBar(old_infobar, infobar.Pass()); | 107 infobar_manager->ReplaceInfoBar(old_infobar, infobar.Pass()); |
| 111 else | 108 else |
| 112 infobar_service->AddInfoBar(infobar.Pass()); | 109 infobar_manager->AddInfoBar(infobar.Pass()); |
| 113 } | 110 } |
| 114 | 111 |
| 115 | 112 |
| 116 void TranslateInfoBarDelegate::UpdateOriginalLanguageIndex( | 113 void TranslateInfoBarDelegate::UpdateOriginalLanguageIndex( |
| 117 size_t language_index) { | 114 size_t language_index) { |
| 118 ui_delegate_.UpdateOriginalLanguageIndex(language_index); | 115 ui_delegate_.UpdateOriginalLanguageIndex(language_index); |
| 119 } | 116 } |
| 120 | 117 |
| 121 void TranslateInfoBarDelegate::UpdateTargetLanguageIndex( | 118 void TranslateInfoBarDelegate::UpdateTargetLanguageIndex( |
| 122 size_t language_index) { | 119 size_t language_index) { |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 kNeverTranslateMinCount); | 262 kNeverTranslateMinCount); |
| 266 } | 263 } |
| 267 | 264 |
| 268 bool TranslateInfoBarDelegate::ShouldShowAlwaysTranslateShortcut() { | 265 bool TranslateInfoBarDelegate::ShouldShowAlwaysTranslateShortcut() { |
| 269 DCHECK_EQ(translate::TRANSLATE_STEP_BEFORE_TRANSLATE, step_); | 266 DCHECK_EQ(translate::TRANSLATE_STEP_BEFORE_TRANSLATE, step_); |
| 270 return !is_off_the_record_ && | 267 return !is_off_the_record_ && |
| 271 (prefs_->GetTranslationAcceptedCount(original_language_code()) >= | 268 (prefs_->GetTranslationAcceptedCount(original_language_code()) >= |
| 272 kAlwaysTranslateMinCount); | 269 kAlwaysTranslateMinCount); |
| 273 } | 270 } |
| 274 | 271 |
| 275 content::WebContents* TranslateInfoBarDelegate::GetWebContents() { | |
| 276 return InfoBarService::WebContentsFromInfoBar(infobar()); | |
| 277 } | |
| 278 | |
| 279 // static | 272 // static |
| 280 void TranslateInfoBarDelegate::GetAfterTranslateStrings( | 273 void TranslateInfoBarDelegate::GetAfterTranslateStrings( |
| 281 std::vector<base::string16>* strings, | 274 std::vector<base::string16>* strings, |
| 282 bool* swap_languages, | 275 bool* swap_languages, |
| 283 bool autodetermined_source_language) { | 276 bool autodetermined_source_language) { |
| 284 DCHECK(strings); | 277 DCHECK(strings); |
| 285 | 278 |
| 286 if (autodetermined_source_language) { | 279 if (autodetermined_source_language) { |
| 287 size_t offset; | 280 size_t offset; |
| 288 base::string16 text = l10n_util::GetStringFUTF16( | 281 base::string16 text = l10n_util::GetStringFUTF16( |
| (...skipping 23 matching lines...) Expand all Loading... |
| 312 } | 305 } |
| 313 | 306 |
| 314 TranslateInfoBarDelegate::TranslateInfoBarDelegate( | 307 TranslateInfoBarDelegate::TranslateInfoBarDelegate( |
| 315 const base::WeakPtr<TranslateManager>& translate_manager, | 308 const base::WeakPtr<TranslateManager>& translate_manager, |
| 316 bool is_off_the_record, | 309 bool is_off_the_record, |
| 317 translate::TranslateStep step, | 310 translate::TranslateStep step, |
| 318 TranslateInfoBarDelegate* old_delegate, | 311 TranslateInfoBarDelegate* old_delegate, |
| 319 const std::string& original_language, | 312 const std::string& original_language, |
| 320 const std::string& target_language, | 313 const std::string& target_language, |
| 321 TranslateErrors::Type error_type, | 314 TranslateErrors::Type error_type, |
| 322 PrefService* prefs, | |
| 323 bool triggered_from_menu) | 315 bool triggered_from_menu) |
| 324 : infobars::InfoBarDelegate(), | 316 : infobars::InfoBarDelegate(), |
| 325 is_off_the_record_(is_off_the_record), | 317 is_off_the_record_(is_off_the_record), |
| 326 step_(step), | 318 step_(step), |
| 327 background_animation_(NONE), | 319 background_animation_(NONE), |
| 328 ui_delegate_(translate_manager->translate_client(), | 320 ui_delegate_(translate_manager->translate_client(), |
| 329 translate_manager.get(), | 321 translate_manager.get(), |
| 330 original_language, | 322 original_language, |
| 331 target_language), | 323 target_language), |
| 332 translate_manager_(translate_manager), | 324 translate_manager_(translate_manager), |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 if (!details.is_navigation_to_different_page && !details.is_main_frame) | 368 if (!details.is_navigation_to_different_page && !details.is_main_frame) |
| 377 return false; | 369 return false; |
| 378 | 370 |
| 379 return infobars::InfoBarDelegate::ShouldExpireInternal(details); | 371 return infobars::InfoBarDelegate::ShouldExpireInternal(details); |
| 380 } | 372 } |
| 381 | 373 |
| 382 TranslateInfoBarDelegate* | 374 TranslateInfoBarDelegate* |
| 383 TranslateInfoBarDelegate::AsTranslateInfoBarDelegate() { | 375 TranslateInfoBarDelegate::AsTranslateInfoBarDelegate() { |
| 384 return this; | 376 return this; |
| 385 } | 377 } |
| OLD | NEW |