| OLD | NEW | 
|    1 // Copyright 2013 The Chromium Authors. All rights reserved. |    1 // Copyright 2013 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_ui_delegate.h" |    5 #include "chrome/browser/translate/translate_ui_delegate.h" | 
|    6  |    6  | 
|    7 #include "base/i18n/string_compare.h" |    7 #include "base/i18n/string_compare.h" | 
|    8 #include "base/metrics/histogram.h" |    8 #include "base/metrics/histogram.h" | 
|    9 #include "chrome/browser/browser_process.h" |    9 #include "chrome/browser/browser_process.h" | 
|   10 #include "chrome/browser/profiles/profile.h" |   10 #include "chrome/browser/profiles/profile.h" | 
 |   11 #include "chrome/browser/translate/translate_browser_metrics.h" | 
|   11 #include "chrome/browser/translate/translate_manager.h" |   12 #include "chrome/browser/translate/translate_manager.h" | 
|   12 #include "chrome/browser/translate/translate_prefs.h" |   13 #include "chrome/browser/translate/translate_prefs.h" | 
|   13 #include "chrome/browser/translate/translate_tab_helper.h" |   14 #include "chrome/browser/translate/translate_tab_helper.h" | 
|   14 #include "components/translate/common/translate_constants.h" |   15 #include "components/translate/common/translate_constants.h" | 
|   15 #include "content/public/browser/browser_context.h" |   16 #include "content/public/browser/browser_context.h" | 
|   16 #include "content/public/browser/navigation_entry.h" |   17 #include "content/public/browser/navigation_entry.h" | 
|   17 #include "content/public/browser/web_contents.h" |   18 #include "content/public/browser/web_contents.h" | 
|   18 #include "third_party/icu/source/i18n/unicode/coll.h" |   19 #include "third_party/icu/source/i18n/unicode/coll.h" | 
|   19 #include "ui/base/l10n/l10n_util.h" |   20 #include "ui/base/l10n/l10n_util.h" | 
|   20  |   21  | 
|   21 namespace { |  | 
|   22  |  | 
|   23 const char kDeclineTranslate[] = "Translate.DeclineTranslate"; |  | 
|   24 const char kRevertTranslation[] = "Translate.RevertTranslation"; |  | 
|   25 const char kPerformTranslate[] = "Translate.Translate"; |  | 
|   26 const char kNeverTranslateLang[] = "Translate.NeverTranslateLang"; |  | 
|   27 const char kNeverTranslateSite[] = "Translate.NeverTranslateSite"; |  | 
|   28 const char kAlwaysTranslateLang[] = "Translate.AlwaysTranslateLang"; |  | 
|   29 const char kModifyOriginalLang[] = "Translate.ModifyOriginalLang"; |  | 
|   30 const char kModifyTargetLang[] = "Translate.ModifyTargetLang"; |  | 
|   31  |  | 
|   32 }  // namespace |  | 
|   33  |  | 
|   34 TranslateUIDelegate::TranslateUIDelegate(content::WebContents* web_contents, |   22 TranslateUIDelegate::TranslateUIDelegate(content::WebContents* web_contents, | 
|   35                                          const std::string& original_language, |   23                                          const std::string& original_language, | 
|   36                                          const std::string& target_language) |   24                                          const std::string& target_language) | 
|   37     : web_contents_(web_contents), |   25     : web_contents_(web_contents), | 
|   38       original_language_index_(NO_INDEX), |   26       original_language_index_(NO_INDEX), | 
|   39       initial_original_language_index_(NO_INDEX), |  | 
|   40       target_language_index_(NO_INDEX) { |   27       target_language_index_(NO_INDEX) { | 
|   41   std::vector<std::string> language_codes; |   28   GetSortedLanguageNames(g_browser_process->GetApplicationLocale(), | 
|   42   TranslateManager::GetSupportedLanguages(&language_codes); |   29                          &languages_); | 
|   43  |   30  | 
|   44   // Preparing for the alphabetical order in the locale. |  | 
|   45   UErrorCode error = U_ZERO_ERROR; |  | 
|   46   std::string locale = g_browser_process->GetApplicationLocale(); |  | 
|   47   icu::Locale loc(locale.c_str()); |  | 
|   48   scoped_ptr<icu::Collator> collator(icu::Collator::createInstance(loc, error)); |  | 
|   49   collator->setStrength(icu::Collator::PRIMARY); |  | 
|   50  |  | 
|   51   languages_.reserve(language_codes.size()); |  | 
|   52   for (std::vector<std::string>::const_iterator iter = language_codes.begin(); |  | 
|   53        iter != language_codes.end(); ++iter) { |  | 
|   54     std::string language_code = *iter; |  | 
|   55  |  | 
|   56     string16 language_name = l10n_util::GetDisplayNameForLocale( |  | 
|   57         language_code, g_browser_process->GetApplicationLocale(), true); |  | 
|   58     // Insert the language in languages_ in alphabetical order. |  | 
|   59     std::vector<LanguageNamePair>::iterator iter2; |  | 
|   60     for (iter2 = languages_.begin(); iter2 != languages_.end(); ++iter2) { |  | 
|   61       if (base::i18n::CompareString16WithCollator(collator.get(), |  | 
|   62           language_name, iter2->second) == UCOL_LESS) { |  | 
|   63         break; |  | 
|   64       } |  | 
|   65     } |  | 
|   66     languages_.insert(iter2, LanguageNamePair(language_code, language_name)); |  | 
|   67   } |  | 
|   68   for (std::vector<LanguageNamePair>::const_iterator iter = languages_.begin(); |   31   for (std::vector<LanguageNamePair>::const_iterator iter = languages_.begin(); | 
|   69        iter != languages_.end(); ++iter) { |   32        iter != languages_.end(); ++iter) { | 
|   70     std::string language_code = iter->first; |   33     std::string language_code = iter->first; | 
|   71     if (language_code == original_language) { |   34     if (language_code == original_language) | 
|   72       original_language_index_ = iter - languages_.begin(); |   35       original_language_index_ = iter - languages_.begin(); | 
|   73       initial_original_language_index_ = original_language_index_; |  | 
|   74     } |  | 
|   75     if (language_code == target_language) |   36     if (language_code == target_language) | 
|   76       target_language_index_ = iter - languages_.begin(); |   37       target_language_index_ = iter - languages_.begin(); | 
|   77   } |   38   } | 
|   78  |   39  | 
|   79   Profile* profile = |   40   Profile* profile = | 
|   80       Profile::FromBrowserContext(web_contents->GetBrowserContext()); |   41       Profile::FromBrowserContext(web_contents->GetBrowserContext()); | 
|   81   prefs_.reset(new TranslatePrefs(profile->GetPrefs())); |   42   prefs_.reset(new TranslatePrefs(profile->GetPrefs())); | 
|   82 } |   43 } | 
|   83  |   44  | 
|   84 TranslateUIDelegate::~TranslateUIDelegate() { |   45 TranslateUIDelegate::~TranslateUIDelegate() { | 
|   85 } |   46 } | 
|   86  |   47  | 
 |   48 // static | 
 |   49 void TranslateUIDelegate::GetSortedLanguageNames( | 
 |   50     const std::string& locale, | 
 |   51     std::vector<LanguageNamePair>* language_names) { | 
 |   52   DCHECK(language_names->empty()); | 
 |   53  | 
 |   54   std::vector<std::string> language_codes; | 
 |   55   TranslateManager::GetSupportedLanguages(&language_codes); | 
 |   56  | 
 |   57   // Preparing for the alphabetical order in the locale. | 
 |   58   UErrorCode error = U_ZERO_ERROR; | 
 |   59   icu::Locale loc(locale.c_str()); | 
 |   60   scoped_ptr<icu::Collator> collator(icu::Collator::createInstance(loc, error)); | 
 |   61   collator->setStrength(icu::Collator::PRIMARY); | 
 |   62  | 
 |   63   language_names->reserve(language_codes.size()); | 
 |   64   for (std::vector<std::string>::const_iterator iter = language_codes.begin(); | 
 |   65        iter != language_codes.end(); ++iter) { | 
 |   66     std::string language_code = *iter; | 
 |   67  | 
 |   68     string16 language_name = l10n_util::GetDisplayNameForLocale( | 
 |   69         language_code, locale, true); | 
 |   70     // Insert the language in language_names in alphabetical order. | 
 |   71     std::vector<LanguageNamePair>::iterator iter2; | 
 |   72     for (iter2 = language_names->begin(); iter2 != language_names->end(); | 
 |   73          ++iter2) { | 
 |   74       if (base::i18n::CompareString16WithCollator(collator.get(), | 
 |   75           language_name, iter2->second) == UCOL_LESS) { | 
 |   76         break; | 
 |   77       } | 
 |   78     } | 
 |   79     language_names->insert(iter2, | 
 |   80                            LanguageNamePair(language_code, language_name)); | 
 |   81   } | 
 |   82 } | 
 |   83  | 
 |   84 // static | 
 |   85 std::string TranslateUIDelegate::GetPageHost( | 
 |   86     content::WebContents* web_contents) { | 
 |   87   content::NavigationEntry* entry = | 
 |   88       web_contents->GetController().GetActiveEntry(); | 
 |   89   return entry ? entry->GetURL().HostNoBrackets() : std::string(); | 
 |   90 } | 
 |   91  | 
