Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(300)

Side by Side Diff: chrome/browser/translate/translate_infobar_delegate.cc

Issue 23708029: Translate: Refactoring: Create TranslateUIDelegate (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: (rebasing) Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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_service.h" 13 #include "chrome/browser/infobars/infobar_service.h"
14 #include "chrome/browser/profiles/profile.h" 14 #include "chrome/browser/profiles/profile.h"
15 #include "chrome/browser/translate/translate_accept_languages.h" 15 #include "chrome/browser/translate/translate_accept_languages.h"
16 #include "chrome/browser/translate/translate_manager.h" 16 #include "chrome/browser/translate/translate_manager.h"
17 #include "chrome/browser/translate/translate_tab_helper.h" 17 #include "chrome/browser/translate/translate_tab_helper.h"
18 #include "components/translate/common/translate_constants.h"
18 #include "content/public/browser/navigation_details.h" 19 #include "content/public/browser/navigation_details.h"
19 #include "content/public/browser/navigation_entry.h" 20 #include "content/public/browser/navigation_entry.h"
20 #include "content/public/browser/web_contents.h" 21 #include "content/public/browser/web_contents.h"
21 #include "grit/generated_resources.h" 22 #include "grit/generated_resources.h"
22 #include "grit/theme_resources.h" 23 #include "grit/theme_resources.h"
23 #include "third_party/icu/source/i18n/unicode/coll.h" 24 #include "third_party/icu/source/i18n/unicode/coll.h"
24 #include "ui/base/l10n/l10n_util.h" 25 #include "ui/base/l10n/l10n_util.h"
25 26
26 using content::NavigationEntry; 27 using content::NavigationEntry;
27 28
28 namespace { 29 namespace {
29 30
31 // TODO(hajimehoshi): Remove this after crbug/283720 is solved.
30 const char kDeclineTranslate[] = "Translate.DeclineTranslate"; 32 const char kDeclineTranslate[] = "Translate.DeclineTranslate";
33
31 const char kCloseInfobar[] = "Translate.DeclineTranslateCloseInfobar"; 34 const char kCloseInfobar[] = "Translate.DeclineTranslateCloseInfobar";
32 const char kRevertTranslation[] = "Translate.RevertTranslation";
33 const char kShowErrorInfobar[] = "Translate.ShowErrorInfobar"; 35 const char kShowErrorInfobar[] = "Translate.ShowErrorInfobar";
34 const char kPerformTranslate[] = "Translate.Translate";
35 const char kNeverTranslateLang[] = "Translate.NeverTranslateLang";
36 const char kNeverTranslateSite[] = "Translate.NeverTranslateSite";
37 const char kAlwaysTranslateLang[] = "Translate.AlwaysTranslateLang";
38 36
39 } // namespace 37 } // namespace
40 38
41 // static 39 const size_t TranslateInfoBarDelegate::kNoIndex = TranslateUIDelegate::NO_INDEX;
42 const size_t TranslateInfoBarDelegate::kNoIndex = static_cast<size_t>(-1);
43 40
44 TranslateInfoBarDelegate::~TranslateInfoBarDelegate() { 41 TranslateInfoBarDelegate::~TranslateInfoBarDelegate() {
45 } 42 }
46 43
47 // static 44 // static
48 void TranslateInfoBarDelegate::Create( 45 void TranslateInfoBarDelegate::Create(
49 bool replace_existing_infobar, 46 bool replace_existing_infobar,
50 InfoBarService* infobar_service, 47 InfoBarService* infobar_service,
51 Type infobar_type, 48 Type infobar_type,
52 const std::string& original_language, 49 const std::string& original_language,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 if (!old_delegate) { 94 if (!old_delegate) {
98 infobar_service->AddInfoBar(infobar.PassAs<InfoBarDelegate>()); 95 infobar_service->AddInfoBar(infobar.PassAs<InfoBarDelegate>());
99 } else { 96 } else {
100 DCHECK(replace_existing_infobar); 97 DCHECK(replace_existing_infobar);
101 infobar_service->ReplaceInfoBar(old_delegate, 98 infobar_service->ReplaceInfoBar(old_delegate,
102 infobar.PassAs<InfoBarDelegate>()); 99 infobar.PassAs<InfoBarDelegate>());
103 } 100 }
104 } 101 }
105 102
106 void TranslateInfoBarDelegate::Translate() { 103 void TranslateInfoBarDelegate::Translate() {
107 if (!web_contents()->GetBrowserContext()->IsOffTheRecord()) { 104 ui_delegate_.Translate();
108 prefs_.ResetTranslationDeniedCount(original_language_code());
109 prefs_.IncrementTranslationAcceptedCount(original_language_code());
110 }
111
112 TranslateManager::GetInstance()->TranslatePage(web_contents(),
113 original_language_code(),
114 target_language_code());
115
116 UMA_HISTOGRAM_BOOLEAN(kPerformTranslate, true);
117 } 105 }
118 106
119 void TranslateInfoBarDelegate::RevertTranslation() { 107 void TranslateInfoBarDelegate::RevertTranslation() {
120 TranslateManager::GetInstance()->RevertTranslation(web_contents()); 108 ui_delegate_.RevertTranslation();
121 RemoveSelf(); 109 RemoveSelf();
122
123 UMA_HISTOGRAM_BOOLEAN(kRevertTranslation, true);
124 } 110 }
125 111
126 void TranslateInfoBarDelegate::ReportLanguageDetectionError() { 112 void TranslateInfoBarDelegate::ReportLanguageDetectionError() {
127 TranslateManager::GetInstance()->ReportLanguageDetectionError( 113 TranslateManager::GetInstance()->ReportLanguageDetectionError(
128 web_contents()); 114 web_contents());
129 } 115 }
130 116
131 void TranslateInfoBarDelegate::TranslationDeclined() { 117 void TranslateInfoBarDelegate::TranslationDeclined() {
132 // TODO(miguelg) switch this back to just calling web_contents() 118 // TODO(miguelg) switch this back to just calling web_contents()
133 // once we've diagnosed crbug/283720 119 // once we've diagnosed crbug/283720
120 // TODO(hajimehoshi): Replace this implementstion with calling ui_delegate_.
121 // TranslationDeclined() after miguelg's investigating.
134 content::WebContents* contents = owner()->web_contents(); 122 content::WebContents* contents = owner()->web_contents();
135 content::BrowserContext* context = contents->GetBrowserContext(); 123 content::BrowserContext* context = contents->GetBrowserContext();
136 if (!context->IsOffTheRecord()) { 124 if (!context->IsOffTheRecord()) {
137 prefs_.ResetTranslationAcceptedCount(original_language_code()); 125 prefs_.ResetTranslationAcceptedCount(original_language_code());
138 prefs_.IncrementTranslationDeniedCount(original_language_code()); 126 prefs_.IncrementTranslationDeniedCount(original_language_code());
139 } 127 }
140 128
141 // Remember that the user declined the translation so as to prevent showing a 129 // Remember that the user declined the translation so as to prevent showing a
142 // translate infobar for that page again. (TranslateManager initiates 130 // translate infobar for that page again. (TranslateManager initiates
143 // translations when getting a LANGUAGE_DETERMINED from the page, which 131 // translations when getting a LANGUAGE_DETERMINED from the page, which
144 // happens when a load stops. That could happen multiple times, including 132 // happens when a load stops. That could happen multiple times, including
145 // after the user already declined the translation.) 133 // after the user already declined the translation.)
146 TranslateTabHelper::FromWebContents(web_contents())-> 134 TranslateTabHelper::FromWebContents(web_contents())->
147 language_state().set_translation_declined(true); 135 language_state().set_translation_declined(true);
148 136
149 UMA_HISTOGRAM_BOOLEAN(kDeclineTranslate, true); 137 UMA_HISTOGRAM_BOOLEAN(kDeclineTranslate, true);
150 } 138 }
151 139
152 bool TranslateInfoBarDelegate::IsTranslatableLanguageByPrefs() { 140 bool TranslateInfoBarDelegate::IsTranslatableLanguageByPrefs() {
153 Profile* profile = 141 Profile* profile =
154 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 142 Profile::FromBrowserContext(web_contents()->GetBrowserContext());
155 Profile* original_profile = profile->GetOriginalProfile(); 143 Profile* original_profile = profile->GetOriginalProfile();
156 return TranslatePrefs::CanTranslateLanguage(original_profile, 144 return TranslatePrefs::CanTranslateLanguage(original_profile,
157 original_language_code()); 145 original_language_code());
158 } 146 }
159 147
160 void TranslateInfoBarDelegate::ToggleTranslatableLanguageByPrefs() { 148 void TranslateInfoBarDelegate::ToggleTranslatableLanguageByPrefs() {
161 const std::string& original_lang = original_language_code(); 149 if (ui_delegate_.IsLanguageBlocked()) {
162 if (prefs_.IsBlockedLanguage(original_lang)) { 150 ui_delegate_.SetLanguageBlocked(false);
163 prefs_.UnblockLanguage(original_lang);
164 } else { 151 } else {
165 prefs_.BlockLanguage(original_lang); 152 ui_delegate_.SetLanguageBlocked(true);
166 RemoveSelf(); 153 RemoveSelf();
167 } 154 }
168
169 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateLang, true);
170 } 155 }
171 156
172 bool TranslateInfoBarDelegate::IsSiteBlacklisted() { 157 bool TranslateInfoBarDelegate::IsSiteBlacklisted() {
173 std::string host = GetPageHost(); 158 return ui_delegate_.IsSiteBlacklisted();
174 return !host.empty() && prefs_.IsSiteBlacklisted(host);
175 } 159 }
176 160
177 void TranslateInfoBarDelegate::ToggleSiteBlacklist() { 161 void TranslateInfoBarDelegate::ToggleSiteBlacklist() {
178 std::string host = GetPageHost(); 162 if (ui_delegate_.IsSiteBlacklisted()) {
179 if (host.empty()) 163 ui_delegate_.SetSiteBlacklist(false);
180 return;
181
182 if (prefs_.IsSiteBlacklisted(host)) {
183 prefs_.RemoveSiteFromBlacklist(host);
184 } else { 164 } else {
185 prefs_.BlacklistSite(host); 165 ui_delegate_.SetSiteBlacklist(true);
186 RemoveSelf(); 166 RemoveSelf();
187 } 167 }
188
189 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateSite, true);
190 } 168 }
191 169
192 bool TranslateInfoBarDelegate::ShouldAlwaysTranslate() { 170 bool TranslateInfoBarDelegate::ShouldAlwaysTranslate() {
193 return prefs_.IsLanguagePairWhitelisted(original_language_code(), 171 return ui_delegate_.ShouldAlwaysTranslate();
194 target_language_code());
195 } 172 }
196 173
197 void TranslateInfoBarDelegate::ToggleAlwaysTranslate() { 174 void TranslateInfoBarDelegate::ToggleAlwaysTranslate() {
198 const std::string& original_lang = original_language_code(); 175 ui_delegate_.SetAlwaysTranslate(!ui_delegate_.ShouldAlwaysTranslate());
199 const std::string& target_lang = target_language_code();
200 if (prefs_.IsLanguagePairWhitelisted(original_lang, target_lang))
201 prefs_.RemoveLanguagePairFromWhitelist(original_lang, target_lang);
202 else
203 prefs_.WhitelistLanguagePair(original_lang, target_lang);
204
205 UMA_HISTOGRAM_BOOLEAN(kAlwaysTranslateLang, true);
206 } 176 }
207 177
208 void TranslateInfoBarDelegate::AlwaysTranslatePageLanguage() { 178 void TranslateInfoBarDelegate::AlwaysTranslatePageLanguage() {
209 const std::string& original_lang = original_language_code(); 179 DCHECK(!ui_delegate_.ShouldAlwaysTranslate());
210 const std::string& target_lang = target_language_code(); 180 ui_delegate_.SetAlwaysTranslate(true);
211 DCHECK(!prefs_.IsLanguagePairWhitelisted(original_lang, target_lang));
212 prefs_.WhitelistLanguagePair(original_lang, target_lang);
213 Translate(); 181 Translate();
214 } 182 }
215 183
216 void TranslateInfoBarDelegate::NeverTranslatePageLanguage() { 184 void TranslateInfoBarDelegate::NeverTranslatePageLanguage() {
217 std::string original_lang = original_language_code(); 185 DCHECK(!ui_delegate_.IsLanguageBlocked());
218 prefs_.BlockLanguage(original_lang); 186 ui_delegate_.SetLanguageBlocked(true);
219 RemoveSelf(); 187 RemoveSelf();
220 } 188 }
221 189
222 string16 TranslateInfoBarDelegate::GetMessageInfoBarText() { 190 string16 TranslateInfoBarDelegate::GetMessageInfoBarText() {
223 if (infobar_type_ == TRANSLATING) { 191 if (infobar_type_ == TRANSLATING) {
192 string16 target_language_name = language_name_at(target_language_index());
224 return l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_TRANSLATING_TO, 193 return l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_TRANSLATING_TO,
225 language_name_at(target_language_index_)); 194 target_language_name);
226 } 195 }
227 196
228 DCHECK_EQ(TRANSLATION_ERROR, infobar_type_); 197 DCHECK_EQ(TRANSLATION_ERROR, infobar_type_);
229 UMA_HISTOGRAM_ENUMERATION(kShowErrorInfobar, 198 UMA_HISTOGRAM_ENUMERATION(kShowErrorInfobar,
230 error_type_, 199 error_type_,
231 TranslateErrors::TRANSLATE_ERROR_MAX); 200 TranslateErrors::TRANSLATE_ERROR_MAX);
232 switch (error_type_) { 201 switch (error_type_) {
233 case TranslateErrors::NETWORK: 202 case TranslateErrors::NETWORK:
234 return l10n_util::GetStringUTF16( 203 return l10n_util::GetStringUTF16(
235 IDS_TRANSLATE_INFOBAR_ERROR_CANT_CONNECT); 204 IDS_TRANSLATE_INFOBAR_ERROR_CANT_CONNECT);
236 case TranslateErrors::INITIALIZATION_ERROR: 205 case TranslateErrors::INITIALIZATION_ERROR:
237 case TranslateErrors::TRANSLATION_ERROR: 206 case TranslateErrors::TRANSLATION_ERROR:
238 return l10n_util::GetStringUTF16( 207 return l10n_util::GetStringUTF16(
239 IDS_TRANSLATE_INFOBAR_ERROR_CANT_TRANSLATE); 208 IDS_TRANSLATE_INFOBAR_ERROR_CANT_TRANSLATE);
240 case TranslateErrors::UNKNOWN_LANGUAGE: 209 case TranslateErrors::UNKNOWN_LANGUAGE:
241 return l10n_util::GetStringUTF16( 210 return l10n_util::GetStringUTF16(
242 IDS_TRANSLATE_INFOBAR_UNKNOWN_PAGE_LANGUAGE); 211 IDS_TRANSLATE_INFOBAR_UNKNOWN_PAGE_LANGUAGE);
243 case TranslateErrors::UNSUPPORTED_LANGUAGE: 212 case TranslateErrors::UNSUPPORTED_LANGUAGE:
244 return l10n_util::GetStringFUTF16( 213 return l10n_util::GetStringFUTF16(
245 IDS_TRANSLATE_INFOBAR_UNSUPPORTED_PAGE_LANGUAGE, 214 IDS_TRANSLATE_INFOBAR_UNSUPPORTED_PAGE_LANGUAGE,
246 language_name_at(target_language_index_)); 215 language_name_at(target_language_index()));
247 case TranslateErrors::IDENTICAL_LANGUAGES: 216 case TranslateErrors::IDENTICAL_LANGUAGES:
248 return l10n_util::GetStringFUTF16( 217 return l10n_util::GetStringFUTF16(
249 IDS_TRANSLATE_INFOBAR_ERROR_SAME_LANGUAGE, 218 IDS_TRANSLATE_INFOBAR_ERROR_SAME_LANGUAGE,
250 language_name_at(target_language_index_)); 219 language_name_at(target_language_index()));
251 default: 220 default:
252 NOTREACHED(); 221 NOTREACHED();
253 return string16(); 222 return string16();
254 } 223 }
255 } 224 }
256 225
257 string16 TranslateInfoBarDelegate::GetMessageInfoBarButtonText() { 226 string16 TranslateInfoBarDelegate::GetMessageInfoBarButtonText() {
258 if (infobar_type_ != TRANSLATION_ERROR) { 227 if (infobar_type_ != TRANSLATION_ERROR) {
259 DCHECK_EQ(TRANSLATING, infobar_type_); 228 DCHECK_EQ(TRANSLATING, infobar_type_);
260 } else if ((error_type_ != TranslateErrors::IDENTICAL_LANGUAGES) && 229 } else if ((error_type_ != TranslateErrors::IDENTICAL_LANGUAGES) &&
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 Type infobar_type, 310 Type infobar_type,
342 TranslateInfoBarDelegate* old_delegate, 311 TranslateInfoBarDelegate* old_delegate,
343 const std::string& original_language, 312 const std::string& original_language,
344 const std::string& target_language, 313 const std::string& target_language,
345 TranslateErrors::Type error_type, 314 TranslateErrors::Type error_type,
346 PrefService* prefs, 315 PrefService* prefs,
347 ShortcutConfiguration shortcut_config) 316 ShortcutConfiguration shortcut_config)
348 : InfoBarDelegate(infobar_service), 317 : InfoBarDelegate(infobar_service),
349 infobar_type_(infobar_type), 318 infobar_type_(infobar_type),
350 background_animation_(NONE), 319 background_animation_(NONE),
351 original_language_index_(kNoIndex), 320 ui_delegate_(web_contents(), original_language, target_language),
352 initial_original_language_index_(kNoIndex),
353 target_language_index_(kNoIndex),
354 error_type_(error_type), 321 error_type_(error_type),
355 prefs_(prefs), 322 prefs_(prefs),
356 shortcut_config_(shortcut_config) { 323 shortcut_config_(shortcut_config) {
357 DCHECK_NE((infobar_type_ == TRANSLATION_ERROR), 324 DCHECK_NE((infobar_type_ == TRANSLATION_ERROR),
358 (error_type_ == TranslateErrors::NONE)); 325 (error_type_ == TranslateErrors::NONE));
359 326
360 if (old_delegate && (old_delegate->is_error() != is_error())) 327 if (old_delegate && (old_delegate->is_error() != is_error()))
361 background_animation_ = is_error() ? NORMAL_TO_ERROR : ERROR_TO_NORMAL; 328 background_animation_ = is_error() ? NORMAL_TO_ERROR : ERROR_TO_NORMAL;
362
363 std::vector<std::string> language_codes;
364 TranslateManager::GetSupportedLanguages(&language_codes);
365
366 // Preparing for the alphabetical order in the locale.
367 UErrorCode error = U_ZERO_ERROR;
368 std::string locale = g_browser_process->GetApplicationLocale();
369 icu::Locale loc(locale.c_str());
370 scoped_ptr<icu::Collator> collator(icu::Collator::createInstance(loc, error));
371 collator->setStrength(icu::Collator::PRIMARY);
372
373 languages_.reserve(language_codes.size());
374 for (std::vector<std::string>::const_iterator iter = language_codes.begin();
375 iter != language_codes.end(); ++iter) {
376 std::string language_code = *iter;
377
378 string16 language_name = GetLanguageDisplayableName(language_code);
379 // Insert the language in languages_ in alphabetical order.
380 std::vector<LanguageNamePair>::iterator iter2;
381 for (iter2 = languages_.begin(); iter2 != languages_.end(); ++iter2) {
382 if (base::i18n::CompareString16WithCollator(collator.get(),
383 language_name, iter2->second) == UCOL_LESS) {
384 break;
385 }
386 }
387 languages_.insert(iter2, LanguageNamePair(language_code, language_name));
388 }
389 for (std::vector<LanguageNamePair>::const_iterator iter = languages_.begin();
390 iter != languages_.end(); ++iter) {
391 std::string language_code = iter->first;
392 if (language_code == original_language) {
393 original_language_index_ = iter - languages_.begin();
394 initial_original_language_index_ = original_language_index_;
395 }
396 if (language_code == target_language)
397 target_language_index_ = iter - languages_.begin();
398 }
399 DCHECK_NE(kNoIndex, target_language_index_);
400 } 329 }
401 330
402 void TranslateInfoBarDelegate::InfoBarDismissed() { 331 void TranslateInfoBarDelegate::InfoBarDismissed() {
403 if (infobar_type_ != BEFORE_TRANSLATE) 332 if (infobar_type_ != BEFORE_TRANSLATE)
404 return; 333 return;
405 334
406 // The user closed the infobar without clicking the translate button. 335 // The user closed the infobar without clicking the translate button.
407 TranslationDeclined(); 336 TranslationDeclined();
408 UMA_HISTOGRAM_BOOLEAN(kCloseInfobar, true); 337 UMA_HISTOGRAM_BOOLEAN(kCloseInfobar, true);
409 } 338 }
(...skipping 13 matching lines...) Expand all
423 if (!details.is_navigation_to_different_page() && !details.is_main_frame) 352 if (!details.is_navigation_to_different_page() && !details.is_main_frame)
424 return false; 353 return false;
425 354
426 return InfoBarDelegate::ShouldExpireInternal(details); 355 return InfoBarDelegate::ShouldExpireInternal(details);
427 } 356 }
428 357
429 TranslateInfoBarDelegate* 358 TranslateInfoBarDelegate*
430 TranslateInfoBarDelegate::AsTranslateInfoBarDelegate() { 359 TranslateInfoBarDelegate::AsTranslateInfoBarDelegate() {
431 return this; 360 return this;
432 } 361 }
433
434 std::string TranslateInfoBarDelegate::GetPageHost() {
435 NavigationEntry* entry = web_contents()->GetController().GetActiveEntry();
436 return entry ? entry->GetURL().HostNoBrackets() : std::string();
437 }
OLDNEW
« no previous file with comments | « chrome/browser/translate/translate_infobar_delegate.h ('k') | chrome/browser/translate/translate_prefs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698