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 | |
droger
2014/04/07 09:09:54
Nit: maybe keep the comment about this being calle
blundell
2014/04/08 05:25:22
Done.
| |
201 // sense. | |
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 (!web_contents->GetBrowserContext()->IsOffTheRecord()) { | 298 if (!web_contents->GetBrowserContext()->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 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
478 NOTREACHED(); | 450 NOTREACHED(); |
479 return; | 451 return; |
480 } | 452 } |
481 | 453 |
482 translate_driver_->GetLanguageState().set_translation_pending(true); | 454 translate_driver_->GetLanguageState().set_translation_pending(true); |
483 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_TranslatePage( | 455 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_TranslatePage( |
484 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID(), | 456 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID(), |
485 translate_script, source_lang, target_lang)); | 457 translate_script, source_lang, target_lang)); |
486 } | 458 } |
487 | 459 |
488 void TranslateManager::PageTranslated(PageTranslatedDetails* details) { | 460 void TranslateManager::PageTranslated(const std::string& source_lang, |
489 if ((details->error_type == TranslateErrors::NONE) && | 461 const std::string& target_lang, |
490 details->source_language != translate::kUnknownLanguageCode && | 462 TranslateErrors::Type error_type) { |
491 !TranslateDownloadManager::IsSupportedLanguage( | 463 translate_driver_->GetLanguageState().SetCurrentLanguage(target_lang); |
492 details->source_language)) { | 464 translate_driver_->GetLanguageState().set_translation_pending(false); |
493 details->error_type = TranslateErrors::UNSUPPORTED_LANGUAGE; | 465 |
466 if ((error_type == TranslateErrors::NONE) && | |
467 source_lang != translate::kUnknownLanguageCode && | |
468 !TranslateDownloadManager::IsSupportedLanguage(source_lang)) { | |
469 error_type = TranslateErrors::UNSUPPORTED_LANGUAGE; | |
494 } | 470 } |
495 | 471 |
496 DCHECK(translate_tab_helper_->GetWebContents()); | |
497 | |
498 translate_tab_helper_->ShowTranslateUI(TranslateTabHelper::AFTER_TRANSLATE, | 472 translate_tab_helper_->ShowTranslateUI(TranslateTabHelper::AFTER_TRANSLATE, |
499 details->source_language, | 473 source_lang, |
500 details->target_language, | 474 target_lang, |
501 details->error_type, | 475 error_type, |
502 false); | 476 false); |
503 | 477 |
504 WebContents* web_contents = translate_tab_helper_->GetWebContents(); | 478 WebContents* web_contents = translate_tab_helper_->GetWebContents(); |
505 if (details->error_type != TranslateErrors::NONE && | 479 if (error_type != TranslateErrors::NONE && |
506 !web_contents->GetBrowserContext()->IsOffTheRecord()) { | 480 !web_contents->GetBrowserContext()->IsOffTheRecord()) { |
507 TranslateErrorDetails error_details; | 481 TranslateErrorDetails error_details; |
508 error_details.time = base::Time::Now(); | 482 error_details.time = base::Time::Now(); |
509 error_details.url = web_contents->GetLastCommittedURL(); | 483 error_details.url = web_contents->GetLastCommittedURL(); |
510 error_details.error = details->error_type; | 484 error_details.error = error_type; |
511 NotifyTranslateError(error_details); | 485 NotifyTranslateError(error_details); |
512 } | 486 } |
513 } | 487 } |
514 | 488 |
515 void TranslateManager::OnTranslateScriptFetchComplete( | 489 void TranslateManager::OnTranslateScriptFetchComplete( |
516 int page_id, | 490 int page_id, |
517 const std::string& source_lang, | 491 const std::string& source_lang, |
518 const std::string& target_lang, | 492 const std::string& target_lang, |
519 bool success, | 493 bool success, |
520 const std::string& data) { | 494 const std::string& data) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
581 &auto_target_lang)) { | 555 &auto_target_lang)) { |
582 // We need to confirm that the saved target language is still supported. | 556 // We need to confirm that the saved target language is still supported. |
583 // Also, GetLanguageCode will take care of removing country code if any. | 557 // Also, GetLanguageCode will take care of removing country code if any. |
584 auto_target_lang = | 558 auto_target_lang = |
585 TranslateDownloadManager::GetLanguageCode(auto_target_lang); | 559 TranslateDownloadManager::GetLanguageCode(auto_target_lang); |
586 if (TranslateDownloadManager::IsSupportedLanguage(auto_target_lang)) | 560 if (TranslateDownloadManager::IsSupportedLanguage(auto_target_lang)) |
587 return auto_target_lang; | 561 return auto_target_lang; |
588 } | 562 } |
589 return std::string(); | 563 return std::string(); |
590 } | 564 } |
OLD | NEW |