|   87 size_t TranslateUIDelegate::GetNumberOfLanguages() const { |   92 size_t TranslateUIDelegate::GetNumberOfLanguages() const { | 
|   88   return languages_.size(); |   93   return languages_.size(); | 
|   89 } |   94 } | 
|   90  |   95  | 
|   91 size_t TranslateUIDelegate::GetOriginalLanguageIndex() const { |   96 size_t TranslateUIDelegate::GetOriginalLanguageIndex() const { | 
|   92   return original_language_index_; |   97   return original_language_index_; | 
|   93 } |   98 } | 
|   94  |   99  | 
|   95 void TranslateUIDelegate::UpdateOriginalLanguageIndex(size_t language_index) { |  100 void TranslateUIDelegate::UpdateOriginalLanguageIndex(size_t language_index) { | 
 |  101   // Note: TranslateInfobarDelegate should be updated if this implementation is | 
 |  102   // updated. | 
|   96   if (original_language_index_ == language_index) |  103   if (original_language_index_ == language_index) | 
|   97     return; |  104     return; | 
|   98  |  105  | 
|   99   UMA_HISTOGRAM_BOOLEAN(kModifyOriginalLang, true); |  106   UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | 
 |  107       TranslateBrowserMetrics::UMA_MODIFY_ORIGINAL_LANG), true); | 
