Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / translate / translate_infobar_delegate.cc
index 9a8c408..a2b8254 100644 (file)
 #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;
 
@@ -32,30 +54,29 @@ TranslateInfoBarDelegate::~TranslateInfoBarDelegate() {
 }
 
 // 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 ||
@@ -81,8 +102,8 @@ void TranslateInfoBarDelegate::Create(
   // 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
@@ -122,8 +143,12 @@ bool TranslateInfoBarDelegate::IsTranslatableLanguageByPrefs() {
   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() {
@@ -169,14 +194,14 @@ void TranslateInfoBarDelegate::NeverTranslatePageLanguage() {
 }
 
 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);
@@ -207,8 +232,8 @@ base::string16 TranslateInfoBarDelegate::GetMessageInfoBarText() {
 }
 
 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(
@@ -219,7 +244,7 @@ base::string16 TranslateInfoBarDelegate::GetMessageInfoBarButtonText() {
 }
 
 void TranslateInfoBarDelegate::MessageInfoBarButtonPressed() {
-  DCHECK_EQ(TRANSLATION_ERROR, infobar_type_);
+  DCHECK_EQ(TranslateTabHelper::TRANSLATE_ERROR, step_);
   if (error_type_ == TranslateErrors::UNSUPPORTED_LANGUAGE) {
     RevertTranslation();
     return;
@@ -234,17 +259,17 @@ bool TranslateInfoBarDelegate::ShouldShowMessageInfoBarButton() {
 }
 
 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
@@ -291,21 +316,19 @@ void TranslateInfoBarDelegate::GetAfterTranslateStrings(
 
 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()))
@@ -316,7 +339,7 @@ TranslateInfoBarDelegate::TranslateInfoBarDelegate(
 // 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.