Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "components/translate/core/browser/translate_manager.h" | 5 #include "components/translate/core/browser/translate_manager.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 211 return; | 211 return; |
| 212 } | 212 } |
| 213 | 213 |
| 214 std::unique_ptr<TranslatePrefs> translate_prefs( | 214 std::unique_ptr<TranslatePrefs> translate_prefs( |
| 215 translate_client_->GetTranslatePrefs()); | 215 translate_client_->GetTranslatePrefs()); |
| 216 | 216 |
| 217 std::string target_lang = GetTargetLanguage(translate_prefs.get()); | 217 std::string target_lang = GetTargetLanguage(translate_prefs.get()); |
| 218 std::string language_code = | 218 std::string language_code = |
| 219 TranslateDownloadManager::GetLanguageCode(page_lang); | 219 TranslateDownloadManager::GetLanguageCode(page_lang); |
| 220 | 220 |
| 221 InitTranslateEvent(language_code, target_lang, *translate_prefs); | |
| 222 | |
| 221 // Don't translate similar languages (ex: en-US to en). | 223 // Don't translate similar languages (ex: en-US to en). |
| 222 if (language_code == target_lang) { | 224 if (language_code == target_lang) { |
| 223 TranslateBrowserMetrics::ReportInitiationStatus( | 225 TranslateBrowserMetrics::ReportInitiationStatus( |
| 224 TranslateBrowserMetrics::INITIATION_STATUS_SIMILAR_LANGUAGES); | 226 TranslateBrowserMetrics::INITIATION_STATUS_SIMILAR_LANGUAGES); |
| 225 return; | 227 return; |
| 226 } | 228 } |
| 227 | 229 |
| 228 // Nothing to do if either the language Chrome is in or the language of the | 230 // Nothing to do if either the language Chrome is in or the language of the |
| 229 // page is not supported by the translation server. | 231 // page is not supported by the translation server. |
| 230 if (target_lang.empty() || | 232 if (target_lang.empty() || |
| 231 !TranslateDownloadManager::IsSupportedLanguage(language_code)) { | 233 !TranslateDownloadManager::IsSupportedLanguage(language_code)) { |
| 232 TranslateBrowserMetrics::ReportInitiationStatus( | 234 TranslateBrowserMetrics::ReportInitiationStatus( |
| 233 TranslateBrowserMetrics::INITIATION_STATUS_LANGUAGE_IS_NOT_SUPPORTED); | 235 TranslateBrowserMetrics::INITIATION_STATUS_LANGUAGE_IS_NOT_SUPPORTED); |
| 234 TranslateBrowserMetrics::ReportUnsupportedLanguageAtInitiation( | 236 TranslateBrowserMetrics::ReportUnsupportedLanguageAtInitiation( |
| 235 language_code); | 237 language_code); |
| 238 RecordTranslateEvent(metrics::TranslateEventProto::UNSUPPORTED_LANGUAGE); | |
| 236 return; | 239 return; |
| 237 } | 240 } |
| 238 | 241 |
| 239 TranslateAcceptLanguages* accept_languages = | 242 TranslateAcceptLanguages* accept_languages = |
| 240 translate_client_->GetTranslateAcceptLanguages(); | 243 translate_client_->GetTranslateAcceptLanguages(); |
| 241 // Don't translate any user black-listed languages. | 244 // Don't translate any user black-listed languages. |
| 242 if (!translate_prefs->CanTranslateLanguage(accept_languages, | 245 if (!translate_prefs->CanTranslateLanguage(accept_languages, |
| 243 language_code)) { | 246 language_code)) { |
| 244 TranslateBrowserMetrics::ReportInitiationStatus( | 247 TranslateBrowserMetrics::ReportInitiationStatus( |
| 245 TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_CONFIG); | 248 TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_CONFIG); |
| 249 RecordTranslateEvent( | |
| 250 metrics::TranslateEventProto::LANGUAGE_DISABLED_BY_USER_CONFIG); | |
| 246 return; | 251 return; |
| 247 } | 252 } |
| 248 | 253 |
| 249 // Don't translate any user black-listed URLs. | 254 // Don't translate any user black-listed URLs. |
| 250 if (translate_prefs->IsSiteBlacklisted(page_url.HostNoBrackets())) { | 255 if (translate_prefs->IsSiteBlacklisted(page_url.HostNoBrackets())) { |
| 251 TranslateBrowserMetrics::ReportInitiationStatus( | 256 TranslateBrowserMetrics::ReportInitiationStatus( |
| 252 TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_CONFIG); | 257 TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_CONFIG); |
| 258 RecordTranslateEvent( | |
| 259 metrics::TranslateEventProto::URL_DISABLED_BY_USER_CONFIG); | |
| 253 return; | 260 return; |
| 254 } | 261 } |
| 255 | 262 |
| 256 // If the user has previously selected "always translate" for this language we | 263 // If the user has previously selected "always translate" for this language we |
| 257 // automatically translate. Note that in incognito mode we disable that | 264 // automatically translate. Note that in incognito mode we disable that |
| 258 // feature; the user will get an infobar, so they can control whether the | 265 // feature; the user will get an infobar, so they can control whether the |
| 259 // page's text is sent to the translate server. | 266 // page's text is sent to the translate server. |
| 260 if (!translate_driver_->IsOffTheRecord()) { | 267 if (!translate_driver_->IsOffTheRecord()) { |
| 261 std::string auto_target_lang = | 268 std::string auto_target_lang = |
| 262 GetAutoTargetLanguage(language_code, translate_prefs.get()); | 269 GetAutoTargetLanguage(language_code, translate_prefs.get()); |
| 263 if (!auto_target_lang.empty()) { | 270 if (!auto_target_lang.empty()) { |
| 264 TranslateBrowserMetrics::ReportInitiationStatus( | 271 TranslateBrowserMetrics::ReportInitiationStatus( |
| 265 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_CONFIG); | 272 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_CONFIG); |
| 273 translate_event_.set_modified_target_language(auto_target_lang); | |
| 274 RecordTranslateEvent( | |
| 275 metrics::TranslateEventProto::AUTOMATICALLY_TRANSLATED); | |
| 266 TranslatePage(language_code, auto_target_lang, false); | 276 TranslatePage(language_code, auto_target_lang, false); |
| 267 return; | 277 return; |
| 268 } | 278 } |
| 269 } | 279 } |
| 270 | 280 |
| 271 std::string auto_translate_to = language_state_.AutoTranslateTo(); | 281 std::string auto_translate_to = language_state_.AutoTranslateTo(); |
| 272 if (!auto_translate_to.empty()) { | 282 if (!auto_translate_to.empty()) { |
| 273 // This page was navigated through a click from a translated page. | 283 // This page was navigated through a click from a translated page. |
| 274 TranslateBrowserMetrics::ReportInitiationStatus( | 284 TranslateBrowserMetrics::ReportInitiationStatus( |
| 275 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_LINK); | 285 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_LINK); |
| 286 translate_event_.set_modified_target_language(auto_translate_to); | |
| 287 RecordTranslateEvent( | |
| 288 metrics::TranslateEventProto::AUTOMATICALLY_TRANSLATED); | |
| 276 TranslatePage(language_code, auto_translate_to, false); | 289 TranslatePage(language_code, auto_translate_to, false); |
| 277 return; | 290 return; |
| 278 } | 291 } |
| 279 | 292 |
| 280 if (LanguageInULP(language_code)) { | 293 if (LanguageInULP(language_code)) { |
| 281 TranslateBrowserMetrics::ReportInitiationStatus( | 294 TranslateBrowserMetrics::ReportInitiationStatus( |
| 282 TranslateBrowserMetrics::INITIATION_STATUS_LANGUAGE_IN_ULP); | 295 TranslateBrowserMetrics::INITIATION_STATUS_LANGUAGE_IN_ULP); |
| 296 RecordTranslateEvent(metrics::TranslateEventProto::DISABLED_BY_PREF); | |
| 283 return; | 297 return; |
| 284 } | 298 } |
| 285 | 299 |
| 286 if (TranslateRanker::IsEnabled()) { | 300 if (TranslateRanker::IsEnabled()) { |
| 287 if (!TranslateRanker::GetInstance()->ShouldOfferTranslation( | 301 TranslateRanker* translate_ranker = TranslateRanker::GetInstance(); |
| 288 *translate_client_->GetTranslatePrefs(), language_code, | 302 bool should_offer_translation = translate_ranker->ShouldOfferTranslation( |
| 289 target_lang)) { | 303 *translate_client_->GetTranslatePrefs(), language_code, target_lang); |
| 304 translate_event_.set_ranker_request_timestamp_sec( | |
| 305 (base::TimeTicks::Now() - base::TimeTicks()).InSeconds()); | |
| 306 translate_event_.set_ranker_version(translate_ranker->GetModelVersion()); | |
| 307 translate_event_.set_ranker_response( | |
| 308 should_offer_translation ? metrics::TranslateEventProto::SHOW | |
| 309 : metrics::TranslateEventProto::DONT_SHOW); | |
| 310 if (!should_offer_translation && TranslateRanker::IsEnforcementEnabled()) { | |
| 290 TranslateBrowserMetrics::ReportInitiationStatus( | 311 TranslateBrowserMetrics::ReportInitiationStatus( |
| 291 TranslateBrowserMetrics::INITIATION_STATUS_ABORTED_BY_RANKER); | 312 TranslateBrowserMetrics::INITIATION_STATUS_ABORTED_BY_RANKER); |
| 313 RecordTranslateEvent(metrics::TranslateEventProto::DISABLED_BY_RANKER); | |
| 292 return; | 314 return; |
| 293 } | 315 } |
| 294 } | 316 } |
| 295 | 317 |
| 296 TranslateBrowserMetrics::ReportInitiationStatus( | 318 TranslateBrowserMetrics::ReportInitiationStatus( |
| 297 TranslateBrowserMetrics::INITIATION_STATUS_SHOW_INFOBAR); | 319 TranslateBrowserMetrics::INITIATION_STATUS_SHOW_INFOBAR); |
| 298 | 320 |
| 299 // Prompts the user if they want the page translated. | 321 // Prompts the user if they want the page translated. |
| 300 translate_client_->ShowTranslateUI(translate::TRANSLATE_STEP_BEFORE_TRANSLATE, | 322 translate_client_->ShowTranslateUI(translate::TRANSLATE_STEP_BEFORE_TRANSLATE, |
| 301 language_code, | 323 language_code, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 334 } | 356 } |
| 335 | 357 |
| 336 // Translation can be kicked by context menu against unsupported languages. | 358 // Translation can be kicked by context menu against unsupported languages. |
| 337 // Unsupported language strings should be replaced with | 359 // Unsupported language strings should be replaced with |
| 338 // kUnknownLanguageCode in order to send a translation request with enabling | 360 // kUnknownLanguageCode in order to send a translation request with enabling |
| 339 // server side auto language detection. | 361 // server side auto language detection. |
| 340 std::string source_lang(original_source_lang); | 362 std::string source_lang(original_source_lang); |
| 341 if (!TranslateDownloadManager::IsSupportedLanguage(source_lang)) | 363 if (!TranslateDownloadManager::IsSupportedLanguage(source_lang)) |
| 342 source_lang = std::string(translate::kUnknownLanguageCode); | 364 source_lang = std::string(translate::kUnknownLanguageCode); |
| 343 | 365 |
| 366 // Capture the translate event if we were triggered from the menu. | |
| 367 if (triggered_from_menu) { | |
| 368 translate_event_.set_source_language(source_lang); | |
| 369 translate_event_.set_target_language(target_lang); | |
|
hamelphi
2016/10/07 21:41:26
Why not call InitTranslateEvent here?
Roger McFarlane (Chromium)
2016/10/13 07:45:43
Done.
| |
| 370 RecordTranslateEvent( | |
| 371 metrics::TranslateEventProto::USER_CONTEXT_MENU_TRANSLATE); | |
| 372 } | |
| 373 | |
| 374 // Trigger the "translating now" UI. | |
| 344 translate_client_->ShowTranslateUI(translate::TRANSLATE_STEP_TRANSLATING, | 375 translate_client_->ShowTranslateUI(translate::TRANSLATE_STEP_TRANSLATING, |
| 345 source_lang, | 376 source_lang, |
| 346 target_lang, | 377 target_lang, |
| 347 TranslateErrors::NONE, | 378 TranslateErrors::NONE, |
| 348 triggered_from_menu); | 379 triggered_from_menu); |
| 349 | 380 |
| 350 TranslateScript* script = TranslateDownloadManager::GetInstance()->script(); | 381 TranslateScript* script = TranslateDownloadManager::GetInstance()->script(); |
| 351 DCHECK(script != NULL); | 382 DCHECK(script != NULL); |
| 352 | 383 |
| 353 const std::string& script_data = script->data(); | 384 const std::string& script_data = script->data(); |
| 354 if (!script_data.empty()) { | 385 if (!script_data.empty()) { |
| 355 DoTranslatePage(script_data, source_lang, target_lang); | 386 DoTranslatePage(script_data, source_lang, target_lang); |
| 356 return; | 387 return; |
| 357 } | 388 } |
| 358 | 389 |
| 359 // The script is not available yet. Queue that request and query for the | 390 // The script is not available yet. Queue that request and query for the |
| 360 // script. Once it is downloaded we'll do the translate. | 391 // script. Once it is downloaded we'll do the translate. |
| 361 TranslateScript::RequestCallback callback = base::Bind( | 392 TranslateScript::RequestCallback callback = base::Bind( |
| 362 &TranslateManager::OnTranslateScriptFetchComplete, GetWeakPtr(), | 393 &TranslateManager::OnTranslateScriptFetchComplete, GetWeakPtr(), |
| 363 source_lang, target_lang); | 394 source_lang, target_lang); |
| 364 | 395 |
| 365 script->Request(callback); | 396 script->Request(callback); |
| 366 } | 397 } |
| 367 | 398 |
| 368 void TranslateManager::RevertTranslation() { | 399 void TranslateManager::RevertTranslation() { |
| 400 // Capture the revert event in the translate metrics | |
| 401 RecordTranslateEvent(metrics::TranslateEventProto::USER_REVERT); | |
| 402 | |
| 403 // Revert the translation. | |
| 369 translate_driver_->RevertTranslation(page_seq_no_); | 404 translate_driver_->RevertTranslation(page_seq_no_); |
| 370 language_state_.SetCurrentLanguage(language_state_.original_language()); | 405 language_state_.SetCurrentLanguage(language_state_.original_language()); |
| 371 } | 406 } |
| 372 | 407 |
| 373 void TranslateManager::ReportLanguageDetectionError() { | 408 void TranslateManager::ReportLanguageDetectionError() { |
| 374 TranslateBrowserMetrics::ReportLanguageDetectionError(); | 409 TranslateBrowserMetrics::ReportLanguageDetectionError(); |
| 375 | 410 |
| 376 GURL report_error_url = GURL(kReportLanguageDetectionErrorURL); | 411 GURL report_error_url = GURL(kReportLanguageDetectionErrorURL); |
| 377 | 412 |
| 378 report_error_url = net::AppendQueryParameter( | 413 report_error_url = net::AppendQueryParameter( |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 534 return language_state_; | 569 return language_state_; |
| 535 } | 570 } |
| 536 | 571 |
| 537 bool TranslateManager::ignore_missing_key_for_testing_ = false; | 572 bool TranslateManager::ignore_missing_key_for_testing_ = false; |
| 538 | 573 |
| 539 // static | 574 // static |
| 540 void TranslateManager::SetIgnoreMissingKeyForTesting(bool ignore) { | 575 void TranslateManager::SetIgnoreMissingKeyForTesting(bool ignore) { |
| 541 ignore_missing_key_for_testing_ = ignore; | 576 ignore_missing_key_for_testing_ = ignore; |
| 542 } | 577 } |
| 543 | 578 |
| 579 void TranslateManager::InitTranslateEvent(const std::string& src_lang, | |
| 580 const std::string& dst_lang, | |
| 581 const TranslatePrefs& prefs) { | |
| 582 translate_event_.Clear(); | |
| 583 translate_event_.set_source_language(src_lang); | |
| 584 translate_event_.set_target_language(dst_lang); | |
| 585 translate_event_.set_accept_count( | |
| 586 prefs.GetTranslationAcceptedCount(src_lang)); | |
| 587 translate_event_.set_decline_count(prefs.GetTranslationDeniedCount(src_lang)); | |
| 588 translate_event_.set_ignore_count(prefs.GetTranslationIgnoredCount(src_lang)); | |
| 589 translate_event_.set_ranker_response( | |
| 590 metrics::TranslateEventProto::NOT_QUERIED); | |
| 591 translate_event_.set_event_type(metrics::TranslateEventProto::UNKNOWN); | |
| 592 // TODO(rogerm): Populate the language list. | |
| 593 } | |
| 594 | |
| 595 void TranslateManager::RecordTranslateEvent( | |
| 596 metrics::TranslateEventProto::EventType event_type) { | |
| 597 // TODO(rogerm): early exit for incognito? | |
| 598 translate_event_.set_event_type(event_type); | |
| 599 translate_event_.set_event_timestamp_sec( | |
| 600 (base::TimeTicks::Now() - base::TimeTicks()).InSeconds()); | |
| 601 // TODO(rogerm): Finish writing me! | |
| 602 } | |
| 603 | |
| 544 } // namespace translate | 604 } // namespace translate |
| OLD | NEW |