|  100   original_language_index_ = language_index; |  108   original_language_index_ = language_index; | 
|  101 } |  109 } | 
|  102  |  110  | 
|  103 size_t TranslateUIDelegate::GetTargetLanguageIndex() const { |  111 size_t TranslateUIDelegate::GetTargetLanguageIndex() const { | 
|  104   return target_language_index_; |  112   return target_language_index_; | 
|  105 } |  113 } | 
|  106  |  114  | 
|  107 void TranslateUIDelegate::UpdateTargetLanguageIndex(size_t language_index) { |  115 void TranslateUIDelegate::UpdateTargetLanguageIndex(size_t language_index) { | 
 |  116   // Note: TranslateInfobarDelegate should be updated if this implementation is | 
 |  117   // updated. | 
|  108   if (target_language_index_ == language_index) |  118   if (target_language_index_ == language_index) | 
|  109     return; |  119     return; | 
|  110  |  120  | 
|  111   DCHECK_LT(language_index, GetNumberOfLanguages()); |  121   DCHECK_LT(language_index, GetNumberOfLanguages()); | 
|  112   UMA_HISTOGRAM_BOOLEAN(kModifyTargetLang, true); |  122   UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | 
 |  123       TranslateBrowserMetrics::UMA_MODIFY_TARGET_LANG), true); | 
