Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Side by Side Diff: chrome/browser/translate/translate_manager.cc

Issue 133273029: Move LanguageState to the translate component (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix more compile issues Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/memory/singleton.h" 9 #include "base/memory/singleton.h"
10 #include "base/metrics/field_trial.h" 10 #include "base/metrics/field_trial.h"
11 #include "base/metrics/histogram.h" 11 #include "base/metrics/histogram.h"
12 #include "base/prefs/pref_service.h" 12 #include "base/prefs/pref_service.h"
13 #include "base/strings/string_split.h" 13 #include "base/strings/string_split.h"
14 #include "base/strings/stringprintf.h" 14 #include "base/strings/stringprintf.h"
15 #include "base/time/time.h" 15 #include "base/time/time.h"
16 #include "chrome/browser/browser_process.h" 16 #include "chrome/browser/browser_process.h"
17 #include "chrome/browser/chrome_notification_types.h" 17 #include "chrome/browser/chrome_notification_types.h"
18 #include "chrome/browser/profiles/profile.h" 18 #include "chrome/browser/profiles/profile.h"
19 #include "chrome/browser/tab_contents/language_state.h"
20 #include "chrome/browser/tab_contents/tab_util.h" 19 #include "chrome/browser/tab_contents/tab_util.h"
21 #include "chrome/browser/translate/translate_accept_languages.h" 20 #include "chrome/browser/translate/translate_accept_languages.h"
22 #include "chrome/browser/translate/translate_infobar_delegate.h" 21 #include "chrome/browser/translate/translate_infobar_delegate.h"
23 #include "chrome/browser/translate/translate_language_list.h" 22 #include "chrome/browser/translate/translate_language_list.h"
24 #include "chrome/browser/translate/translate_prefs.h" 23 #include "chrome/browser/translate/translate_prefs.h"
25 #include "chrome/browser/translate/translate_script.h" 24 #include "chrome/browser/translate/translate_script.h"
26 #include "chrome/browser/translate/translate_tab_helper.h" 25 #include "chrome/browser/translate/translate_tab_helper.h"
27 #include "chrome/browser/translate/translate_url_util.h" 26 #include "chrome/browser/translate/translate_url_util.h"
28 #include "chrome/browser/ui/browser.h" 27 #include "chrome/browser/ui/browser.h"
29 #include "chrome/browser/ui/browser_finder.h" 28 #include "chrome/browser/ui/browser_finder.h"
30 #include "chrome/browser/ui/browser_tabstrip.h" 29 #include "chrome/browser/ui/browser_tabstrip.h"
31 #include "chrome/browser/ui/browser_window.h" 30 #include "chrome/browser/ui/browser_window.h"
32 #include "chrome/browser/ui/tabs/tab_strip_model.h" 31 #include "chrome/browser/ui/tabs/tab_strip_model.h"
33 #include "chrome/browser/ui/translate/translate_bubble_factory.h" 32 #include "chrome/browser/ui/translate/translate_bubble_factory.h"
34 #include "chrome/common/chrome_switches.h" 33 #include "chrome/common/chrome_switches.h"
35 #include "chrome/common/pref_names.h" 34 #include "chrome/common/pref_names.h"
36 #include "chrome/common/render_messages.h" 35 #include "chrome/common/render_messages.h"
37 #include "chrome/common/url_constants.h" 36 #include "chrome/common/url_constants.h"
37 #include "components/translate/core/browser/language_state.h"
38 #include "components/translate/core/browser/page_translated_details.h" 38 #include "components/translate/core/browser/page_translated_details.h"
39 #include "components/translate/core/browser/translate_browser_metrics.h" 39 #include "components/translate/core/browser/translate_browser_metrics.h"
40 #include "components/translate/core/browser/translate_error_details.h" 40 #include "components/translate/core/browser/translate_error_details.h"
41 #include "components/translate/core/browser/translate_event_details.h" 41 #include "components/translate/core/browser/translate_event_details.h"
42 #include "components/translate/core/common/language_detection_details.h" 42 #include "components/translate/core/common/language_detection_details.h"
43 #include "components/translate/core/common/translate_constants.h" 43 #include "components/translate/core/common/translate_constants.h"
44 #include "content/public/browser/navigation_controller.h" 44 #include "content/public/browser/navigation_controller.h"
45 #include "content/public/browser/navigation_details.h" 45 #include "content/public/browser/navigation_details.h"
46 #include "content/public/browser/navigation_entry.h" 46 #include "content/public/browser/navigation_entry.h"
47 #include "content/public/browser/notification_details.h" 47 #include "content/public/browser/notification_details.h"
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 return; 195 return;
196 196
197 // If the navigation happened while offline don't show the translate 197 // If the navigation happened while offline don't show the translate
198 // bar since there will be nothing to translate. 198 // bar since there will be nothing to translate.
199 if (load_details->http_status_code == 0 || 199 if (load_details->http_status_code == 0 ||
200 load_details->http_status_code == net::HTTP_INTERNAL_SERVER_ERROR) { 200 load_details->http_status_code == net::HTTP_INTERNAL_SERVER_ERROR) {
201 return; 201 return;
202 } 202 }
203 203
204 if (!load_details->is_main_frame && 204 if (!load_details->is_main_frame &&
205 translate_tab_helper->language_state().translation_declined()) { 205 translate_tab_helper->GetLanguageState().translation_declined()) {
206 // Some sites (such as Google map) may trigger sub-frame navigations 206 // Some sites (such as Google map) may trigger sub-frame navigations
207 // when the user interacts with the page. We don't want to show a new 207 // when the user interacts with the page. We don't want to show a new
208 // infobar if the user already dismissed one in that case. 208 // infobar if the user already dismissed one in that case.
209 return; 209 return;
210 } 210 }
211 if (entry->GetTransitionType() != content::PAGE_TRANSITION_RELOAD && 211 if (entry->GetTransitionType() != content::PAGE_TRANSITION_RELOAD &&
212 load_details->type != content::NAVIGATION_TYPE_SAME_PAGE) { 212 load_details->type != content::NAVIGATION_TYPE_SAME_PAGE) {
213 return; 213 return;
214 } 214 }
215 215
216 // When doing a page reload, TAB_LANGUAGE_DETERMINED is not sent, 216 // When doing a page reload, TAB_LANGUAGE_DETERMINED is not sent,
217 // so the translation needs to be explicitly initiated, but only when the 217 // so the translation needs to be explicitly initiated, but only when the
218 // page needs translation. 218 // page needs translation.
219 if (!translate_tab_helper->language_state().page_needs_translation()) 219 if (!translate_tab_helper->GetLanguageState().page_needs_translation())
220 return; 220 return;
221 // Note that we delay it as the TranslateManager gets this notification 221 // Note that we delay it as the TranslateManager gets this notification
222 // before the WebContents and the WebContents processing might remove the 222 // before the WebContents and the WebContents processing might remove the
223 // current infobars. Since InitTranslation might add an infobar, it must 223 // current infobars. Since InitTranslation might add an infobar, it must
224 // be done after that. 224 // be done after that.
225 base::MessageLoop::current()->PostTask(FROM_HERE, 225 base::MessageLoop::current()->PostTask(FROM_HERE,
226 base::Bind( 226 base::Bind(
227 &TranslateManager::InitiateTranslationPosted, 227 &TranslateManager::InitiateTranslationPosted,
228 weak_method_factory_.GetWeakPtr(), 228 weak_method_factory_.GetWeakPtr(),
229 controller->GetWebContents()->GetRenderProcessHost()->GetID(), 229 controller->GetWebContents()->GetRenderProcessHost()->GetID(),
230 controller->GetWebContents()->GetRenderViewHost()->GetRoutingID(), 230 controller->GetWebContents()->GetRenderViewHost()->GetRoutingID(),
231 translate_tab_helper->language_state().original_language(), 0)); 231 translate_tab_helper->GetLanguageState().original_language(), 0));
232 break; 232 break;
233 } 233 }
234 case chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED: { 234 case chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED: {
235 const LanguageDetectionDetails* lang_det_details = 235 const LanguageDetectionDetails* lang_det_details =
236 content::Details<const LanguageDetectionDetails>(details).ptr(); 236 content::Details<const LanguageDetectionDetails>(details).ptr();
237 237
238 WebContents* tab = content::Source<WebContents>(source).ptr(); 238 WebContents* tab = content::Source<WebContents>(source).ptr();
239 if (!tab->GetBrowserContext()->IsOffTheRecord()) 239 if (!tab->GetBrowserContext()->IsOffTheRecord())
240 NotifyLanguageDetection(*lang_det_details); 240 NotifyLanguageDetection(*lang_det_details);
241 241
242 // We may get this notifications multiple times. Make sure to translate 242 // We may get this notifications multiple times. Make sure to translate
243 // only once. 243 // only once.
244 TranslateTabHelper* translate_tab_helper = 244 TranslateTabHelper* translate_tab_helper =
245 TranslateTabHelper::FromWebContents(tab); 245 TranslateTabHelper::FromWebContents(tab);
246 if (!translate_tab_helper) 246 if (!translate_tab_helper)
247 return; 247 return;
248 248
249 LanguageState& language_state = translate_tab_helper->language_state(); 249 LanguageState& language_state = translate_tab_helper->GetLanguageState();
250 if (language_state.page_needs_translation() && 250 if (language_state.page_needs_translation() &&
251 !language_state.translation_pending() && 251 !language_state.translation_pending() &&
252 !language_state.translation_declined() && 252 !language_state.translation_declined() &&
253 !language_state.IsPageTranslated()) { 253 !language_state.IsPageTranslated()) {
254 std::string language = lang_det_details->adopted_language; 254 std::string language = lang_det_details->adopted_language;
255 InitiateTranslation(tab, language); 255 InitiateTranslation(tab, language);
256 } 256 }
257 break; 257 break;
258 } 258 }
259 case chrome::NOTIFICATION_PAGE_TRANSLATED: { 259 case chrome::NOTIFICATION_PAGE_TRANSLATED: {
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 if (!web_contents->GetBrowserContext()->IsOffTheRecord()) { 397 if (!web_contents->GetBrowserContext()->IsOffTheRecord()) {
398 std::string auto_target_lang = GetAutoTargetLanguage(language_code, prefs); 398 std::string auto_target_lang = GetAutoTargetLanguage(language_code, prefs);
399 if (!auto_target_lang.empty()) { 399 if (!auto_target_lang.empty()) {
400 TranslateBrowserMetrics::ReportInitiationStatus( 400 TranslateBrowserMetrics::ReportInitiationStatus(
401 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_CONFIG); 401 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_CONFIG);
402 TranslatePage(web_contents, language_code, auto_target_lang); 402 TranslatePage(web_contents, language_code, auto_target_lang);
403 return; 403 return;
404 } 404 }
405 } 405 }
406 406
407 LanguageState& language_state = translate_tab_helper->language_state(); 407 LanguageState& language_state = translate_tab_helper->GetLanguageState();
408 std::string auto_translate_to = language_state.AutoTranslateTo(); 408 std::string auto_translate_to = language_state.AutoTranslateTo();
409 if (!auto_translate_to.empty()) { 409 if (!auto_translate_to.empty()) {
410 // This page was navigated through a click from a translated page. 410 // This page was navigated through a click from a translated page.
411 TranslateBrowserMetrics::ReportInitiationStatus( 411 TranslateBrowserMetrics::ReportInitiationStatus(
412 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_LINK); 412 TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_LINK);
413 TranslatePage(web_contents, language_code, auto_translate_to); 413 TranslatePage(web_contents, language_code, auto_translate_to);
414 return; 414 return;
415 } 415 }
416 416
417 TranslateBrowserMetrics::ReportInitiationStatus( 417 TranslateBrowserMetrics::ReportInitiationStatus(
(...skipping 20 matching lines...) Expand all
438 const std::string& page_lang, 438 const std::string& page_lang,
439 int attempt) { 439 int attempt) {
440 // The tab might have been closed. 440 // The tab might have been closed.
441 WebContents* web_contents = 441 WebContents* web_contents =
442 tab_util::GetWebContentsByID(process_id, render_id); 442 tab_util::GetWebContentsByID(process_id, render_id);
443 if (!web_contents) 443 if (!web_contents)
444 return; 444 return;
445 445
446 TranslateTabHelper* translate_tab_helper = 446 TranslateTabHelper* translate_tab_helper =
447 TranslateTabHelper::FromWebContents(web_contents); 447 TranslateTabHelper::FromWebContents(web_contents);
448 if (translate_tab_helper->language_state().translation_pending()) 448 if (translate_tab_helper->GetLanguageState().translation_pending())
449 return; 449 return;
450 450
451 // During a reload we need web content to be available before the 451 // During a reload we need web content to be available before the
452 // translate script is executed. Otherwise we will run the translate script on 452 // translate script is executed. Otherwise we will run the translate script on
453 // an empty DOM which will fail. Therefore we wait a bit to see if the page 453 // an empty DOM which will fail. Therefore we wait a bit to see if the page
454 // has finished. 454 // has finished.
455 if ((web_contents->IsLoading()) && attempt < kMaxTranslateLoadCheckAttempts) { 455 if ((web_contents->IsLoading()) && attempt < kMaxTranslateLoadCheckAttempts) {
456 int backoff = attempt * max_reload_check_attempts_; 456 int backoff = attempt * max_reload_check_attempts_;
457 base::MessageLoop::current()->PostDelayedTask( 457 base::MessageLoop::current()->PostDelayedTask(
458 FROM_HERE, base::Bind(&TranslateManager::InitiateTranslationPosted, 458 FROM_HERE, base::Bind(&TranslateManager::InitiateTranslationPosted,
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
525 NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); 525 NavigationEntry* entry = web_contents->GetController().GetActiveEntry();
526 if (!entry) { 526 if (!entry) {
527 NOTREACHED(); 527 NOTREACHED();
528 return; 528 return;
529 } 529 }
530 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_RevertTranslation( 530 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_RevertTranslation(
531 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID())); 531 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID()));
532 532
533 TranslateTabHelper* translate_tab_helper = 533 TranslateTabHelper* translate_tab_helper =
534 TranslateTabHelper::FromWebContents(web_contents); 534 TranslateTabHelper::FromWebContents(web_contents);
535 translate_tab_helper->language_state().SetCurrentLanguage( 535 translate_tab_helper->GetLanguageState().SetCurrentLanguage(
536 translate_tab_helper->language_state().original_language()); 536 translate_tab_helper->GetLanguageState().original_language());
537 } 537 }
538 538
539 void TranslateManager::ReportLanguageDetectionError(WebContents* web_contents) { 539 void TranslateManager::ReportLanguageDetectionError(WebContents* web_contents) {
540 TranslateBrowserMetrics::ReportLanguageDetectionError(); 540 TranslateBrowserMetrics::ReportLanguageDetectionError();
541 // We'll open the URL in a new tab so that the user can tell us more. 541 // We'll open the URL in a new tab so that the user can tell us more.
542 Browser* browser = chrome::FindBrowserWithWebContents(web_contents); 542 Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
543 if (!browser) { 543 if (!browser) {
544 NOTREACHED(); 544 NOTREACHED();
545 return; 545 return;
546 } 546 }
547 547
548 GURL report_error_url = GURL(kReportLanguageDetectionErrorURL); 548 GURL report_error_url = GURL(kReportLanguageDetectionErrorURL);
549 549
550 GURL page_url = web_contents->GetController().GetActiveEntry()->GetURL(); 550 GURL page_url = web_contents->GetController().GetActiveEntry()->GetURL();
551 report_error_url = net::AppendQueryParameter( 551 report_error_url = net::AppendQueryParameter(
552 report_error_url, 552 report_error_url,
553 kUrlQueryName, 553 kUrlQueryName,
554 page_url.spec()); 554 page_url.spec());
555 555
556 TranslateTabHelper* translate_tab_helper = 556 TranslateTabHelper* translate_tab_helper =
557 TranslateTabHelper::FromWebContents(web_contents); 557 TranslateTabHelper::FromWebContents(web_contents);
558 report_error_url = net::AppendQueryParameter( 558 report_error_url = net::AppendQueryParameter(
559 report_error_url, 559 report_error_url,
560 kSourceLanguageQueryName, 560 kSourceLanguageQueryName,
561 translate_tab_helper->language_state().original_language()); 561 translate_tab_helper->GetLanguageState().original_language());
562 562
563 report_error_url = TranslateURLUtil::AddHostLocaleToUrl(report_error_url); 563 report_error_url = TranslateURLUtil::AddHostLocaleToUrl(report_error_url);
564 report_error_url = TranslateURLUtil::AddApiKeyToUrl(report_error_url); 564 report_error_url = TranslateURLUtil::AddApiKeyToUrl(report_error_url);
565 565
566 chrome::AddSelectedTabWithURL(browser, report_error_url, 566 chrome::AddSelectedTabWithURL(browser, report_error_url,
567 content::PAGE_TRANSITION_AUTO_BOOKMARK); 567 content::PAGE_TRANSITION_AUTO_BOOKMARK);
568 } 568 }
569 569
570 void TranslateManager::ClearTranslateScript() { 570 void TranslateManager::ClearTranslateScript() {
571 if (script_.get() == NULL) { 571 if (script_.get() == NULL) {
(...skipping 11 matching lines...) Expand all
583 if (!entry) { 583 if (!entry) {
584 NOTREACHED(); 584 NOTREACHED();
585 return; 585 return;
586 } 586 }
587 587
588 TranslateTabHelper* translate_tab_helper = 588 TranslateTabHelper* translate_tab_helper =
589 TranslateTabHelper::FromWebContents(web_contents); 589 TranslateTabHelper::FromWebContents(web_contents);
590 if (!translate_tab_helper) 590 if (!translate_tab_helper)
591 return; 591 return;
592 592
593 translate_tab_helper->language_state().set_translation_pending(true); 593 translate_tab_helper->GetLanguageState().set_translation_pending(true);
594 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_TranslatePage( 594 web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_TranslatePage(
595 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID(), 595 web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID(),
596 translate_script, source_lang, target_lang)); 596 translate_script, source_lang, target_lang));
597 } 597 }
598 598
599 void TranslateManager::PageTranslated(WebContents* web_contents, 599 void TranslateManager::PageTranslated(WebContents* web_contents,
600 PageTranslatedDetails* details) { 600 PageTranslatedDetails* details) {
601 if ((details->error_type == TranslateErrors::NONE) && 601 if ((details->error_type == TranslateErrors::NONE) &&
602 details->source_language != translate::kUnknownLanguageCode && 602 details->source_language != translate::kUnknownLanguageCode &&
603 !IsSupportedLanguage(details->source_language)) { 603 !IsSupportedLanguage(details->source_language)) {
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 chrome::FindLastActiveWithHostDesktopType(browser->host_desktop_type())) { 728 chrome::FindLastActiveWithHostDesktopType(browser->host_desktop_type())) {
729 return; 729 return;
730 } 730 }
731 731
732 // During auto-translating, the bubble should not be shown. 732 // During auto-translating, the bubble should not be shown.
733 if (view_state == TranslateBubbleModel::VIEW_STATE_TRANSLATING || 733 if (view_state == TranslateBubbleModel::VIEW_STATE_TRANSLATING ||
734 view_state == TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE) { 734 view_state == TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE) {
735 TranslateTabHelper* translate_tab_helper = 735 TranslateTabHelper* translate_tab_helper =
736 TranslateTabHelper::FromWebContents(web_contents); 736 TranslateTabHelper::FromWebContents(web_contents);
737 if (!translate_tab_helper || 737 if (!translate_tab_helper ||
738 translate_tab_helper->language_state().InTranslateNavigation()) { 738 translate_tab_helper->GetLanguageState().InTranslateNavigation()) {
739 return; 739 return;
740 } 740 }
741 } 741 }
742 742
743 TranslateBubbleFactory::Show(browser->window(), web_contents, view_state, 743 TranslateBubbleFactory::Show(browser->window(), web_contents, view_state,
744 error_type); 744 error_type);
745 #else 745 #else
746 NOTREACHED(); 746 NOTREACHED();
747 #endif 747 #endif
748 } 748 }
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
810 // so we are more aggressive about showing the shortcut to never translate. 810 // so we are more aggressive about showing the shortcut to never translate.
811 #if defined(OS_ANDROID) 811 #if defined(OS_ANDROID)
812 config.never_translate_min_count = 1; 812 config.never_translate_min_count = 1;
813 #else 813 #else
814 config.never_translate_min_count = 3; 814 config.never_translate_min_count = 3;
815 #endif // defined(OS_ANDROID) 815 #endif // defined(OS_ANDROID)
816 816
817 config.always_translate_min_count = 3; 817 config.always_translate_min_count = 3;
818 return config; 818 return config;
819 } 819 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698