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/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/memory/singleton.h" | 10 #include "base/memory/singleton.h" |
11 #include "base/message_loop.h" | 11 #include "base/message_loop.h" |
12 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
13 #include "base/prefs/pref_service.h" | 13 #include "base/prefs/pref_service.h" |
14 #include "base/string_util.h" | 14 #include "base/string_util.h" |
15 #include "base/stringprintf.h" | 15 #include "base/stringprintf.h" |
16 #include "base/strings/string_split.h" | 16 #include "base/strings/string_split.h" |
17 #include "base/time.h" | 17 #include "base/time.h" |
18 #include "base/values.h" | 18 #include "base/values.h" |
19 #include "chrome/browser/browser_process.h" | 19 #include "chrome/browser/browser_process.h" |
20 #include "chrome/browser/infobars/infobar_service.h" | 20 #include "chrome/browser/infobars/infobar_service.h" |
21 #include "chrome/browser/profiles/profile.h" | 21 #include "chrome/browser/profiles/profile.h" |
22 #include "chrome/browser/tab_contents/language_state.h" | 22 #include "chrome/browser/tab_contents/language_state.h" |
23 #include "chrome/browser/tab_contents/tab_util.h" | 23 #include "chrome/browser/tab_contents/tab_util.h" |
24 #include "chrome/browser/translate/page_translated_details.h" | 24 #include "chrome/browser/translate/page_translated_details.h" |
| 25 #include "chrome/browser/translate/translate_browser_metrics.h" |
25 #include "chrome/browser/translate/translate_error_details.h" | 26 #include "chrome/browser/translate/translate_error_details.h" |
26 #include "chrome/browser/translate/translate_infobar_delegate.h" | 27 #include "chrome/browser/translate/translate_infobar_delegate.h" |
27 #include "chrome/browser/translate/translate_language_list.h" | 28 #include "chrome/browser/translate/translate_language_list.h" |
28 #include "chrome/browser/translate/translate_manager_metrics.h" | |
29 #include "chrome/browser/translate/translate_prefs.h" | 29 #include "chrome/browser/translate/translate_prefs.h" |
30 #include "chrome/browser/translate/translate_tab_helper.h" | 30 #include "chrome/browser/translate/translate_tab_helper.h" |
31 #include "chrome/browser/translate/translate_url_util.h" | 31 #include "chrome/browser/translate/translate_url_util.h" |
32 #include "chrome/browser/ui/browser.h" | 32 #include "chrome/browser/ui/browser.h" |
33 #include "chrome/browser/ui/browser_finder.h" | 33 #include "chrome/browser/ui/browser_finder.h" |
34 #include "chrome/browser/ui/browser_tabstrip.h" | 34 #include "chrome/browser/ui/browser_tabstrip.h" |
35 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 35 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
36 #include "chrome/common/chrome_constants.h" | 36 #include "chrome/common/chrome_constants.h" |
37 #include "chrome/common/chrome_notification_types.h" | 37 #include "chrome/common/chrome_notification_types.h" |
38 #include "chrome/common/chrome_switches.h" | 38 #include "chrome/common/chrome_switches.h" |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 content::NotificationService::AllSources()); | 383 content::NotificationService::AllSources()); |
384 language_list_.reset(new TranslateLanguageList); | 384 language_list_.reset(new TranslateLanguageList); |
385 } | 385 } |
386 | 386 |
387 void TranslateManager::InitiateTranslation(WebContents* web_contents, | 387 void TranslateManager::InitiateTranslation(WebContents* web_contents, |
388 const std::string& page_lang) { | 388 const std::string& page_lang) { |
389 Profile* profile = | 389 Profile* profile = |
390 Profile::FromBrowserContext(web_contents->GetBrowserContext()); | 390 Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
391 PrefService* prefs = profile->GetOriginalProfile()->GetPrefs(); | 391 PrefService* prefs = profile->GetOriginalProfile()->GetPrefs(); |
392 if (!prefs->GetBoolean(prefs::kEnableTranslate)) { | 392 if (!prefs->GetBoolean(prefs::kEnableTranslate)) { |
393 TranslateManagerMetrics::ReportInitiationStatus( | 393 TranslateBrowserMetrics::ReportInitiationStatus( |
394 TranslateManagerMetrics::INITIATION_STATUS_DISABLED_BY_PREFS); | 394 TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_PREFS); |
395 return; | 395 return; |
396 } | 396 } |
397 | 397 |
398 // Allow disabling of translate from the command line to assist with | 398 // Allow disabling of translate from the command line to assist with |
399 // automated browser testing. | 399 // automated browser testing. |
400 if (CommandLine::ForCurrentProcess()->HasSwitch( | 400 if (CommandLine::ForCurrentProcess()->HasSwitch( |
401 switches::kDisableTranslate)) { | 401 switches::kDisableTranslate)) { |
402 TranslateManagerMetrics::ReportInitiationStatus( | 402 TranslateBrowserMetrics::ReportInitiationStatus( |
403 TranslateManagerMetrics::INITIATION_STATUS_DISABLED_BY_SWITCH); | 403 TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_SWITCH); |
404 return; | 404 return; |
405 } | 405 } |
406 | 406 |
407 // Don't translate any Chrome specific page, e.g., New Tab Page, Download, | 407 // Don't translate any Chrome specific page, e.g., New Tab Page, Download, |
408 // History, and so on. | 408 // History, and so on. |
409 GURL page_url = web_contents->GetURL(); | 409 GURL page_url = web_contents->GetURL(); |
410 if (!IsTranslatableURL(page_url)) { | 410 if (!IsTranslatableURL(page_url)) { |
411 TranslateManagerMetrics::ReportInitiationStatus( | 411 TranslateBrowserMetrics::ReportInitiationStatus( |
412 TranslateManagerMetrics::INITIATION_STATUS_URL_IS_NOT_SUPPORTED); | 412 TranslateBrowserMetrics::INITIATION_STATUS_URL_IS_NOT_SUPPORTED); |
413 return; | 413 return; |
414 } | 414 } |
415 | 415 |
416 // Don't translate similar languages (ex: en-US to en). | 416 // Don't translate similar languages (ex: en-US to en). |
417 std::string target_lang = GetTargetLanguage(prefs); | 417 std::string target_lang = GetTargetLanguage(prefs); |
418 std::string language_code = GetLanguageCode(page_lang); | 418 std::string language_code = GetLanguageCode(page_lang); |
419 if (language_code == target_lang) { | 419 if (language_code == target_lang) { |
420 TranslateManagerMetrics::ReportInitiationStatus( | 420 TranslateBrowserMetrics::ReportInitiationStatus( |
421 TranslateManagerMetrics::INITIATION_STATUS_SIMILAR_LANGUAGES); | 421 TranslateBrowserMetrics::INITIATION_STATUS_SIMILAR_LANGUAGES); |
422 return; | 422 return; |
423 } | 423 } |
424 | 424 |
425 // Don't translate any language the user configured as accepted languages. | 425 // Don't translate any language the user configured as accepted languages. |
426 if (IsAcceptLanguage(web_contents, language_code)) { | 426 if (IsAcceptLanguage(web_contents, language_code)) { |
427 TranslateManagerMetrics::ReportInitiationStatus( | 427 TranslateBrowserMetrics::ReportInitiationStatus( |
428 TranslateManagerMetrics::INITIATION_STATUS_ACCEPT_LANGUAGES); | 428 TranslateBrowserMetrics::INITIATION_STATUS_ACCEPT_LANGUAGES); |
429 return; | 429 return; |
430 } | 430 } |
431 | 431 |
432 // Nothing to do if either the language Chrome is in or the language of the | 432 // Nothing to do if either the language Chrome is in or the language of the |
433 // page is not supported by the translation server. | 433 // page is not supported by the translation server. |
434 if (target_lang.empty() || !IsSupportedLanguage(language_code)) { | 434 if (target_lang.empty() || !IsSupportedLanguage(language_code)) { |
435 TranslateManagerMetrics::ReportInitiationStatus( | 435 TranslateBrowserMetrics::ReportInitiationStatus( |
436 TranslateManagerMetrics::INITIATION_STATUS_LANGUAGE_IS_NOT_SUPPORTED); | 436 TranslateBrowserMetrics::INITIATION_STATUS_LANGUAGE_IS_NOT_SUPPORTED); |
437 TranslateManagerMetrics::ReportUnsupportedLanguageAtInitiation( | 437 TranslateBrowserMetrics::ReportUnsupportedLanguageAtInitiation( |
438 language_code); | 438 language_code); |
439 | 439 |
440 return; | 440 return; |
441 } | 441 } |
442 | 442 |
443 // Don't translate any user black-listed URLs or user selected language | 443 // Don't translate any user black-listed URLs or user selected language |
444 // combination. | 444 // combination. |
445 if (!TranslatePrefs::CanTranslate(prefs, language_code, page_url)) { | 445 if (!TranslatePrefs::CanTranslate(prefs, language_code, page_url)) { |
446 TranslateManagerMetrics::ReportInitiationStatus( | 446 TranslateBrowserMetrics::ReportInitiationStatus( |
447 TranslateManagerMetrics::INITIATION_STATUS_DISABLED_BY_CONFIG); | 447 TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_CONFIG); |
448 return; | 448 return; |
449 } | 449 } |
450 | 450 |
451 // If the user has previously selected "always translate" for this language we | 451 // If the user has previously selected "always translate" for this language we |
452 // automatically translate. Note that in incognito mode we disable that | 452 // automatically translate. Note that in incognito mode we disable that |
453 // feature; the user will get an infobar, so they can control whether the | 453 // feature; the user will get an infobar, so they can control whether the |
454 // page's text is sent to the translate server. | 454 // page's text is sent to the translate server. |
455 std::string auto_target_lang; | 455 std::string auto_target_lang; |
456 if (!web_contents->GetBrowserContext()->IsOffTheRecord() && | 456 if (!web_contents->GetBrowserContext()->IsOffTheRecord() && |
457 TranslatePrefs::ShouldAutoTranslate(prefs, language_code, | 457 TranslatePrefs::ShouldAutoTranslate(prefs, language_code, |
458 &auto_target_lang)) { | 458 &auto_target_lang)) { |
459 // We need to confirm that the saved target language is still supported. | 459 // We need to confirm that the saved target language is still supported. |
460 // Also, GetLanguageCode will take care of removing country code if any. | 460 // Also, GetLanguageCode will take care of removing country code if any. |
461 auto_target_lang = GetLanguageCode(auto_target_lang); | 461 auto_target_lang = GetLanguageCode(auto_target_lang); |
462 if (IsSupportedLanguage(auto_target_lang)) { | 462 if (IsSupportedLanguage(auto_target_lang)) { |
463 TranslateManagerMetrics::ReportInitiationStatus( | 463 TranslateBrowserMetrics::ReportInitiationStatus( |
464 TranslateManagerMetrics::INITIATION_STATUS_AUTO_BY_CONFIG); | 464 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_CONFIG); |
465 TranslatePage(web_contents, language_code, auto_target_lang); | 465 TranslatePage(web_contents, language_code, auto_target_lang); |
466 return; | 466 return; |
467 } | 467 } |
468 } | 468 } |
469 | 469 |
470 TranslateTabHelper* translate_tab_helper = | 470 TranslateTabHelper* translate_tab_helper = |
471 TranslateTabHelper::FromWebContents(web_contents); | 471 TranslateTabHelper::FromWebContents(web_contents); |
472 if (!translate_tab_helper) | 472 if (!translate_tab_helper) |
473 return; | 473 return; |
474 | 474 |
475 std::string auto_translate_to = | 475 std::string auto_translate_to = |
476 translate_tab_helper->language_state().AutoTranslateTo(); | 476 translate_tab_helper->language_state().AutoTranslateTo(); |
477 if (!auto_translate_to.empty()) { | 477 if (!auto_translate_to.empty()) { |
478 // This page was navigated through a click from a translated page. | 478 // This page was navigated through a click from a translated page. |
479 TranslateManagerMetrics::ReportInitiationStatus( | 479 TranslateBrowserMetrics::ReportInitiationStatus( |
480 TranslateManagerMetrics::INITIATION_STATUS_AUTO_BY_LINK); | 480 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_LINK); |
481 TranslatePage(web_contents, language_code, auto_translate_to); | 481 TranslatePage(web_contents, language_code, auto_translate_to); |
482 return; | 482 return; |
483 } | 483 } |
484 | 484 |
485 // Prompts the user if he/she wants the page translated. | 485 // Prompts the user if he/she wants the page translated. |
486 TranslateManagerMetrics::ReportInitiationStatus( | 486 TranslateBrowserMetrics::ReportInitiationStatus( |
487 TranslateManagerMetrics::INITIATION_STATUS_SHOW_INFOBAR); | 487 TranslateBrowserMetrics::INITIATION_STATUS_SHOW_INFOBAR); |
488 TranslateInfoBarDelegate::Create( | 488 TranslateInfoBarDelegate::Create( |
489 InfoBarService::FromWebContents(web_contents), false, | 489 InfoBarService::FromWebContents(web_contents), false, |
490 TranslateInfoBarDelegate::BEFORE_TRANSLATE, TranslateErrors::NONE, | 490 TranslateInfoBarDelegate::BEFORE_TRANSLATE, TranslateErrors::NONE, |
491 profile->GetPrefs(), ShortcutConfig(), | 491 profile->GetPrefs(), ShortcutConfig(), |
492 language_code, target_lang); | 492 language_code, target_lang); |
493 } | 493 } |
494 | 494 |
495 void TranslateManager::InitiateTranslationPosted( | 495 void TranslateManager::InitiateTranslationPosted( |
496 int process_id, int render_id, const std::string& page_lang, int attempt) { | 496 int process_id, int render_id, const std::string& page_lang, int attempt) { |
497 // The tab might have been closed. | 497 // The tab might have been closed. |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
575 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_RevertTranslation( | 575 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_RevertTranslation( |
576 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID())); | 576 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID())); |
577 | 577 |
578 TranslateTabHelper* translate_tab_helper = | 578 TranslateTabHelper* translate_tab_helper = |
579 TranslateTabHelper::FromWebContents(web_contents); | 579 TranslateTabHelper::FromWebContents(web_contents); |
580 translate_tab_helper->language_state().set_current_language( | 580 translate_tab_helper->language_state().set_current_language( |
581 translate_tab_helper->language_state().original_language()); | 581 translate_tab_helper->language_state().original_language()); |
582 } | 582 } |
583 | 583 |
584 void TranslateManager::ReportLanguageDetectionError(WebContents* web_contents) { | 584 void TranslateManager::ReportLanguageDetectionError(WebContents* web_contents) { |
585 TranslateManagerMetrics::ReportLanguageDetectionError(); | 585 TranslateBrowserMetrics::ReportLanguageDetectionError(); |
586 // We'll open the URL in a new tab so that the user can tell us more. | 586 // We'll open the URL in a new tab so that the user can tell us more. |
587 Browser* browser = chrome::FindBrowserWithWebContents(web_contents); | 587 Browser* browser = chrome::FindBrowserWithWebContents(web_contents); |
588 if (!browser) { | 588 if (!browser) { |
589 NOTREACHED(); | 589 NOTREACHED(); |
590 return; | 590 return; |
591 } | 591 } |
592 | 592 |
593 GURL report_error_url = GURL(kReportLanguageDetectionErrorURL); | 593 GURL report_error_url = GURL(kReportLanguageDetectionErrorURL); |
594 | 594 |
595 GURL page_url = web_contents->GetController().GetActiveEntry()->GetURL(); | 595 GURL page_url = web_contents->GetController().GetActiveEntry()->GetURL(); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
631 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_TranslatePage( | 631 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_TranslatePage( |
632 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID(), | 632 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID(), |
633 translate_script, source_lang, target_lang)); | 633 translate_script, source_lang, target_lang)); |
634 } | 634 } |
635 | 635 |
636 void TranslateManager::PageTranslated(WebContents* web_contents, | 636 void TranslateManager::PageTranslated(WebContents* web_contents, |
637 PageTranslatedDetails* details) { | 637 PageTranslatedDetails* details) { |
638 if ((details->error_type == TranslateErrors::NONE) && | 638 if ((details->error_type == TranslateErrors::NONE) && |
639 details->source_language != chrome::kUnknownLanguageCode && | 639 details->source_language != chrome::kUnknownLanguageCode && |
640 !IsSupportedLanguage(details->source_language)) { | 640 !IsSupportedLanguage(details->source_language)) { |
641 // TODO(toyoshim): http://crbug.com/242142 We should check if | |
642 // l10n_util::GetDisplayNameForLocale() support |source_language| here. | |
643 // Also, following metrics should be modified to have language code. | |
644 TranslateManagerMetrics::ReportUnsupportedLanguage(); | |
645 details->error_type = TranslateErrors::UNSUPPORTED_LANGUAGE; | 641 details->error_type = TranslateErrors::UNSUPPORTED_LANGUAGE; |
646 } | 642 } |
647 | 643 |
648 Profile* profile = | 644 Profile* profile = |
649 Profile::FromBrowserContext(web_contents->GetBrowserContext()); | 645 Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
650 PrefService* prefs = profile->GetPrefs(); | 646 PrefService* prefs = profile->GetPrefs(); |
651 TranslateInfoBarDelegate::Create( | 647 TranslateInfoBarDelegate::Create( |
652 InfoBarService::FromWebContents(web_contents), true, | 648 InfoBarService::FromWebContents(web_contents), true, |
653 (details->error_type == TranslateErrors::NONE) ? | 649 (details->error_type == TranslateErrors::NONE) ? |
654 TranslateInfoBarDelegate::AFTER_TRANSLATE : | 650 TranslateInfoBarDelegate::AFTER_TRANSLATE : |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
826 // reason so we are more aggressive showing the shortcuts for never translate. | 822 // reason so we are more aggressive showing the shortcuts for never translate. |
827 #if defined(OS_ANDROID) | 823 #if defined(OS_ANDROID) |
828 config.never_translate_min_count = 1; | 824 config.never_translate_min_count = 1; |
829 #else | 825 #else |
830 config.never_translate_min_count = 3; | 826 config.never_translate_min_count = 3; |
831 #endif // defined(OS_ANDROID) | 827 #endif // defined(OS_ANDROID) |
832 | 828 |
833 config.always_translate_min_count = 3; | 829 config.always_translate_min_count = 3; |
834 return config; | 830 return config; |
835 } | 831 } |
OLD | NEW |