|  113   target_language_index_ = language_index; |  124   target_language_index_ = language_index; | 
|  114 } |  125 } | 
|  115  |  126  | 
|  116  |  127  | 
|  117 std::string TranslateUIDelegate::GetLanguageCodeAt(size_t index) const { |  128 std::string TranslateUIDelegate::GetLanguageCodeAt(size_t index) const { | 
 |  129   // Note: TranslateInfobarDelegate should be updated if this implementation is | 
 |  130   // updated. | 
|  118   DCHECK_LT(index, GetNumberOfLanguages()); |  131   DCHECK_LT(index, GetNumberOfLanguages()); | 
|  119   return languages_[index].first; |  132   return languages_[index].first; | 
|  120 } |  133 } | 
|  121  |  134  | 
|  122 string16 TranslateUIDelegate::GetLanguageNameAt(size_t index) const { |  135 string16 TranslateUIDelegate::GetLanguageNameAt(size_t index) const { | 
 |  136   // Note: TranslateInfobarDelegate should be updated if this implementation is | 
 |  137   // updated. | 
|  123   if (index == static_cast<size_t>(NO_INDEX)) |  138   if (index == static_cast<size_t>(NO_INDEX)) | 
|  124     return string16(); |  139     return string16(); | 
|  125   DCHECK_LT(index, GetNumberOfLanguages()); |  140   DCHECK_LT(index, GetNumberOfLanguages()); | 
|  126   return languages_[index].second; |  141   return languages_[index].second; | 
|  127 } |  142 } | 
|  128  |  143  | 
|  129 std::string TranslateUIDelegate::GetOriginalLanguageCode() const { |  144 std::string TranslateUIDelegate::GetOriginalLanguageCode() const { | 
 |  145   // Note: TranslateInfobarDelegate should be updated if this implementation is | 
 |  146   // updated. | 
|  130   return (GetOriginalLanguageIndex() == static_cast<size_t>(NO_INDEX)) ? |  147   return (GetOriginalLanguageIndex() == static_cast<size_t>(NO_INDEX)) ? | 
|  131       translate::kUnknownLanguageCode : |  148       translate::kUnknownLanguageCode : | 
|  132       GetLanguageCodeAt(GetOriginalLanguageIndex()); |  149       GetLanguageCodeAt(GetOriginalLanguageIndex()); | 
|  133 } |  150 } | 
|  134  |  151  | 
|  135 std::string TranslateUIDelegate::GetTargetLanguageCode() const { |  152 std::string TranslateUIDelegate::GetTargetLanguageCode() const { | 
 |  153   // Note: TranslateInfobarDelegate should be updated if this implementation is | 
 |  154   // updated. | 
|  136   return GetLanguageCodeAt(GetTargetLanguageIndex()); |  155   return GetLanguageCodeAt(GetTargetLanguageIndex()); | 
|  137 } |  156 } | 
|  138  |  157  | 
|  139 void TranslateUIDelegate::Translate() { |  158 void TranslateUIDelegate::Translate() { | 
 |  159   // Note: TranslateInfobarDelegate should be updated if this implementation is | 
 |  160   // updated. | 
|  140   if (!web_contents()->GetBrowserContext()->IsOffTheRecord()) { |  161   if (!web_contents()->GetBrowserContext()->IsOffTheRecord()) { | 
|  141     prefs_->ResetTranslationDeniedCount(GetOriginalLanguageCode()); |  162     prefs_->ResetTranslationDeniedCount(GetOriginalLanguageCode()); | 
|  142     prefs_->IncrementTranslationAcceptedCount(GetOriginalLanguageCode()); |  163     prefs_->IncrementTranslationAcceptedCount(GetOriginalLanguageCode()); | 
|  143   } |  164   } | 
|  144   TranslateManager::GetInstance()->TranslatePage(web_contents(), |  165   TranslateManager::GetInstance()->TranslatePage(web_contents(), | 
|  145                                                  GetOriginalLanguageCode(), |  166                                                  GetOriginalLanguageCode(), | 
|  146                                                  GetTargetLanguageCode()); |  167                                                  GetTargetLanguageCode()); | 
|  147  |  168  | 
|  148   UMA_HISTOGRAM_BOOLEAN(kPerformTranslate, true); |  169   UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | 
 |  170       TranslateBrowserMetrics::UMA_PERFORM_TRANSLATE), true); | 
|  149 } |  171 } | 
|  150  |  172  | 
|  151 void TranslateUIDelegate::RevertTranslation() { |  173 void TranslateUIDelegate::RevertTranslation() { | 
 |  174   // Note: TranslateInfobarDelegate should be updated if this implementation is | 
 |  175   // updated. | 
|  152   TranslateManager::GetInstance()->RevertTranslation(web_contents()); |  176   TranslateManager::GetInstance()->RevertTranslation(web_contents()); | 
|  153  |  177  | 
|  154   UMA_HISTOGRAM_BOOLEAN(kRevertTranslation, true); |  178   UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | 
 |  179       TranslateBrowserMetrics::UMA_REVERT_TRANSLATION), true); | 
