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

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

Issue 22694006: Infobar system refactor. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: 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 | Annotate | Revision Log
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.h"
13 #include "chrome/browser/infobars/infobar_service.h" 14 #include "chrome/browser/infobars/infobar_service.h"
14 #include "chrome/browser/profiles/profile.h" 15 #include "chrome/browser/profiles/profile.h"
15 #include "chrome/browser/translate/translate_accept_languages.h" 16 #include "chrome/browser/translate/translate_accept_languages.h"
16 #include "chrome/browser/translate/translate_manager.h" 17 #include "chrome/browser/translate/translate_manager.h"
17 #include "chrome/browser/translate/translate_tab_helper.h" 18 #include "chrome/browser/translate/translate_tab_helper.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"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 DCHECK(TranslateManager::IsSupportedLanguage(target_language)); 60 DCHECK(TranslateManager::IsSupportedLanguage(target_language));
60 if (!TranslateManager::IsSupportedLanguage(original_language)) { 61 if (!TranslateManager::IsSupportedLanguage(original_language)) {
61 // The original language can only be "unknown" for the "translating" 62 // The original language can only be "unknown" for the "translating"
62 // infobar, which is the case when the user started a translation from the 63 // infobar, which is the case when the user started a translation from the
63 // context menu. 64 // context menu.
64 DCHECK(infobar_type == TRANSLATING || infobar_type == AFTER_TRANSLATE); 65 DCHECK(infobar_type == TRANSLATING || infobar_type == AFTER_TRANSLATE);
65 DCHECK_EQ(chrome::kUnknownLanguageCode, original_language); 66 DCHECK_EQ(chrome::kUnknownLanguageCode, original_language);
66 } 67 }
67 } 68 }
68 69
70 // Do not create the after translate infobar if we are auto translating.
71 if ((infobar_type == TranslateInfoBarDelegate::AFTER_TRANSLATE) ||
72 (infobar_type == TranslateInfoBarDelegate::TRANSLATING)) {
73 TranslateTabHelper* translate_tab_helper =
74 TranslateTabHelper::FromWebContents(infobar_service->web_contents());
75 if (!translate_tab_helper ||
76 translate_tab_helper->language_state().InTranslateNavigation())
77 return;
78 }
79
69 // Find any existing translate infobar delegate. 80 // Find any existing translate infobar delegate.
81 InfoBar* old_infobar = NULL;
70 TranslateInfoBarDelegate* old_delegate = NULL; 82 TranslateInfoBarDelegate* old_delegate = NULL;
71 for (size_t i = 0; i < infobar_service->infobar_count(); ++i) { 83 for (size_t i = 0; i < infobar_service->infobar_count(); ++i) {
72 old_delegate = infobar_service->infobar_at(i)->AsTranslateInfoBarDelegate(); 84 old_infobar = infobar_service->infobar_at(i);
85 old_delegate = old_infobar->delegate()->AsTranslateInfoBarDelegate();
73 if (old_delegate) { 86 if (old_delegate) {
74 if (!replace_existing_infobar) 87 if (!replace_existing_infobar)
75 return; 88 return;
76 break; 89 break;
77 } 90 }
78 } 91 }
79 92
80 // Create the new delegate. 93 // Add the new delegate.
81 scoped_ptr<TranslateInfoBarDelegate> infobar( 94 scoped_ptr<InfoBar> infobar(CreateInfoBar(
82 new TranslateInfoBarDelegate(infobar_service, infobar_type, old_delegate, 95 scoped_ptr<TranslateInfoBarDelegate>(new TranslateInfoBarDelegate(
83 original_language, target_language, 96 infobar_type, old_delegate, original_language, target_language,
84 error_type, prefs, shortcut_config)); 97 error_type, prefs, shortcut_config))));
85 98 if (old_delegate)
86 // Do not create the after translate infobar if we are auto translating. 99 infobar_service->ReplaceInfoBar(old_infobar, infobar.Pass());
87 if ((infobar_type == TranslateInfoBarDelegate::AFTER_TRANSLATE) || 100 else
88 (infobar_type == TranslateInfoBarDelegate::TRANSLATING)) { 101 infobar_service->AddInfoBar(infobar.Pass());
89 TranslateTabHelper* translate_tab_helper =
90 TranslateTabHelper::FromWebContents(infobar_service->web_contents());
91 if (!translate_tab_helper ||
92 translate_tab_helper->language_state().InTranslateNavigation())
93 return;
94 }
95
96 // Add the new delegate if necessary.
97 if (!old_delegate) {
98 infobar_service->AddInfoBar(infobar.PassAs<InfoBarDelegate>());
99 } else {
100 DCHECK(replace_existing_infobar);
101 infobar_service->ReplaceInfoBar(old_delegate,
102 infobar.PassAs<InfoBarDelegate>());
103 }
104 } 102 }
105 103
106 void TranslateInfoBarDelegate::Translate() { 104 void TranslateInfoBarDelegate::Translate() {
107 if (!web_contents()->GetBrowserContext()->IsOffTheRecord()) { 105 if (!web_contents()->GetBrowserContext()->IsOffTheRecord()) {
108 prefs_.ResetTranslationDeniedCount(original_language_code()); 106 prefs_.ResetTranslationDeniedCount(original_language_code());
109 prefs_.IncrementTranslationAcceptedCount(original_language_code()); 107 prefs_.IncrementTranslationAcceptedCount(original_language_code());
110 } 108 }
111 109
112 TranslateManager::GetInstance()->TranslatePage(web_contents(), 110 TranslateManager::GetInstance()->TranslatePage(web_contents(),
113 original_language_code(), 111 original_language_code(),
114 target_language_code()); 112 target_language_code());
115 113
116 UMA_HISTOGRAM_BOOLEAN(kPerformTranslate, true); 114 UMA_HISTOGRAM_BOOLEAN(kPerformTranslate, true);
117 } 115 }
118 116
119 void TranslateInfoBarDelegate::RevertTranslation() { 117 void TranslateInfoBarDelegate::RevertTranslation() {
120 TranslateManager::GetInstance()->RevertTranslation(web_contents()); 118 TranslateManager::GetInstance()->RevertTranslation(web_contents());
121 RemoveSelf(); 119 infobar()->RemoveSelf();
122 120
123 UMA_HISTOGRAM_BOOLEAN(kRevertTranslation, true); 121 UMA_HISTOGRAM_BOOLEAN(kRevertTranslation, true);
124 } 122 }
125 123
126 void TranslateInfoBarDelegate::ReportLanguageDetectionError() { 124 void TranslateInfoBarDelegate::ReportLanguageDetectionError() {
127 TranslateManager::GetInstance()->ReportLanguageDetectionError( 125 TranslateManager::GetInstance()->ReportLanguageDetectionError(
128 web_contents()); 126 web_contents());
129 } 127 }
130 128
131 void TranslateInfoBarDelegate::TranslationDeclined() { 129 void TranslateInfoBarDelegate::TranslationDeclined() {
(...skipping 20 matching lines...) Expand all
152 return TranslatePrefs::CanTranslateLanguage(original_profile, 150 return TranslatePrefs::CanTranslateLanguage(original_profile,
153 original_language_code()); 151 original_language_code());
154 } 152 }
155 153
156 void TranslateInfoBarDelegate::ToggleTranslatableLanguageByPrefs() { 154 void TranslateInfoBarDelegate::ToggleTranslatableLanguageByPrefs() {
157 const std::string& original_lang = original_language_code(); 155 const std::string& original_lang = original_language_code();
158 if (prefs_.IsBlockedLanguage(original_lang)) { 156 if (prefs_.IsBlockedLanguage(original_lang)) {
159 prefs_.UnblockLanguage(original_lang); 157 prefs_.UnblockLanguage(original_lang);
160 } else { 158 } else {
161 prefs_.BlockLanguage(original_lang); 159 prefs_.BlockLanguage(original_lang);
162 RemoveSelf(); 160 infobar()->RemoveSelf();
163 } 161 }
164 162
165 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateLang, true); 163 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateLang, true);
166 } 164 }
167 165
168 bool TranslateInfoBarDelegate::IsSiteBlacklisted() { 166 bool TranslateInfoBarDelegate::IsSiteBlacklisted() {
169 std::string host = GetPageHost(); 167 std::string host = GetPageHost();
170 return !host.empty() && prefs_.IsSiteBlacklisted(host); 168 return !host.empty() && prefs_.IsSiteBlacklisted(host);
171 } 169 }
172 170
173 void TranslateInfoBarDelegate::ToggleSiteBlacklist() { 171 void TranslateInfoBarDelegate::ToggleSiteBlacklist() {
174 std::string host = GetPageHost(); 172 std::string host = GetPageHost();
175 if (host.empty()) 173 if (host.empty())
176 return; 174 return;
177 175
178 if (prefs_.IsSiteBlacklisted(host)) { 176 if (prefs_.IsSiteBlacklisted(host)) {
179 prefs_.RemoveSiteFromBlacklist(host); 177 prefs_.RemoveSiteFromBlacklist(host);
180 } else { 178 } else {
181 prefs_.BlacklistSite(host); 179 prefs_.BlacklistSite(host);
182 RemoveSelf(); 180 infobar()->RemoveSelf();
183 } 181 }
184 182
185 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateSite, true); 183 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateSite, true);
186 } 184 }
187 185
188 bool TranslateInfoBarDelegate::ShouldAlwaysTranslate() { 186 bool TranslateInfoBarDelegate::ShouldAlwaysTranslate() {
189 return prefs_.IsLanguagePairWhitelisted(original_language_code(), 187 return prefs_.IsLanguagePairWhitelisted(original_language_code(),
190 target_language_code()); 188 target_language_code());
191 } 189 }
192 190
(...skipping 12 matching lines...) Expand all
205 const std::string& original_lang = original_language_code(); 203 const std::string& original_lang = original_language_code();
206 const std::string& target_lang = target_language_code(); 204 const std::string& target_lang = target_language_code();
207 DCHECK(!prefs_.IsLanguagePairWhitelisted(original_lang, target_lang)); 205 DCHECK(!prefs_.IsLanguagePairWhitelisted(original_lang, target_lang));
208 prefs_.WhitelistLanguagePair(original_lang, target_lang); 206 prefs_.WhitelistLanguagePair(original_lang, target_lang);
209 Translate(); 207 Translate();
210 } 208 }
211 209
212 void TranslateInfoBarDelegate::NeverTranslatePageLanguage() { 210 void TranslateInfoBarDelegate::NeverTranslatePageLanguage() {
213 std::string original_lang = original_language_code(); 211 std::string original_lang = original_language_code();
214 prefs_.BlockLanguage(original_lang); 212 prefs_.BlockLanguage(original_lang);
215 RemoveSelf(); 213 infobar()->RemoveSelf();
216 } 214 }
217 215
218 string16 TranslateInfoBarDelegate::GetMessageInfoBarText() { 216 string16 TranslateInfoBarDelegate::GetMessageInfoBarText() {
219 if (infobar_type_ == TRANSLATING) { 217 if (infobar_type_ == TRANSLATING) {
220 return l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_TRANSLATING_TO, 218 return l10n_util::GetStringFUTF16(IDS_TRANSLATE_INFOBAR_TRANSLATING_TO,
221 language_name_at(target_language_index_)); 219 language_name_at(target_language_index_));
222 } 220 }
223 221
224 DCHECK_EQ(TRANSLATION_ERROR, infobar_type_); 222 DCHECK_EQ(TRANSLATION_ERROR, infobar_type_);
225 UMA_HISTOGRAM_ENUMERATION(kShowErrorInfobar, 223 UMA_HISTOGRAM_ENUMERATION(kShowErrorInfobar,
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 *swap_languages = (offsets[0] > offsets[1]); 324 *swap_languages = (offsets[0] > offsets[1]);
327 if (*swap_languages) 325 if (*swap_languages)
328 std::swap(offsets[0], offsets[1]); 326 std::swap(offsets[0], offsets[1]);
329 327
330 strings->push_back(text.substr(0, offsets[0])); 328 strings->push_back(text.substr(0, offsets[0]));
331 strings->push_back(text.substr(offsets[0], offsets[1] - offsets[0])); 329 strings->push_back(text.substr(offsets[0], offsets[1] - offsets[0]));
332 strings->push_back(text.substr(offsets[1])); 330 strings->push_back(text.substr(offsets[1]));
333 } 331 }
334 332
335 TranslateInfoBarDelegate::TranslateInfoBarDelegate( 333 TranslateInfoBarDelegate::TranslateInfoBarDelegate(
336 InfoBarService* infobar_service,
337 Type infobar_type, 334 Type infobar_type,
338 TranslateInfoBarDelegate* old_delegate, 335 TranslateInfoBarDelegate* old_delegate,
339 const std::string& original_language, 336 const std::string& original_language,
340 const std::string& target_language, 337 const std::string& target_language,
341 TranslateErrors::Type error_type, 338 TranslateErrors::Type error_type,
342 PrefService* prefs, 339 PrefService* prefs,
343 ShortcutConfiguration shortcut_config) 340 ShortcutConfiguration shortcut_config)
344 : InfoBarDelegate(infobar_service), 341 : InfoBarDelegate(),
345 infobar_type_(infobar_type), 342 infobar_type_(infobar_type),
346 background_animation_(NONE), 343 background_animation_(NONE),
347 original_language_index_(kNoIndex), 344 original_language_index_(kNoIndex),
348 initial_original_language_index_(kNoIndex), 345 initial_original_language_index_(kNoIndex),
349 target_language_index_(kNoIndex), 346 target_language_index_(kNoIndex),
350 error_type_(error_type), 347 error_type_(error_type),
351 prefs_(prefs), 348 prefs_(prefs),
352 shortcut_config_(shortcut_config) { 349 shortcut_config_(shortcut_config) {
353 DCHECK_NE((infobar_type_ == TRANSLATION_ERROR), 350 DCHECK_NE((infobar_type_ == TRANSLATION_ERROR),
354 (error_type_ == TranslateErrors::NONE)); 351 (error_type_ == TranslateErrors::NONE));
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 if (language_code == original_language) { 385 if (language_code == original_language) {
389 original_language_index_ = iter - languages_.begin(); 386 original_language_index_ = iter - languages_.begin();
390 initial_original_language_index_ = original_language_index_; 387 initial_original_language_index_ = original_language_index_;
391 } 388 }
392 if (language_code == target_language) 389 if (language_code == target_language)
393 target_language_index_ = iter - languages_.begin(); 390 target_language_index_ = iter - languages_.begin();
394 } 391 }
395 DCHECK_NE(kNoIndex, target_language_index_); 392 DCHECK_NE(kNoIndex, target_language_index_);
396 } 393 }
397 394
395 // TranslateInfoBarDelegate::CreateInfoBar() is implemented in platform-specific
396 // files.
397
398 void TranslateInfoBarDelegate::InfoBarDismissed() { 398 void TranslateInfoBarDelegate::InfoBarDismissed() {
399 if (infobar_type_ != BEFORE_TRANSLATE) 399 if (infobar_type_ != BEFORE_TRANSLATE)
400 return; 400 return;
401 401
402 // The user closed the infobar without clicking the translate button. 402 // The user closed the infobar without clicking the translate button.
403 TranslationDeclined(); 403 TranslationDeclined();
404 UMA_HISTOGRAM_BOOLEAN(kCloseInfobar, true); 404 UMA_HISTOGRAM_BOOLEAN(kCloseInfobar, true);
405 } 405 }
406 406
407 int TranslateInfoBarDelegate::GetIconID() const { 407 int TranslateInfoBarDelegate::GetIconID() const {
(...skipping 16 matching lines...) Expand all
424 424
425 TranslateInfoBarDelegate* 425 TranslateInfoBarDelegate*
426 TranslateInfoBarDelegate::AsTranslateInfoBarDelegate() { 426 TranslateInfoBarDelegate::AsTranslateInfoBarDelegate() {
427 return this; 427 return this;
428 } 428 }
429 429
430 std::string TranslateInfoBarDelegate::GetPageHost() { 430 std::string TranslateInfoBarDelegate::GetPageHost() {
431 NavigationEntry* entry = web_contents()->GetController().GetActiveEntry(); 431 NavigationEntry* entry = web_contents()->GetController().GetActiveEntry();
432 return entry ? entry->GetURL().HostNoBrackets() : std::string(); 432 return entry ? entry->GetURL().HostNoBrackets() : std::string();
433 } 433 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698