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 |