|  155 } |  180 } | 
|  156  |  181  | 
|  157 void TranslateUIDelegate::TranslationDeclined() { |  182 void TranslateUIDelegate::TranslationDeclined() { | 
 |  183   // Note: TranslateInfobarDelegate should be updated if this implementation is | 
 |  184   // updated. | 
|  158   if (!web_contents()->GetBrowserContext()->IsOffTheRecord()) { |  185   if (!web_contents()->GetBrowserContext()->IsOffTheRecord()) { | 
|  159     prefs_->ResetTranslationAcceptedCount(GetOriginalLanguageCode()); |  186     prefs_->ResetTranslationAcceptedCount(GetOriginalLanguageCode()); | 
|  160     prefs_->IncrementTranslationDeniedCount(GetOriginalLanguageCode()); |  187     prefs_->IncrementTranslationDeniedCount(GetOriginalLanguageCode()); | 
|  161   } |  188   } | 
|  162  |  189  | 
|  163   // Remember that the user declined the translation so as to prevent showing a |  190   // Remember that the user declined the translation so as to prevent showing a | 
|  164   // translate infobar for that page again.  (TranslateManager initiates |  191   // translate infobar for that page again.  (TranslateManager initiates | 
|  165   // translations when getting a LANGUAGE_DETERMINED from the page, which |  192   // translations when getting a LANGUAGE_DETERMINED from the page, which | 
|  166   // happens when a load stops. That could happen multiple times, including |  193   // happens when a load stops. That could happen multiple times, including | 
|  167   // after the user already declined the translation.) |  194   // after the user already declined the translation.) | 
|  168   TranslateTabHelper::FromWebContents(web_contents())-> |  195   TranslateTabHelper::FromWebContents(web_contents())-> | 
|  169       language_state().set_translation_declined(true); |  196       language_state().set_translation_declined(true); | 
|  170  |  197  | 
|  171   UMA_HISTOGRAM_BOOLEAN(kDeclineTranslate, true); |  198   UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | 
 |  199       TranslateBrowserMetrics::UMA_DECLINE_TRANSLATE), true); | 
|  172 } |  200 } | 
|  173  |  201  | 
|  174 bool TranslateUIDelegate::IsLanguageBlocked() { |  202 bool TranslateUIDelegate::IsLanguageBlocked() { | 
|  175   return prefs_->IsBlockedLanguage(GetOriginalLanguageCode()); |  203   return prefs_->IsBlockedLanguage(GetOriginalLanguageCode()); | 
|  176 } |  204 } | 
|  177  |  205  | 
|  178 void TranslateUIDelegate::SetLanguageBlocked(bool value) { |  206 void TranslateUIDelegate::SetLanguageBlocked(bool value) { | 
 |  207   // Note: TranslateInfobarDelegate should be updated if this implementation is | 
 |  208   // updated. | 
|  179   if (value) { |  209   if (value) { | 
|  180     prefs_->BlockLanguage(GetOriginalLanguageCode()); |  210     prefs_->BlockLanguage(GetOriginalLanguageCode()); | 
|  181     TranslateTabHelper* translate_tab_helper = |  211     TranslateTabHelper* translate_tab_helper = | 
|  182         TranslateTabHelper::FromWebContents(web_contents()); |  212         TranslateTabHelper::FromWebContents(web_contents()); | 
|  183     DCHECK(translate_tab_helper); |  213     DCHECK(translate_tab_helper); | 
|  184     translate_tab_helper->language_state().SetTranslateEnabled(false); |  214     translate_tab_helper->language_state().SetTranslateEnabled(false); | 
|  185   } else { |  215   } else { | 
|  186     prefs_->UnblockLanguage(GetOriginalLanguageCode()); |  216     prefs_->UnblockLanguage(GetOriginalLanguageCode()); | 
|  187   } |  217   } | 
|  188  |  218  | 
|  189   UMA_HISTOGRAM_BOOLEAN(kNeverTranslateLang, true); |  219   UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | 
 |  220       TranslateBrowserMetrics::UMA_NEVER_TRANSLATE_LANG), true); | 
