#include "chrome/browser/infobars/infobar.h"
#include "chrome/browser/infobars/infobar_service.h"
#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/translate/translate_accept_languages.h"
#include "chrome/browser/translate/translate_manager.h"
#include "chrome/browser/translate/translate_tab_helper.h"
+#include "components/translate/core/browser/translate_accept_languages.h"
+#include "components/translate/core/browser/translate_download_manager.h"
#include "components/translate/core/common/translate_constants.h"
#include "content/public/browser/navigation_details.h"
#include "content/public/browser/navigation_entry.h"
#include "third_party/icu/source/i18n/unicode/coll.h"
#include "ui/base/l10n/l10n_util.h"
+namespace {
+
+// Counts used to decide whether infobars should be shown.
+// Android and iOS implementations do not offer a drop down (for space reasons),
+// so we are more aggressive about showing the shortcut to never translate.
+// The "Always Translate" option is always shown on iOS and Android.
+#if defined(OS_ANDROID)
+ const int kAlwaysTranslateMinCount = 1;
+ const int kNeverTranslateMinCount = 1;
+#elif defined(OS_IOS)
+ // The iOS implementation, like the Android implementation, shows the "Never
+ // translate" infobar after two denials. There is an offset of one because on
+ // Android the last event is not counted.
+ const int kAlwaysTranslateMinCount = 1;
+ const int kNeverTranslateMinCount = 2;
+#else
+ const int kAlwaysTranslateMinCount = 3;
+ const int kNeverTranslateMinCount = 3;
+#endif
+
+} // namespace
const size_t TranslateInfoBarDelegate::kNoIndex = TranslateUIDelegate::NO_INDEX;
}
// static
-void TranslateInfoBarDelegate::Create(
- bool replace_existing_infobar,
- content::WebContents* web_contents,
- Type infobar_type,
- const std::string& original_language,
- const std::string& target_language,
- TranslateErrors::Type error_type,
- PrefService* prefs,
- const ShortcutConfiguration& shortcut_config) {
+void TranslateInfoBarDelegate::Create(bool replace_existing_infobar,
+ content::WebContents* web_contents,
+ TranslateTabHelper::TranslateStep step,
+ const std::string& original_language,
+ const std::string& target_language,
+ TranslateErrors::Type error_type,
+ PrefService* prefs) {
// Check preconditions.
- if (infobar_type != TRANSLATION_ERROR) {
- DCHECK(TranslateManager::IsSupportedLanguage(target_language));
- if (!TranslateManager::IsSupportedLanguage(original_language)) {
+ if (step != TranslateTabHelper::TRANSLATE_ERROR) {
+ DCHECK(TranslateDownloadManager::IsSupportedLanguage(target_language));
+ if (!TranslateDownloadManager::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(infobar_type == TRANSLATING || infobar_type == AFTER_TRANSLATE);
+ DCHECK(step == TranslateTabHelper::TRANSLATING ||
+ step == TranslateTabHelper::AFTER_TRANSLATE);
DCHECK_EQ(translate::kUnknownLanguageCode, original_language);
}
}
// Do not create the after translate infobar if we are auto translating.
- if ((infobar_type == TranslateInfoBarDelegate::AFTER_TRANSLATE) ||
- (infobar_type == TranslateInfoBarDelegate::TRANSLATING)) {
+ if ((step == TranslateTabHelper::AFTER_TRANSLATE) ||
+ (step == TranslateTabHelper::TRANSLATING)) {
TranslateTabHelper* translate_tab_helper =
TranslateTabHelper::FromWebContents(web_contents);
if (!translate_tab_helper ||
// Add the new delegate.
scoped_ptr<InfoBar> infobar(CreateInfoBar(
scoped_ptr<TranslateInfoBarDelegate>(new TranslateInfoBarDelegate(
- web_contents, infobar_type, old_delegate, original_language,
- target_language, error_type, prefs, shortcut_config))));
+ web_contents, step, old_delegate, original_language,
+ target_language, error_type, prefs))));
if (old_delegate)
infobar_service->ReplaceInfoBar(old_infobar, infobar.Pass());
else
Profile* profile =
Profile::FromBrowserContext(web_contents()->GetBrowserContext());
Profile* original_profile = profile->GetOriginalProfile();
- return TranslatePrefs::CanTranslateLanguage(original_profile,
- original_language_code());
+ scoped_ptr<TranslatePrefs> translate_prefs(
+ TranslateTabHelper::CreateTranslatePrefs(original_profile->GetPrefs()));
+ TranslateAcceptLanguages* accept_languages =
+ TranslateTabHelper::GetTranslateAcceptLanguages(original_profile);
+ return translate_prefs->CanTranslateLanguage(accept_languages,
+ original_language_code());
}
void TranslateInfoBarDelegate::ToggleTranslatableLanguageByPrefs() {
}
base::string16 TranslateInfoBarDelegate::GetMessageInfoBarText() {
- if (infobar_type_ == TRANSLATING) {
+ if (step_ == TranslateTabHelper::TRANSLATING) {
base::string16 target_language_name =
language_name_at(target_language_index());
return l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_TRANSLATING_TO,
target_language_name);
}
- DCHECK_EQ(TRANSLATION_ERROR, infobar_type_);
+ DCHECK_EQ(TranslateTabHelper::TRANSLATE_ERROR, step_);
UMA_HISTOGRAM_ENUMERATION("Translate.ShowErrorInfobar",
error_type_,
TranslateErrors::TRANSLATE_ERROR_MAX);
}
base::string16 TranslateInfoBarDelegate::GetMessageInfoBarButtonText() {
- if (infobar_type_ != TRANSLATION_ERROR) {
- DCHECK_EQ(TRANSLATING, infobar_type_);
+ if (step_ != TranslateTabHelper::TRANSLATE_ERROR) {
+ DCHECK_EQ(TranslateTabHelper::TRANSLATING, step_);
} else if ((error_type_ != TranslateErrors::IDENTICAL_LANGUAGES) &&
(error_type_ != TranslateErrors::UNKNOWN_LANGUAGE)) {
return l10n_util::GetStringUTF16(
}
void TranslateInfoBarDelegate::MessageInfoBarButtonPressed() {
- DCHECK_EQ(TRANSLATION_ERROR, infobar_type_);
+ DCHECK_EQ(TranslateTabHelper::TRANSLATE_ERROR, step_);
if (error_type_ == TranslateErrors::UNSUPPORTED_LANGUAGE) {
RevertTranslation();
return;
}
bool TranslateInfoBarDelegate::ShouldShowNeverTranslateShortcut() {
- DCHECK_EQ(BEFORE_TRANSLATE, infobar_type_);
+ DCHECK_EQ(TranslateTabHelper::BEFORE_TRANSLATE, step_);
return !web_contents()->GetBrowserContext()->IsOffTheRecord() &&
- (prefs_.GetTranslationDeniedCount(original_language_code()) >=
- shortcut_config_.never_translate_min_count);
+ (prefs_->GetTranslationDeniedCount(original_language_code()) >=
+ kNeverTranslateMinCount);
}
bool TranslateInfoBarDelegate::ShouldShowAlwaysTranslateShortcut() {
- DCHECK_EQ(BEFORE_TRANSLATE, infobar_type_);
+ DCHECK_EQ(TranslateTabHelper::BEFORE_TRANSLATE, step_);
return !web_contents()->GetBrowserContext()->IsOffTheRecord() &&
- (prefs_.GetTranslationAcceptedCount(original_language_code()) >=
- shortcut_config_.always_translate_min_count);
+ (prefs_->GetTranslationAcceptedCount(original_language_code()) >=
+ kAlwaysTranslateMinCount);
}
// static
TranslateInfoBarDelegate::TranslateInfoBarDelegate(
content::WebContents* web_contents,
- Type infobar_type,
+ TranslateTabHelper::TranslateStep step,
TranslateInfoBarDelegate* old_delegate,
const std::string& original_language,
const std::string& target_language,
TranslateErrors::Type error_type,
- PrefService* prefs,
- ShortcutConfiguration shortcut_config)
+ PrefService* prefs)
: InfoBarDelegate(),
- infobar_type_(infobar_type),
+ step_(step),
background_animation_(NONE),
ui_delegate_(web_contents, original_language, target_language),
error_type_(error_type),
- prefs_(prefs),
- shortcut_config_(shortcut_config) {
- DCHECK_NE((infobar_type_ == TRANSLATION_ERROR),
+ prefs_(TranslateTabHelper::CreateTranslatePrefs(prefs)) {
+ DCHECK_NE((step_ == TranslateTabHelper::TRANSLATE_ERROR),
(error_type_ == TranslateErrors::NONE));
if (old_delegate && (old_delegate->is_error() != is_error()))
// files.
void TranslateInfoBarDelegate::InfoBarDismissed() {
- if (infobar_type_ != BEFORE_TRANSLATE)
+ if (step_ != TranslateTabHelper::BEFORE_TRANSLATE)
return;
// The user closed the infobar without clicking the translate button.