Chromium Code Reviews| 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 |