|  190 } |  221 } | 
|  191  |  222  | 
|  192 bool TranslateUIDelegate::IsSiteBlacklisted() { |  223 bool TranslateUIDelegate::IsSiteBlacklisted() { | 
|  193   std::string host = GetPageHost(); |  224   // Note: TranslateInfobarDelegate should be updated if this implementation is | 
 |  225   // updated. | 
 |  226   std::string host = GetPageHost(web_contents()); | 
|  194   return !host.empty() && prefs_->IsSiteBlacklisted(host); |  227   return !host.empty() && prefs_->IsSiteBlacklisted(host); | 
|  195 } |  228 } | 
|  196  |  229  | 
|  197 void TranslateUIDelegate::SetSiteBlacklist(bool value) { |  230 void TranslateUIDelegate::SetSiteBlacklist(bool value) { | 
|  198   std::string host = GetPageHost(); |  231   // Note: TranslateInfobarDelegate should be updated if this implementation is | 
 |  232   // updated. | 
 |  233   std::string host = GetPageHost(web_contents()); | 
|  199   if (host.empty()) |  234   if (host.empty()) | 
|  200     return; |  235     return; | 
|  201  |  236  | 
|  202   if (value) { |  237   if (value) { | 
|  203     prefs_->BlacklistSite(host); |  238     prefs_->BlacklistSite(host); | 
|  204     TranslateTabHelper* translate_tab_helper = |  239     TranslateTabHelper* translate_tab_helper = | 
|  205         TranslateTabHelper::FromWebContents(web_contents()); |  240         TranslateTabHelper::FromWebContents(web_contents()); | 
|  206     DCHECK(translate_tab_helper); |  241     DCHECK(translate_tab_helper); | 
|  207     translate_tab_helper->language_state().SetTranslateEnabled(false); |  242     translate_tab_helper->language_state().SetTranslateEnabled(false); | 
|  208   } else { |  243   } else { | 
|  209     prefs_->RemoveSiteFromBlacklist(host); |  244     prefs_->RemoveSiteFromBlacklist(host); | 
|  210   } |  245   } | 
|  211  |  246  | 
|  212   UMA_HISTOGRAM_BOOLEAN(kNeverTranslateSite, true); |  247   UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | 
 |  248       TranslateBrowserMetrics::UMA_NEVER_TRANSLATE_SITE), true); | 
|  213 } |  249 } | 
|  214  |  250  | 
|  215 bool TranslateUIDelegate::ShouldAlwaysTranslate() { |  251 bool TranslateUIDelegate::ShouldAlwaysTranslate() { | 
|  216   return prefs_->IsLanguagePairWhitelisted(GetOriginalLanguageCode(), |  252   return prefs_->IsLanguagePairWhitelisted(GetOriginalLanguageCode(), | 
|  217                                            GetTargetLanguageCode()); |  253                                            GetTargetLanguageCode()); | 
|  218 } |  254 } | 
|  219  |  255  | 
|  220 void TranslateUIDelegate::SetAlwaysTranslate(bool value) { |  256 void TranslateUIDelegate::SetAlwaysTranslate(bool value) { | 
 |  257   // Note: TranslateInfobarDelegate should be updated if this implementation is | 
 |  258   // updated. | 
|  221   const std::string& original_lang = GetOriginalLanguageCode(); |  259   const std::string& original_lang = GetOriginalLanguageCode(); | 
|  222   const std::string& target_lang = GetTargetLanguageCode(); |  260   const std::string& target_lang = GetTargetLanguageCode(); | 
|  223   if (value) |  261   if (value) | 
|  224     prefs_->WhitelistLanguagePair(original_lang, target_lang); |  262     prefs_->WhitelistLanguagePair(original_lang, target_lang); | 
|  225   else |  263   else | 
|  226     prefs_->RemoveLanguagePairFromWhitelist(original_lang, target_lang); |  264     prefs_->RemoveLanguagePairFromWhitelist(original_lang, target_lang); | 
|  227  |  265  | 
|  228   UMA_HISTOGRAM_BOOLEAN(kAlwaysTranslateLang, true); |  266   UMA_HISTOGRAM_BOOLEAN(TranslateBrowserMetrics::GetMetricsName( | 
 |  267       TranslateBrowserMetrics::UMA_ALWAYS_TRANSLATE_LANG), true); | 
|  229 } |  268 } | 
|  230  |  | 
|  231 std::string TranslateUIDelegate::GetPageHost() { |  | 
|  232   content::NavigationEntry* entry = |  | 
|  233       web_contents()->GetController().GetActiveEntry(); |  | 
|  234   return entry ? entry->GetURL().HostNoBrackets() : std::string(); |  | 
|  235 } |  | 
| OLD | NEW |