| Index: chrome/browser/translate/translate_manager.cc
|
| diff --git a/chrome/browser/translate/translate_manager.cc b/chrome/browser/translate/translate_manager.cc
|
| index 5eb19be4ccf002393b4cb963ddae8b4daf18d970..2264fc676287fc60dea3e46bca3031b24b8ac784 100644
|
| --- a/chrome/browser/translate/translate_manager.cc
|
| +++ b/chrome/browser/translate/translate_manager.cc
|
| @@ -6,7 +6,6 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/command_line.h"
|
| -#include "base/memory/singleton.h"
|
| #include "base/metrics/field_trial.h"
|
| #include "base/metrics/histogram.h"
|
| #include "base/prefs/pref_service.h"
|
| @@ -90,13 +89,7 @@ void NotifyTranslateError(const TranslateErrorDetails& details) {
|
|
|
| } // namespace
|
|
|
| -TranslateManager::~TranslateManager() {
|
| -}
|
| -
|
| -// static
|
| -TranslateManager* TranslateManager::GetInstance() {
|
| - return Singleton<TranslateManager>::get();
|
| -}
|
| +TranslateManager::~TranslateManager() {}
|
|
|
| // static
|
| bool TranslateManager::IsTranslatableURL(const GURL& url) {
|
| @@ -124,6 +117,8 @@ void TranslateManager::Observe(int type,
|
| case content::NOTIFICATION_NAV_ENTRY_COMMITTED: {
|
| NavigationController* controller =
|
| content::Source<NavigationController>(source).ptr();
|
| + DCHECK_EQ(&translate_tab_helper_->GetWebContents()->GetController(),
|
| + controller);
|
| content::LoadCommittedDetails* load_details =
|
| content::Details<content::LoadCommittedDetails>(details).ptr();
|
| NavigationEntry* entry = controller->GetActiveEntry();
|
| @@ -132,9 +127,7 @@ void TranslateManager::Observe(int type,
|
| return;
|
| }
|
|
|
| - TranslateTabHelper* translate_tab_helper =
|
| - TranslateTabHelper::FromWebContents(controller->GetWebContents());
|
| - if (!translate_tab_helper)
|
| + if (!translate_tab_helper_->GetWebContents())
|
| return;
|
|
|
| // If the navigation happened while offline don't show the translate
|
| @@ -145,7 +138,7 @@ void TranslateManager::Observe(int type,
|
| }
|
|
|
| if (!load_details->is_main_frame &&
|
| - translate_tab_helper->GetLanguageState().translation_declined()) {
|
| + translate_tab_helper_->GetLanguageState().translation_declined()) {
|
| // Some sites (such as Google map) may trigger sub-frame navigations
|
| // when the user interacts with the page. We don't want to show a new
|
| // infobar if the user already dismissed one in that case.
|
| @@ -159,19 +152,19 @@ void TranslateManager::Observe(int type,
|
| // When doing a page reload, TAB_LANGUAGE_DETERMINED is not sent,
|
| // so the translation needs to be explicitly initiated, but only when the
|
| // page needs translation.
|
| - if (!translate_tab_helper->GetLanguageState().page_needs_translation())
|
| + if (!translate_tab_helper_->GetLanguageState().page_needs_translation())
|
| return;
|
| // Note that we delay it as the TranslateManager gets this notification
|
| // before the WebContents and the WebContents processing might remove the
|
| // current infobars. Since InitTranslation might add an infobar, it must
|
| // be done after that.
|
| - base::MessageLoop::current()->PostTask(FROM_HERE,
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| base::Bind(
|
| &TranslateManager::InitiateTranslationPosted,
|
| weak_method_factory_.GetWeakPtr(),
|
| - controller->GetWebContents()->GetRenderProcessHost()->GetID(),
|
| - controller->GetWebContents()->GetRenderViewHost()->GetRoutingID(),
|
| - translate_tab_helper->GetLanguageState().original_language(), 0));
|
| + translate_tab_helper_->GetLanguageState().original_language(),
|
| + 0));
|
| break;
|
| }
|
| case chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED: {
|
| @@ -179,21 +172,20 @@ void TranslateManager::Observe(int type,
|
| content::Details<const LanguageDetectionDetails>(details).ptr();
|
|
|
| WebContents* tab = content::Source<WebContents>(source).ptr();
|
| + DCHECK_EQ(translate_tab_helper_->GetWebContents(), tab);
|
|
|
| - // We may get this notifications multiple times. Make sure to translate
|
| - // only once.
|
| - TranslateTabHelper* translate_tab_helper =
|
| - TranslateTabHelper::FromWebContents(tab);
|
| - if (!translate_tab_helper)
|
| + if (!translate_tab_helper_->GetWebContents())
|
| return;
|
|
|
| - LanguageState& language_state = translate_tab_helper->GetLanguageState();
|
| + // We may get this notifications multiple times. Make sure to translate
|
| + // only once.
|
| + LanguageState& language_state = translate_tab_helper_->GetLanguageState();
|
| if (language_state.page_needs_translation() &&
|
| !language_state.translation_pending() &&
|
| !language_state.translation_declined() &&
|
| !language_state.IsPageTranslated()) {
|
| std::string language = lang_det_details->adopted_language;
|
| - InitiateTranslation(tab, language);
|
| + InitiateTranslation(language);
|
| }
|
| break;
|
| }
|
| @@ -201,10 +193,9 @@ void TranslateManager::Observe(int type,
|
| // Only add translate infobar if it doesn't exist; if it already exists,
|
| // just update the state, the actual infobar would have received the same
|
| // notification and update the visual display accordingly.
|
| - WebContents* tab = content::Source<WebContents>(source).ptr();
|
| PageTranslatedDetails* page_translated_details =
|
| content::Details<PageTranslatedDetails>(details).ptr();
|
| - PageTranslated(tab, page_translated_details);
|
| + PageTranslated(page_translated_details);
|
| break;
|
| }
|
| default:
|
| @@ -221,23 +212,27 @@ TranslateManager::RegisterTranslateErrorCallback(
|
| return g_callback_list_->Add(callback);
|
| }
|
|
|
| -TranslateManager::TranslateManager()
|
| - : max_reload_check_attempts_(kMaxTranslateLoadCheckAttempts),
|
| - weak_method_factory_(this) {
|
| - notification_registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - content::NotificationService::AllSources());
|
| +TranslateManager::TranslateManager(TranslateTabHelper* helper)
|
| + : max_reload_check_attempts_(kMaxTranslateLoadCheckAttempts),
|
| + translate_tab_helper_(helper),
|
| + weak_method_factory_(this) {
|
| +
|
| + WebContents* web_contents = translate_tab_helper_->GetWebContents();
|
| +
|
| + notification_registrar_.Add(
|
| + this, content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| + content::Source<NavigationController>(&web_contents->GetController()));
|
| notification_registrar_.Add(this,
|
| chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
|
| - content::NotificationService::AllSources());
|
| - notification_registrar_.Add(this, chrome::NOTIFICATION_PAGE_TRANSLATED,
|
| - content::NotificationService::AllSources());
|
| + content::Source<WebContents>(web_contents));
|
| + notification_registrar_.Add(this,
|
| + chrome::NOTIFICATION_PAGE_TRANSLATED,
|
| + content::Source<WebContents>(web_contents));
|
| }
|
|
|
| -void TranslateManager::InitiateTranslation(WebContents* web_contents,
|
| - const std::string& page_lang) {
|
| - TranslateTabHelper* translate_tab_helper =
|
| - TranslateTabHelper::FromWebContents(web_contents);
|
| - if (!translate_tab_helper)
|
| +void TranslateManager::InitiateTranslation(const std::string& page_lang) {
|
| + WebContents* web_contents = translate_tab_helper_->GetWebContents();
|
| + if (!web_contents)
|
| return;
|
|
|
| Profile* profile =
|
| @@ -329,18 +324,18 @@ void TranslateManager::InitiateTranslation(WebContents* web_contents,
|
| if (!auto_target_lang.empty()) {
|
| TranslateBrowserMetrics::ReportInitiationStatus(
|
| TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_CONFIG);
|
| - TranslatePage(web_contents, language_code, auto_target_lang);
|
| + TranslatePage(language_code, auto_target_lang);
|
| return;
|
| }
|
| }
|
|
|
| - LanguageState& language_state = translate_tab_helper->GetLanguageState();
|
| + LanguageState& language_state = translate_tab_helper_->GetLanguageState();
|
| std::string auto_translate_to = language_state.AutoTranslateTo();
|
| if (!auto_translate_to.empty()) {
|
| // This page was navigated through a click from a translated page.
|
| TranslateBrowserMetrics::ReportInitiationStatus(
|
| TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_LINK);
|
| - TranslatePage(web_contents, language_code, auto_translate_to);
|
| + TranslatePage(language_code, auto_translate_to);
|
| return;
|
| }
|
|
|
| @@ -348,26 +343,19 @@ void TranslateManager::InitiateTranslation(WebContents* web_contents,
|
| TranslateBrowserMetrics::INITIATION_STATUS_SHOW_INFOBAR);
|
|
|
| // Prompts the user if he/she wants the page translated.
|
| - translate_tab_helper->ShowTranslateUI(TranslateTabHelper::BEFORE_TRANSLATE,
|
| - web_contents,
|
| - language_code,
|
| - target_lang,
|
| - TranslateErrors::NONE);
|
| + translate_tab_helper_->ShowTranslateUI(TranslateTabHelper::BEFORE_TRANSLATE,
|
| + language_code,
|
| + target_lang,
|
| + TranslateErrors::NONE);
|
| }
|
|
|
| -void TranslateManager::InitiateTranslationPosted(int process_id,
|
| - int render_id,
|
| - const std::string& page_lang,
|
| +void TranslateManager::InitiateTranslationPosted(const std::string& page_lang,
|
| int attempt) {
|
| - // The tab might have been closed.
|
| - WebContents* web_contents =
|
| - tab_util::GetWebContentsByID(process_id, render_id);
|
| + WebContents* web_contents = translate_tab_helper_->GetWebContents();
|
| if (!web_contents)
|
| return;
|
|
|
| - TranslateTabHelper* translate_tab_helper =
|
| - TranslateTabHelper::FromWebContents(web_contents);
|
| - if (translate_tab_helper->GetLanguageState().translation_pending())
|
| + if (translate_tab_helper_->GetLanguageState().translation_pending())
|
| return;
|
|
|
| // During a reload we need web content to be available before the
|
| @@ -378,19 +366,19 @@ void TranslateManager::InitiateTranslationPosted(int process_id,
|
| int backoff = attempt * max_reload_check_attempts_;
|
| base::MessageLoop::current()->PostDelayedTask(
|
| FROM_HERE, base::Bind(&TranslateManager::InitiateTranslationPosted,
|
| - weak_method_factory_.GetWeakPtr(), process_id,
|
| - render_id, page_lang, ++attempt),
|
| + weak_method_factory_.GetWeakPtr(),
|
| + page_lang, ++attempt),
|
| base::TimeDelta::FromMilliseconds(backoff));
|
| return;
|
| }
|
|
|
| - InitiateTranslation(web_contents,
|
| - TranslateDownloadManager::GetLanguageCode(page_lang));
|
| + InitiateTranslation(TranslateDownloadManager::GetLanguageCode(page_lang));
|
| }
|
|
|
| -void TranslateManager::TranslatePage(WebContents* web_contents,
|
| - const std::string& original_source_lang,
|
| +void TranslateManager::TranslatePage(const std::string& original_source_lang,
|
| const std::string& target_lang) {
|
| + WebContents* web_contents = translate_tab_helper_->GetWebContents();
|
| + DCHECK(web_contents);
|
| NavigationEntry* entry = web_contents->GetController().GetActiveEntry();
|
| if (!entry) {
|
| NOTREACHED();
|
| @@ -405,39 +393,34 @@ void TranslateManager::TranslatePage(WebContents* web_contents,
|
| if (!TranslateDownloadManager::IsSupportedLanguage(source_lang))
|
| source_lang = std::string(translate::kUnknownLanguageCode);
|
|
|
| - TranslateTabHelper* translate_tab_helper =
|
| - TranslateTabHelper::FromWebContents(web_contents);
|
| - DCHECK(translate_tab_helper);
|
| - translate_tab_helper->ShowTranslateUI(TranslateTabHelper::TRANSLATING,
|
| - web_contents,
|
| - source_lang,
|
| - target_lang,
|
| - TranslateErrors::NONE);
|
| + translate_tab_helper_->ShowTranslateUI(TranslateTabHelper::TRANSLATING,
|
| + source_lang,
|
| + target_lang,
|
| + TranslateErrors::NONE);
|
|
|
| TranslateScript* script = TranslateDownloadManager::GetInstance()->script();
|
| DCHECK(script != NULL);
|
|
|
| const std::string& script_data = script->data();
|
| if (!script_data.empty()) {
|
| - DoTranslatePage(web_contents, script_data, source_lang, target_lang);
|
| + DoTranslatePage(script_data, source_lang, target_lang);
|
| return;
|
| }
|
|
|
| // The script is not available yet. Queue that request and query for the
|
| // script. Once it is downloaded we'll do the translate.
|
| - content::RenderViewHost* rvh = web_contents->GetRenderViewHost();
|
| - PendingRequest request;
|
| - request.render_process_id = rvh->GetProcess()->GetID();
|
| - request.render_view_id = rvh->GetRoutingID();
|
| - request.page_id = entry->GetPageID();
|
| - request.source_lang = source_lang;
|
| - request.target_lang = target_lang;
|
| -
|
| - script->Request(base::Bind(&TranslateManager::OnTranslateScriptFetchComplete,
|
| - weak_method_factory_.GetWeakPtr(), request));
|
| + TranslateScript::RequestCallback callback =
|
| + base::Bind(&TranslateManager::OnTranslateScriptFetchComplete,
|
| + weak_method_factory_.GetWeakPtr(),
|
| + entry->GetPageID(),
|
| + source_lang,
|
| + target_lang);
|
| +
|
| + script->Request(callback);
|
| }
|
|
|
| -void TranslateManager::RevertTranslation(WebContents* web_contents) {
|
| +void TranslateManager::RevertTranslation() {
|
| + WebContents* web_contents = translate_tab_helper_->GetWebContents();
|
| NavigationEntry* entry = web_contents->GetController().GetActiveEntry();
|
| if (!entry) {
|
| NOTREACHED();
|
| @@ -446,15 +429,14 @@ void TranslateManager::RevertTranslation(WebContents* web_contents) {
|
| web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_RevertTranslation(
|
| web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID()));
|
|
|
| - TranslateTabHelper* translate_tab_helper =
|
| - TranslateTabHelper::FromWebContents(web_contents);
|
| - translate_tab_helper->GetLanguageState().SetCurrentLanguage(
|
| - translate_tab_helper->GetLanguageState().original_language());
|
| + translate_tab_helper_->GetLanguageState().SetCurrentLanguage(
|
| + translate_tab_helper_->GetLanguageState().original_language());
|
| }
|
|
|
| -void TranslateManager::ReportLanguageDetectionError(WebContents* web_contents) {
|
| +void TranslateManager::ReportLanguageDetectionError() {
|
| TranslateBrowserMetrics::ReportLanguageDetectionError();
|
| // We'll open the URL in a new tab so that the user can tell us more.
|
| + WebContents* web_contents = translate_tab_helper_->GetWebContents();
|
| Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
|
| if (!browser) {
|
| NOTREACHED();
|
| @@ -469,12 +451,10 @@ void TranslateManager::ReportLanguageDetectionError(WebContents* web_contents) {
|
| kUrlQueryName,
|
| page_url.spec());
|
|
|
| - TranslateTabHelper* translate_tab_helper =
|
| - TranslateTabHelper::FromWebContents(web_contents);
|
| report_error_url = net::AppendQueryParameter(
|
| report_error_url,
|
| kSourceLanguageQueryName,
|
| - translate_tab_helper->GetLanguageState().original_language());
|
| + translate_tab_helper_->GetLanguageState().original_language());
|
|
|
| report_error_url = TranslateURLUtil::AddHostLocaleToUrl(report_error_url);
|
| report_error_url = TranslateURLUtil::AddApiKeyToUrl(report_error_url);
|
| @@ -483,29 +463,25 @@ void TranslateManager::ReportLanguageDetectionError(WebContents* web_contents) {
|
| content::PAGE_TRANSITION_AUTO_BOOKMARK);
|
| }
|
|
|
| -void TranslateManager::DoTranslatePage(WebContents* web_contents,
|
| - const std::string& translate_script,
|
| +void TranslateManager::DoTranslatePage(const std::string& translate_script,
|
| const std::string& source_lang,
|
| const std::string& target_lang) {
|
| + WebContents* web_contents = translate_tab_helper_->GetWebContents();
|
| + if (!web_contents)
|
| + return;
|
| NavigationEntry* entry = web_contents->GetController().GetActiveEntry();
|
| if (!entry) {
|
| NOTREACHED();
|
| return;
|
| }
|
|
|
| - TranslateTabHelper* translate_tab_helper =
|
| - TranslateTabHelper::FromWebContents(web_contents);
|
| - if (!translate_tab_helper)
|
| - return;
|
| -
|
| - translate_tab_helper->GetLanguageState().set_translation_pending(true);
|
| + translate_tab_helper_->GetLanguageState().set_translation_pending(true);
|
| web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_TranslatePage(
|
| web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID(),
|
| translate_script, source_lang, target_lang));
|
| }
|
|
|
| -void TranslateManager::PageTranslated(WebContents* web_contents,
|
| - PageTranslatedDetails* details) {
|
| +void TranslateManager::PageTranslated(PageTranslatedDetails* details) {
|
| if ((details->error_type == TranslateErrors::NONE) &&
|
| details->source_language != translate::kUnknownLanguageCode &&
|
| !TranslateDownloadManager::IsSupportedLanguage(
|
| @@ -513,15 +489,14 @@ void TranslateManager::PageTranslated(WebContents* web_contents,
|
| details->error_type = TranslateErrors::UNSUPPORTED_LANGUAGE;
|
| }
|
|
|
| - TranslateTabHelper* translate_tab_helper =
|
| - TranslateTabHelper::FromWebContents(web_contents);
|
| - DCHECK(translate_tab_helper);
|
| - translate_tab_helper->ShowTranslateUI(TranslateTabHelper::AFTER_TRANSLATE,
|
| - web_contents,
|
| - details->source_language,
|
| - details->target_language,
|
| - details->error_type);
|
| + DCHECK(translate_tab_helper_->GetWebContents());
|
| +
|
| + translate_tab_helper_->ShowTranslateUI(TranslateTabHelper::AFTER_TRANSLATE,
|
| + details->source_language,
|
| + details->target_language,
|
| + details->error_type);
|
|
|
| + WebContents* web_contents = translate_tab_helper_->GetWebContents();
|
| if (details->error_type != TranslateErrors::NONE &&
|
| !web_contents->GetBrowserContext()->IsOffTheRecord()) {
|
| TranslateErrorDetails error_details;
|
| @@ -532,17 +507,19 @@ void TranslateManager::PageTranslated(WebContents* web_contents,
|
| }
|
| }
|
|
|
| -void TranslateManager::OnTranslateScriptFetchComplete(PendingRequest request,
|
| - bool success,
|
| - const std::string& data) {
|
| - WebContents* web_contents = tab_util::GetWebContentsByID(
|
| - request.render_process_id, request.render_view_id);
|
| +void TranslateManager::OnTranslateScriptFetchComplete(
|
| + int page_id,
|
| + const std::string& source_lang,
|
| + const std::string& target_lang,
|
| + bool success,
|
| + const std::string& data) {
|
| + WebContents* web_contents = translate_tab_helper_->GetWebContents();
|
| if (!web_contents) {
|
| // The tab went away while we were retrieving the script.
|
| return;
|
| }
|
| NavigationEntry* entry = web_contents->GetController().GetActiveEntry();
|
| - if (!entry || entry->GetPageID() != request.page_id) {
|
| + if (!entry || entry->GetPageID() != page_id) {
|
| // We navigated away from the page the translation was triggered on.
|
| return;
|
| }
|
| @@ -552,17 +529,12 @@ void TranslateManager::OnTranslateScriptFetchComplete(PendingRequest request,
|
| TranslateScript* translate_script =
|
| TranslateDownloadManager::GetInstance()->script();
|
| DCHECK(translate_script);
|
| - DoTranslatePage(web_contents, translate_script->data(), request.source_lang,
|
| - request.target_lang);
|
| + DoTranslatePage(translate_script->data(), source_lang, target_lang);
|
| } else {
|
| - TranslateTabHelper* translate_tab_helper =
|
| - TranslateTabHelper::FromWebContents(web_contents);
|
| - DCHECK(translate_tab_helper);
|
| - translate_tab_helper->ShowTranslateUI(TranslateTabHelper::TRANSLATE_ERROR,
|
| - web_contents,
|
| - request.source_lang,
|
| - request.target_lang,
|
| - TranslateErrors::NETWORK);
|
| + translate_tab_helper_->ShowTranslateUI(TranslateTabHelper::TRANSLATE_ERROR,
|
| + source_lang,
|
| + target_lang,
|
| + TranslateErrors::NETWORK);
|
| if (!web_contents->GetBrowserContext()->IsOffTheRecord()) {
|
| TranslateErrorDetails error_details;
|
| error_details.time = base::Time::Now();
|
|
|