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_manager.h" | 5 #include "chrome/browser/translate/translate_manager.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/metrics/field_trial.h" | 9 #include "base/metrics/field_trial.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 // be done after that. | 158 // be done after that. |
159 base::MessageLoop::current()->PostTask( | 159 base::MessageLoop::current()->PostTask( |
160 FROM_HERE, | 160 FROM_HERE, |
161 base::Bind( | 161 base::Bind( |
162 &TranslateManager::InitiateTranslationPosted, | 162 &TranslateManager::InitiateTranslationPosted, |
163 weak_method_factory_.GetWeakPtr(), | 163 weak_method_factory_.GetWeakPtr(), |
164 translate_driver_->GetLanguageState().original_language(), | 164 translate_driver_->GetLanguageState().original_language(), |
165 0)); | 165 0)); |
166 break; | 166 break; |
167 } | 167 } |
168 case chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED: { | |
169 const LanguageDetectionDetails* lang_det_details = | |
170 content::Details<const LanguageDetectionDetails>(details).ptr(); | |
171 | |
172 WebContents* tab = content::Source<WebContents>(source).ptr(); | |
173 DCHECK_EQ(translate_tab_helper_->GetWebContents(), tab); | |
174 | |
175 if (!translate_tab_helper_->GetWebContents()) | |
176 return; | |
177 | |
178 // We may get this notifications multiple times. Make sure to translate | |
179 // only once. | |
180 LanguageState& language_state = translate_driver_->GetLanguageState(); | |
181 if (language_state.page_needs_translation() && | |
182 !language_state.translation_pending() && | |
183 !language_state.translation_declined() && | |
184 !language_state.IsPageTranslated()) { | |
185 std::string language = lang_det_details->adopted_language; | |
186 InitiateTranslation(language); | |
187 } | |
188 break; | |
189 } | |
190 case chrome::NOTIFICATION_PAGE_TRANSLATED: { | |
191 // Only add translate infobar if it doesn't exist; if it already exists, | |
192 // just update the state, the actual infobar would have received the same | |
193 // notification and update the visual display accordingly. | |
194 PageTranslatedDetails* page_translated_details = | |
195 content::Details<PageTranslatedDetails>(details).ptr(); | |
196 PageTranslated(page_translated_details); | |
197 break; | |
198 } | |
199 default: | 168 default: |
200 NOTREACHED(); | 169 NOTREACHED(); |
201 } | 170 } |
202 } | 171 } |
203 | 172 |
204 // static | 173 // static |
205 scoped_ptr<TranslateManager::TranslateErrorCallbackList::Subscription> | 174 scoped_ptr<TranslateManager::TranslateErrorCallbackList::Subscription> |
206 TranslateManager::RegisterTranslateErrorCallback( | 175 TranslateManager::RegisterTranslateErrorCallback( |
207 const TranslateManager::TranslateErrorCallback& callback) { | 176 const TranslateManager::TranslateErrorCallback& callback) { |
208 if (!g_callback_list_) | 177 if (!g_callback_list_) |
209 g_callback_list_ = new TranslateErrorCallbackList; | 178 g_callback_list_ = new TranslateErrorCallbackList; |
210 return g_callback_list_->Add(callback); | 179 return g_callback_list_->Add(callback); |
211 } | 180 } |
212 | 181 |
213 TranslateManager::TranslateManager( | 182 TranslateManager::TranslateManager( |
214 TranslateTabHelper* helper, | 183 TranslateTabHelper* helper, |
215 const std::string& accept_languages_pref_name) | 184 const std::string& accept_languages_pref_name) |
216 : max_reload_check_attempts_(kMaxTranslateLoadCheckAttempts), | 185 : max_reload_check_attempts_(kMaxTranslateLoadCheckAttempts), |
217 accept_languages_pref_name_(accept_languages_pref_name), | 186 accept_languages_pref_name_(accept_languages_pref_name), |
218 translate_tab_helper_(helper), | 187 translate_tab_helper_(helper), |
219 translate_client_(helper), | 188 translate_client_(helper), |
220 translate_driver_(translate_client_->GetTranslateDriver()), | 189 translate_driver_(translate_client_->GetTranslateDriver()), |
221 weak_method_factory_(this) { | 190 weak_method_factory_(this) { |
222 | 191 |
223 WebContents* web_contents = translate_tab_helper_->GetWebContents(); | 192 WebContents* web_contents = translate_tab_helper_->GetWebContents(); |
224 | 193 |
225 notification_registrar_.Add( | 194 notification_registrar_.Add( |
226 this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, | 195 this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
227 content::Source<NavigationController>(&web_contents->GetController())); | 196 content::Source<NavigationController>(&web_contents->GetController())); |
228 notification_registrar_.Add(this, | |
229 chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED, | |
230 content::Source<WebContents>(web_contents)); | |
231 notification_registrar_.Add(this, | |
232 chrome::NOTIFICATION_PAGE_TRANSLATED, | |
233 content::Source<WebContents>(web_contents)); | |
234 } | 197 } |
235 | 198 |
236 void TranslateManager::InitiateTranslation(const std::string& page_lang) { | 199 void TranslateManager::InitiateTranslation(const std::string& page_lang) { |
| 200 // Short-circuit out if not in a state where initiating translation makes |
| 201 // sense (this method may be called muhtiple times for a given page). |
| 202 LanguageState& language_state = translate_driver_->GetLanguageState(); |
| 203 if (!language_state.page_needs_translation() || |
| 204 language_state.translation_pending() || |
| 205 language_state.translation_declined() || |
| 206 language_state.IsPageTranslated()) { |
| 207 return; |
| 208 } |
| 209 |
237 PrefService* prefs = translate_client_->GetPrefs(); | 210 PrefService* prefs = translate_client_->GetPrefs(); |
238 if (!prefs->GetBoolean(prefs::kEnableTranslate)) { | 211 if (!prefs->GetBoolean(prefs::kEnableTranslate)) { |
239 TranslateBrowserMetrics::ReportInitiationStatus( | 212 TranslateBrowserMetrics::ReportInitiationStatus( |
240 TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_PREFS); | 213 TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_PREFS); |
241 const std::string& locale = | 214 const std::string& locale = |
242 TranslateDownloadManager::GetInstance()->application_locale(); | 215 TranslateDownloadManager::GetInstance()->application_locale(); |
243 TranslateBrowserMetrics::ReportLocalesOnDisabledByPrefs(locale); | 216 TranslateBrowserMetrics::ReportLocalesOnDisabledByPrefs(locale); |
244 return; | 217 return; |
245 } | 218 } |
246 | 219 |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 if (!translate_driver_->IsOffTheRecord()) { | 298 if (!translate_driver_->IsOffTheRecord()) { |
326 std::string auto_target_lang = GetAutoTargetLanguage(language_code, prefs); | 299 std::string auto_target_lang = GetAutoTargetLanguage(language_code, prefs); |
327 if (!auto_target_lang.empty()) { | 300 if (!auto_target_lang.empty()) { |
328 TranslateBrowserMetrics::ReportInitiationStatus( | 301 TranslateBrowserMetrics::ReportInitiationStatus( |
329 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_CONFIG); | 302 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_CONFIG); |
330 TranslatePage(language_code, auto_target_lang, false); | 303 TranslatePage(language_code, auto_target_lang, false); |
331 return; | 304 return; |
332 } | 305 } |
333 } | 306 } |
334 | 307 |
335 LanguageState& language_state = translate_driver_->GetLanguageState(); | |
336 std::string auto_translate_to = language_state.AutoTranslateTo(); | 308 std::string auto_translate_to = language_state.AutoTranslateTo(); |
337 if (!auto_translate_to.empty()) { | 309 if (!auto_translate_to.empty()) { |
338 // This page was navigated through a click from a translated page. | 310 // This page was navigated through a click from a translated page. |
339 TranslateBrowserMetrics::ReportInitiationStatus( | 311 TranslateBrowserMetrics::ReportInitiationStatus( |
340 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_LINK); | 312 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_LINK); |
341 TranslatePage(language_code, auto_translate_to, false); | 313 TranslatePage(language_code, auto_translate_to, false); |
342 return; | 314 return; |
343 } | 315 } |
344 | 316 |
345 TranslateBrowserMetrics::ReportInitiationStatus( | 317 TranslateBrowserMetrics::ReportInitiationStatus( |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 content::PAGE_TRANSITION_AUTO_BOOKMARK); | 432 content::PAGE_TRANSITION_AUTO_BOOKMARK); |
461 } | 433 } |
462 | 434 |
463 void TranslateManager::DoTranslatePage(const std::string& translate_script, | 435 void TranslateManager::DoTranslatePage(const std::string& translate_script, |
464 const std::string& source_lang, | 436 const std::string& source_lang, |
465 const std::string& target_lang) { | 437 const std::string& target_lang) { |
466 translate_driver_->GetLanguageState().set_translation_pending(true); | 438 translate_driver_->GetLanguageState().set_translation_pending(true); |
467 translate_driver_->TranslatePage(translate_script, source_lang, target_lang); | 439 translate_driver_->TranslatePage(translate_script, source_lang, target_lang); |
468 } | 440 } |
469 | 441 |
470 void TranslateManager::PageTranslated(PageTranslatedDetails* details) { | 442 void TranslateManager::PageTranslated(const std::string& source_lang, |
471 if ((details->error_type == TranslateErrors::NONE) && | 443 const std::string& target_lang, |
472 details->source_language != translate::kUnknownLanguageCode && | 444 TranslateErrors::Type error_type) { |
473 !TranslateDownloadManager::IsSupportedLanguage( | 445 translate_driver_->GetLanguageState().SetCurrentLanguage(target_lang); |
474 details->source_language)) { | 446 translate_driver_->GetLanguageState().set_translation_pending(false); |
475 details->error_type = TranslateErrors::UNSUPPORTED_LANGUAGE; | 447 |
| 448 if ((error_type == TranslateErrors::NONE) && |
| 449 source_lang != translate::kUnknownLanguageCode && |
| 450 !TranslateDownloadManager::IsSupportedLanguage(source_lang)) { |
| 451 error_type = TranslateErrors::UNSUPPORTED_LANGUAGE; |
476 } | 452 } |
477 | 453 |
478 DCHECK(translate_tab_helper_->GetWebContents()); | |
479 | |
480 translate_client_->ShowTranslateUI(translate::TRANSLATE_STEP_AFTER_TRANSLATE, | 454 translate_client_->ShowTranslateUI(translate::TRANSLATE_STEP_AFTER_TRANSLATE, |
481 details->source_language, | 455 source_lang, |
482 details->target_language, | 456 target_lang, |
483 details->error_type, | 457 error_type, |
484 false); | 458 false); |
485 | 459 |
486 WebContents* web_contents = translate_tab_helper_->GetWebContents(); | 460 WebContents* web_contents = translate_tab_helper_->GetWebContents(); |
487 if (details->error_type != TranslateErrors::NONE && | 461 if (error_type != TranslateErrors::NONE && |
488 !translate_driver_->IsOffTheRecord()) { | 462 !translate_driver_->IsOffTheRecord()) { |
489 TranslateErrorDetails error_details; | 463 TranslateErrorDetails error_details; |
490 error_details.time = base::Time::Now(); | 464 error_details.time = base::Time::Now(); |
491 error_details.url = web_contents->GetLastCommittedURL(); | 465 error_details.url = web_contents->GetLastCommittedURL(); |
492 error_details.error = details->error_type; | 466 error_details.error = error_type; |
493 NotifyTranslateError(error_details); | 467 NotifyTranslateError(error_details); |
494 } | 468 } |
495 } | 469 } |
496 | 470 |
497 void TranslateManager::OnTranslateScriptFetchComplete( | 471 void TranslateManager::OnTranslateScriptFetchComplete( |
498 int page_id, | 472 int page_id, |
499 const std::string& source_lang, | 473 const std::string& source_lang, |
500 const std::string& target_lang, | 474 const std::string& target_lang, |
501 bool success, | 475 bool success, |
502 const std::string& data) { | 476 const std::string& data) { |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
564 &auto_target_lang)) { | 538 &auto_target_lang)) { |
565 // We need to confirm that the saved target language is still supported. | 539 // We need to confirm that the saved target language is still supported. |
566 // Also, GetLanguageCode will take care of removing country code if any. | 540 // Also, GetLanguageCode will take care of removing country code if any. |
567 auto_target_lang = | 541 auto_target_lang = |
568 TranslateDownloadManager::GetLanguageCode(auto_target_lang); | 542 TranslateDownloadManager::GetLanguageCode(auto_target_lang); |
569 if (TranslateDownloadManager::IsSupportedLanguage(auto_target_lang)) | 543 if (TranslateDownloadManager::IsSupportedLanguage(auto_target_lang)) |
570 return auto_target_lang; | 544 return auto_target_lang; |
571 } | 545 } |
572 return std::string(); | 546 return std::string(); |
573 } | 547 } |
OLD | NEW |